Skip to content

Commit 08a5245

Browse files
authored
Merge pull request #2925 from dawedawe/add_measure_trivia
Adjust to optional lhs of SynMeasure.Divide
2 parents 41fe8d6 + 6cb2a6d commit 08a5245

File tree

7 files changed

+119
-20
lines changed

7 files changed

+119
-20
lines changed

CHANGELOG.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,14 @@
11
# Changelog
22

3+
## 6.1.2 - 2023-07-23
4+
5+
### Changed
6+
* Update FCS to 'Add trivia information to SynConst.Measure', commit 7b5e12842d673b7daa467e0091378bf4acc95e4f
7+
8+
### Fixed
9+
* Left out lhs in SynMeasure.Divide should not be restored as SynMeasure.One. [#2926](https://github.com/fsprojects/fantomas/issues/2926)
10+
* Block comments in measure are lost or restored twice and in wrong place. [#2927](https://github.com/fsprojects/fantomas/issues/2927)
11+
312
## 6.1.1 - 2023-06-29
413

514
### Changed

Directory.Build.props

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ Some common use cases include:
3939

4040
<!-- Versions -->
4141
<PropertyGroup>
42-
<FCSCommitHash>9c8b4192966e6554adc5dcc8973f2a23c8fa2722</FCSCommitHash>
42+
<FCSCommitHash>7b5e12842d673b7daa467e0091378bf4acc95e4f</FCSCommitHash>
4343
<StreamJsonRpcVersion>2.8.28</StreamJsonRpcVersion>
4444
<FSharpCoreVersion>6.0.1</FSharpCoreVersion>
4545
</PropertyGroup>

src/Fantomas.Core.Tests/SynConstTests.fs

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -726,3 +726,48 @@ let ``single digit constant`` () =
726726
{ config with
727727
InsertFinalNewline = false }
728728
|> should equal "1"
729+
730+
[<Test>]
731+
let ``left out lhs in SynMeasure.Divide should not be restored as SynMeasure.One, 2926`` () =
732+
formatSourceString
733+
false
734+
"""
735+
234</kg>
736+
"""
737+
config
738+
|> prepend newline
739+
|> should
740+
equal
741+
"""
742+
234< / kg>
743+
"""
744+
745+
[<Test>]
746+
let ``explicit SynMeasure.One in SynMeasure.Divide should be preserved`` () =
747+
formatSourceString
748+
false
749+
"""
750+
234<1/kg>
751+
"""
752+
config
753+
|> prepend newline
754+
|> should
755+
equal
756+
"""
757+
234<1 / kg>
758+
"""
759+
760+
[<Test>]
761+
let ``block comments in measure are lost or restored twice and in wrong place, 2927`` () =
762+
formatSourceString
763+
false
764+
"""
765+
234<(* foo *)kg(* bar *)>
766+
"""
767+
config
768+
|> prepend newline
769+
|> should
770+
equal
771+
"""
772+
234< (* foo *) kg (* bar *) >
773+
"""

src/Fantomas.Core/ASTTransformer.fs

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -150,24 +150,37 @@ let mkConstant (creationAide: CreationAide) c r : Constant =
150150
$"\"{content}\"B"
151151

152152
stn (creationAide.TextFromSource fallback r) r |> Constant.FromText
153-
| SynConst.Measure(c, numberRange, measure) ->
154-
ConstantMeasureNode(mkConstant creationAide c numberRange, mkMeasure creationAide measure, r)
153+
| SynConst.Measure(c, numberRange, measure, trivia) ->
154+
let uOfMRange =
155+
mkRange trivia.LessRange.FileName trivia.LessRange.Start trivia.GreaterRange.End
156+
157+
let unitOfMeasure =
158+
UnitOfMeasureNode(
159+
stn "<" trivia.LessRange,
160+
mkMeasure creationAide measure,
161+
stn ">" trivia.GreaterRange,
162+
uOfMRange
163+
)
164+
165+
ConstantMeasureNode(mkConstant creationAide c numberRange, unitOfMeasure, r)
155166
|> Constant.Measure
156167
| SynConst.SourceIdentifier(c, _, r) -> stn c r |> Constant.FromText
157168

158169
let mkMeasure (creationAide: CreationAide) (measure: SynMeasure) : Measure =
159170
match measure with
160171
| SynMeasure.Var(typar, _) -> mkSynTypar typar |> Measure.Single
161172
| SynMeasure.Anon m -> stn "_" m |> Measure.Single
162-
| SynMeasure.One -> stn "1" Range.Zero |> Measure.Single
173+
| SynMeasure.One m -> stn "1" m |> Measure.Single
163174
| SynMeasure.Product(m1, m2, m) ->
164175
MeasureOperatorNode(mkMeasure creationAide m1, stn "*" Range.Zero, mkMeasure creationAide m2, m)
165176
|> Measure.Operator
166177
| SynMeasure.Divide(m1, m2, m) ->
167-
MeasureOperatorNode(mkMeasure creationAide m1, stn "/" Range.Zero, mkMeasure creationAide m2, m)
168-
|> Measure.Operator
178+
let lhs = m1 |> Option.map (mkMeasure creationAide)
179+
180+
MeasureDivideNode(lhs, stn "/" Range.Zero, mkMeasure creationAide m2, m)
181+
|> Measure.Divide
169182
| SynMeasure.Power(ms, rat, m) ->
170-
MeasurePowerNode(mkMeasure creationAide ms, stn (mkSynRationalConst rat) Range.Zero, m)
183+
MeasurePowerNode(mkMeasure creationAide ms, stn (mkSynRationalConst creationAide rat) Range.Zero, m)
171184
|> Measure.Power
172185
| SynMeasure.Named(lid, _) -> mkLongIdent lid |> Measure.Multiple
173186
| SynMeasure.Paren(measure, StartEndRange 1 (mOpen, m, mClose)) ->
@@ -1991,12 +2004,13 @@ let mkSynValTyparDecls (creationAide: CreationAide) (vt: SynValTyparDecls option
19912004
| None -> None
19922005
| Some(SynValTyparDecls(tds, _)) -> Option.map (mkSynTyparDecls creationAide) tds
19932006

1994-
let mkSynRationalConst rc =
2007+
let mkSynRationalConst (creationAide: CreationAide) rc =
19952008
let rec visit rc =
19962009
match rc with
1997-
| SynRationalConst.Integer i -> string i
1998-
| SynRationalConst.Rational(numerator, denominator, _) -> $"(%i{numerator}/%i{denominator})"
1999-
| SynRationalConst.Negate innerRc -> $"-{visit innerRc}"
2010+
| SynRationalConst.Integer(i, range) -> creationAide.TextFromSource (fun () -> string i) range
2011+
| SynRationalConst.Rational(numerator = numerator; denominator = denominator) ->
2012+
$"(%i{numerator}/%i{denominator})"
2013+
| SynRationalConst.Negate(rationalConst = innerRc) -> $"-{visit innerRc}"
20002014

20012015
visit rc
20022016

@@ -2097,7 +2111,7 @@ let mkType (creationAide: CreationAide) (t: SynType) : Type =
20972111
TypeHashConstraintNode(stn "#" mHash, mkType creationAide t, typeRange)
20982112
|> Type.HashConstraint
20992113
| SynType.MeasurePower(t, rc, _) ->
2100-
TypeMeasurePowerNode(mkType creationAide t, mkSynRationalConst rc, typeRange)
2114+
TypeMeasurePowerNode(mkType creationAide t, mkSynRationalConst creationAide rc, typeRange)
21012115
|> Type.MeasurePower
21022116
| SynType.StaticConstant(SynConst.String(null, kind, mString), r) ->
21032117
mkConstant creationAide (SynConst.String("null", kind, mString)) r
@@ -2656,7 +2670,7 @@ let mkMemberDefn (creationAide: CreationAide) (md: SynMemberDefn) =
26562670
memberDefn = SynBinding(
26572671
attributes = ats
26582672
xmlDoc = px
2659-
valData = SynValData(Some { MemberKind = SynMemberKind.Constructor }, _, ido)
2673+
valData = SynValData(Some { MemberKind = SynMemberKind.Constructor }, _, ido, _)
26602674
headPat = SynPat.LongIdent(
26612675
longDotId = SynLongIdent(id = [ newIdent ])
26622676
argPats = SynArgPats.Pats [ SynPat.Paren _ as pat ]

src/Fantomas.Core/CodePrinter.fs

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -207,9 +207,9 @@ let genConstant (c: Constant) =
207207
| Constant.Unit n -> genUnit n
208208
| Constant.Measure n ->
209209
(genConstant n.Constant |> genNode (Constant.Node n.Constant))
210-
+> !- "<"
211-
+> genMeasure n.Measure
212-
+> !- ">"
210+
+> genSingleTextNode n.Measure.LessThan
211+
+> genMeasure n.Measure.Measure
212+
+> genSingleTextNode n.Measure.GreaterThan
213213
|> genNode n
214214

215215
let genMeasure (measure: Measure) =
@@ -222,8 +222,15 @@ let genMeasure (measure: Measure) =
222222
+> sepSpace
223223
+> genMeasure n.RightHandSide
224224
|> genNode n
225+
| Measure.Divide n ->
226+
optSingle genMeasure n.LeftHandSide
227+
+> sepSpace
228+
+> genSingleTextNode n.Operator
229+
+> sepSpace
230+
+> genMeasure n.RightHandSide
231+
|> genNode n
225232
| Measure.Power n -> genMeasure n.Measure +> !- "^" +> genSingleTextNode n.Exponent |> genNode n
226-
| Measure.Seq n -> col sepSpace n.Measures genMeasure
233+
| Measure.Seq n -> col sepSpace n.Measures genMeasure |> genNode n
227234
| Measure.Multiple n -> genIdentListNode n
228235
| Measure.Paren n ->
229236
genSingleTextNode n.OpeningParen

src/Fantomas.Core/SyntaxOak.fs

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2630,9 +2630,9 @@ type UnitNode(openingParen: SingleTextNode, closingParen: SingleTextNode, range)
26302630
member val OpeningParen = openingParen
26312631
member val ClosingParen = closingParen
26322632

2633-
type ConstantMeasureNode(constant: Constant, measure: Measure, range) =
2633+
type ConstantMeasureNode(constant: Constant, measure: UnitOfMeasureNode, range) =
26342634
inherit NodeBase(range)
2635-
override val Children: Node array = [| yield Constant.Node constant; yield Measure.Node measure |]
2635+
override val Children: Node array = [| yield Constant.Node constant; yield measure |]
26362636
member val Constant = constant
26372637
member val Measure = measure
26382638

@@ -2745,6 +2745,15 @@ type TypeConstraint =
27452745
| EnumOrDelegate n -> n
27462746
| WhereSelfConstrained t -> Type.Node t
27472747

2748+
type UnitOfMeasureNode(lessThan: SingleTextNode, measure: Measure, greaterThan: SingleTextNode, range) =
2749+
inherit NodeBase(range)
2750+
2751+
override val Children: Node array = [| yield lessThan; yield Measure.Node measure; yield greaterThan |]
2752+
2753+
member val LessThan = lessThan
2754+
member val Measure = measure
2755+
member val GreaterThan = greaterThan
2756+
27482757
type MeasureOperatorNode(lhs: Measure, operator: SingleTextNode, rhs: Measure, range) =
27492758
inherit NodeBase(range)
27502759

@@ -2754,6 +2763,19 @@ type MeasureOperatorNode(lhs: Measure, operator: SingleTextNode, rhs: Measure, r
27542763
member val Operator = operator
27552764
member val RightHandSide = rhs
27562765

2766+
type MeasureDivideNode(lhs: Measure option, operator: SingleTextNode, rhs: Measure, range) =
2767+
inherit NodeBase(range)
2768+
2769+
override val Children: Node array =
2770+
[| if Option.isSome lhs then
2771+
yield Measure.Node lhs.Value
2772+
yield operator
2773+
yield Measure.Node rhs |]
2774+
2775+
member val LeftHandSide = lhs
2776+
member val Operator = operator
2777+
member val RightHandSide = rhs
2778+
27572779
type MeasurePowerNode(measure: Measure, exponent: SingleTextNode, range) =
27582780
inherit NodeBase(range)
27592781
override val Children: Node array = [| yield Measure.Node measure; yield exponent |]
@@ -2778,6 +2800,7 @@ type MeasureParenNode(openingParen: SingleTextNode, measure: Measure, closingPar
27782800
type Measure =
27792801
| Single of SingleTextNode
27802802
| Operator of MeasureOperatorNode
2803+
| Divide of MeasureDivideNode
27812804
| Power of MeasurePowerNode
27822805
| Multiple of IdentListNode
27832806
| Seq of MeasureSequenceNode
@@ -2787,6 +2810,7 @@ type Measure =
27872810
match m with
27882811
| Single n -> n
27892812
| Operator n -> n
2813+
| Divide n -> n
27902814
| Power n -> n
27912815
| Multiple n -> n
27922816
| Seq n -> n

src/Fantomas.FCS/Parse.fs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -407,7 +407,7 @@ let EmptyParsedInput (filename, isLastCompiland) =
407407
)
408408

409409
let createLexbuf langVersion sourceText =
410-
UnicodeLexing.SourceTextAsLexbuf(true, LanguageVersion(langVersion), sourceText)
410+
UnicodeLexing.SourceTextAsLexbuf(true, LanguageVersion(langVersion), None, sourceText)
411411

412412
let createLexerFunction (defines: string list) lexbuf (errorLogger: CapturingDiagnosticsLogger) =
413413
let lightStatus = IndentationAwareSyntaxStatus(true, true)

0 commit comments

Comments
 (0)