diff --git a/CHANGELOG.md b/CHANGELOG.md index 1aeeaee8bf..d8e1705e40 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,14 @@ # Changelog +## 6.1.2 - 2023-07-23 + +### 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) +* 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 ### Changed diff --git a/Directory.Build.props b/Directory.Build.props index 6da587b5d8..6b1736892e 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -39,7 +39,7 @@ Some common use cases include: - 9c8b4192966e6554adc5dcc8973f2a23c8fa2722 + 7b5e12842d673b7daa467e0091378bf4acc95e4f 2.8.28 6.0.1 diff --git a/src/Fantomas.Core.Tests/SynConstTests.fs b/src/Fantomas.Core.Tests/SynConstTests.fs index cca6c7623f..b211999f9c 100644 --- a/src/Fantomas.Core.Tests/SynConstTests.fs +++ b/src/Fantomas.Core.Tests/SynConstTests.fs @@ -726,3 +726,48 @@ 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, 2926`` () = + formatSourceString + false + """ +234 +""" + config + |> prepend newline + |> should + equal + """ +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> +""" + +[] +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 e30c7e8982..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 @@ -159,15 +170,17 @@ 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) + 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)) -> @@ -1991,12 +2004,13 @@ 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 i -> string i - | SynRationalConst.Rational(numerator, denominator, _) -> $"(%i{numerator}/%i{denominator})" - | SynRationalConst.Negate innerRc -> $"-{visit innerRc}" + | 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}" visit rc @@ -2097,7 +2111,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 @@ -2656,7 +2670,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 ] diff --git a/src/Fantomas.Core/CodePrinter.fs b/src/Fantomas.Core/CodePrinter.fs index 62e44fd43b..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) = @@ -222,8 +222,15 @@ let genMeasure (measure: Measure) = +> sepSpace +> genMeasure n.RightHandSide |> genNode n + | Measure.Divide n -> + optSingle genMeasure n.LeftHandSide + +> 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.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 ea9908ac92..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) @@ -2754,6 +2763,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 +2800,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 +2810,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)