From 3e1a42f086bdea4e10d29bfe4ee685c1d743c3e7 Mon Sep 17 00:00:00 2001 From: dawe Date: Fri, 25 Aug 2023 17:14:20 +0200 Subject: [PATCH 1/4] make use of the added ranges of SynRationalConst.Rational to model the parens and the div operator as real children of the RationalNode. Fixes #2930, #2932, #2933 --- CHANGELOG.md | 7 ++++ Directory.Build.props | 3 +- build.fsx | 11 +++--- src/Fantomas.Core.Tests/SynConstTests.fs | 45 ++++++++++++++++++++++++ src/Fantomas.Core/ASTTransformer.fs | 24 +++++++++++-- src/Fantomas.Core/CodePrinter.fs | 6 ++-- src/Fantomas.Core/SyntaxOak.fs | 20 +++++++++-- 7 files changed, 103 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bfe087cd52..c004570190 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [Unreleased] + +### Fixed +* Block comment in Rational between lparen and numerator is moved before lparen. [#2930](https://github.com/fsprojects/fantomas/issues/2930) +* Block comment in Rational between / and denominator is moved before /. [#2932](https://github.com/fsprojects/fantomas/issues/2932) +* Block comment in Rational between denominator and rparen is moved behind rparen. [#2933](https://github.com/fsprojects/fantomas/issues/2933) + ## 6.1.3 - 2023-08-25 ### Changed diff --git a/Directory.Build.props b/Directory.Build.props index 875ebc62e4..0363071a9b 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -39,7 +39,8 @@ Some common use cases include: - 6ed38fcb360a0015828973b1f32cd2ea6b58c6ad + dawedawe/fsharp + eb0899cccefc1decf503d4a0b3a96a4c6e62189e 2.8.28 6.0.1 diff --git a/build.fsx b/build.fsx index 10a2b1edaa..1e82e01888 100644 --- a/build.fsx +++ b/build.fsx @@ -189,6 +189,10 @@ pipeline "EnsureRepoConfig" { let deps = __SOURCE_DIRECTORY__ ".deps" +let fsharpCompilerRepo = + let xDoc = XElement.Load(__SOURCE_DIRECTORY__ "Directory.Build.props") + xDoc.XPathSelectElements("//FCSRepo") |> Seq.head |> (fun xe -> xe.Value) + let fsharpCompilerHash = let xDoc = XElement.Load(__SOURCE_DIRECTORY__ "Directory.Build.props") xDoc.XPathSelectElements("//FCSCommitHash") |> Seq.head |> (fun xe -> xe.Value) @@ -204,7 +208,7 @@ let updateFileRaw (file: FileInfo) = line) File.WriteAllLines(file.FullName, updatedLines) -let downloadCompilerFile commitHash relativePath = +let downloadCompilerFile repo commitHash relativePath = async { let file = FileInfo(deps commitHash relativePath) if file.Exists && file.Length <> 0 then @@ -213,8 +217,7 @@ let downloadCompilerFile commitHash relativePath = file.Directory.Create() let fs = file.Create() let fileName = Path.GetFileName(relativePath) - let url = - $"https://raw.githubusercontent.com/dotnet/fsharp/{commitHash}/{relativePath}" + let url = $"https://raw.githubusercontent.com/{repo}/{commitHash}/{relativePath}" let! response = Http.AsyncRequestStream( url, @@ -304,7 +307,7 @@ pipeline "Init" { "src/Compiler/SyntaxTree/LexHelpers.fs" "src/Compiler/SyntaxTree/LexFilter.fsi" "src/Compiler/SyntaxTree/LexFilter.fs" |] - |> Array.map (downloadCompilerFile fsharpCompilerHash) + |> Array.map (downloadCompilerFile fsharpCompilerRepo fsharpCompilerHash) |> Async.Parallel |> Async.Ignore) } diff --git a/src/Fantomas.Core.Tests/SynConstTests.fs b/src/Fantomas.Core.Tests/SynConstTests.fs index ebb8e0cfc2..e81831918d 100644 --- a/src/Fantomas.Core.Tests/SynConstTests.fs +++ b/src/Fantomas.Core.Tests/SynConstTests.fs @@ -846,3 +846,48 @@ let ``block comment between ^ and exponent in SynMeasure.Power is lost, 2936`` ( """ 234 """ + +[] +let ``block comment in Rational between lparen and numerator is moved before lparen, 2930`` () = + formatSourceString + false + """ +234 +""" + config + |> prepend newline + |> should + equal + """ +234 +""" + +[] +let ``block comment in Rational between / and denominator is moved before /, 2932`` () = + formatSourceString + false + """ +234 +""" + config + |> prepend newline + |> should + equal + """ +234 +""" + +[] +let ``block comment in Rational between denominator and rparen is moved behind rparen, 2933`` () = + formatSourceString + false + """ +234 +""" + config + |> prepend newline + |> should + equal + """ +234 +""" diff --git a/src/Fantomas.Core/ASTTransformer.fs b/src/Fantomas.Core/ASTTransformer.fs index 4dc47ff730..12253e5103 100644 --- a/src/Fantomas.Core/ASTTransformer.fs +++ b/src/Fantomas.Core/ASTTransformer.fs @@ -1976,7 +1976,7 @@ let mkModuleDecl (creationAide: CreationAide) (decl: SynModuleDecl) = |> ModuleDecl.NestedModule | decl -> failwithf $"Failed to create ModuleDecl for %A{decl}" -let mkSynTyparDecl (creationAide: CreationAide) (SynTyparDecl(attrs, typar)) = +let mkSynTyparDecl (creationAide: CreationAide) (SynTyparDecl(attributes = attrs; typar = typar)) = let m = match List.tryHead attrs with | None -> typar.Range @@ -2010,14 +2010,32 @@ let mkSynRationalConst (creationAide: CreationAide) rc = | SynRationalConst.Integer(i, range) -> stn (creationAide.TextFromSource (fun () -> string i) range) range |> RationalConstNode.Integer - | SynRationalConst.Rational(numerator, numeratorRange, denominator, denominatorRange, range) -> + | SynRationalConst.Rational(lparenRange, + numerator, + numeratorRange, + divRange, + denominator, + denominatorRange, + rparenRange, + _range) -> + let openingParen = + stn (creationAide.TextFromSource (fun () -> "(") lparenRange) lparenRange + let n = stn (creationAide.TextFromSource (fun () -> string numerator) numeratorRange) numeratorRange + let div = stn (creationAide.TextFromSource (fun () -> "/") divRange) divRange + let d = stn (creationAide.TextFromSource (fun () -> string denominator) denominatorRange) denominatorRange - RationalConstNode.Rational(RationalNode(n, d, range)) + let closingParen = + stn (creationAide.TextFromSource (fun () -> ")") rparenRange) rparenRange + + // Use bigger overall range than AST to include parens and improve block comment handling + let range = unionRanges lparenRange rparenRange + + RationalConstNode.Rational(RationalNode(openingParen, n, div, d, closingParen, range)) | SynRationalConst.Negate(innerRc, range) -> RationalConstNode.Negate(NegateRationalNode(stn "-" range.StartRange, visit innerRc, range)) diff --git a/src/Fantomas.Core/CodePrinter.fs b/src/Fantomas.Core/CodePrinter.fs index f6d23f8d3b..710929abe7 100644 --- a/src/Fantomas.Core/CodePrinter.fs +++ b/src/Fantomas.Core/CodePrinter.fs @@ -245,11 +245,11 @@ let genRational (rat: RationalConstNode) = | RationalConstNode.Integer i -> genSingleTextNode i | RationalConstNode.Negate negate -> genSingleTextNode negate.Minus +> genRational negate.Rational | RationalConstNode.Rational rationalNode -> - genSingleTextNode (SingleTextNode("(", Fantomas.FCS.Text.Range.Zero)) + genSingleTextNode rationalNode.OpeningParen +> genSingleTextNode rationalNode.Numerator - +> genSingleTextNode (SingleTextNode("/", Fantomas.FCS.Text.Range.Zero)) + +> genSingleTextNode rationalNode.DivOp +> genSingleTextNode rationalNode.Denominator - +> genSingleTextNode (SingleTextNode(")", Fantomas.FCS.Text.Range.Zero)) + +> genSingleTextNode rationalNode.ClosingParen |> genNode rationalNode let genAttributesCore (ats: AttributeNode list) = diff --git a/src/Fantomas.Core/SyntaxOak.fs b/src/Fantomas.Core/SyntaxOak.fs index 79b7814529..a0d4e9f6b5 100644 --- a/src/Fantomas.Core/SyntaxOak.fs +++ b/src/Fantomas.Core/SyntaxOak.fs @@ -2802,13 +2802,29 @@ type MeasureParenNode(openingParen: SingleTextNode, measure: Measure, closingPar member val Measure = measure member val ClosingParen = closingParen -type RationalNode(numerator: SingleTextNode, denominator: SingleTextNode, range: range) = +type RationalNode + ( + openingParen: SingleTextNode, + numerator: SingleTextNode, + divOp: SingleTextNode, + denominator: SingleTextNode, + closingParen: SingleTextNode, + range: range + ) = inherit NodeBase(range) - override val Children: Node array = [| yield numerator; yield denominator |] + override val Children: Node array = + [| yield openingParen + yield numerator + yield divOp + yield denominator + yield closingParen |] + member val OpeningParen = openingParen member val Numerator = numerator + member val DivOp = divOp member val Denominator = denominator + member val ClosingParen = closingParen type NegateRationalNode(minus: SingleTextNode, rationalConst: RationalConstNode, range: range) = inherit NodeBase(range) From 5b213ae1d71479e7f3130df795ea6ccd5747975c Mon Sep 17 00:00:00 2001 From: dawe Date: Mon, 28 Aug 2023 15:11:16 +0200 Subject: [PATCH 2/4] adjust to latest AST changes (SynRationalConst.Paren) --- Directory.Build.props | 2 +- src/Fantomas.Core/ASTTransformer.fs | 29 +++++++++++++++++------------ 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/Directory.Build.props b/Directory.Build.props index 0363071a9b..9d3ec74769 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -40,7 +40,7 @@ Some common use cases include: dawedawe/fsharp - eb0899cccefc1decf503d4a0b3a96a4c6e62189e + ab8bb0cbc6b5068cd9481b09fd521eac7c7c2421 2.8.28 6.0.1 diff --git a/src/Fantomas.Core/ASTTransformer.fs b/src/Fantomas.Core/ASTTransformer.fs index 12253e5103..7f5ea4a8eb 100644 --- a/src/Fantomas.Core/ASTTransformer.fs +++ b/src/Fantomas.Core/ASTTransformer.fs @@ -2010,16 +2010,19 @@ let mkSynRationalConst (creationAide: CreationAide) rc = | SynRationalConst.Integer(i, range) -> stn (creationAide.TextFromSource (fun () -> string i) range) range |> RationalConstNode.Integer - | SynRationalConst.Rational(lparenRange, - numerator, - numeratorRange, - divRange, - denominator, - denominatorRange, - rparenRange, - _range) -> + + | SynRationalConst.Paren(SynRationalConst.Rational(numerator, + numeratorRange, + divRange, + denominator, + denominatorRange, + _), + range) -> let openingParen = - stn (creationAide.TextFromSource (fun () -> "(") lparenRange) lparenRange + let r = + withEnd (Position.mkPos range.Start.Line (range.StartRange.StartColumn + 1)) range.StartRange + + stn (creationAide.TextFromSource (fun () -> "(") r) r let n = stn (creationAide.TextFromSource (fun () -> string numerator) numeratorRange) numeratorRange @@ -2030,14 +2033,16 @@ let mkSynRationalConst (creationAide: CreationAide) rc = stn (creationAide.TextFromSource (fun () -> string denominator) denominatorRange) denominatorRange let closingParen = - stn (creationAide.TextFromSource (fun () -> ")") rparenRange) rparenRange + let r = + withStart (Position.mkPos range.End.Line (range.End.Column - 1)) range.EndRange - // Use bigger overall range than AST to include parens and improve block comment handling - let range = unionRanges lparenRange rparenRange + stn (creationAide.TextFromSource (fun () -> ")") r) r RationalConstNode.Rational(RationalNode(openingParen, n, div, d, closingParen, range)) + | SynRationalConst.Paren(innerRc, _) -> visit innerRc | SynRationalConst.Negate(innerRc, range) -> RationalConstNode.Negate(NegateRationalNode(stn "-" range.StartRange, visit innerRc, range)) + | SynRationalConst.Rational _ -> failwith "SynRationalConst.Rational not wrapped in SynRationalConst.Paren" visit rc From 136a7d93f36fd840bfe5a2d38b85fd5b0d43b12a Mon Sep 17 00:00:00 2001 From: dawe Date: Tue, 29 Aug 2023 08:27:44 +0200 Subject: [PATCH 3/4] update FCS to 'Add a Paren case to SynRationalConst', commit 97a5b6584b54707e3e8541fe758e1aa22132a8fe --- CHANGELOG.md | 1 + Directory.Build.props | 3 +-- build.fsx | 11 ++++------- 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f3280dd6e7..3ca76cf115 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ ### Changed * Update FCS to 'Included get,set in range of AutoProperty', commit d508186f510681d1261291474e3f9f25485999a8 +* Update FCS to 'Add a Paren case to SynRationalConst', commit 97a5b6584b54707e3e8541fe758e1aa22132a8fe ### Added * Initial support for `SynExpr.DotLambda` [#2920](https://github.com/fsprojects/fantomas/pull/2920) (See [dotnet/fsharp#13907](https://github.com/dotnet/fsharp/pull/13907)) diff --git a/Directory.Build.props b/Directory.Build.props index aefbad86cc..ea7af583ad 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -39,8 +39,7 @@ Some common use cases include: - dawedawe/fsharp - d26ba6b2f220b53ebbc16436fca37ad6291b6040 + 97a5b6584b54707e3e8541fe758e1aa22132a8fe 2.8.28 6.0.1 diff --git a/build.fsx b/build.fsx index 1e82e01888..10a2b1edaa 100644 --- a/build.fsx +++ b/build.fsx @@ -189,10 +189,6 @@ pipeline "EnsureRepoConfig" { let deps = __SOURCE_DIRECTORY__ ".deps" -let fsharpCompilerRepo = - let xDoc = XElement.Load(__SOURCE_DIRECTORY__ "Directory.Build.props") - xDoc.XPathSelectElements("//FCSRepo") |> Seq.head |> (fun xe -> xe.Value) - let fsharpCompilerHash = let xDoc = XElement.Load(__SOURCE_DIRECTORY__ "Directory.Build.props") xDoc.XPathSelectElements("//FCSCommitHash") |> Seq.head |> (fun xe -> xe.Value) @@ -208,7 +204,7 @@ let updateFileRaw (file: FileInfo) = line) File.WriteAllLines(file.FullName, updatedLines) -let downloadCompilerFile repo commitHash relativePath = +let downloadCompilerFile commitHash relativePath = async { let file = FileInfo(deps commitHash relativePath) if file.Exists && file.Length <> 0 then @@ -217,7 +213,8 @@ let downloadCompilerFile repo commitHash relativePath = file.Directory.Create() let fs = file.Create() let fileName = Path.GetFileName(relativePath) - let url = $"https://raw.githubusercontent.com/{repo}/{commitHash}/{relativePath}" + let url = + $"https://raw.githubusercontent.com/dotnet/fsharp/{commitHash}/{relativePath}" let! response = Http.AsyncRequestStream( url, @@ -307,7 +304,7 @@ pipeline "Init" { "src/Compiler/SyntaxTree/LexHelpers.fs" "src/Compiler/SyntaxTree/LexFilter.fsi" "src/Compiler/SyntaxTree/LexFilter.fs" |] - |> Array.map (downloadCompilerFile fsharpCompilerRepo fsharpCompilerHash) + |> Array.map (downloadCompilerFile fsharpCompilerHash) |> Async.Parallel |> Async.Ignore) } From 4b33295cb554e708cd0d4192ab483cb5a32c2d2d Mon Sep 17 00:00:00 2001 From: dawe Date: Tue, 29 Aug 2023 08:51:21 +0200 Subject: [PATCH 4/4] optimize stn --- src/Fantomas.Core/ASTTransformer.fs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Fantomas.Core/ASTTransformer.fs b/src/Fantomas.Core/ASTTransformer.fs index bbbea78fe7..c19605cd5d 100644 --- a/src/Fantomas.Core/ASTTransformer.fs +++ b/src/Fantomas.Core/ASTTransformer.fs @@ -2028,12 +2028,12 @@ let mkSynRationalConst (creationAide: CreationAide) rc = let r = withEnd (Position.mkPos range.Start.Line (range.StartRange.StartColumn + 1)) range.StartRange - stn (creationAide.TextFromSource (fun () -> "(") r) r + stn "(" r let n = stn (creationAide.TextFromSource (fun () -> string numerator) numeratorRange) numeratorRange - let div = stn (creationAide.TextFromSource (fun () -> "/") divRange) divRange + let div = stn "/" divRange let d = stn (creationAide.TextFromSource (fun () -> string denominator) denominatorRange) denominatorRange @@ -2042,7 +2042,7 @@ let mkSynRationalConst (creationAide: CreationAide) rc = let r = withStart (Position.mkPos range.End.Line (range.End.Column - 1)) range.EndRange - stn (creationAide.TextFromSource (fun () -> ")") r) r + stn ")" r RationalConstNode.Rational(RationalNode(openingParen, n, div, d, closingParen, range)) | SynRationalConst.Paren(innerRc, _) -> visit innerRc