diff --git a/src/Fantomas.Tests/InterpolatedStringTests.fs b/src/Fantomas.Tests/InterpolatedStringTests.fs index fa9408f9da..77f516c674 100644 --- a/src/Fantomas.Tests/InterpolatedStringTests.fs +++ b/src/Fantomas.Tests/InterpolatedStringTests.fs @@ -146,3 +146,20 @@ $"\"{bar}\" {1} {2}" """ $"\"{bar}\" {1} {2}" """ + +[] +let ``multiline string literal, issue 1451`` () = + formatSourceString + false + " +$\"\"\"one: {1}< +>two: {2}\"\"\" +" + config + |> prepend newline + |> should + equal + " +$\"\"\"one: {1}< +>two: {2}\"\"\" +" diff --git a/src/Fantomas/TokenParser.fs b/src/Fantomas/TokenParser.fs index 07d834c22c..5f3689fa7e 100644 --- a/src/Fantomas/TokenParser.fs +++ b/src/Fantomas/TokenParser.fs @@ -579,6 +579,17 @@ let private identIsDecompiledOperator (token: Token) = token.TokenInfo.TokenName = "IDENT" && decompiledName <> token.Content +let private extractContentPreservingNewLines (tokens: Token list) = + let rec loop result = + function + | [] -> result + | [ final ] -> final.Content :: result + | current :: ((next :: _) as rest) when (current.LineNumber <> next.LineNumber) -> + loop ("\n" :: current.Content :: result) rest + | current :: rest -> loop (current.Content :: result) rest + + loop [] tokens |> List.rev + let ``only whitespaces were found in the remainder of the line`` lineNumber tokens = tokens |> List.exists @@ -732,7 +743,7 @@ let rec private getTriviaFromTokensThemSelves | EndOfInterpolatedString (stringTokens, interpStringEnd, rest) -> let stringContent = - [ yield! (List.map (fun t -> t.Content) stringTokens) + [ yield! extractContentPreservingNewLines stringTokens yield interpStringEnd.Content ] |> String.concat String.Empty