@@ -1561,18 +1561,23 @@ attributeListElements:
15611561attribute:
15621562 /* A custom attribute */
15631563 | path opt_HIGH_PRECEDENCE_APP opt_atomicExprAfterType
1564- { let arg = match $3 with None -> mkSynUnit $1.Range | Some e -> e
1565- ({ TypeName=$1; ArgExpr=arg; Target=None; AppliesToGetterAndSetter=false; Range=$1.Range } : SynAttribute) }
1564+ { let arg = match $3 with None -> mkSynUnit $1.Range | Some e -> e
1565+ let m = unionRanges $1.Range arg.Range
1566+ ({ TypeName=$1; ArgExpr=arg; Target=None; AppliesToGetterAndSetter=false; Range=m } : SynAttribute) }
15661567
15671568 /* A custom attribute with an attribute target */
15681569 | attributeTarget path opt_HIGH_PRECEDENCE_APP opt_atomicExprAfterType
1569- { let arg = match $4 with None -> mkSynUnit $2.Range | Some e -> e
1570- ({ TypeName=$2; ArgExpr=arg; Target=$1; AppliesToGetterAndSetter=false; Range=$2.Range } : SynAttribute) }
1570+ { let arg = match $4 with None -> mkSynUnit $2.Range | Some e -> e
1571+ let startRange = match $1 with Some (ident:Ident) -> ident.idRange | None -> $2.Range
1572+ let m = unionRanges startRange arg.Range
1573+ ({ TypeName=$2; ArgExpr=arg; Target=$1; AppliesToGetterAndSetter=false; Range=m } : SynAttribute) }
15711574
15721575 /* A custom attribute with an attribute target */
15731576 | attributeTarget OBLOCKBEGIN path oblockend opt_HIGH_PRECEDENCE_APP opt_atomicExprAfterType
15741577 { let arg = match $6 with None -> mkSynUnit $3.Range | Some e -> e
1575- ({ TypeName=$3; ArgExpr=arg; Target=$1; AppliesToGetterAndSetter=false; Range=$3.Range } : SynAttribute) }
1578+ let startRange = match $1 with Some ident -> ident.idRange | None -> $3.Range
1579+ let m = unionRanges startRange arg.Range
1580+ ({ TypeName=$3; ArgExpr=arg; Target=$1; AppliesToGetterAndSetter=false; Range=m } : SynAttribute) }
15761581
15771582
15781583/* The target of a custom attribute */
@@ -1863,7 +1868,7 @@ memberCore:
18631868 let xmlDoc = grabXmlDocAtRangeStart(parseState, attrs, rangeStart)
18641869 let memberFlags = Some (memFlagsBuilder SynMemberKind.Member)
18651870 let mWholeBindLhs = (mBindLhs, attrs) ||> unionRangeWithListBy (fun (a: SynAttributeList) -> a.Range)
1866- let trivia: SynBindingTrivia = { LetKeyword = None; EqualsRange = Some mEquals }
1871+ let trivia: SynBindingTrivia = { LetKeyword = None; EqualsRange = Some mEquals; ExternKeyword = None }
18671872 let binding = mkSynBinding (xmlDoc, bindingPat) (vis, $1, false, mWholeBindLhs, DebugPointAtBinding.NoneAtInvisible, optReturnType, $5, mRhs, [], attrs, memberFlags, trivia)
18681873 let memberRange = unionRanges rangeStart mRhs |> unionRangeWithXmlDoc xmlDoc
18691874 [ SynMemberDefn.Member (binding, memberRange) ]) }
@@ -1980,7 +1985,7 @@ classDefnMember:
19801985 let declPat = SynPat.LongIdent (SynLongIdent([mkSynId (rhs parseState 3) "new"], [], [None]), None, Some noInferredTypars, SynArgPats.Pats [$4], vis, rhs parseState 3)
19811986 // Check that 'SynPatForConstructorDecl' matches this correctly
19821987 assert (match declPat with SynPatForConstructorDecl _ -> true | _ -> false)
1983- let synBindingTrivia: SynBindingTrivia = { LetKeyword = None; EqualsRange = Some mEquals }
1988+ let synBindingTrivia: SynBindingTrivia = { LetKeyword = None; EqualsRange = Some mEquals; ExternKeyword = None }
19841989 [ SynMemberDefn.Member(SynBinding (None, SynBindingKind.Normal, false, false, $1, xmlDoc, valSynData, declPat, None, expr, mWholeBindLhs, DebugPointAtBinding.NoneAtInvisible, synBindingTrivia), m) ] }
19851990
19861991 | opt_attributes opt_declVisibility STATIC typeKeyword tyconDefn
@@ -2738,7 +2743,8 @@ hardwhiteDefnBindingsTerminator:
27382743/* An 'extern' DllImport function definition in C-style syntax */
27392744cPrototype:
27402745 | EXTERN cRetType opt_access ident opt_HIGH_PRECEDENCE_APP LPAREN externArgs rparen
2741- { let rty, vis, nm, args = $2, $3, $4, $7
2746+ { let mExtern = rhs parseState 1
2747+ let rty, vis, nm, args = $2, $3, $4, $7
27422748 let nmm = rhs parseState 3
27432749 let argsm = rhs parseState 6
27442750 let mBindLhs = lhs parseState
@@ -2755,10 +2761,11 @@ cPrototype:
27552761 let bindingPat = SynPat.LongIdent (SynLongIdent([nm], [], [None]), None, Some noInferredTypars, SynArgPats.Pats [SynPat.Tuple(false, args, argsm)], vis, nmm)
27562762 let mWholeBindLhs = (mBindLhs, attrs) ||> unionRangeWithListBy (fun (a: SynAttributeList) -> a.Range)
27572763 let xmlDoc = grabXmlDoc(parseState, attrs, 1)
2764+ let trivia = { LetKeyword = None; ExternKeyword = Some mExtern; EqualsRange = None }
27582765 let binding =
27592766 mkSynBinding
27602767 (xmlDoc, bindingPat)
2761- (vis, false, false, mWholeBindLhs, DebugPointAtBinding.NoneAtInvisible, Some rty, rhsExpr, mRhs, [], attrs, None, SynBindingTrivia.Zero )
2768+ (vis, false, false, mWholeBindLhs, DebugPointAtBinding.NoneAtInvisible, Some rty, rhsExpr, mRhs, [], attrs, None, trivia )
27622769 [], [binding]) }
27632770
27642771/* A list of arguments in an 'extern' DllImport function definition */
@@ -2877,7 +2884,7 @@ localBinding:
28772884 let mWhole = (unionRanges mLetKwd mRhs, attrs) ||> unionRangeWithListBy (fun (a: SynAttributeList) -> a.Range)
28782885 let spBind = if IsDebugPointBinding bindingPat expr then DebugPointAtBinding.Yes mWhole else DebugPointAtBinding.NoneAtLet
28792886 let mWholeBindLhs = (mBindLhs, attrs) ||> unionRangeWithListBy (fun (a: SynAttributeList) -> a.Range)
2880- let trivia: SynBindingTrivia = { LetKeyword = Some mLetKwd; EqualsRange = Some mEquals }
2887+ let trivia: SynBindingTrivia = { LetKeyword = Some mLetKwd; EqualsRange = Some mEquals; ExternKeyword = None }
28812888 mkSynBinding (xmlDoc, bindingPat) (vis, $1, $2, mWholeBindLhs, spBind, optReturnType, expr, mRhs, opts, attrs, None, trivia))
28822889 localBindingRange, localBindingBuilder }
28832890
@@ -2892,7 +2899,7 @@ localBinding:
28922899 let zeroWidthAtEnd = mEquals.EndRange
28932900 let rhsExpr = arbExpr("localBinding1", zeroWidthAtEnd)
28942901 let spBind = if IsDebugPointBinding bindingPat rhsExpr then DebugPointAtBinding.Yes mWhole else DebugPointAtBinding.NoneAtLet
2895- let trivia: SynBindingTrivia = { LetKeyword = Some mLetKwd; EqualsRange = Some mEquals }
2902+ let trivia: SynBindingTrivia = { LetKeyword = Some mLetKwd; EqualsRange = Some mEquals; ExternKeyword = None }
28962903 mkSynBinding (xmlDoc, bindingPat) (vis, $1, $2, mBindLhs, spBind, optReturnType, rhsExpr, mRhs, [], attrs, None, trivia))
28972904 mWhole, localBindingBuilder }
28982905
@@ -2905,7 +2912,7 @@ localBinding:
29052912 let localBindingBuilder =
29062913 (fun xmlDoc attrs vis mLetKwd ->
29072914 let spBind = DebugPointAtBinding.Yes (unionRanges mLetKwd mRhs)
2908- let trivia = { LetKeyword = Some mLetKwd; EqualsRange = None }
2915+ let trivia = { LetKeyword = Some mLetKwd; EqualsRange = None; ExternKeyword = None }
29092916 let rhsExpr = arbExpr("localBinding2", mRhs)
29102917 mkSynBinding (xmlDoc, bindingPat) (vis, $1, $2, mBindLhs, spBind, optReturnType, rhsExpr, mRhs, [], attrs, None, trivia))
29112918 mWhole, localBindingBuilder }
0 commit comments