未验证 提交 5bf11999 编写于 作者: F Florian Verdonck 提交者: GitHub

Add equals token SynValSigTrivia. (#13210)

Include optional expression in the range if present.
上级 5b1a3ae5
......@@ -161,5 +161,6 @@ type SynModuleOrNamespaceSigTrivia =
[<NoEquality; NoComparison>]
type SynValSigTrivia =
{ ValKeyword: range option
WithKeyword: range option }
static member Zero: SynValSigTrivia = { ValKeyword = None; WithKeyword = None }
WithKeyword: range option
EqualsRange: range option }
static member Zero: SynValSigTrivia = { ValKeyword = None; WithKeyword = None; EqualsRange = None }
......@@ -318,6 +318,9 @@ type SynValSigTrivia =
/// The syntax range of the `with` keyword
WithKeyword: range option
/// The syntax range of the `=` token.
EqualsRange: range option
}
static member Zero: SynValSigTrivia
......@@ -860,24 +860,32 @@ moduleSpfn:
valSpfn:
| opt_attributes opt_declVisibility VAL opt_attributes opt_inline opt_mutable opt_access nameop opt_explicitValTyparDecls COLON topTypeWithTypeConstraints optLiteralValueSpfn
{ if Option.isSome $2 then errorR(Error(FSComp.SR.parsVisibilityDeclarationsShouldComePriorToIdentifier(), rhs parseState 2))
let attr1, attr2, isInline, isMutable, vis2, id, doc, explicitValTyparDecls, (ty, arity), konst = ($1), ($4), ($5), ($6), ($7), ($8), grabXmlDoc(parseState, $1, 1), ($9), ($11), ($12)
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)
if not (isNil attr2) then errorR(Deprecated(FSComp.SR.parsAttributesMustComeBeforeVal(), rhs parseState 4))
let m = rhs2 parseState 1 11 |> unionRangeWithXmlDoc doc
let m =
rhs2 parseState 1 11
|> unionRangeWithXmlDoc doc
|> fun m ->
match konst with
| None -> m
| Some e -> unionRanges m e.Range
let mVal = rhs parseState 3
let valSpfn = SynValSig((attr1@attr2), id, explicitValTyparDecls, ty, arity, isInline, isMutable, doc, vis2, konst, m, { ValKeyword = Some mVal; WithKeyword = None })
let valSpfn = SynValSig((attr1@attr2), id, explicitValTyparDecls, ty, arity, isInline, isMutable, doc, vis2, konst, m, { ValKeyword = Some mVal; WithKeyword = None; EqualsRange = mEquals })
SynModuleSigDecl.Val(valSpfn, m)
}
/* The optional literal value on a literal specification in a signature */
optLiteralValueSpfn:
| /* EMPTY */
{ None }
{ None, None }
| EQUALS declExpr
{ Some($2) }
{ let mEquals = rhs parseState 1
Some(mEquals), Some($2) }
| EQUALS OBLOCKBEGIN declExpr oblockend opt_ODECLEND
{ Some($3) }
{ let mEquals = rhs parseState 1
Some(mEquals), Some($3) }
/* A block of definitions in a module in a signature file */
......@@ -1059,7 +1067,7 @@ classSpfnMembersAtLeastOne:
classMemberSpfn:
| opt_attributes opt_declVisibility memberSpecFlags opt_inline opt_access nameop opt_explicitValTyparDecls COLON topTypeWithTypeConstraints classMemberSpfnGetSet optLiteralValueSpfn
{ if Option.isSome $2 then errorR(Error(FSComp.SR.parsVisibilityDeclarationsShouldComePriorToIdentifier(), rhs parseState 2))
let isInline, doc, vis2, id, explicitValTyparDecls, (ty, arity), optLiteralValue = $4, grabXmlDoc(parseState, $1, 1), $5, $6, $7, $9, $11
let isInline, doc, vis2, id, explicitValTyparDecls, (ty, arity), (mEquals, optLiteralValue) = $4, grabXmlDoc(parseState, $1, 1), $5, $6, $7, $9, $11
let mWith, getSetRangeOpt, getSet = $10
let getSetAdjuster arity = match arity, getSet with SynValInfo([], _), SynMemberKind.Member -> SynMemberKind.PropertyGet | _ -> getSet
let wholeRange =
......@@ -1069,7 +1077,11 @@ classMemberSpfn:
| Some m2 -> unionRanges m m2
|> fun m -> (m, $1) ||> unionRangeWithListBy (fun (a: SynAttributeList) -> a.Range)
|> unionRangeWithXmlDoc doc
let valSpfn = SynValSig($1, id, explicitValTyparDecls, ty, arity, isInline, false, doc, vis2, optLiteralValue, wholeRange, { ValKeyword = None; WithKeyword = mWith })
|> fun m ->
match optLiteralValue with
| None -> m
| Some e -> unionRanges m e.Range
let valSpfn = SynValSig($1, id, explicitValTyparDecls, ty, arity, isInline, false, doc, vis2, optLiteralValue, wholeRange, { ValKeyword = None; WithKeyword = mWith; EqualsRange = mEquals })
let _, flags = $3
SynMemberSig.Member(valSpfn, flags (getSetAdjuster arity), wholeRange) }
......@@ -2102,7 +2114,7 @@ classDefnMember:
| Some m2 -> unionRanges m m2
|> unionRangeWithXmlDoc doc
if Option.isSome $2 then errorR(Error(FSComp.SR.parsAccessibilityModsIllegalForAbstract(), wholeRange))
let valSpfn = SynValSig($1, id, explicitValTyparDecls, ty, arity, isInline, false, doc, None, None, wholeRange, { ValKeyword = None; WithKeyword = mWith })
let valSpfn = SynValSig($1, id, explicitValTyparDecls, ty, arity, isInline, false, doc, None, None, wholeRange, { ValKeyword = None; WithKeyword = mWith; EqualsRange = None })
[ SynMemberDefn.AbstractSlot(valSpfn, AbstractMemberFlags $3 (getSetAdjuster arity), wholeRange) ] }
| opt_attributes opt_declVisibility inheritsDefn
......
......@@ -9462,12 +9462,14 @@ FSharp.Compiler.SyntaxTrivia.SynUnionCaseTrivia: Void .ctor(Microsoft.FSharp.Cor
FSharp.Compiler.SyntaxTrivia.SynValSigTrivia
FSharp.Compiler.SyntaxTrivia.SynValSigTrivia: FSharp.Compiler.SyntaxTrivia.SynValSigTrivia Zero
FSharp.Compiler.SyntaxTrivia.SynValSigTrivia: FSharp.Compiler.SyntaxTrivia.SynValSigTrivia get_Zero()
FSharp.Compiler.SyntaxTrivia.SynValSigTrivia: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] EqualsRange
FSharp.Compiler.SyntaxTrivia.SynValSigTrivia: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] ValKeyword
FSharp.Compiler.SyntaxTrivia.SynValSigTrivia: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] WithKeyword
FSharp.Compiler.SyntaxTrivia.SynValSigTrivia: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] get_EqualsRange()
FSharp.Compiler.SyntaxTrivia.SynValSigTrivia: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] get_ValKeyword()
FSharp.Compiler.SyntaxTrivia.SynValSigTrivia: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] get_WithKeyword()
FSharp.Compiler.SyntaxTrivia.SynValSigTrivia: System.String ToString()
FSharp.Compiler.SyntaxTrivia.SynValSigTrivia: Void .ctor(Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range])
FSharp.Compiler.SyntaxTrivia.SynValSigTrivia: Void .ctor(Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range])
FSharp.Compiler.Text.ISourceText
FSharp.Compiler.Text.ISourceText: Boolean ContentEquals(FSharp.Compiler.Text.ISourceText)
FSharp.Compiler.Text.ISourceText: Boolean SubTextEquals(System.String, Int32)
......
......@@ -1930,6 +1930,49 @@ val a : int
assertRange (6, 0) (6, 3) mVal
| _ -> Assert.Fail "Could not get valid AST"
[<Test>]
let ``Equals token is present in SynValSig value`` () =
let parseResults =
getParseResultsOfSignatureFile
"""
module Meh
val a : int = 9
"""
match parseResults with
| ParsedInput.SigFile (ParsedSigFileInput (modules=[
SynModuleOrNamespaceSig(decls=[
SynModuleSigDecl.Val(valSig = SynValSig(trivia = { EqualsRange = Some mEquals }); range = mVal)
] ) ])) ->
assertRange (4, 12) (4, 13) mEquals
assertRange (4, 0) (4, 15) mVal
| _ -> Assert.Fail "Could not get valid AST"
[<Test>]
let ``Equals token is present in SynValSig member`` () =
let parseResults =
getParseResultsOfSignatureFile
"""
module Meh
type X =
member a : int = 10
"""
match parseResults with
| ParsedInput.SigFile (ParsedSigFileInput (modules=[
SynModuleOrNamespaceSig(decls=[
SynModuleSigDecl.Types(types = [
SynTypeDefnSig(typeRepr = SynTypeDefnSigRepr.ObjectModel(memberSigs = [
SynMemberSig.Member(memberSig = SynValSig(trivia = { EqualsRange = Some mEquals }); range = mMember)
]))
])
] ) ])) ->
assertRange (5, 19) (5, 20) mEquals
assertRange (5, 4) (5, 23) mMember
| _ -> Assert.Fail "Could not get valid AST"
module SynMatchClause =
[<Test>]
let ``Range of single SynMatchClause`` () =
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册