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)