From 9108d64b170b6e50dd786266227692986a72ab7b Mon Sep 17 00:00:00 2001 From: nojaf Date: Wed, 2 Nov 2022 14:23:09 +0100 Subject: [PATCH 1/4] Add GetSetKeyword to trivia --- src/Compiler/Checking/CheckDeclarations.fs | 16 ++++----- src/Compiler/Checking/CheckExpressions.fs | 2 +- .../Service/ServiceInterfaceStubGenerator.fs | 2 +- src/Compiler/Service/ServiceNavigation.fs | 8 ++--- src/Compiler/Service/ServiceParseTreeWalk.fs | 2 +- src/Compiler/Service/ServiceParsedInputOps.fs | 8 ++--- src/Compiler/Service/ServiceStructure.fs | 4 +-- src/Compiler/Service/ServiceXmlDocParser.fs | 2 +- src/Compiler/SyntaxTree/SyntaxTree.fs | 4 +-- src/Compiler/SyntaxTree/SyntaxTree.fsi | 8 +++-- src/Compiler/SyntaxTree/SyntaxTrivia.fs | 16 +++++++++ src/Compiler/SyntaxTree/SyntaxTrivia.fsi | 20 +++++++++++ src/Compiler/pars.fsy | 19 +++++----- ...erService.SurfaceArea.netstandard.expected | 22 ++++++++++-- tests/service/SyntaxTreeTests/MemberTests.fs | 36 +++++++++++++++++-- 15 files changed, 130 insertions(+), 39 deletions(-) diff --git a/src/Compiler/Checking/CheckDeclarations.fs b/src/Compiler/Checking/CheckDeclarations.fs index e9272db3bc0..b3f6c8704d3 100644 --- a/src/Compiler/Checking/CheckDeclarations.fs +++ b/src/Compiler/Checking/CheckDeclarations.fs @@ -406,7 +406,7 @@ let private CheckDuplicatesAbstractMethodParmsSig (typeSpecs: SynTypeDefnSig li | SynTypeDefnSigRepr.ObjectModel(_, synMemberSigs, _) -> for sms in synMemberSigs do match sms with - | SynMemberSig.Member(synValSig, _, m) -> + | SynMemberSig.Member(memberSig = synValSig; range = m) -> CheckDuplicatesArgNames synValSig m | _ -> () | _ -> () @@ -601,7 +601,7 @@ let TcAndPublishMemberSpec cenv env containerInfo declKind tpenv memb = | SynMemberSig.ValField(_, m) -> error(Error(FSComp.SR.tcFieldValIllegalHere(), m)) | SynMemberSig.Inherit(_, m) -> error(Error(FSComp.SR.tcInheritIllegalHere(), m)) | SynMemberSig.NestedType(_, m) -> error(Error(FSComp.SR.tcTypesCannotContainNestedTypes(), m)) - | SynMemberSig.Member(synValSig, memberFlags, _) -> + | SynMemberSig.Member(memberSig = synValSig; flags = memberFlags) -> TcAndPublishValSpec (cenv, env, containerInfo, declKind, Some memberFlags, tpenv, synValSig) | SynMemberSig.Interface _ -> // These are done in TcMutRecDefns_Phase1 @@ -3972,7 +3972,7 @@ module TcDeclarations = for slot in ds do if isAbstractSlot slot then match slot with - | SynMemberDefn.AbstractSlot (synVal, _, m) -> + | SynMemberDefn.AbstractSlot (slotSig = synVal; range = m) -> CheckDuplicatesArgNames synVal m | _ -> () @@ -4013,7 +4013,7 @@ module TcDeclarations = | SynMemberDefn.ImplicitInherit (ty, _, idOpt, m) -> Some(ty, m, idOpt) | _ -> None) //let nestedTycons = cspec |> List.choose (function SynMemberDefn.NestedType (x, _, _) -> Some x | _ -> None) - let slotsigs = cspec |> List.choose (function SynMemberDefn.AbstractSlot (x, y, _) -> Some(x, y) | _ -> None) + let slotsigs = cspec |> List.choose (function SynMemberDefn.AbstractSlot (slotSig = x; flags = y) -> Some(x, y) | _ -> None) let members = let membersIncludingAutoProps = @@ -4261,22 +4261,22 @@ module TcDeclarations = let implements2 = cspec |> List.choose (function SynMemberSig.Interface (ty, m) -> Some(ty, m) | _ -> None) let inherits = cspec |> List.choose (function SynMemberSig.Inherit (ty, _) -> Some(ty, m, None) | _ -> None) //let nestedTycons = cspec |> List.choose (function SynMemberSig.NestedType (x, _) -> Some x | _ -> None) - let slotsigs = cspec |> List.choose (function SynMemberSig.Member (v, fl, _) when fl.IsDispatchSlot -> Some(v, fl) | _ -> None) + let slotsigs = cspec |> List.choose (function SynMemberSig.Member (memberSig = v; flags = fl) when fl.IsDispatchSlot -> Some(v, fl) | _ -> None) let members = cspec |> List.filter (function | SynMemberSig.Interface _ -> true - | SynMemberSig.Member (_, memberFlags, _) when not memberFlags.IsDispatchSlot -> true + | SynMemberSig.Member (flags = memberFlags) when not memberFlags.IsDispatchSlot -> true | SynMemberSig.NestedType (_, m) -> error(Error(FSComp.SR.tcTypesCannotContainNestedTypes(), m)); false | _ -> false) let isConcrete = members |> List.exists (function - | SynMemberSig.Member (_, memberFlags, _) -> memberFlags.MemberKind=SynMemberKind.Constructor + | SynMemberSig.Member (flags = memberFlags) -> memberFlags.MemberKind=SynMemberKind.Constructor | _ -> false) // An ugly bit of code to pre-determine if a type has a nullary constructor, prior to establishing the // members of the type let preEstablishedHasDefaultCtor = members |> List.exists (function - | SynMemberSig.Member (synValSig, memberFlags, _) -> + | SynMemberSig.Member (memberSig = synValSig; flags = memberFlags) -> memberFlags.MemberKind=SynMemberKind.Constructor && // REVIEW: This is a syntactic approximation (match synValSig.SynType, synValSig.SynInfo.CurriedArgInfos with diff --git a/src/Compiler/Checking/CheckExpressions.fs b/src/Compiler/Checking/CheckExpressions.fs index 02cdd360e86..44c69a0d638 100644 --- a/src/Compiler/Checking/CheckExpressions.fs +++ b/src/Compiler/Checking/CheckExpressions.fs @@ -4029,7 +4029,7 @@ and TcPseudoMemberSpec cenv newOk env synTypes tpenv synMemberSig m = let tys, tpenv = List.mapFold (TcTypeAndRecover cenv newOk CheckCxs ItemOccurence.UseInType WarnOnIWSAM.Yes env) tpenv synTypes match synMemberSig with - | SynMemberSig.Member (synValSig, memberFlags, m) -> + | SynMemberSig.Member (synValSig, memberFlags, m, _) -> // REVIEW: Test pseudo constraints cannot refer to polymorphic methods. // REVIEW: Test pseudo constraints cannot be curried. let members, tpenv = TcValSpec cenv env ModuleOrMemberBinding newOk ExprContainerInfo (Some memberFlags) (Some (List.head tys)) tpenv synValSig [] diff --git a/src/Compiler/Service/ServiceInterfaceStubGenerator.fs b/src/Compiler/Service/ServiceInterfaceStubGenerator.fs index 5042d2b1408..55ff01779f5 100644 --- a/src/Compiler/Service/ServiceInterfaceStubGenerator.fs +++ b/src/Compiler/Service/ServiceInterfaceStubGenerator.fs @@ -825,7 +825,7 @@ module InterfaceStubGenerator = None else match memberDefn with - | SynMemberDefn.AbstractSlot (_synValSig, _memberFlags, _range) -> None + | SynMemberDefn.AbstractSlot _ -> None | SynMemberDefn.AutoProperty (synExpr = expr) -> walkExpr expr | SynMemberDefn.Interface (interfaceType = interfaceType; members = members) -> if rangeContainsPos interfaceType.Range pos then diff --git a/src/Compiler/Service/ServiceNavigation.fs b/src/Compiler/Service/ServiceNavigation.fs index 8f5a4acb2b1..500033de4b7 100755 --- a/src/Compiler/Service/ServiceNavigation.fs +++ b/src/Compiler/Service/ServiceNavigation.fs @@ -336,7 +336,7 @@ module NavigationImpl = [ createMember (id, NavigationItemKind.Field, FSharpGlyph.Field, id.idRange, enclosingEntityKind, false, access) ] - | SynMemberDefn.AbstractSlot (SynValSig (ident = SynIdent (id, _); synType = ty; accessibility = access), _, _) -> + | SynMemberDefn.AbstractSlot(slotSig = SynValSig (ident = SynIdent (id, _); synType = ty; accessibility = access)) -> [ createMember (id, NavigationItemKind.Method, FSharpGlyph.OverridenMethod, ty.Range, enclosingEntityKind, true, access) ] @@ -557,7 +557,7 @@ module NavigationImpl = [ for memb in members do match memb with - | SynMemberSig.Member (SynValSig.SynValSig (ident = SynIdent (id, _); accessibility = access; range = m), _, _) -> + | SynMemberSig.Member(memberSig = SynValSig.SynValSig (ident = SynIdent (id, _); accessibility = access; range = m)) -> createMember (id, NavigationItemKind.Method, FSharpGlyph.Method, m, NavigationEntityKind.Class, false, access) | SynMemberSig.ValField (SynField (idOpt = Some rcid; fieldType = ty; accessibility = access), _) -> createMember (rcid, NavigationItemKind.Field, FSharpGlyph.Field, ty.Range, NavigationEntityKind.Class, false, access) @@ -882,7 +882,7 @@ module NavigateTo = and walkSynMemberSig (synMemberSig: SynMemberSig) container = match synMemberSig with - | SynMemberSig.Member (valSig, memberFlags, _) -> addMember valSig memberFlags true container + | SynMemberSig.Member (memberSig = valSig; flags = memberFlags) -> addMember valSig memberFlags true container | SynMemberSig.ValField (synField, _) -> addField synField true container | SynMemberSig.NestedType (synTypeDef, _) -> walkSynTypeDefnSig synTypeDef container | SynMemberSig.Inherit _ @@ -980,7 +980,7 @@ module NavigateTo = and walkSynMemberDefn (memberDefn: SynMemberDefn) container = match memberDefn with - | SynMemberDefn.AbstractSlot (synValSig, memberFlags, _) -> addMember synValSig memberFlags false container + | SynMemberDefn.AbstractSlot (slotSig = synValSig; flags = memberFlags) -> addMember synValSig memberFlags false container | SynMemberDefn.AutoProperty (ident = id) -> addIdent NavigableItemKind.Property id false container | SynMemberDefn.Interface (members = members) -> match members with diff --git a/src/Compiler/Service/ServiceParseTreeWalk.fs b/src/Compiler/Service/ServiceParseTreeWalk.fs index 9298fc11b27..2c61c20036c 100644 --- a/src/Compiler/Service/ServiceParseTreeWalk.fs +++ b/src/Compiler/Service/ServiceParseTreeWalk.fs @@ -924,7 +924,7 @@ module SyntaxTraversal = |> List.map (fun x -> dive x x.RangeOfBindingWithRhs (traverseSynBinding path)) |> pick m | x -> x - | SynMemberDefn.AbstractSlot (SynValSig (synType = synType), _memberFlags, _range) -> traverseSynType path synType + | SynMemberDefn.AbstractSlot(slotSig = SynValSig (synType = synType)) -> traverseSynType path synType | SynMemberDefn.Interface (interfaceType = synType; members = synMemberDefnsOption) -> match visitor.VisitInterfaceSynMemberDefnType(path, synType) with | None -> diff --git a/src/Compiler/Service/ServiceParsedInputOps.fs b/src/Compiler/Service/ServiceParsedInputOps.fs index 0ab14efa942..d41426a5e70 100644 --- a/src/Compiler/Service/ServiceParsedInputOps.fs +++ b/src/Compiler/Service/ServiceParsedInputOps.fs @@ -867,7 +867,7 @@ module ParsedInput = match membSig with | SynMemberSig.Inherit (t, _) -> walkType t - | SynMemberSig.Member (vs, _, _) -> walkValSig vs + | SynMemberSig.Member (memberSig = vs) -> walkValSig vs | SynMemberSig.Interface (t, _) -> walkType t @@ -880,7 +880,7 @@ module ParsedInput = and walkMember memb = match memb with - | SynMemberDefn.AbstractSlot (valSig, _, _) -> walkValSig valSig + | SynMemberDefn.AbstractSlot (slotSig = valSig) -> walkValSig valSig | SynMemberDefn.Member (binding, _) -> walkBinding binding @@ -1869,7 +1869,7 @@ module ParsedInput = match membSig with | SynMemberSig.Inherit (t, _) | SynMemberSig.Interface (t, _) -> walkType t - | SynMemberSig.Member (vs, _, _) -> walkValSig vs + | SynMemberSig.Member (memberSig = vs) -> walkValSig vs | SynMemberSig.ValField (f, _) -> walkField f | SynMemberSig.NestedType (nestedType = typeDefn) -> let (SynTypeDefnSig (typeInfo = info; typeRepr = repr; members = memberSigs)) = @@ -1888,7 +1888,7 @@ module ParsedInput = and walkMember memb = match memb with - | SynMemberDefn.AbstractSlot (valSig, _, _) -> walkValSig valSig + | SynMemberDefn.AbstractSlot (slotSig = valSig) -> walkValSig valSig | SynMemberDefn.Member (binding, _) -> walkBinding binding | SynMemberDefn.GetSetMember (getBinding, setBinding, _, _) -> Option.iter walkBinding getBinding diff --git a/src/Compiler/Service/ServiceStructure.fs b/src/Compiler/Service/ServiceStructure.fs index 5e381130ed8..010f37e87d8 100644 --- a/src/Compiler/Service/ServiceStructure.fs +++ b/src/Compiler/Service/ServiceStructure.fs @@ -611,7 +611,7 @@ module Structure = | SynMemberDefn.NestedType (td, _, _) -> parseTypeDefn td - | SynMemberDefn.AbstractSlot (SynValSig (synType = synt), _, r) -> + | SynMemberDefn.AbstractSlot (slotSig = SynValSig (synType = synt); range = r) -> rcheck Scope.Member Collapse.Below d.Range (Range.startToEnd synt.Range r) | SynMemberDefn.AutoProperty (synExpr = e; range = r) -> @@ -890,7 +890,7 @@ module Structure = let rec parseSynMemberDefnSig inp = match inp with - | SynMemberSig.Member (valSigs, _, r) -> + | SynMemberSig.Member (memberSig = valSigs; range = r) -> let collapse = Range.endToEnd valSigs.RangeOfId r rcheck Scope.Member Collapse.Below r collapse | SynMemberSig.ValField (SynField (attributes = attrs; range = fr), mFull) -> diff --git a/src/Compiler/Service/ServiceXmlDocParser.fs b/src/Compiler/Service/ServiceXmlDocParser.fs index 4a7eca7868d..289257d936a 100644 --- a/src/Compiler/Service/ServiceXmlDocParser.fs +++ b/src/Compiler/Service/ServiceXmlDocParser.fs @@ -175,7 +175,7 @@ module XmlDocParsing = |> Option.toList |> List.collect getXmlDocablesSynMemberDefn - | SynMemberDefn.AbstractSlot (valSig, _, range) -> + | SynMemberDefn.AbstractSlot (slotSig = valSig; range = range) -> let (SynValSig (attributes = synAttributes; arity = synValInfo; xmlDoc = preXmlDoc)) = valSig diff --git a/src/Compiler/SyntaxTree/SyntaxTree.fs b/src/Compiler/SyntaxTree/SyntaxTree.fs index 66951e620a8..b74ab1d947d 100644 --- a/src/Compiler/SyntaxTree/SyntaxTree.fs +++ b/src/Compiler/SyntaxTree/SyntaxTree.fs @@ -1119,7 +1119,7 @@ type SynMemberKind = [] type SynMemberSig = - | Member of memberSig: SynValSig * flags: SynMemberFlags * range: range + | Member of memberSig: SynValSig * flags: SynMemberFlags * range: range * trivia: SynMemberSigMemberTrivia | Interface of interfaceType: SynType * range: range @@ -1417,7 +1417,7 @@ type SynMemberDefn = | LetBindings of bindings: SynBinding list * isStatic: bool * isRecursive: bool * range: range - | AbstractSlot of slotSig: SynValSig * flags: SynMemberFlags * range: range + | AbstractSlot of slotSig: SynValSig * flags: SynMemberFlags * range: range * trivia: SynMemberDefnAbstractSlotTrivia | Interface of interfaceType: SynType * withKeyword: range option * members: SynMemberDefns option * range: range diff --git a/src/Compiler/SyntaxTree/SyntaxTree.fsi b/src/Compiler/SyntaxTree/SyntaxTree.fsi index 9d12ce00e81..43d37d47f1b 100644 --- a/src/Compiler/SyntaxTree/SyntaxTree.fsi +++ b/src/Compiler/SyntaxTree/SyntaxTree.fsi @@ -1265,7 +1265,7 @@ type SynMemberKind = type SynMemberSig = /// A member definition in a type in a signature file - | Member of memberSig: SynValSig * flags: SynMemberFlags * range: range + | Member of memberSig: SynValSig * flags: SynMemberFlags * range: range * trivia: SynMemberSigMemberTrivia /// An interface definition in a type in a signature file | Interface of interfaceType: SynType * range: range @@ -1598,7 +1598,11 @@ type SynMemberDefn = | LetBindings of bindings: SynBinding list * isStatic: bool * isRecursive: bool * range: range /// An abstract slot definition within a class or interface - | AbstractSlot of slotSig: SynValSig * flags: SynMemberFlags * range: range + | AbstractSlot of + slotSig: SynValSig * + flags: SynMemberFlags * + range: range * + trivia: SynMemberDefnAbstractSlotTrivia /// An interface implementation definition within a class | Interface of interfaceType: SynType * withKeyword: range option * members: SynMemberDefns option * range: range diff --git a/src/Compiler/SyntaxTree/SyntaxTrivia.fs b/src/Compiler/SyntaxTree/SyntaxTrivia.fs index 10b052a5a00..a8d76e93dcb 100644 --- a/src/Compiler/SyntaxTree/SyntaxTrivia.fs +++ b/src/Compiler/SyntaxTree/SyntaxTrivia.fs @@ -323,6 +323,14 @@ type SynMemberDefnAutoPropertyTrivia = GetSetKeyword: range option } +[] +type SynMemberDefnAbstractSlotTrivia = + { + GetSetKeyword: range option + } + + static member Zero = { GetSetKeyword = None } + [] type SynFieldTrivia = { @@ -336,3 +344,11 @@ type SynTypeOrTrivia = { OrKeyword: range } [] type SynBindingReturnInfoTrivia = { ColonRange: range option } + +[] +type SynMemberSigMemberTrivia = + { + GetSetKeyword: range option + } + + static member Zero: SynMemberSigMemberTrivia = { GetSetKeyword = None } diff --git a/src/Compiler/SyntaxTree/SyntaxTrivia.fsi b/src/Compiler/SyntaxTree/SyntaxTrivia.fsi index 08d847fc5ea..03686a89543 100644 --- a/src/Compiler/SyntaxTree/SyntaxTrivia.fsi +++ b/src/Compiler/SyntaxTree/SyntaxTrivia.fsi @@ -421,6 +421,16 @@ type SynMemberDefnAutoPropertyTrivia = GetSetKeyword: range option } +/// Represents additional information for SynMemberDefn.AbstractSlot +[] +type SynMemberDefnAbstractSlotTrivia = + { + /// The syntax range of 'get, set' + GetSetKeyword: range option + } + + static member Zero: SynMemberDefnAbstractSlotTrivia + /// Represents additional information for SynField [] type SynFieldTrivia = @@ -446,3 +456,13 @@ type SynBindingReturnInfoTrivia = /// The syntax range of the `:` token ColonRange: range option } + +/// Represents additional information for SynMemberSig.Member +[] +type SynMemberSigMemberTrivia = + { + /// The syntax range of 'get, set' + GetSetKeyword: range option + } + + static member Zero: SynMemberSigMemberTrivia diff --git a/src/Compiler/pars.fsy b/src/Compiler/pars.fsy index 65714a0fc3e..2062b011915 100644 --- a/src/Compiler/pars.fsy +++ b/src/Compiler/pars.fsy @@ -840,7 +840,7 @@ tyconSpfnRhs: let ty, arity = $3 let flags = AbstractMemberFlags true SynMemberKind.Member let valSig = SynValSig([], (SynIdent(mkSynId m "Invoke", None)), inferredTyparDecls, ty, arity, false, false, PreXmlDoc.Empty, None, None, m, SynValSigTrivia.Zero) - let invoke = SynMemberSig.Member(valSig, flags, m) + let invoke = SynMemberSig.Member(valSig, flags, m, SynMemberSigMemberTrivia.Zero) (fun leadingKeyword nameRange nameInfo mEquals augmentation -> if not (isNil augmentation) then raiseParseErrorAt m (FSComp.SR.parsAugmentationsIllegalOnDelegateType()) let mWhole = unionRanges nameRange m @@ -932,7 +932,8 @@ classMemberSpfn: let flags = flags (getSetAdjuster arity) let trivia = { LeadingKeyword = leadingKeyword; WithKeyword = mWith; EqualsRange = mEquals } let valSpfn = SynValSig($1, id, explicitValTyparDecls, ty, arity, isInline, false, doc, vis2, optLiteralValue, mWhole, trivia) - SynMemberSig.Member(valSpfn, flags, mWhole) } + let trivia: SynMemberSigMemberTrivia = { GetSetKeyword = getSetRangeOpt } + SynMemberSig.Member(valSpfn, flags, mWhole, trivia) } | opt_attributes opt_access interfaceMember appType { if Option.isSome $2 then errorR(Error(FSComp.SR.parsVisibilityDeclarationsShouldComePriorToIdentifier(), rhs parseState 2)) @@ -971,7 +972,7 @@ classMemberSpfn: let isInline = false let trivia: SynValSigTrivia = { LeadingKeyword = SynLeadingKeyword.New mNew; WithKeyword = None; EqualsRange = None } let valSpfn = SynValSig ($1, (SynIdent(mkSynId (rhs parseState 3) "new", None)), noInferredTypars, ty, valSynInfo, isInline, false, doc, vis, None, m, trivia) - SynMemberSig.Member(valSpfn, CtorMemberFlags, m) } + SynMemberSig.Member(valSpfn, CtorMemberFlags, m, SynMemberSigMemberTrivia.Zero) } /* The optional "with get, set" on a member in a signature */ @@ -981,16 +982,16 @@ classMemberSpfnGetSet: | WITH classMemberSpfnGetSetElements { let mWith = rhs parseState 1 - Some mWith, Some (rhs2 parseState 1 2), $2 } + Some mWith, Some (rhs parseState 2), $2 } | OWITH classMemberSpfnGetSetElements OEND { let mWith = rhs parseState 1 - Some mWith, Some (rhs2 parseState 1 2), $2 } + Some mWith, Some (rhs parseState 2), $2 } | OWITH classMemberSpfnGetSetElements error { let mWith = rhs parseState 1 reportParseErrorAt mWith (FSComp.SR.parsUnmatchedWith()) - Some mWith, Some (rhs2 parseState 1 2), $2 } + Some mWith, Some (rhs parseState 2), $2 } /* The "get, set" on a property member in a signature */ @@ -1610,7 +1611,7 @@ tyconDefnRhs: (fun nameRange augmentation -> let valSig = SynValSig([], (SynIdent(mkSynId m "Invoke", None)), inferredTyparDecls, ty, arity, false, false, PreXmlDoc.Empty, None, None, m, SynValSigTrivia.Zero) let flags = AbstractMemberFlags true SynMemberKind.Member - let invoke = SynMemberDefn.AbstractSlot(valSig, flags, m) + let invoke = SynMemberDefn.AbstractSlot(valSig, flags, m, SynMemberDefnAbstractSlotTrivia.Zero) if not (isNil augmentation) then raiseParseErrorAt m (FSComp.SR.parsAugmentationsIllegalOnDelegateType()) SynTypeDefnRepr.ObjectModel (SynTypeDefnKind.Delegate (ty, arity), [invoke], m), []) } @@ -1824,8 +1825,8 @@ classDefnMember: let mkFlags, leadingKeyword = $3 let trivia = { LeadingKeyword = leadingKeyword; WithKeyword = mWith; EqualsRange = None } let valSpfn = SynValSig($1, id, explicitValTyparDecls, ty, arity, isInline, false, doc, None, None, mWhole, trivia) - - [ SynMemberDefn.AbstractSlot(valSpfn, mkFlags (getSetAdjuster arity), mWhole) ] } + let trivia: SynMemberDefnAbstractSlotTrivia = { GetSetKeyword = getSetRangeOpt } + [ SynMemberDefn.AbstractSlot(valSpfn, mkFlags (getSetAdjuster arity), mWhole, trivia) ] } | opt_attributes opt_access inheritsDefn { if not (isNil $1) then errorR(Error(FSComp.SR.parsAttributesIllegalOnInherit(), rhs parseState 1)) diff --git a/tests/FSharp.Compiler.Service.Tests/FSharp.CompilerService.SurfaceArea.netstandard.expected b/tests/FSharp.Compiler.Service.Tests/FSharp.CompilerService.SurfaceArea.netstandard.expected index 1ece3f1a780..89cddbde746 100644 --- a/tests/FSharp.Compiler.Service.Tests/FSharp.CompilerService.SurfaceArea.netstandard.expected +++ b/tests/FSharp.Compiler.Service.Tests/FSharp.CompilerService.SurfaceArea.netstandard.expected @@ -7364,6 +7364,8 @@ FSharp.Compiler.Syntax.SynMemberDefn+AbstractSlot: FSharp.Compiler.Syntax.SynMem FSharp.Compiler.Syntax.SynMemberDefn+AbstractSlot: FSharp.Compiler.Syntax.SynMemberFlags get_flags() FSharp.Compiler.Syntax.SynMemberDefn+AbstractSlot: FSharp.Compiler.Syntax.SynValSig get_slotSig() FSharp.Compiler.Syntax.SynMemberDefn+AbstractSlot: FSharp.Compiler.Syntax.SynValSig slotSig +FSharp.Compiler.Syntax.SynMemberDefn+AbstractSlot: FSharp.Compiler.SyntaxTrivia.SynMemberDefnAbstractSlotTrivia get_trivia() +FSharp.Compiler.Syntax.SynMemberDefn+AbstractSlot: FSharp.Compiler.SyntaxTrivia.SynMemberDefnAbstractSlotTrivia trivia FSharp.Compiler.Syntax.SynMemberDefn+AbstractSlot: FSharp.Compiler.Text.Range get_range() FSharp.Compiler.Syntax.SynMemberDefn+AbstractSlot: FSharp.Compiler.Text.Range range FSharp.Compiler.Syntax.SynMemberDefn+AutoProperty: Boolean get_isStatic() @@ -7494,7 +7496,7 @@ FSharp.Compiler.Syntax.SynMemberDefn: Boolean get_IsMember() FSharp.Compiler.Syntax.SynMemberDefn: Boolean get_IsNestedType() FSharp.Compiler.Syntax.SynMemberDefn: Boolean get_IsOpen() FSharp.Compiler.Syntax.SynMemberDefn: Boolean get_IsValField() -FSharp.Compiler.Syntax.SynMemberDefn: FSharp.Compiler.Syntax.SynMemberDefn NewAbstractSlot(FSharp.Compiler.Syntax.SynValSig, FSharp.Compiler.Syntax.SynMemberFlags, FSharp.Compiler.Text.Range) +FSharp.Compiler.Syntax.SynMemberDefn: FSharp.Compiler.Syntax.SynMemberDefn NewAbstractSlot(FSharp.Compiler.Syntax.SynValSig, FSharp.Compiler.Syntax.SynMemberFlags, FSharp.Compiler.Text.Range, FSharp.Compiler.SyntaxTrivia.SynMemberDefnAbstractSlotTrivia) FSharp.Compiler.Syntax.SynMemberDefn: FSharp.Compiler.Syntax.SynMemberDefn NewAutoProperty(Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynAttributeList], Boolean, FSharp.Compiler.Syntax.Ident, Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynType], FSharp.Compiler.Syntax.SynMemberKind, FSharp.Compiler.Syntax.SynMemberFlags, FSharp.Compiler.Syntax.SynMemberFlags, FSharp.Compiler.Xml.PreXmlDoc, Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynAccess], FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range, FSharp.Compiler.SyntaxTrivia.SynMemberDefnAutoPropertyTrivia) FSharp.Compiler.Syntax.SynMemberDefn: FSharp.Compiler.Syntax.SynMemberDefn NewGetSetMember(Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynBinding], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynBinding], FSharp.Compiler.Text.Range, FSharp.Compiler.SyntaxTrivia.SynMemberGetSetTrivia) FSharp.Compiler.Syntax.SynMemberDefn: FSharp.Compiler.Syntax.SynMemberDefn NewImplicitCtor(Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynAccess], Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynAttributeList], FSharp.Compiler.Syntax.SynSimplePats, Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.Ident], FSharp.Compiler.Xml.PreXmlDoc, FSharp.Compiler.Text.Range) @@ -7594,6 +7596,8 @@ FSharp.Compiler.Syntax.SynMemberSig+Member: FSharp.Compiler.Syntax.SynMemberFlag FSharp.Compiler.Syntax.SynMemberSig+Member: FSharp.Compiler.Syntax.SynMemberFlags get_flags() FSharp.Compiler.Syntax.SynMemberSig+Member: FSharp.Compiler.Syntax.SynValSig get_memberSig() FSharp.Compiler.Syntax.SynMemberSig+Member: FSharp.Compiler.Syntax.SynValSig memberSig +FSharp.Compiler.Syntax.SynMemberSig+Member: FSharp.Compiler.SyntaxTrivia.SynMemberSigMemberTrivia get_trivia() +FSharp.Compiler.Syntax.SynMemberSig+Member: FSharp.Compiler.SyntaxTrivia.SynMemberSigMemberTrivia trivia FSharp.Compiler.Syntax.SynMemberSig+Member: FSharp.Compiler.Text.Range get_range() FSharp.Compiler.Syntax.SynMemberSig+Member: FSharp.Compiler.Text.Range range FSharp.Compiler.Syntax.SynMemberSig+NestedType: FSharp.Compiler.Syntax.SynTypeDefnSig get_nestedType() @@ -7621,7 +7625,7 @@ FSharp.Compiler.Syntax.SynMemberSig: Boolean get_IsNestedType() FSharp.Compiler.Syntax.SynMemberSig: Boolean get_IsValField() FSharp.Compiler.Syntax.SynMemberSig: FSharp.Compiler.Syntax.SynMemberSig NewInherit(FSharp.Compiler.Syntax.SynType, FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SynMemberSig: FSharp.Compiler.Syntax.SynMemberSig NewInterface(FSharp.Compiler.Syntax.SynType, FSharp.Compiler.Text.Range) -FSharp.Compiler.Syntax.SynMemberSig: FSharp.Compiler.Syntax.SynMemberSig NewMember(FSharp.Compiler.Syntax.SynValSig, FSharp.Compiler.Syntax.SynMemberFlags, FSharp.Compiler.Text.Range) +FSharp.Compiler.Syntax.SynMemberSig: FSharp.Compiler.Syntax.SynMemberSig NewMember(FSharp.Compiler.Syntax.SynValSig, FSharp.Compiler.Syntax.SynMemberFlags, FSharp.Compiler.Text.Range, FSharp.Compiler.SyntaxTrivia.SynMemberSigMemberTrivia) FSharp.Compiler.Syntax.SynMemberSig: FSharp.Compiler.Syntax.SynMemberSig NewNestedType(FSharp.Compiler.Syntax.SynTypeDefnSig, FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SynMemberSig: FSharp.Compiler.Syntax.SynMemberSig NewValField(FSharp.Compiler.Syntax.SynField, FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SynMemberSig: FSharp.Compiler.Syntax.SynMemberSig+Inherit @@ -9730,6 +9734,13 @@ FSharp.Compiler.SyntaxTrivia.SynMatchClauseTrivia: Microsoft.FSharp.Core.FSharpO FSharp.Compiler.SyntaxTrivia.SynMatchClauseTrivia: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] get_BarRange() FSharp.Compiler.SyntaxTrivia.SynMatchClauseTrivia: System.String ToString() FSharp.Compiler.SyntaxTrivia.SynMatchClauseTrivia: Void .ctor(Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range]) +FSharp.Compiler.SyntaxTrivia.SynMemberDefnAbstractSlotTrivia +FSharp.Compiler.SyntaxTrivia.SynMemberDefnAbstractSlotTrivia: FSharp.Compiler.SyntaxTrivia.SynMemberDefnAbstractSlotTrivia Zero +FSharp.Compiler.SyntaxTrivia.SynMemberDefnAbstractSlotTrivia: FSharp.Compiler.SyntaxTrivia.SynMemberDefnAbstractSlotTrivia get_Zero() +FSharp.Compiler.SyntaxTrivia.SynMemberDefnAbstractSlotTrivia: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] GetSetKeyword +FSharp.Compiler.SyntaxTrivia.SynMemberDefnAbstractSlotTrivia: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] get_GetSetKeyword() +FSharp.Compiler.SyntaxTrivia.SynMemberDefnAbstractSlotTrivia: System.String ToString() +FSharp.Compiler.SyntaxTrivia.SynMemberDefnAbstractSlotTrivia: Void .ctor(Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range]) FSharp.Compiler.SyntaxTrivia.SynMemberDefnAutoPropertyTrivia FSharp.Compiler.SyntaxTrivia.SynMemberDefnAutoPropertyTrivia: FSharp.Compiler.SyntaxTrivia.SynLeadingKeyword LeadingKeyword FSharp.Compiler.SyntaxTrivia.SynMemberDefnAutoPropertyTrivia: FSharp.Compiler.SyntaxTrivia.SynLeadingKeyword get_LeadingKeyword() @@ -9752,6 +9763,13 @@ FSharp.Compiler.SyntaxTrivia.SynMemberGetSetTrivia: Microsoft.FSharp.Core.FSharp FSharp.Compiler.SyntaxTrivia.SynMemberGetSetTrivia: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] get_SetKeyword() FSharp.Compiler.SyntaxTrivia.SynMemberGetSetTrivia: System.String ToString() FSharp.Compiler.SyntaxTrivia.SynMemberGetSetTrivia: Void .ctor(FSharp.Compiler.Text.Range, 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.SyntaxTrivia.SynMemberSigMemberTrivia +FSharp.Compiler.SyntaxTrivia.SynMemberSigMemberTrivia: FSharp.Compiler.SyntaxTrivia.SynMemberSigMemberTrivia Zero +FSharp.Compiler.SyntaxTrivia.SynMemberSigMemberTrivia: FSharp.Compiler.SyntaxTrivia.SynMemberSigMemberTrivia get_Zero() +FSharp.Compiler.SyntaxTrivia.SynMemberSigMemberTrivia: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] GetSetKeyword +FSharp.Compiler.SyntaxTrivia.SynMemberSigMemberTrivia: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] get_GetSetKeyword() +FSharp.Compiler.SyntaxTrivia.SynMemberSigMemberTrivia: System.String ToString() +FSharp.Compiler.SyntaxTrivia.SynMemberSigMemberTrivia: Void .ctor(Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range]) FSharp.Compiler.SyntaxTrivia.SynModuleDeclNestedModuleTrivia FSharp.Compiler.SyntaxTrivia.SynModuleDeclNestedModuleTrivia: FSharp.Compiler.SyntaxTrivia.SynModuleDeclNestedModuleTrivia Zero FSharp.Compiler.SyntaxTrivia.SynModuleDeclNestedModuleTrivia: FSharp.Compiler.SyntaxTrivia.SynModuleDeclNestedModuleTrivia get_Zero() diff --git a/tests/service/SyntaxTreeTests/MemberTests.fs b/tests/service/SyntaxTreeTests/MemberTests.fs index 24693fd12bc..f0aa7f87e43 100644 --- a/tests/service/SyntaxTreeTests/MemberTests.fs +++ b/tests/service/SyntaxTreeTests/MemberTests.fs @@ -39,11 +39,13 @@ type Foo() = | ParsedInput.ImplFile (ParsedImplFileInput (contents = [ SynModuleOrNamespace.SynModuleOrNamespace(decls = [ SynModuleDecl.Types( typeDefns = [ SynTypeDefn(typeRepr = SynTypeDefnRepr.ObjectModel(members = [_ - SynMemberDefn.AutoProperty(trivia = { WithKeyword = Some mWith }) + SynMemberDefn.AutoProperty(trivia = { WithKeyword = Some mWith + GetSetKeyword = Some mGS }) SynMemberDefn.AutoProperty(trivia = { WithKeyword = None })])) ] ) ]) ])) -> assertRange (3, 39) (3, 43) mWith + assertRange (3, 44) (3, 52) mGS | _ -> Assert.Fail "Could not get valid AST" [] @@ -59,10 +61,12 @@ type Foo() = | ParsedInput.ImplFile (ParsedImplFileInput (contents = [ SynModuleOrNamespace.SynModuleOrNamespace(decls = [ SynModuleDecl.Types( typeDefns = [ SynTypeDefn(typeRepr = SynTypeDefnRepr.ObjectModel(members = [_ - SynMemberDefn.AbstractSlot(slotSig=SynValSig(trivia = { WithKeyword = Some mWith }))])) ] + SynMemberDefn.AbstractSlot(slotSig=SynValSig(trivia = { WithKeyword = Some mWith }) + trivia = { GetSetKeyword = Some mGS })])) ] ) ]) ])) -> assertRange (3, 30) (3, 34) mWith + assertRange (3, 35) (3, 42) mGS | _ -> Assert.Fail "Could not get valid AST" [] @@ -223,3 +227,31 @@ type A = let comment = preXmlDoc.ToXmlDoc(false, None).GetXmlText() Assert.False (System.String.IsNullOrWhiteSpace(comment)) | _ -> Assert.Fail "Could not get valid AST" + +[] +let ``Signature member with get,set`` () = + let parseResults = + getParseResultsOfSignatureFile + """ +module Meh + +type X = + // MemberSig.Member + member Y : int + with + get , set +""" + + match parseResults with + | ParsedInput.SigFile (ParsedSigFileInput (contents=[ + SynModuleOrNamespaceSig(decls=[ + SynModuleSigDecl.Types(types = [ + SynTypeDefnSig(typeRepr = SynTypeDefnSigRepr.ObjectModel(memberSigs = [ + SynMemberSig.Member(memberSig = SynValSig(trivia = { WithKeyword = Some mWith }) + trivia = { GetSetKeyword = Some mGS }) + ])) + ]) + ] ) ])) -> + assertRange (7, 20) (7, 24) mWith + assertRange (8, 28) (8, 39) mGS + | _ -> Assert.Fail "Could not get valid AST" From c57e902bb3d89d82788699677746606a10216de6 Mon Sep 17 00:00:00 2001 From: nojaf Date: Wed, 2 Nov 2022 16:20:32 +0100 Subject: [PATCH 2/4] Update failing unit test to only include the `set` range. --- .../ClassTypes/AutoProperties/E_OnlySetter01.fs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/fsharpqa/Source/Conformance/ObjectOrientedTypeDefinitions/ClassTypes/AutoProperties/E_OnlySetter01.fs b/tests/fsharpqa/Source/Conformance/ObjectOrientedTypeDefinitions/ClassTypes/AutoProperties/E_OnlySetter01.fs index fdd0c4fe0f1..c3dd61f429f 100644 --- a/tests/fsharpqa/Source/Conformance/ObjectOrientedTypeDefinitions/ClassTypes/AutoProperties/E_OnlySetter01.fs +++ b/tests/fsharpqa/Source/Conformance/ObjectOrientedTypeDefinitions/ClassTypes/AutoProperties/E_OnlySetter01.fs @@ -1,5 +1,5 @@ // #Conformance #ObjectOrientedTypes #Classes #MethodsAndProperties -//To indicate that this property can be set, use 'member val PropertyName = expr with get,set'\.$ +//To indicate that this property can be set, use 'member val PropertyName = expr with get,set'\.$ type T() = member val Property = 0 with set // contrary to C#, we need both get and set From a17d5e4e74e73e2fb1aa141e41cee035c58413ad Mon Sep 17 00:00:00 2001 From: nojaf Date: Thu, 3 Nov 2022 08:54:46 +0100 Subject: [PATCH 3/4] GetSetKeywords --- src/Compiler/Checking/CheckDeclarations.fs | 4 +- src/Compiler/SyntaxTree/SyntaxTrivia.fs | 26 +++++-- src/Compiler/SyntaxTree/SyntaxTrivia.fsi | 15 +++- src/Compiler/pars.fsy | 39 ++++++---- ...erService.SurfaceArea.netstandard.expected | 48 +++++++++--- tests/service/SyntaxTreeTests/MemberTests.fs | 76 +++++++++++++++++-- 6 files changed, 165 insertions(+), 43 deletions(-) diff --git a/src/Compiler/Checking/CheckDeclarations.fs b/src/Compiler/Checking/CheckDeclarations.fs index b3f6c8704d3..9241db0aff4 100644 --- a/src/Compiler/Checking/CheckDeclarations.fs +++ b/src/Compiler/Checking/CheckDeclarations.fs @@ -4063,7 +4063,7 @@ module TcDeclarations = // Convert auto properties to member bindings in the post-list let rec postAutoProps memb = match memb with - | SynMemberDefn.AutoProperty(attributes=Attributes attribs; isStatic=isStatic; ident=id; typeOpt=tyOpt; propKind=propKind; memberFlags=memberFlags; memberFlagsForSet=memberFlagsForSet; xmlDoc=xmlDoc; accessibility=access; trivia = { GetSetKeyword = mGetSetOpt }) -> + | SynMemberDefn.AutoProperty(attributes=Attributes attribs; isStatic=isStatic; ident=id; typeOpt=tyOpt; propKind=propKind; memberFlags=memberFlags; memberFlagsForSet=memberFlagsForSet; xmlDoc=xmlDoc; accessibility=access; trivia = { GetSetKeywords = mGetSetOpt }) -> let mMemberPortion = id.idRange // Only the keep the non-field-targeted attributes let attribs = attribs |> List.filter (fun a -> match a.Target with Some t when t.idText = "field" -> false | _ -> true) @@ -4074,7 +4074,7 @@ module TcDeclarations = let memberFlagsForSet = { memberFlagsForSet with GetterOrSetterIsCompilerGenerated = true } match propKind, mGetSetOpt with - | SynMemberKind.PropertySet, Some m -> errorR(Error(FSComp.SR.parsMutableOnAutoPropertyShouldBeGetSetNotJustSet(), m)) + | SynMemberKind.PropertySet, Some gs -> errorR(Error(FSComp.SR.parsMutableOnAutoPropertyShouldBeGetSetNotJustSet(), gs.Range)) | _ -> () [ diff --git a/src/Compiler/SyntaxTree/SyntaxTrivia.fs b/src/Compiler/SyntaxTree/SyntaxTrivia.fs index a8d76e93dcb..160569564a3 100644 --- a/src/Compiler/SyntaxTree/SyntaxTrivia.fs +++ b/src/Compiler/SyntaxTree/SyntaxTrivia.fs @@ -314,22 +314,38 @@ type SynMemberGetSetTrivia = [] type SynArgPatsNamePatPairsTrivia = { ParenRange: range } +[] +type GetSetKeywords = + | Get of range + | Set of range + | GetSet of get: range * set: range + + member x.Range = + match x with + | Get m + | Set m -> m + | GetSet (mG, mS) -> + if Range.rangeBeforePos mG mS.Start then + Range.unionRanges mG mS + else + Range.unionRanges mS mG + [] type SynMemberDefnAutoPropertyTrivia = { LeadingKeyword: SynLeadingKeyword WithKeyword: range option EqualsRange: range option - GetSetKeyword: range option + GetSetKeywords: GetSetKeywords option } [] type SynMemberDefnAbstractSlotTrivia = { - GetSetKeyword: range option + GetSetKeywords: GetSetKeywords option } - static member Zero = { GetSetKeyword = None } + static member Zero = { GetSetKeywords = None } [] type SynFieldTrivia = @@ -348,7 +364,7 @@ type SynBindingReturnInfoTrivia = { ColonRange: range option } [] type SynMemberSigMemberTrivia = { - GetSetKeyword: range option + GetSetKeywords: GetSetKeywords option } - static member Zero: SynMemberSigMemberTrivia = { GetSetKeyword = None } + static member Zero: SynMemberSigMemberTrivia = { GetSetKeywords = None } diff --git a/src/Compiler/SyntaxTree/SyntaxTrivia.fsi b/src/Compiler/SyntaxTree/SyntaxTrivia.fsi index 03686a89543..555af5520ed 100644 --- a/src/Compiler/SyntaxTree/SyntaxTrivia.fsi +++ b/src/Compiler/SyntaxTree/SyntaxTrivia.fsi @@ -404,6 +404,15 @@ type SynArgPatsNamePatPairsTrivia = ParenRange: range } +/// Represents additional information for `get, set` syntax +[] +type GetSetKeywords = + | Get of range + | Set of range + | GetSet of get: range * set: range + + member Range: range + /// Represents additional information for SynMemberDefn.AutoProperty [] type SynMemberDefnAutoPropertyTrivia = @@ -418,7 +427,7 @@ type SynMemberDefnAutoPropertyTrivia = EqualsRange: range option /// The syntax range of 'get, set' - GetSetKeyword: range option + GetSetKeywords: GetSetKeywords option } /// Represents additional information for SynMemberDefn.AbstractSlot @@ -426,7 +435,7 @@ type SynMemberDefnAutoPropertyTrivia = type SynMemberDefnAbstractSlotTrivia = { /// The syntax range of 'get, set' - GetSetKeyword: range option + GetSetKeywords: GetSetKeywords option } static member Zero: SynMemberDefnAbstractSlotTrivia @@ -462,7 +471,7 @@ type SynBindingReturnInfoTrivia = type SynMemberSigMemberTrivia = { /// The syntax range of 'get, set' - GetSetKeyword: range option + GetSetKeywords: GetSetKeywords option } static member Zero: SynMemberSigMemberTrivia diff --git a/src/Compiler/pars.fsy b/src/Compiler/pars.fsy index 2062b011915..a18fb02fbb1 100644 --- a/src/Compiler/pars.fsy +++ b/src/Compiler/pars.fsy @@ -914,13 +914,13 @@ classMemberSpfn: | opt_attributes opt_access 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), (mEquals, optLiteralValue) = $4, grabXmlDoc(parseState, $1, 1), $5, $6, $7, $9, $11 - let mWith, getSetRangeOpt, getSet = $10 + let mWith, (getSet, getSetRangeOpt) = $10 let getSetAdjuster arity = match arity, getSet with SynValInfo([], _), SynMemberKind.Member -> SynMemberKind.PropertyGet | _ -> getSet let mWhole = let m = rhs parseState 3 match getSetRangeOpt with | None -> unionRanges m ty.Range - | Some m2 -> unionRanges m m2 + | Some gs -> unionRanges m (gs : GetSetKeywords).Range |> fun m -> (m, $1) ||> unionRangeWithListBy (fun (a: SynAttributeList) -> a.Range) |> unionRangeWithXmlDoc doc |> fun m -> @@ -932,7 +932,7 @@ classMemberSpfn: let flags = flags (getSetAdjuster arity) let trivia = { LeadingKeyword = leadingKeyword; WithKeyword = mWith; EqualsRange = mEquals } let valSpfn = SynValSig($1, id, explicitValTyparDecls, ty, arity, isInline, false, doc, vis2, optLiteralValue, mWhole, trivia) - let trivia: SynMemberSigMemberTrivia = { GetSetKeyword = getSetRangeOpt } + let trivia: SynMemberSigMemberTrivia = { GetSetKeywords = getSetRangeOpt } SynMemberSig.Member(valSpfn, flags, mWhole, trivia) } | opt_attributes opt_access interfaceMember appType @@ -978,29 +978,32 @@ classMemberSpfn: /* The optional "with get, set" on a member in a signature */ classMemberSpfnGetSet: | /* EMPTY */ - { None, None, SynMemberKind.Member } + { None, (SynMemberKind.Member, None) } | WITH classMemberSpfnGetSetElements { let mWith = rhs parseState 1 - Some mWith, Some (rhs parseState 2), $2 } + Some mWith, $2 } | OWITH classMemberSpfnGetSetElements OEND { let mWith = rhs parseState 1 - Some mWith, Some (rhs parseState 2), $2 } + Some mWith, $2 } | OWITH classMemberSpfnGetSetElements error { let mWith = rhs parseState 1 reportParseErrorAt mWith (FSComp.SR.parsUnmatchedWith()) - Some mWith, Some (rhs parseState 2), $2 } + Some mWith, $2 } /* The "get, set" on a property member in a signature */ classMemberSpfnGetSetElements: | nameop { (let (SynIdent(id:Ident, _)) = $1 - if id.idText = "get" then SynMemberKind.PropertyGet - else if id.idText = "set" then SynMemberKind.PropertySet - else raiseParseErrorAt (rhs parseState 1) (FSComp.SR.parsGetOrSetRequired())) } + if id.idText = "get" then + SynMemberKind.PropertyGet, Some (GetSetKeywords.Get id.idRange) + else if id.idText = "set" then + SynMemberKind.PropertySet, Some (GetSetKeywords.Set id.idRange) + else + raiseParseErrorAt (rhs parseState 1) (FSComp.SR.parsGetOrSetRequired())) } | nameop COMMA nameop { let (SynIdent(id, _)) = $1 @@ -1008,7 +1011,11 @@ classMemberSpfnGetSetElements: if not ((id.idText = "get" && id2.idText = "set") || (id.idText = "set" && id2.idText = "get")) then raiseParseErrorAt (rhs2 parseState 1 3) (FSComp.SR.parsGetOrSetRequired()) - SynMemberKind.PropertyGetSet } + + if id.idText = "get" then + SynMemberKind.PropertyGetSet, Some (GetSetKeywords.GetSet(id.idRange, id2.idRange)) + else + SynMemberKind.PropertyGetSet, Some (GetSetKeywords.GetSet(id2.idRange, id.idRange)) } memberSpecFlags: | memberFlags { $1 } @@ -1813,19 +1820,19 @@ classDefnMember: | opt_attributes opt_access abstractMemberFlags opt_inline nameop opt_explicitValTyparDecls COLON topTypeWithTypeConstraints classMemberSpfnGetSet opt_ODECLEND { let ty, arity = $8 let isInline, doc, id, explicitValTyparDecls = $4, grabXmlDoc(parseState, $1, 1), $5, $6 - let mWith, getSetRangeOpt, getSet = $9 + let mWith, (getSet, getSetRangeOpt) = $9 let getSetAdjuster arity = match arity, getSet with SynValInfo([], _), SynMemberKind.Member -> SynMemberKind.PropertyGet | _ -> getSet let mWhole = let m = rhs parseState 1 match getSetRangeOpt with | None -> unionRanges m ty.Range - | Some m2 -> unionRanges m m2 + | Some gs -> unionRanges m gs.Range |> unionRangeWithXmlDoc doc if Option.isSome $2 then errorR(Error(FSComp.SR.parsAccessibilityModsIllegalForAbstract(), mWhole)) let mkFlags, leadingKeyword = $3 let trivia = { LeadingKeyword = leadingKeyword; WithKeyword = mWith; EqualsRange = None } let valSpfn = SynValSig($1, id, explicitValTyparDecls, ty, arity, isInline, false, doc, None, None, mWhole, trivia) - let trivia: SynMemberDefnAbstractSlotTrivia = { GetSetKeyword = getSetRangeOpt } + let trivia: SynMemberDefnAbstractSlotTrivia = { GetSetKeywords = getSetRangeOpt } [ SynMemberDefn.AbstractSlot(valSpfn, mkFlags (getSetAdjuster arity), mWhole, trivia) ] } | opt_attributes opt_access inheritsDefn @@ -1894,7 +1901,7 @@ valDefnDecl: autoPropsDefnDecl: | VAL opt_mutable opt_access ident opt_typ EQUALS typedSequentialExprBlock classMemberSpfnGetSet { let mVal = rhs parseState 1 - let mWith, mGetSetOpt, getSet = $8 + let mWith, (getSet, getSetOpt) = $8 let mEquals = rhs parseState 6 if $2 then errorR (Error (FSComp.SR.parsMutableOnAutoPropertyShouldBeGetSet (), rhs parseState 3)) @@ -1906,7 +1913,7 @@ autoPropsDefnDecl: let memberFlags = flags SynMemberKind.Member let memberFlagsForSet = flags SynMemberKind.PropertySet let isStatic = not memberFlags.IsInstance - let trivia = { LeadingKeyword = leadingKeyword; WithKeyword = mWith; EqualsRange = Some mEquals; GetSetKeyword = mGetSetOpt } + let trivia = { LeadingKeyword = leadingKeyword; WithKeyword = mWith; EqualsRange = Some mEquals; GetSetKeywords = getSetOpt } [ SynMemberDefn.AutoProperty(attribs, isStatic, $4, $5, getSet, memberFlags, memberFlagsForSet, xmlDoc, $3, $7, memberRange, trivia) ]) } /* An optional type on an auto-property definition */ diff --git a/tests/FSharp.Compiler.Service.Tests/FSharp.CompilerService.SurfaceArea.netstandard.expected b/tests/FSharp.Compiler.Service.Tests/FSharp.CompilerService.SurfaceArea.netstandard.expected index 89cddbde746..1c37f62e330 100644 --- a/tests/FSharp.Compiler.Service.Tests/FSharp.CompilerService.SurfaceArea.netstandard.expected +++ b/tests/FSharp.Compiler.Service.Tests/FSharp.CompilerService.SurfaceArea.netstandard.expected @@ -9317,6 +9317,36 @@ FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia: FSharp.Compiler.SyntaxT FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia: Int32 Tag FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia: Int32 get_Tag() FSharp.Compiler.SyntaxTrivia.ConditionalDirectiveTrivia: System.String ToString() +FSharp.Compiler.SyntaxTrivia.GetSetKeywords +FSharp.Compiler.SyntaxTrivia.GetSetKeywords+Get: FSharp.Compiler.Text.Range Item +FSharp.Compiler.SyntaxTrivia.GetSetKeywords+Get: FSharp.Compiler.Text.Range get_Item() +FSharp.Compiler.SyntaxTrivia.GetSetKeywords+GetSet: FSharp.Compiler.Text.Range get +FSharp.Compiler.SyntaxTrivia.GetSetKeywords+GetSet: FSharp.Compiler.Text.Range get_get() +FSharp.Compiler.SyntaxTrivia.GetSetKeywords+GetSet: FSharp.Compiler.Text.Range get_set() +FSharp.Compiler.SyntaxTrivia.GetSetKeywords+GetSet: FSharp.Compiler.Text.Range set +FSharp.Compiler.SyntaxTrivia.GetSetKeywords+Set: FSharp.Compiler.Text.Range Item +FSharp.Compiler.SyntaxTrivia.GetSetKeywords+Set: FSharp.Compiler.Text.Range get_Item() +FSharp.Compiler.SyntaxTrivia.GetSetKeywords+Tags: Int32 Get +FSharp.Compiler.SyntaxTrivia.GetSetKeywords+Tags: Int32 GetSet +FSharp.Compiler.SyntaxTrivia.GetSetKeywords+Tags: Int32 Set +FSharp.Compiler.SyntaxTrivia.GetSetKeywords: Boolean IsGet +FSharp.Compiler.SyntaxTrivia.GetSetKeywords: Boolean IsGetSet +FSharp.Compiler.SyntaxTrivia.GetSetKeywords: Boolean IsSet +FSharp.Compiler.SyntaxTrivia.GetSetKeywords: Boolean get_IsGet() +FSharp.Compiler.SyntaxTrivia.GetSetKeywords: Boolean get_IsGetSet() +FSharp.Compiler.SyntaxTrivia.GetSetKeywords: Boolean get_IsSet() +FSharp.Compiler.SyntaxTrivia.GetSetKeywords: FSharp.Compiler.SyntaxTrivia.GetSetKeywords NewGet(FSharp.Compiler.Text.Range) +FSharp.Compiler.SyntaxTrivia.GetSetKeywords: FSharp.Compiler.SyntaxTrivia.GetSetKeywords NewGetSet(FSharp.Compiler.Text.Range, FSharp.Compiler.Text.Range) +FSharp.Compiler.SyntaxTrivia.GetSetKeywords: FSharp.Compiler.SyntaxTrivia.GetSetKeywords NewSet(FSharp.Compiler.Text.Range) +FSharp.Compiler.SyntaxTrivia.GetSetKeywords: FSharp.Compiler.SyntaxTrivia.GetSetKeywords+Get +FSharp.Compiler.SyntaxTrivia.GetSetKeywords: FSharp.Compiler.SyntaxTrivia.GetSetKeywords+GetSet +FSharp.Compiler.SyntaxTrivia.GetSetKeywords: FSharp.Compiler.SyntaxTrivia.GetSetKeywords+Set +FSharp.Compiler.SyntaxTrivia.GetSetKeywords: FSharp.Compiler.SyntaxTrivia.GetSetKeywords+Tags +FSharp.Compiler.SyntaxTrivia.GetSetKeywords: FSharp.Compiler.Text.Range Range +FSharp.Compiler.SyntaxTrivia.GetSetKeywords: FSharp.Compiler.Text.Range get_Range() +FSharp.Compiler.SyntaxTrivia.GetSetKeywords: Int32 Tag +FSharp.Compiler.SyntaxTrivia.GetSetKeywords: Int32 get_Tag() +FSharp.Compiler.SyntaxTrivia.GetSetKeywords: System.String ToString() FSharp.Compiler.SyntaxTrivia.IdentTrivia FSharp.Compiler.SyntaxTrivia.IdentTrivia+HasParenthesis: FSharp.Compiler.Text.Range get_leftParenRange() FSharp.Compiler.SyntaxTrivia.IdentTrivia+HasParenthesis: FSharp.Compiler.Text.Range get_rightParenRange() @@ -9737,21 +9767,21 @@ FSharp.Compiler.SyntaxTrivia.SynMatchClauseTrivia: Void .ctor(Microsoft.FSharp.C FSharp.Compiler.SyntaxTrivia.SynMemberDefnAbstractSlotTrivia FSharp.Compiler.SyntaxTrivia.SynMemberDefnAbstractSlotTrivia: FSharp.Compiler.SyntaxTrivia.SynMemberDefnAbstractSlotTrivia Zero FSharp.Compiler.SyntaxTrivia.SynMemberDefnAbstractSlotTrivia: FSharp.Compiler.SyntaxTrivia.SynMemberDefnAbstractSlotTrivia get_Zero() -FSharp.Compiler.SyntaxTrivia.SynMemberDefnAbstractSlotTrivia: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] GetSetKeyword -FSharp.Compiler.SyntaxTrivia.SynMemberDefnAbstractSlotTrivia: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] get_GetSetKeyword() +FSharp.Compiler.SyntaxTrivia.SynMemberDefnAbstractSlotTrivia: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.SyntaxTrivia.GetSetKeywords] GetSetKeywords +FSharp.Compiler.SyntaxTrivia.SynMemberDefnAbstractSlotTrivia: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.SyntaxTrivia.GetSetKeywords] get_GetSetKeywords() FSharp.Compiler.SyntaxTrivia.SynMemberDefnAbstractSlotTrivia: System.String ToString() -FSharp.Compiler.SyntaxTrivia.SynMemberDefnAbstractSlotTrivia: Void .ctor(Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range]) +FSharp.Compiler.SyntaxTrivia.SynMemberDefnAbstractSlotTrivia: Void .ctor(Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.SyntaxTrivia.GetSetKeywords]) FSharp.Compiler.SyntaxTrivia.SynMemberDefnAutoPropertyTrivia FSharp.Compiler.SyntaxTrivia.SynMemberDefnAutoPropertyTrivia: FSharp.Compiler.SyntaxTrivia.SynLeadingKeyword LeadingKeyword FSharp.Compiler.SyntaxTrivia.SynMemberDefnAutoPropertyTrivia: FSharp.Compiler.SyntaxTrivia.SynLeadingKeyword get_LeadingKeyword() +FSharp.Compiler.SyntaxTrivia.SynMemberDefnAutoPropertyTrivia: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.SyntaxTrivia.GetSetKeywords] GetSetKeywords +FSharp.Compiler.SyntaxTrivia.SynMemberDefnAutoPropertyTrivia: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.SyntaxTrivia.GetSetKeywords] get_GetSetKeywords() FSharp.Compiler.SyntaxTrivia.SynMemberDefnAutoPropertyTrivia: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] EqualsRange -FSharp.Compiler.SyntaxTrivia.SynMemberDefnAutoPropertyTrivia: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] GetSetKeyword FSharp.Compiler.SyntaxTrivia.SynMemberDefnAutoPropertyTrivia: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] WithKeyword FSharp.Compiler.SyntaxTrivia.SynMemberDefnAutoPropertyTrivia: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] get_EqualsRange() -FSharp.Compiler.SyntaxTrivia.SynMemberDefnAutoPropertyTrivia: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] get_GetSetKeyword() FSharp.Compiler.SyntaxTrivia.SynMemberDefnAutoPropertyTrivia: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] get_WithKeyword() FSharp.Compiler.SyntaxTrivia.SynMemberDefnAutoPropertyTrivia: System.String ToString() -FSharp.Compiler.SyntaxTrivia.SynMemberDefnAutoPropertyTrivia: Void .ctor(FSharp.Compiler.SyntaxTrivia.SynLeadingKeyword, 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.SyntaxTrivia.SynMemberDefnAutoPropertyTrivia: Void .ctor(FSharp.Compiler.SyntaxTrivia.SynLeadingKeyword, 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.SyntaxTrivia.GetSetKeywords]) FSharp.Compiler.SyntaxTrivia.SynMemberGetSetTrivia FSharp.Compiler.SyntaxTrivia.SynMemberGetSetTrivia: FSharp.Compiler.Text.Range WithKeyword FSharp.Compiler.SyntaxTrivia.SynMemberGetSetTrivia: FSharp.Compiler.Text.Range get_WithKeyword() @@ -9766,10 +9796,10 @@ FSharp.Compiler.SyntaxTrivia.SynMemberGetSetTrivia: Void .ctor(FSharp.Compiler.T FSharp.Compiler.SyntaxTrivia.SynMemberSigMemberTrivia FSharp.Compiler.SyntaxTrivia.SynMemberSigMemberTrivia: FSharp.Compiler.SyntaxTrivia.SynMemberSigMemberTrivia Zero FSharp.Compiler.SyntaxTrivia.SynMemberSigMemberTrivia: FSharp.Compiler.SyntaxTrivia.SynMemberSigMemberTrivia get_Zero() -FSharp.Compiler.SyntaxTrivia.SynMemberSigMemberTrivia: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] GetSetKeyword -FSharp.Compiler.SyntaxTrivia.SynMemberSigMemberTrivia: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] get_GetSetKeyword() +FSharp.Compiler.SyntaxTrivia.SynMemberSigMemberTrivia: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.SyntaxTrivia.GetSetKeywords] GetSetKeywords +FSharp.Compiler.SyntaxTrivia.SynMemberSigMemberTrivia: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.SyntaxTrivia.GetSetKeywords] get_GetSetKeywords() FSharp.Compiler.SyntaxTrivia.SynMemberSigMemberTrivia: System.String ToString() -FSharp.Compiler.SyntaxTrivia.SynMemberSigMemberTrivia: Void .ctor(Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range]) +FSharp.Compiler.SyntaxTrivia.SynMemberSigMemberTrivia: Void .ctor(Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.SyntaxTrivia.GetSetKeywords]) FSharp.Compiler.SyntaxTrivia.SynModuleDeclNestedModuleTrivia FSharp.Compiler.SyntaxTrivia.SynModuleDeclNestedModuleTrivia: FSharp.Compiler.SyntaxTrivia.SynModuleDeclNestedModuleTrivia Zero FSharp.Compiler.SyntaxTrivia.SynModuleDeclNestedModuleTrivia: FSharp.Compiler.SyntaxTrivia.SynModuleDeclNestedModuleTrivia get_Zero() diff --git a/tests/service/SyntaxTreeTests/MemberTests.fs b/tests/service/SyntaxTreeTests/MemberTests.fs index f0aa7f87e43..3533a4e69b4 100644 --- a/tests/service/SyntaxTreeTests/MemberTests.fs +++ b/tests/service/SyntaxTreeTests/MemberTests.fs @@ -40,12 +40,13 @@ type Foo() = SynModuleDecl.Types( typeDefns = [ SynTypeDefn(typeRepr = SynTypeDefnRepr.ObjectModel(members = [_ SynMemberDefn.AutoProperty(trivia = { WithKeyword = Some mWith - GetSetKeyword = Some mGS }) + GetSetKeywords = Some (GetSetKeywords.GetSet(mGet, mSet)) }) SynMemberDefn.AutoProperty(trivia = { WithKeyword = None })])) ] ) ]) ])) -> assertRange (3, 39) (3, 43) mWith - assertRange (3, 44) (3, 52) mGS + assertRange (3, 44) (3, 47) mGet + assertRange (3, 49) (3, 52) mSet | _ -> Assert.Fail "Could not get valid AST" [] @@ -62,11 +63,12 @@ type Foo() = SynModuleDecl.Types( typeDefns = [ SynTypeDefn(typeRepr = SynTypeDefnRepr.ObjectModel(members = [_ SynMemberDefn.AbstractSlot(slotSig=SynValSig(trivia = { WithKeyword = Some mWith }) - trivia = { GetSetKeyword = Some mGS })])) ] + trivia = { GetSetKeywords = Some (GetSetKeywords.GetSet(mGet, mSet)) })])) ] ) ]) ])) -> assertRange (3, 30) (3, 34) mWith - assertRange (3, 35) (3, 42) mGS + assertRange (3, 35) (3, 38) mGet + assertRange (3, 39) (3, 42) mSet | _ -> Assert.Fail "Could not get valid AST" [] @@ -229,7 +231,7 @@ type A = | _ -> Assert.Fail "Could not get valid AST" [] -let ``Signature member with get,set`` () = +let ``Signature member with set,get`` () = let parseResults = getParseResultsOfSignatureFile """ @@ -239,7 +241,7 @@ type X = // MemberSig.Member member Y : int with - get , set + set , get """ match parseResults with @@ -248,10 +250,68 @@ type X = SynModuleSigDecl.Types(types = [ SynTypeDefnSig(typeRepr = SynTypeDefnSigRepr.ObjectModel(memberSigs = [ SynMemberSig.Member(memberSig = SynValSig(trivia = { WithKeyword = Some mWith }) - trivia = { GetSetKeyword = Some mGS }) + trivia = { GetSetKeywords = Some (GetSetKeywords.GetSet(mGet, mSet)) }) ])) ]) ] ) ])) -> assertRange (7, 20) (7, 24) mWith - assertRange (8, 28) (8, 39) mGS + assertRange (8, 28) (8, 31) mSet + assertRange (8, 36) (8, 39) mGet + | _ -> Assert.Fail "Could not get valid AST" + +[] +let ``Signature member with set`` () = + let parseResults = + getParseResultsOfSignatureFile + """ +module Meh + +type X = + // MemberSig.Member + member Y : int + with + set +""" + + match parseResults with + | ParsedInput.SigFile (ParsedSigFileInput (contents=[ + SynModuleOrNamespaceSig(decls=[ + SynModuleSigDecl.Types(types = [ + SynTypeDefnSig(typeRepr = SynTypeDefnSigRepr.ObjectModel(memberSigs = [ + SynMemberSig.Member(memberSig = SynValSig(trivia = { WithKeyword = Some mWith }) + trivia = { GetSetKeywords = Some (GetSetKeywords.Set(mSet)) }) + ])) + ]) + ] ) ])) -> + assertRange (7, 20) (7, 24) mWith + assertRange (8, 28) (8, 31) mSet + | _ -> Assert.Fail "Could not get valid AST" + + +[] +let ``Signature member with get`` () = + let parseResults = + getParseResultsOfSignatureFile + """ +module Meh + +type X = + // MemberSig.Member + member Y : int + with + get +""" + + match parseResults with + | ParsedInput.SigFile (ParsedSigFileInput (contents=[ + SynModuleOrNamespaceSig(decls=[ + SynModuleSigDecl.Types(types = [ + SynTypeDefnSig(typeRepr = SynTypeDefnSigRepr.ObjectModel(memberSigs = [ + SynMemberSig.Member(memberSig = SynValSig(trivia = { WithKeyword = Some mWith }) + trivia = { GetSetKeywords = Some (GetSetKeywords.Get(mGet)) }) + ])) + ]) + ] ) ])) -> + assertRange (7, 20) (7, 24) mWith + assertRange (8, 32) (8, 35) mGet | _ -> Assert.Fail "Could not get valid AST" From f29e057fc4005654241c89daedf2afb6e5a53f0a Mon Sep 17 00:00:00 2001 From: nojaf Date: Thu, 3 Nov 2022 11:32:23 +0100 Subject: [PATCH 4/4] Update base line for test --- tests/fsharp/typecheck/sigs/neg62.bsl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/fsharp/typecheck/sigs/neg62.bsl b/tests/fsharp/typecheck/sigs/neg62.bsl index de4ae9d68ac..8205597f550 100644 --- a/tests/fsharp/typecheck/sigs/neg62.bsl +++ b/tests/fsharp/typecheck/sigs/neg62.bsl @@ -25,7 +25,7 @@ neg62.fs(49,6,49,26): typecheck error FS0081: Implicit object constructors for s neg62.fs(50,5,50,21): typecheck error FS0901: Structs cannot contain value definitions because the default constructor for structs will not execute these bindings. Consider adding additional arguments to the primary constructor for the type. -neg62.fs(54,26,54,34): typecheck error FS3135: To indicate that this property can be set, use 'member val PropertyName = expr with get,set'. +neg62.fs(54,31,54,34): typecheck error FS3135: To indicate that this property can be set, use 'member val PropertyName = expr with get,set'. neg62.fs(69,22,69,40): typecheck error FS0670: This code is not sufficiently generic. The type variable 'S could not be generalized because it would escape its scope.