diff --git a/src/Fantomas.Tests/FunctionDefinitionTests.fs b/src/Fantomas.Tests/FunctionDefinitionTests.fs index 246362e755..cd3e371cd6 100644 --- a/src/Fantomas.Tests/FunctionDefinitionTests.fs +++ b/src/Fantomas.Tests/FunctionDefinitionTests.fs @@ -81,6 +81,33 @@ let ``should keep identifiers with + in double backticks``() = |> should equal """let ``Foo+Bar`` () = x """ +[] +let ``double backticks with non-alphanum character, 776``() = + formatSourceString false """let ``!foo hoo`` () = () +let ``@foo hoo`` () = () +let ``$foo hoo`` () = () +let ``%foo hoo`` () = () +let ``^foo hoo`` () = () +let ``&foo hoo`` () = () +let ``*foo hoo`` () = () +let ``foo hoo`` () = () +let ``=foo hoo`` () = () +let ``-foo hoo`` () = () + """ config + |> should equal """let ``!foo hoo`` () = () +let ``@foo hoo`` () = () +let ``$foo hoo`` () = () +let ``%foo hoo`` () = () +let ``^foo hoo`` () = () +let ``&foo hoo`` () = () +let ``*foo hoo`` () = () +let ``foo hoo`` () = () +let ``=foo hoo`` () = () +let ``-foo hoo`` () = () +""" + [] let ``let bindings with return types``() = formatSourceString false """ diff --git a/src/Fantomas/CodePrinter.fs b/src/Fantomas/CodePrinter.fs index 508183ac46..ba3f84007c 100644 --- a/src/Fantomas/CodePrinter.fs +++ b/src/Fantomas/CodePrinter.fs @@ -2753,13 +2753,16 @@ and genTrivia (range: range) f = enterNode range +> f +> leaveNode range and infixOperatorFromTrivia range fallback (ctx: Context) = + // by specs, section 3.4 https://fsharp.org/specs/language-spec/4.1/FSharpSpec-4.1-latest.pdf#page=24&zoom=auto,-137,312 + let validIdentRegex = """^(_|\p{L}|\p{Nl})([_'0-9]|\p{L}|\p{Nl}\p{Pc}|\p{Mn}|\p{Mc}|\p{Cf})*$""" + let isValidIdent x = Regex.Match(x, validIdentRegex).Success ctx.Trivia |> List.choose(fun t -> match t.Range = range with | true -> match t.ContentItself with | Some(IdentOperatorAsWord(iiw)) -> Some iiw - | Some(IdentBetweenTicks(iiw)) -> Some iiw // Used when value between ``...`` + | Some(IdentBetweenTicks(iiw)) when not(isValidIdent fallback) -> Some iiw // Used when value between ``...`` | _ -> None | _ -> None) |> List.tryHead diff --git a/src/Fantomas/Trivia.fs b/src/Fantomas/Trivia.fs index c0e6f35a79..cfc677c63f 100644 --- a/src/Fantomas/Trivia.fs +++ b/src/Fantomas/Trivia.fs @@ -343,6 +343,7 @@ let private addTriviaToTriviaNode (startOfSourceCode:int) (triviaNodes: TriviaNo match t.Type with | MainNode("SynExpr.Ident") | MainNode("SynPat.Named") + | MainNode("SynPat.LongIdent") | MainNode("Ident") -> true | _ -> false isIdent && (t.Range.StartColumn = range.StartColumn || t.Range.StartColumn = range.StartColumn + 1) && t.Range.StartLine = range.StartLine