From 019e8f1f6d84a00bfbda5a1a26baa8afe596820f Mon Sep 17 00:00:00 2001 From: dawe Date: Thu, 20 Jul 2023 11:40:00 +0200 Subject: [PATCH 1/6] - make use of new trivia information of SynConst.Measure - adjust to optional lhs of Measure.Divide --- Directory.Build.props | 3 ++- build.fsx | 7 +++++-- src/Fantomas.Core.Tests/SynConstTests.fs | 15 +++++++++++++++ src/Fantomas.Core/ASTTransformer.fs | 17 ++++++++++------- src/Fantomas.Core/CodePrinter.fs | 9 +++++++++ src/Fantomas.Core/SyntaxOak.fs | 15 +++++++++++++++ src/Fantomas.FCS/Parse.fs | 2 +- 7 files changed, 57 insertions(+), 11 deletions(-) diff --git a/Directory.Build.props b/Directory.Build.props index 6da587b5d8..b991d5df63 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -39,7 +39,8 @@ Some common use cases include: - 9c8b4192966e6554adc5dcc8973f2a23c8fa2722 + dawedawe/fsharp + 3da13f3b373b680df1b08ee342ef290a79016438 2.8.28 6.0.1 diff --git a/build.fsx b/build.fsx index 10a2b1edaa..0f19d92b5e 100644 --- a/build.fsx +++ b/build.fsx @@ -193,6 +193,10 @@ let fsharpCompilerHash = let xDoc = XElement.Load(__SOURCE_DIRECTORY__ "Directory.Build.props") xDoc.XPathSelectElements("//FCSCommitHash") |> Seq.head |> (fun xe -> xe.Value) +let fcsRepo = + let xDoc = XElement.Load(__SOURCE_DIRECTORY__ "Directory.Build.props") + xDoc.XPathSelectElements("//FCSRepo") |> Seq.head |> (fun xe -> xe.Value) + let updateFileRaw (file: FileInfo) = let lines = File.ReadAllLines file.FullName let updatedLines = @@ -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/{fcsRepo}/{commitHash}/{relativePath}" let! response = Http.AsyncRequestStream( url, diff --git a/src/Fantomas.Core.Tests/SynConstTests.fs b/src/Fantomas.Core.Tests/SynConstTests.fs index cca6c7623f..021e6ea425 100644 --- a/src/Fantomas.Core.Tests/SynConstTests.fs +++ b/src/Fantomas.Core.Tests/SynConstTests.fs @@ -726,3 +726,18 @@ let ``single digit constant`` () = { config with InsertFinalNewline = false } |> should equal "1" + +[] +let ``left out lhs in SynMeasure.Divide should not be restored as SynMeasure.One`` () = + formatSourceString + false + """ +234 +""" + config + |> prepend newline + |> should + equal + """ +234< / kg> +""" diff --git a/src/Fantomas.Core/ASTTransformer.fs b/src/Fantomas.Core/ASTTransformer.fs index e30c7e8982..9c85c50977 100644 --- a/src/Fantomas.Core/ASTTransformer.fs +++ b/src/Fantomas.Core/ASTTransformer.fs @@ -150,7 +150,7 @@ let mkConstant (creationAide: CreationAide) c r : Constant = $"\"{content}\"B" stn (creationAide.TextFromSource fallback r) r |> Constant.FromText - | SynConst.Measure(c, numberRange, measure) -> + | SynConst.Measure(c, numberRange, measure, _) -> ConstantMeasureNode(mkConstant creationAide c numberRange, mkMeasure creationAide measure, r) |> Constant.Measure | SynConst.SourceIdentifier(c, _, r) -> stn c r |> Constant.FromText @@ -159,13 +159,15 @@ let mkMeasure (creationAide: CreationAide) (measure: SynMeasure) : Measure = match measure with | SynMeasure.Var(typar, _) -> mkSynTypar typar |> Measure.Single | SynMeasure.Anon m -> stn "_" m |> Measure.Single - | SynMeasure.One -> stn "1" Range.Zero |> Measure.Single + | SynMeasure.One m -> stn "1" m |> Measure.Single | SynMeasure.Product(m1, m2, m) -> MeasureOperatorNode(mkMeasure creationAide m1, stn "*" Range.Zero, mkMeasure creationAide m2, m) |> Measure.Operator | SynMeasure.Divide(m1, m2, m) -> - MeasureOperatorNode(mkMeasure creationAide m1, stn "/" Range.Zero, mkMeasure creationAide m2, m) - |> Measure.Operator + let lhs = m1 |> Option.map (mkMeasure creationAide) + + MeasureDivideNode(lhs, stn "/" Range.Zero, mkMeasure creationAide m2, m) + |> Measure.Divide | SynMeasure.Power(ms, rat, m) -> MeasurePowerNode(mkMeasure creationAide ms, stn (mkSynRationalConst rat) Range.Zero, m) |> Measure.Power @@ -1994,9 +1996,10 @@ let mkSynValTyparDecls (creationAide: CreationAide) (vt: SynValTyparDecls option let mkSynRationalConst rc = let rec visit rc = match rc with - | SynRationalConst.Integer i -> string i - | SynRationalConst.Rational(numerator, denominator, _) -> $"(%i{numerator}/%i{denominator})" - | SynRationalConst.Negate innerRc -> $"-{visit innerRc}" + | SynRationalConst.Integer(value = i) -> string i + | SynRationalConst.Rational(numerator = numerator; denominator = denominator) -> + $"(%i{numerator}/%i{denominator})" + | SynRationalConst.Negate(rationalConst = innerRc) -> $"-{visit innerRc}" visit rc diff --git a/src/Fantomas.Core/CodePrinter.fs b/src/Fantomas.Core/CodePrinter.fs index 62e44fd43b..d6d9d9df7a 100644 --- a/src/Fantomas.Core/CodePrinter.fs +++ b/src/Fantomas.Core/CodePrinter.fs @@ -222,6 +222,15 @@ let genMeasure (measure: Measure) = +> sepSpace +> genMeasure n.RightHandSide |> genNode n + | Measure.Divide n -> + let lhs = n.LeftHandSide |> Option.map genMeasure |> Option.defaultValue id + + lhs + +> sepSpace + +> genSingleTextNode n.Operator + +> sepSpace + +> genMeasure n.RightHandSide + |> genNode n | Measure.Power n -> genMeasure n.Measure +> !- "^" +> genSingleTextNode n.Exponent |> genNode n | Measure.Seq n -> col sepSpace n.Measures genMeasure | Measure.Multiple n -> genIdentListNode n diff --git a/src/Fantomas.Core/SyntaxOak.fs b/src/Fantomas.Core/SyntaxOak.fs index ea9908ac92..e125779aac 100644 --- a/src/Fantomas.Core/SyntaxOak.fs +++ b/src/Fantomas.Core/SyntaxOak.fs @@ -2754,6 +2754,19 @@ type MeasureOperatorNode(lhs: Measure, operator: SingleTextNode, rhs: Measure, r member val Operator = operator member val RightHandSide = rhs +type MeasureDivideNode(lhs: Measure option, operator: SingleTextNode, rhs: Measure, range) = + inherit NodeBase(range) + + override val Children: Node array = + [| if Option.isSome lhs then + yield Measure.Node lhs.Value + yield operator + yield Measure.Node rhs |] + + member val LeftHandSide = lhs + member val Operator = operator + member val RightHandSide = rhs + type MeasurePowerNode(measure: Measure, exponent: SingleTextNode, range) = inherit NodeBase(range) override val Children: Node array = [| yield Measure.Node measure; yield exponent |] @@ -2778,6 +2791,7 @@ type MeasureParenNode(openingParen: SingleTextNode, measure: Measure, closingPar type Measure = | Single of SingleTextNode | Operator of MeasureOperatorNode + | Divide of MeasureDivideNode | Power of MeasurePowerNode | Multiple of IdentListNode | Seq of MeasureSequenceNode @@ -2787,6 +2801,7 @@ type Measure = match m with | Single n -> n | Operator n -> n + | Divide n -> n | Power n -> n | Multiple n -> n | Seq n -> n diff --git a/src/Fantomas.FCS/Parse.fs b/src/Fantomas.FCS/Parse.fs index a1746eb379..221faec1bc 100644 --- a/src/Fantomas.FCS/Parse.fs +++ b/src/Fantomas.FCS/Parse.fs @@ -407,7 +407,7 @@ let EmptyParsedInput (filename, isLastCompiland) = ) let createLexbuf langVersion sourceText = - UnicodeLexing.SourceTextAsLexbuf(true, LanguageVersion(langVersion), sourceText) + UnicodeLexing.SourceTextAsLexbuf(true, LanguageVersion(langVersion), None, sourceText) let createLexerFunction (defines: string list) lexbuf (errorLogger: CapturingDiagnosticsLogger) = let lightStatus = IndentationAwareSyntaxStatus(true, true) From de69f50831af6c09417c637077e297e51d6e3c65 Mon Sep 17 00:00:00 2001 From: dawe Date: Thu, 20 Jul 2023 18:40:22 +0200 Subject: [PATCH 2/6] use "creationAide.TextFromSource" for SynRationalConst.Integer --- src/Fantomas.Core/ASTTransformer.fs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Fantomas.Core/ASTTransformer.fs b/src/Fantomas.Core/ASTTransformer.fs index 9c85c50977..03ba8a733f 100644 --- a/src/Fantomas.Core/ASTTransformer.fs +++ b/src/Fantomas.Core/ASTTransformer.fs @@ -169,7 +169,7 @@ let mkMeasure (creationAide: CreationAide) (measure: SynMeasure) : Measure = MeasureDivideNode(lhs, stn "/" Range.Zero, mkMeasure creationAide m2, m) |> Measure.Divide | SynMeasure.Power(ms, rat, m) -> - MeasurePowerNode(mkMeasure creationAide ms, stn (mkSynRationalConst rat) Range.Zero, m) + MeasurePowerNode(mkMeasure creationAide ms, stn (mkSynRationalConst creationAide rat) Range.Zero, m) |> Measure.Power | SynMeasure.Named(lid, _) -> mkLongIdent lid |> Measure.Multiple | SynMeasure.Paren(measure, StartEndRange 1 (mOpen, m, mClose)) -> @@ -1993,10 +1993,10 @@ let mkSynValTyparDecls (creationAide: CreationAide) (vt: SynValTyparDecls option | None -> None | Some(SynValTyparDecls(tds, _)) -> Option.map (mkSynTyparDecls creationAide) tds -let mkSynRationalConst rc = +let mkSynRationalConst (creationAide: CreationAide) rc = let rec visit rc = match rc with - | SynRationalConst.Integer(value = i) -> string i + | SynRationalConst.Integer(i, range) -> creationAide.TextFromSource (fun () -> string i) range | SynRationalConst.Rational(numerator = numerator; denominator = denominator) -> $"(%i{numerator}/%i{denominator})" | SynRationalConst.Negate(rationalConst = innerRc) -> $"-{visit innerRc}" @@ -2100,7 +2100,7 @@ let mkType (creationAide: CreationAide) (t: SynType) : Type = TypeHashConstraintNode(stn "#" mHash, mkType creationAide t, typeRange) |> Type.HashConstraint | SynType.MeasurePower(t, rc, _) -> - TypeMeasurePowerNode(mkType creationAide t, mkSynRationalConst rc, typeRange) + TypeMeasurePowerNode(mkType creationAide t, mkSynRationalConst creationAide rc, typeRange) |> Type.MeasurePower | SynType.StaticConstant(SynConst.String(null, kind, mString), r) -> mkConstant creationAide (SynConst.String("null", kind, mString)) r From aff9da811bb18481f84c5e520808a49cccd69ec3 Mon Sep 17 00:00:00 2001 From: dawe Date: Thu, 20 Jul 2023 18:44:13 +0200 Subject: [PATCH 3/6] use optSingle --- src/Fantomas.Core/CodePrinter.fs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/Fantomas.Core/CodePrinter.fs b/src/Fantomas.Core/CodePrinter.fs index d6d9d9df7a..da48dcdb14 100644 --- a/src/Fantomas.Core/CodePrinter.fs +++ b/src/Fantomas.Core/CodePrinter.fs @@ -223,9 +223,7 @@ let genMeasure (measure: Measure) = +> genMeasure n.RightHandSide |> genNode n | Measure.Divide n -> - let lhs = n.LeftHandSide |> Option.map genMeasure |> Option.defaultValue id - - lhs + optSingle genMeasure n.LeftHandSide +> sepSpace +> genSingleTextNode n.Operator +> sepSpace From 88c9b9f8472630db66d64075083f3c8094713963 Mon Sep 17 00:00:00 2001 From: dawe Date: Sat, 22 Jul 2023 18:39:58 +0200 Subject: [PATCH 4/6] - update fcs to 'Add trivia information to SynConst.Measure', commit 7b5e12842d673b7daa467e0091378bf4acc95e4f - add test - add CHANGELOG entry --- CHANGELOG.md | 8 ++++++++ Directory.Build.props | 3 +-- build.fsx | 7 ++----- src/Fantomas.Core.Tests/SynConstTests.fs | 17 ++++++++++++++++- src/Fantomas.Core/ASTTransformer.fs | 2 +- 5 files changed, 28 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1aeeaee8bf..3a8574a467 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## [Unreleased] + +### Changed +* Update FCS to 'Add trivia information to SynConst.Measure', commit 7b5e12842d673b7daa467e0091378bf4acc95e4f + +### Fixed +* Left out lhs in SynMeasure.Divide should not be restored as SynMeasure.One. [#2926](https://github.com/fsprojects/fantomas/issues/2926) + ## 6.1.1 - 2023-06-29 ### Changed diff --git a/Directory.Build.props b/Directory.Build.props index b991d5df63..6b1736892e 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -39,8 +39,7 @@ Some common use cases include: - dawedawe/fsharp - 3da13f3b373b680df1b08ee342ef290a79016438 + 7b5e12842d673b7daa467e0091378bf4acc95e4f 2.8.28 6.0.1 diff --git a/build.fsx b/build.fsx index 0f19d92b5e..10a2b1edaa 100644 --- a/build.fsx +++ b/build.fsx @@ -193,10 +193,6 @@ let fsharpCompilerHash = let xDoc = XElement.Load(__SOURCE_DIRECTORY__ "Directory.Build.props") xDoc.XPathSelectElements("//FCSCommitHash") |> Seq.head |> (fun xe -> xe.Value) -let fcsRepo = - let xDoc = XElement.Load(__SOURCE_DIRECTORY__ "Directory.Build.props") - xDoc.XPathSelectElements("//FCSRepo") |> Seq.head |> (fun xe -> xe.Value) - let updateFileRaw (file: FileInfo) = let lines = File.ReadAllLines file.FullName let updatedLines = @@ -217,7 +213,8 @@ let downloadCompilerFile commitHash relativePath = file.Directory.Create() let fs = file.Create() let fileName = Path.GetFileName(relativePath) - let url = $"https://raw.githubusercontent.com/{fcsRepo}/{commitHash}/{relativePath}" + let url = + $"https://raw.githubusercontent.com/dotnet/fsharp/{commitHash}/{relativePath}" let! response = Http.AsyncRequestStream( url, diff --git a/src/Fantomas.Core.Tests/SynConstTests.fs b/src/Fantomas.Core.Tests/SynConstTests.fs index 021e6ea425..ee00dd03dc 100644 --- a/src/Fantomas.Core.Tests/SynConstTests.fs +++ b/src/Fantomas.Core.Tests/SynConstTests.fs @@ -728,7 +728,7 @@ let ``single digit constant`` () = |> should equal "1" [] -let ``left out lhs in SynMeasure.Divide should not be restored as SynMeasure.One`` () = +let ``left out lhs in SynMeasure.Divide should not be restored as SynMeasure.One, 2926`` () = formatSourceString false """ @@ -741,3 +741,18 @@ let ``left out lhs in SynMeasure.Divide should not be restored as SynMeasure.One """ 234< / kg> """ + +[] +let ``explicit SynMeasure.One in SynMeasure.Divide should be preserved`` () = + formatSourceString + false + """ +234<1/kg> +""" + config + |> prepend newline + |> should + equal + """ +234<1 / kg> +""" diff --git a/src/Fantomas.Core/ASTTransformer.fs b/src/Fantomas.Core/ASTTransformer.fs index 03ba8a733f..3c0de2b3d0 100644 --- a/src/Fantomas.Core/ASTTransformer.fs +++ b/src/Fantomas.Core/ASTTransformer.fs @@ -2659,7 +2659,7 @@ let mkMemberDefn (creationAide: CreationAide) (md: SynMemberDefn) = memberDefn = SynBinding( attributes = ats xmlDoc = px - valData = SynValData(Some { MemberKind = SynMemberKind.Constructor }, _, ido) + valData = SynValData(Some { MemberKind = SynMemberKind.Constructor }, _, ido, _) headPat = SynPat.LongIdent( longDotId = SynLongIdent(id = [ newIdent ]) argPats = SynArgPats.Pats [ SynPat.Paren _ as pat ] From cbccca775764078e214ea150b1ad39773b1e39e8 Mon Sep 17 00:00:00 2001 From: dawe Date: Sun, 23 Jul 2023 17:40:00 +0200 Subject: [PATCH 5/6] start to fix block comments in measures --- CHANGELOG.md | 1 + src/Fantomas.Core.Tests/SynConstTests.fs | 15 +++++++++++++++ src/Fantomas.Core/ASTTransformer.fs | 15 +++++++++++++-- src/Fantomas.Core/CodePrinter.fs | 8 ++++---- src/Fantomas.Core/SyntaxOak.fs | 13 +++++++++++-- 5 files changed, 44 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3a8574a467..1b55fb0a2e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ ### Fixed * Left out lhs in SynMeasure.Divide should not be restored as SynMeasure.One. [#2926](https://github.com/fsprojects/fantomas/issues/2926) +* Block comments in measure are lost or restored twice and in wrong place. [#2927](https://github.com/fsprojects/fantomas/issues/2927) ## 6.1.1 - 2023-06-29 diff --git a/src/Fantomas.Core.Tests/SynConstTests.fs b/src/Fantomas.Core.Tests/SynConstTests.fs index ee00dd03dc..b211999f9c 100644 --- a/src/Fantomas.Core.Tests/SynConstTests.fs +++ b/src/Fantomas.Core.Tests/SynConstTests.fs @@ -756,3 +756,18 @@ let ``explicit SynMeasure.One in SynMeasure.Divide should be preserved`` () = """ 234<1 / kg> """ + +[] +let ``block comments in measure are lost or restored twice and in wrong place, 2927`` () = + formatSourceString + false + """ +234<(* foo *)kg(* bar *)> +""" + config + |> prepend newline + |> should + equal + """ +234< (* foo *) kg (* bar *) > +""" diff --git a/src/Fantomas.Core/ASTTransformer.fs b/src/Fantomas.Core/ASTTransformer.fs index 3c0de2b3d0..49ed14639c 100644 --- a/src/Fantomas.Core/ASTTransformer.fs +++ b/src/Fantomas.Core/ASTTransformer.fs @@ -150,8 +150,19 @@ let mkConstant (creationAide: CreationAide) c r : Constant = $"\"{content}\"B" stn (creationAide.TextFromSource fallback r) r |> Constant.FromText - | SynConst.Measure(c, numberRange, measure, _) -> - ConstantMeasureNode(mkConstant creationAide c numberRange, mkMeasure creationAide measure, r) + | SynConst.Measure(c, numberRange, measure, trivia) -> + let uOfMRange = + mkRange trivia.LessRange.FileName trivia.LessRange.Start trivia.GreaterRange.End + + let unitOfMeasure = + UnitOfMeasureNode( + stn "<" trivia.LessRange, + mkMeasure creationAide measure, + stn ">" trivia.GreaterRange, + uOfMRange + ) + + ConstantMeasureNode(mkConstant creationAide c numberRange, unitOfMeasure, r) |> Constant.Measure | SynConst.SourceIdentifier(c, _, r) -> stn c r |> Constant.FromText diff --git a/src/Fantomas.Core/CodePrinter.fs b/src/Fantomas.Core/CodePrinter.fs index da48dcdb14..275fe5a3a1 100644 --- a/src/Fantomas.Core/CodePrinter.fs +++ b/src/Fantomas.Core/CodePrinter.fs @@ -207,9 +207,9 @@ let genConstant (c: Constant) = | Constant.Unit n -> genUnit n | Constant.Measure n -> (genConstant n.Constant |> genNode (Constant.Node n.Constant)) - +> !- "<" - +> genMeasure n.Measure - +> !- ">" + +> genSingleTextNode n.Measure.LessThan + +> genMeasure n.Measure.Measure + +> genSingleTextNode n.Measure.GreaterThan |> genNode n let genMeasure (measure: Measure) = @@ -230,7 +230,7 @@ let genMeasure (measure: Measure) = +> genMeasure n.RightHandSide |> genNode n | Measure.Power n -> genMeasure n.Measure +> !- "^" +> genSingleTextNode n.Exponent |> genNode n - | Measure.Seq n -> col sepSpace n.Measures genMeasure + | Measure.Seq n -> col sepSpace n.Measures genMeasure |> genNode n | Measure.Multiple n -> genIdentListNode n | Measure.Paren n -> genSingleTextNode n.OpeningParen diff --git a/src/Fantomas.Core/SyntaxOak.fs b/src/Fantomas.Core/SyntaxOak.fs index e125779aac..2b61cbb4db 100644 --- a/src/Fantomas.Core/SyntaxOak.fs +++ b/src/Fantomas.Core/SyntaxOak.fs @@ -2630,9 +2630,9 @@ type UnitNode(openingParen: SingleTextNode, closingParen: SingleTextNode, range) member val OpeningParen = openingParen member val ClosingParen = closingParen -type ConstantMeasureNode(constant: Constant, measure: Measure, range) = +type ConstantMeasureNode(constant: Constant, measure: UnitOfMeasureNode, range) = inherit NodeBase(range) - override val Children: Node array = [| yield Constant.Node constant; yield Measure.Node measure |] + override val Children: Node array = [| yield Constant.Node constant; yield measure |] member val Constant = constant member val Measure = measure @@ -2745,6 +2745,15 @@ type TypeConstraint = | EnumOrDelegate n -> n | WhereSelfConstrained t -> Type.Node t +type UnitOfMeasureNode(lessThan: SingleTextNode, measure: Measure, greaterThan: SingleTextNode, range) = + inherit NodeBase(range) + + override val Children: Node array = [| yield lessThan; yield Measure.Node measure; yield greaterThan |] + + member val LessThan = lessThan + member val Measure = measure + member val GreaterThan = greaterThan + type MeasureOperatorNode(lhs: Measure, operator: SingleTextNode, rhs: Measure, range) = inherit NodeBase(range) From 6cb2a6d3926b027c39b30d729cbfa6533922cec5 Mon Sep 17 00:00:00 2001 From: dawe Date: Sun, 23 Jul 2023 18:14:19 +0200 Subject: [PATCH 6/6] changelog for release --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1b55fb0a2e..d8e1705e40 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Changelog -## [Unreleased] +## 6.1.2 - 2023-07-23 ### Changed * Update FCS to 'Add trivia information to SynConst.Measure', commit 7b5e12842d673b7daa467e0091378bf4acc95e4f