Skip to content

Commit e30d14c

Browse files
authored
Include inline in trivia. (#14503)
1 parent 35971aa commit e30d14c

File tree

10 files changed

+170
-31
lines changed

10 files changed

+170
-31
lines changed

src/Compiler/SyntaxTree/ParseHelpers.fs

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -420,9 +420,9 @@ let (|GetIdent|SetIdent|OtherIdent|) (ident: Ident option) =
420420

421421
let mkSynMemberDefnGetSet
422422
(parseState: IParseState)
423-
(opt_inline: bool)
423+
(opt_inline: range option)
424424
(mWith: range)
425-
(classDefnMemberGetSetElements: (bool * SynAttributeList list * (SynPat * range) * (range option * SynReturnInfo) option * range option * SynExpr * range) list)
425+
(classDefnMemberGetSetElements: (range option * SynAttributeList list * (SynPat * range) * (range option * SynReturnInfo) option * range option * SynExpr * range) list)
426426
(mAnd: range option)
427427
(mWhole: range)
428428
(propertyNameBindingPat: SynPat)
@@ -441,15 +441,15 @@ let mkSynMemberDefnGetSet
441441

442442
let tryMkSynMemberDefnMember
443443
(
444-
optInline,
444+
mOptInline: range option,
445445
optAttrs: SynAttributeList list,
446446
(bindingPat, mBindLhs),
447447
optReturnType,
448448
mEquals,
449449
expr,
450450
mExpr
451451
) : (SynMemberDefn * Ident option) option =
452-
let optInline = opt_inline || optInline
452+
let optInline = Option.isSome opt_inline || Option.isSome mOptInline
453453
// optional attributes are only applied to getters and setters
454454
// the "top level" attrs will be applied to both
455455
let optAttrs =
@@ -469,6 +469,7 @@ let mkSynMemberDefnGetSet
469469
let trivia: SynBindingTrivia =
470470
{
471471
LeadingKeyword = leadingKeyword
472+
InlineKeyword = mOptInline
472473
EqualsRange = mEquals
473474
}
474475

@@ -729,6 +730,7 @@ let mkSynMemberDefnGetSet
729730
if getOrSet.idText = "get" then
730731
let trivia =
731732
{
733+
InlineKeyword = opt_inline
732734
WithKeyword = mWith
733735
GetKeyword = Some getOrSet.idRange
734736
AndKeyword = None
@@ -739,6 +741,7 @@ let mkSynMemberDefnGetSet
739741
else
740742
let trivia =
741743
{
744+
InlineKeyword = opt_inline
742745
WithKeyword = mWith
743746
GetKeyword = None
744747
AndKeyword = None
@@ -759,6 +762,7 @@ let mkSynMemberDefnGetSet
759762

760763
let trivia =
761764
{
765+
InlineKeyword = opt_inline
762766
WithKeyword = mWith
763767
GetKeyword = Some mGet
764768
AndKeyword = mAnd
@@ -772,20 +776,23 @@ let mkSynMemberDefnGetSet
772776
match getOrSet with
773777
| GetIdent mGet ->
774778
{
779+
InlineKeyword = opt_inline
775780
WithKeyword = mWith
776781
GetKeyword = Some mGet
777782
AndKeyword = mAnd
778783
SetKeyword = None
779784
}
780785
| SetIdent mSet ->
781786
{
787+
InlineKeyword = opt_inline
782788
WithKeyword = mWith
783789
GetKeyword = None
784790
AndKeyword = mAnd
785791
SetKeyword = Some mSet
786792
}
787793
| OtherIdent ->
788794
{
795+
InlineKeyword = opt_inline
789796
WithKeyword = mWith
790797
AndKeyword = mAnd
791798
GetKeyword = None
@@ -899,6 +906,7 @@ let mkSynDoBinding (vis: SynAccess option, mDo, expr, m) =
899906
DebugPointAtBinding.NoneAtDo,
900907
{
901908
LeadingKeyword = SynLeadingKeyword.Do mDo
909+
InlineKeyword = None
902910
EqualsRange = None
903911
}
904912
)

src/Compiler/SyntaxTree/ParseHelpers.fsi

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -164,9 +164,9 @@ val raiseParseErrorAt: range -> (int * string) -> 'a
164164

165165
val mkSynMemberDefnGetSet:
166166
parseState: IParseState ->
167-
opt_inline: bool ->
167+
opt_inline: range option ->
168168
mWith: range ->
169-
classDefnMemberGetSetElements: (bool * SynAttributeList list * (SynPat * range) * (range option * SynReturnInfo) option * range option * SynExpr * range) list ->
169+
classDefnMemberGetSetElements: (range option * SynAttributeList list * (SynPat * range) * (range option * SynReturnInfo) option * range option * SynExpr * range) list ->
170170
mAnd: range option ->
171171
mWhole: range ->
172172
propertyNameBindingPat: SynPat ->

src/Compiler/SyntaxTree/SyntaxTrivia.fs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,12 +224,14 @@ type SynLeadingKeyword =
224224
type SynBindingTrivia =
225225
{
226226
LeadingKeyword: SynLeadingKeyword
227+
InlineKeyword: range option
227228
EqualsRange: range option
228229
}
229230

230231
static member Zero: SynBindingTrivia =
231232
{
232233
LeadingKeyword = SynLeadingKeyword.Synthetic
234+
InlineKeyword = None
233235
EqualsRange = None
234236
}
235237

@@ -288,13 +290,15 @@ type SynModuleOrNamespaceSigTrivia =
288290
type SynValSigTrivia =
289291
{
290292
LeadingKeyword: SynLeadingKeyword
293+
InlineKeyword: range option
291294
WithKeyword: range option
292295
EqualsRange: range option
293296
}
294297

295298
static member Zero: SynValSigTrivia =
296299
{
297300
LeadingKeyword = SynLeadingKeyword.Synthetic
301+
InlineKeyword = None
298302
WithKeyword = None
299303
EqualsRange = None
300304
}
@@ -305,6 +309,7 @@ type SynTypeFunTrivia = { ArrowRange: range }
305309
[<NoEquality; NoComparison>]
306310
type SynMemberGetSetTrivia =
307311
{
312+
InlineKeyword: range option
308313
WithKeyword: range
309314
GetKeyword: range option
310315
AndKeyword: range option

src/Compiler/SyntaxTree/SyntaxTrivia.fsi

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,9 @@ type SynBindingTrivia =
287287
/// Used leading keyword of SynBinding
288288
LeadingKeyword: SynLeadingKeyword
289289

290+
/// The syntax range of the `inline` keyword
291+
InlineKeyword: range option
292+
290293
/// The syntax range of the `=` token.
291294
EqualsRange: range option
292295
}
@@ -362,6 +365,9 @@ type SynValSigTrivia =
362365
/// but in case of `SynMemberDefn.AutoProperty` or `SynMemberDefn.AbstractSlot` it could be something else.
363366
LeadingKeyword: SynLeadingKeyword
364367

368+
/// The syntax range of the `inline` keyword
369+
InlineKeyword: range option
370+
365371
/// The syntax range of the `with` keyword
366372
WithKeyword: range option
367373

@@ -383,6 +389,9 @@ type SynTypeFunTrivia =
383389
[<NoEquality; NoComparison>]
384390
type SynMemberGetSetTrivia =
385391
{
392+
/// The syntax range of the `inline` keyword
393+
InlineKeyword: range option
394+
386395
/// The syntax range of the `with` keyword
387396
WithKeyword: range
388397

src/Compiler/pars.fsy

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -695,7 +695,7 @@ moduleSpfn:
695695
valSpfn:
696696
| opt_attributes opt_access VAL opt_attributes opt_inline opt_mutable opt_access nameop opt_explicitValTyparDecls COLON topTypeWithTypeConstraints optLiteralValueSpfn
697697
{ if Option.isSome $2 then errorR(Error(FSComp.SR.parsVisibilityDeclarationsShouldComePriorToIdentifier(), rhs parseState 2))
698-
let attr1, attr2, isInline, isMutable, vis2, id, doc, explicitValTyparDecls, (ty, arity), (mEquals, konst: SynExpr option) = ($1), ($4), ($5), ($6), ($7), ($8), grabXmlDoc(parseState, $1, 1), ($9), ($11), ($12)
698+
let attr1, attr2, isInline, isMutable, vis2, id, doc, explicitValTyparDecls, (ty, arity), (mEquals, konst: SynExpr option) = ($1), ($4), (Option.isSome $5), ($6), ($7), ($8), grabXmlDoc(parseState, $1, 1), ($9), ($11), ($12)
699699
if not (isNil attr2) then errorR(Deprecated(FSComp.SR.parsAttributesMustComeBeforeVal(), rhs parseState 4))
700700
let m =
701701
rhs2 parseState 1 11
@@ -705,7 +705,7 @@ valSpfn:
705705
| None -> m
706706
| Some e -> unionRanges m e.Range
707707
let mVal = rhs parseState 3
708-
let trivia: SynValSigTrivia = { LeadingKeyword = SynLeadingKeyword.Val mVal; WithKeyword = None; EqualsRange = mEquals }
708+
let trivia: SynValSigTrivia = { LeadingKeyword = SynLeadingKeyword.Val mVal; InlineKeyword = $5; WithKeyword = None; EqualsRange = mEquals }
709709
let valSpfn = SynValSig((attr1@attr2), id, explicitValTyparDecls, ty, arity, isInline, isMutable, doc, vis2, konst, m, trivia)
710710
SynModuleSigDecl.Val(valSpfn, m)
711711
}
@@ -913,7 +913,7 @@ classSpfnMembersAtLeastOne:
913913
classMemberSpfn:
914914
| opt_attributes opt_access memberSpecFlags opt_inline opt_access nameop opt_explicitValTyparDecls COLON topTypeWithTypeConstraints classMemberSpfnGetSet optLiteralValueSpfn
915915
{ if Option.isSome $2 then errorR(Error(FSComp.SR.parsVisibilityDeclarationsShouldComePriorToIdentifier(), rhs parseState 2))
916-
let isInline, doc, vis2, id, explicitValTyparDecls, (ty, arity), (mEquals, optLiteralValue) = $4, grabXmlDoc(parseState, $1, 1), $5, $6, $7, $9, $11
916+
let isInline, doc, vis2, id, explicitValTyparDecls, (ty, arity), (mEquals, optLiteralValue) = (Option.isSome $4), grabXmlDoc(parseState, $1, 1), $5, $6, $7, $9, $11
917917
let mWith, (getSet, getSetRangeOpt) = $10
918918
let getSetAdjuster arity = match arity, getSet with SynValInfo([], _), SynMemberKind.Member -> SynMemberKind.PropertyGet | _ -> getSet
919919
let mWhole =
@@ -930,7 +930,7 @@ classMemberSpfn:
930930

931931
let flags, leadingKeyword = $3
932932
let flags = flags (getSetAdjuster arity)
933-
let trivia = { LeadingKeyword = leadingKeyword; WithKeyword = mWith; EqualsRange = mEquals }
933+
let trivia = { LeadingKeyword = leadingKeyword; InlineKeyword = $4; WithKeyword = mWith; EqualsRange = mEquals }
934934
let valSpfn = SynValSig($1, id, explicitValTyparDecls, ty, arity, isInline, false, doc, vis2, optLiteralValue, mWhole, trivia)
935935
let trivia: SynMemberSigMemberTrivia = { GetSetKeywords = getSetRangeOpt }
936936
SynMemberSig.Member(valSpfn, flags, mWhole, trivia) }
@@ -970,7 +970,7 @@ classMemberSpfn:
970970
let mNew = rhs parseState 3
971971
let m = unionRanges (rhs parseState 1) ty.Range |> unionRangeWithXmlDoc doc
972972
let isInline = false
973-
let trivia: SynValSigTrivia = { LeadingKeyword = SynLeadingKeyword.New mNew; WithKeyword = None; EqualsRange = None }
973+
let trivia: SynValSigTrivia = { LeadingKeyword = SynLeadingKeyword.New mNew; InlineKeyword = None; WithKeyword = None; EqualsRange = None }
974974
let valSpfn = SynValSig ($1, (SynIdent(mkSynId (rhs parseState 3) "new", None)), noInferredTypars, ty, valSynInfo, isInline, false, doc, vis, None, m, trivia)
975975
SynMemberSig.Member(valSpfn, CtorMemberFlags, m, SynMemberSigMemberTrivia.Zero) }
976976

@@ -1740,8 +1740,8 @@ memberCore:
17401740
let memFlagsBuilder, leadingKeyword = flagsBuilderAndLeadingKeyword
17411741
let memberFlags = memFlagsBuilder SynMemberKind.Member
17421742
let mWholeBindLhs = (mBindLhs, attrs) ||> unionRangeWithListBy (fun (a: SynAttributeList) -> a.Range)
1743-
let trivia: SynBindingTrivia = { LeadingKeyword = leadingKeyword; EqualsRange = Some mEquals }
1744-
let binding = mkSynBinding (xmlDoc, bindingPat) (vis, $1, false, mWholeBindLhs, DebugPointAtBinding.NoneAtInvisible, optReturnType, $5, mRhs, [], attrs, Some memberFlags, trivia)
1743+
let trivia: SynBindingTrivia = { LeadingKeyword = leadingKeyword; InlineKeyword = $1; EqualsRange = Some mEquals }
1744+
let binding = mkSynBinding (xmlDoc, bindingPat) (vis, (Option.isSome $1), false, mWholeBindLhs, DebugPointAtBinding.NoneAtInvisible, optReturnType, $5, mRhs, [], attrs, Some memberFlags, trivia)
17451745
let memberRange = unionRanges rangeStart mRhs |> unionRangeWithXmlDoc xmlDoc
17461746
[ SynMemberDefn.Member (binding, memberRange) ]) }
17471747

@@ -1819,7 +1819,7 @@ classDefnMember:
18191819

18201820
| opt_attributes opt_access abstractMemberFlags opt_inline nameop opt_explicitValTyparDecls COLON topTypeWithTypeConstraints classMemberSpfnGetSet opt_ODECLEND
18211821
{ let ty, arity = $8
1822-
let isInline, doc, id, explicitValTyparDecls = $4, grabXmlDoc(parseState, $1, 1), $5, $6
1822+
let isInline, doc, id, explicitValTyparDecls = (Option.isSome $4), grabXmlDoc(parseState, $1, 1), $5, $6
18231823
let mWith, (getSet, getSetRangeOpt) = $9
18241824
let getSetAdjuster arity = match arity, getSet with SynValInfo([], _), SynMemberKind.Member -> SynMemberKind.PropertyGet | _ -> getSet
18251825
let mWhole =
@@ -1830,7 +1830,7 @@ classDefnMember:
18301830
|> unionRangeWithXmlDoc doc
18311831
if Option.isSome $2 then errorR(Error(FSComp.SR.parsAccessibilityModsIllegalForAbstract(), mWhole))
18321832
let mkFlags, leadingKeyword = $3
1833-
let trivia = { LeadingKeyword = leadingKeyword; WithKeyword = mWith; EqualsRange = None }
1833+
let trivia = { LeadingKeyword = leadingKeyword; InlineKeyword = $4; WithKeyword = mWith; EqualsRange = None }
18341834
let valSpfn = SynValSig($1, id, explicitValTyparDecls, ty, arity, isInline, false, doc, None, None, mWhole, trivia)
18351835
let trivia: SynMemberDefnAbstractSlotTrivia = { GetSetKeywords = getSetRangeOpt }
18361836
[ SynMemberDefn.AbstractSlot(valSpfn, mkFlags (getSetAdjuster arity), mWhole, trivia) ] }
@@ -1870,7 +1870,7 @@ classDefnMember:
18701870
let declPat = SynPat.LongIdent (SynLongIdent([mkSynId (rhs parseState 3) "new"], [], [None]), None, Some noInferredTypars, SynArgPats.Pats [$4], vis, rhs parseState 3)
18711871
// Check that 'SynPatForConstructorDecl' matches this correctly
18721872
assert (match declPat with SynPatForConstructorDecl _ -> true | _ -> false)
1873-
let synBindingTrivia: SynBindingTrivia = { LeadingKeyword = SynLeadingKeyword.New mNew; EqualsRange = Some mEquals }
1873+
let synBindingTrivia: SynBindingTrivia = { LeadingKeyword = SynLeadingKeyword.New mNew; InlineKeyword = None; EqualsRange = Some mEquals }
18741874
[ SynMemberDefn.Member(SynBinding (None, SynBindingKind.Normal, false, false, $1, xmlDoc, valSynData, declPat, None, expr, mWholeBindLhs, DebugPointAtBinding.NoneAtInvisible, synBindingTrivia), m) ] }
18751875

18761876
| opt_attributes opt_access STATIC typeKeyword tyconDefn
@@ -2669,7 +2669,7 @@ cPrototype:
26692669
let bindingPat = SynPat.LongIdent (SynLongIdent([nm], [], [None]), None, Some noInferredTypars, SynArgPats.Pats [SynPat.Tuple(false, args, argsm)], vis, nmm)
26702670
let mWholeBindLhs = (mBindLhs, attrs) ||> unionRangeWithListBy (fun (a: SynAttributeList) -> a.Range)
26712671
let xmlDoc = grabXmlDoc(parseState, attrs, 1)
2672-
let trivia = { LeadingKeyword = SynLeadingKeyword.Extern mExtern; EqualsRange = None }
2672+
let trivia = { LeadingKeyword = SynLeadingKeyword.Extern mExtern; InlineKeyword = None; EqualsRange = None }
26732673
let binding =
26742674
mkSynBinding
26752675
(xmlDoc, bindingPat)
@@ -2792,8 +2792,8 @@ localBinding:
27922792
let mWhole = (unionRanges leadingKeyword.Range mRhs, attrs) ||> unionRangeWithListBy (fun (a: SynAttributeList) -> a.Range)
27932793
let spBind = if IsDebugPointBinding bindingPat expr then DebugPointAtBinding.Yes mWhole else DebugPointAtBinding.NoneAtLet
27942794
let mWholeBindLhs = (mBindLhs, attrs) ||> unionRangeWithListBy (fun (a: SynAttributeList) -> a.Range)
2795-
let trivia: SynBindingTrivia = { LeadingKeyword = leadingKeyword; EqualsRange = Some mEquals }
2796-
mkSynBinding (xmlDoc, bindingPat) (vis, $1, $2, mWholeBindLhs, spBind, optReturnType, expr, mRhs, opts, attrs, None, trivia))
2795+
let trivia: SynBindingTrivia = { LeadingKeyword = leadingKeyword; InlineKeyword = $1; EqualsRange = Some mEquals }
2796+
mkSynBinding (xmlDoc, bindingPat) (vis, Option.isSome $1, $2, mWholeBindLhs, spBind, optReturnType, expr, mRhs, opts, attrs, None, trivia))
27972797
localBindingRange, localBindingBuilder }
27982798

27992799
| opt_inline opt_mutable bindingPattern opt_topReturnTypeWithTypeConstraints EQUALS error
@@ -2807,8 +2807,8 @@ localBinding:
28072807
let zeroWidthAtEnd = mEquals.EndRange
28082808
let rhsExpr = arbExpr("localBinding1", zeroWidthAtEnd)
28092809
let spBind = if IsDebugPointBinding bindingPat rhsExpr then DebugPointAtBinding.Yes mWhole else DebugPointAtBinding.NoneAtLet
2810-
let trivia: SynBindingTrivia = { LeadingKeyword = leadingKeyword; EqualsRange = Some mEquals }
2811-
mkSynBinding (xmlDoc, bindingPat) (vis, $1, $2, mBindLhs, spBind, optReturnType, rhsExpr, mRhs, [], attrs, None, trivia))
2810+
let trivia: SynBindingTrivia = { LeadingKeyword = leadingKeyword; InlineKeyword = $1; EqualsRange = Some mEquals }
2811+
mkSynBinding (xmlDoc, bindingPat) (vis, Option.isSome $1, $2, mBindLhs, spBind, optReturnType, rhsExpr, mRhs, [], attrs, None, trivia))
28122812
mWhole, localBindingBuilder }
28132813

28142814
| opt_inline opt_mutable bindingPattern opt_topReturnTypeWithTypeConstraints recover
@@ -2820,9 +2820,9 @@ localBinding:
28202820
let localBindingBuilder =
28212821
(fun xmlDoc attrs vis (leadingKeyword: SynLeadingKeyword) ->
28222822
let spBind = DebugPointAtBinding.Yes (unionRanges leadingKeyword.Range mRhs)
2823-
let trivia = { LeadingKeyword = leadingKeyword; EqualsRange = None }
2823+
let trivia = { LeadingKeyword = leadingKeyword; InlineKeyword = $1; EqualsRange = None }
28242824
let rhsExpr = arbExpr("localBinding2", mRhs)
2825-
mkSynBinding (xmlDoc, bindingPat) (vis, $1, $2, mBindLhs, spBind, optReturnType, rhsExpr, mRhs, [], attrs, None, trivia))
2825+
mkSynBinding (xmlDoc, bindingPat) (vis, Option.isSome $1, $2, mBindLhs, spBind, optReturnType, rhsExpr, mRhs, [], attrs, None, trivia))
28262826
mWhole, localBindingBuilder }
28272827

28282828
/* A single expression with an optional type annotation, and an optional static optimization block */
@@ -5816,8 +5816,8 @@ opt_bar:
58165816
| /* EMPTY */ { }
58175817

58185818
opt_inline:
5819-
| INLINE { true }
5820-
| /* EMPTY */ { false }
5819+
| INLINE { Some (rhs parseState 1) }
5820+
| /* EMPTY */ { None }
58215821

58225822
opt_mutable:
58235823
| MUTABLE { true }

tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.Tests.fsproj

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,9 @@
131131
<Compile Include="..\service\SyntaxTreeTests\LeadingKeywordTests.fs">
132132
<Link>SyntaxTree\LeadingKeywordTests.fs</Link>
133133
</Compile>
134+
<Compile Include="..\service\SyntaxTreeTests\ValTests.fs">
135+
<Link>SyntaxTree\ValTests.fs</Link>
136+
</Compile>
134137
<Compile Include="..\service\FileSystemTests.fs">
135138
<Link>FileSystemTests.fs</Link>
136139
</Compile>

0 commit comments

Comments
 (0)