From eafdd7b5ee9cf502435d1ac97ee90d559300e3b9 Mon Sep 17 00:00:00 2001 From: Adam Boniecki Date: Tue, 6 Dec 2022 16:52:05 +0100 Subject: [PATCH] Fix handling % chars in interpolated strings Interpolated strings require escaping '%' chars by doubling them, however if an interpolated string literal had no interpolation expressions, it would not drop extra '%' chars in the content. --- src/Compiler/Checking/CheckExpressions.fs | 5 +++-- .../Language/InterpolatedStringsTests.fs | 8 +++++++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/Compiler/Checking/CheckExpressions.fs b/src/Compiler/Checking/CheckExpressions.fs index 53381d07648..d4ff82dd1da 100644 --- a/src/Compiler/Checking/CheckExpressions.fs +++ b/src/Compiler/Checking/CheckExpressions.fs @@ -7165,13 +7165,14 @@ and TcInterpolatedStringExpr cenv (overallTy: OverallTy) env m tpenv (parts: Syn // Type check the expressions filling the holes if List.isEmpty synFillExprs then - let str = mkString g m printfFormatString - if isString then + let sb = System.Text.StringBuilder(printfFormatString).Replace("%%", "%") + let str = mkString g m (sb.ToString()) TcPropagatingExprLeafThenConvert cenv overallTy g.string_ty env (* true *) m (fun () -> str, tpenv ) else + let str = mkString g m printfFormatString mkCallNewFormat g m printerTy printerArgTy printerResidueTy printerResultTy printerTupleTy str, tpenv else // Type check the expressions filling the holes diff --git a/tests/FSharp.Compiler.ComponentTests/Language/InterpolatedStringsTests.fs b/tests/FSharp.Compiler.ComponentTests/Language/InterpolatedStringsTests.fs index 14dbb4fd0a1..db431a6386c 100644 --- a/tests/FSharp.Compiler.ComponentTests/Language/InterpolatedStringsTests.fs +++ b/tests/FSharp.Compiler.ComponentTests/Language/InterpolatedStringsTests.fs @@ -30,4 +30,10 @@ let b: System.IComparable = $"string" let c: System.IFormattable = $"string" """ |> compile - |> shouldSucceed \ No newline at end of file + |> shouldSucceed + + [] + let ``Percent sign characters in interpolated strings`` () = + Assert.Equal("%", $"%%") + Assert.Equal("42%", $"{42}%%") + Assert.Equal("% 42", $"%%%3d{42}") \ No newline at end of file