Skip to content

Commit 0c5671f

Browse files
nojafdsyme
andauthored
Refactor get/set members to SynMemberDefn.GetSetMember. (#13420)
* Refactor get/set members to SynMemberDefn.GetSetMember. * Accept reversed order of get/set identifiers. * Update ServiceStructure.fs * Update ServiceXmlDocParser.fs * Update SyntaxTrivia.fsi Co-authored-by: Don Syme <[email protected]>
1 parent 3229db8 commit 0c5671f

23 files changed

+492
-190
lines changed

src/Compiler/Checking/CheckDeclarations.fs

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2531,6 +2531,7 @@ let TcMutRecDefns_Phase2 (cenv: cenv) envInitial bindsm scopem mutRecNSInfo (env
25312531
| SynMemberDefn.LetBindings _
25322532
| SynMemberDefn.AutoProperty _
25332533
| SynMemberDefn.Member _
2534+
| SynMemberDefn.GetSetMember _
25342535
| SynMemberDefn.Open _
25352536
-> Some(TyconBindingDefn(containerInfo, newslotsOK, declKind, memb, memb.Range))
25362537

@@ -2554,7 +2555,8 @@ let TcMutRecDefns_Phase2 (cenv: cenv) envInitial bindsm scopem mutRecNSInfo (env
25542555
error(InternalError("Intrinsic augmentations of types are only permitted in the same file as the definition of the type", m))
25552556
members |> List.iter (fun mem ->
25562557
match mem with
2557-
| SynMemberDefn.Member _ -> ()
2558+
| SynMemberDefn.Member _
2559+
| SynMemberDefn.GetSetMember _
25582560
| SynMemberDefn.Interface _ -> ()
25592561
| SynMemberDefn.Open _
25602562
| SynMemberDefn.AutoProperty _
@@ -4813,10 +4815,12 @@ module TcDeclarations =
48134815
/// where simpleRepr can contain inherit type, declared fields and virtual slots.
48144816
/// body = members
48154817
/// where members contain methods/overrides, also implicit ctor, inheritCall and local definitions.
4816-
let rec private SplitTyconDefn (SynTypeDefn(typeInfo=synTyconInfo;typeRepr=trepr; members=extraMembers)) =
4818+
let rec private SplitTyconDefn (SynTypeDefn(typeInfo=synTyconInfo;typeRepr=trepr; members=extraMembers)) =
4819+
let extraMembers = desugarGetSetMembers extraMembers
48174820
let implements1 = List.choose (function SynMemberDefn.Interface (interfaceType=ty) -> Some(ty, ty.Range) | _ -> None) extraMembers
48184821
match trepr with
48194822
| SynTypeDefnRepr.ObjectModel(kind, cspec, m) ->
4823+
let cspec = desugarGetSetMembers cspec
48204824
CheckMembersForm cspec
48214825
let fields = cspec |> List.choose (function SynMemberDefn.ValField (f, _) -> Some f | _ -> None)
48224826
let implements2 = cspec |> List.choose (function SynMemberDefn.Interface (interfaceType=ty) -> Some(ty, ty.Range) | _ -> None)
@@ -4833,7 +4837,8 @@ module TcDeclarations =
48334837
cspec |> List.filter (fun memb ->
48344838
match memb with
48354839
| SynMemberDefn.Interface _
4836-
| SynMemberDefn.Member _
4840+
| SynMemberDefn.Member _
4841+
| SynMemberDefn.GetSetMember _
48374842
| SynMemberDefn.LetBindings _
48384843
| SynMemberDefn.ImplicitCtor _
48394844
| SynMemberDefn.AutoProperty _
@@ -4853,7 +4858,7 @@ module TcDeclarations =
48534858
let attribs = attribs |> List.filter (fun a -> match a.Target with Some t when t.idText = "field" -> true | _ -> false)
48544859
let mLetPortion = synExpr.Range
48554860
let fldId = ident (CompilerGeneratedName id.idText, mLetPortion)
4856-
let headPat = SynPat.LongIdent (SynLongIdent([fldId], [], [None]), None, None, Some noInferredTypars, SynArgPats.Pats [], None, mLetPortion)
4861+
let headPat = SynPat.LongIdent (SynLongIdent([fldId], [], [None]), None, Some noInferredTypars, SynArgPats.Pats [], None, mLetPortion)
48574862
let retInfo = match tyOpt with None -> None | Some ty -> Some (SynReturnInfo((ty, SynInfo.unnamedRetVal), ty.Range))
48584863
let isMutable =
48594864
match propKind with
@@ -4881,7 +4886,7 @@ module TcDeclarations =
48814886
let attribs = attribs |> List.filter (fun a -> match a.Target with Some t when t.idText = "field" -> false | _ -> true)
48824887
let fldId = ident (CompilerGeneratedName id.idText, mMemberPortion)
48834888
let headPatIds = if isStatic then [id] else [ident ("__", mMemberPortion);id]
4884-
let headPat = SynPat.LongIdent (SynLongIdent(headPatIds, [], List.replicate headPatIds.Length None), None, None, Some noInferredTypars, SynArgPats.Pats [], None, mMemberPortion)
4889+
let headPat = SynPat.LongIdent (SynLongIdent(headPatIds, [], List.replicate headPatIds.Length None), None, Some noInferredTypars, SynArgPats.Pats [], None, mMemberPortion)
48854890

48864891
match propKind, mGetSetOpt with
48874892
| SynMemberKind.PropertySet, Some m -> errorR(Error(FSComp.SR.parsMutableOnAutoPropertyShouldBeGetSetNotJustSet(), m))
@@ -4906,7 +4911,7 @@ module TcDeclarations =
49064911
| SynMemberKind.PropertyGetSet ->
49074912
let setter =
49084913
let vId = ident("v", mMemberPortion)
4909-
let headPat = SynPat.LongIdent (SynLongIdent(headPatIds, [], List.replicate headPatIds.Length None), None, None, Some noInferredTypars, SynArgPats.Pats [mkSynPatVar None vId], None, mMemberPortion)
4914+
let headPat = SynPat.LongIdent (SynLongIdent(headPatIds, [], List.replicate headPatIds.Length None), None, Some noInferredTypars, SynArgPats.Pats [mkSynPatVar None vId], None, mMemberPortion)
49104915
let rhsExpr = mkSynAssign (SynExpr.Ident fldId) (SynExpr.Ident vId)
49114916
//let retInfo = match tyOpt with None -> None | Some ty -> Some (SynReturnInfo((ty, SynInfo.unnamedRetVal), ty.Range))
49124917
let binding = mkSynBinding (xmlDoc, headPat) (access, false, false, mMemberPortion, DebugPointAtBinding.NoneAtInvisible, None, rhsExpr, rhsExpr.Range, [], [], Some (memberFlags SynMemberKind.PropertySet), SynBindingTrivia.Zero)
@@ -5717,7 +5722,8 @@ and TcModuleOrNamespaceElementsMutRec (cenv: cenv) parent typeNames m envInitial
57175722
let decls = [ MutRecShape.Open (MutRecDataForOpen(target, m, moduleRange, ref [])) ]
57185723
decls, (openOk, moduleAbbrevOk, attrs)
57195724

5720-
| SynModuleDecl.Exception (SynExceptionDefn(repr, _, members, _), _m) ->
5725+
| SynModuleDecl.Exception (SynExceptionDefn(repr, _, members, _), _m) ->
5726+
let members = desugarGetSetMembers members
57215727
let (SynExceptionDefnRepr(synAttrs, SynUnionCase(ident=SynIdent(id,_)), _repr, xmlDoc, vis, m)) = repr
57225728
let compInfo = SynComponentInfo(synAttrs, None, [], [id], xmlDoc, false, vis, id.idRange)
57235729
let decls = [ MutRecShape.Tycon(SynTypeDefn(compInfo, SynTypeDefnRepr.Exception repr, members, None, m, SynTypeDefnTrivia.Zero)) ]

src/Compiler/Checking/CheckExpressions.fs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2636,7 +2636,7 @@ module BindingNormalization =
26362636
| SynPat.FromParseError(innerPat, _) ->
26372637
normPattern innerPat
26382638

2639-
| SynPat.LongIdent (SynLongIdent(longId, _, _), _, toolId, tyargs, SynArgPats.Pats args, vis, m) ->
2639+
| SynPat.LongIdent (SynLongIdent(longId, _, _), toolId, tyargs, SynArgPats.Pats args, vis, m) ->
26402640
let typars = match tyargs with None -> inferredTyparDecls | Some typars -> typars
26412641
match memberFlagsOpt with
26422642
| None ->
@@ -5710,6 +5710,12 @@ and TcExprUndelayed cenv (overallTy: OverallTy) env tpenv (synExpr: SynExpr) =
57105710
)
57115711

57125712
| SynExpr.ObjExpr (synObjTy, argopt, _mWith, binds, members, extraImpls, mNewExpr, m) ->
5713+
let members = desugarGetSetMembers members
5714+
let extraImpls =
5715+
extraImpls
5716+
|> List.map (fun (SynInterfaceImpl(interfaceTy, withKeyword, bindings, members, m)) ->
5717+
SynInterfaceImpl(interfaceTy, withKeyword, bindings, desugarGetSetMembers members, m)
5718+
)
57135719
TcNonControlFlowExpr env <| fun env ->
57145720
let binds = unionBindingAndMembers binds members
57155721
TcExprObjectExpr cenv overallTy env tpenv (synObjTy, argopt, binds, extraImpls, mNewExpr, m)

src/Compiler/Service/FSharpParseFileResults.fs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -885,6 +885,14 @@ type FSharpParseFileResults(diagnostics: FSharpDiagnostic[], input: ParsedInput,
885885
| SynMemberDefn.AutoProperty (synExpr = synExpr) -> yield! walkExpr true synExpr
886886
| SynMemberDefn.ImplicitCtor (_, _, _, _, _, m) -> yield! checkRange m
887887
| SynMemberDefn.Member (bind, _) -> yield! walkBind bind
888+
| SynMemberDefn.GetSetMember (getBinding, setBinding, _, _) ->
889+
match getBinding, setBinding with
890+
| None, None -> ()
891+
| None, Some binding
892+
| Some binding, None -> yield! walkBind binding
893+
| Some getBinding, Some setBinding ->
894+
yield! walkBind getBinding
895+
yield! walkBind setBinding
888896
| SynMemberDefn.Interface(members = Some membs) ->
889897
for m in membs do
890898
yield! walkMember m

src/Compiler/Service/ServiceInterfaceStubGenerator.fs

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -592,9 +592,12 @@ module InterfaceStubGenerator =
592592
| InterfaceData.Interface (_, None) -> []
593593
| InterfaceData.Interface (_, Some memberDefns) ->
594594
memberDefns
595-
|> Seq.choose (function
596-
| SynMemberDefn.Member (binding, _) -> Some binding
597-
| _ -> None)
595+
|> Seq.collect (function
596+
| SynMemberDefn.Member (binding, _) -> [ binding ]
597+
| SynMemberDefn.GetSetMember (Some getBinding, Some setBinding, _, _) -> [ getBinding; setBinding ]
598+
| SynMemberDefn.GetSetMember (Some binding, None, _, _)
599+
| SynMemberDefn.GetSetMember (None, Some binding, _, _) -> [ binding ]
600+
| _ -> [])
598601
|> Seq.choose (|MemberNameAndRange|_|)
599602
|> Seq.toList
600603
| InterfaceData.ObjExpr (_, bindings) -> List.choose (|MemberNameAndRange|_|) bindings
@@ -817,6 +820,12 @@ module InterfaceStubGenerator =
817820
else
818821
Option.bind (List.tryPick walkSynMemberDefn) members
819822
| SynMemberDefn.Member (binding, _range) -> walkBinding binding
823+
| SynMemberDefn.GetSetMember (getBinding, setBinding, _, _) ->
824+
match getBinding, setBinding with
825+
| None, None -> None
826+
| Some binding, None
827+
| None, Some binding -> walkBinding binding
828+
| Some getBinding, Some setBinding -> walkBinding getBinding |> Option.orElseWith (fun () -> walkBinding setBinding)
820829
| SynMemberDefn.NestedType (typeDef, _access, _range) -> walkSynTypeDefn typeDef
821830
| SynMemberDefn.ValField (_field, _range) -> None
822831
| SynMemberDefn.LetBindings (bindings, _isStatic, _isRec, _range) -> List.tryPick walkBinding bindings

src/Compiler/Service/ServiceNavigation.fs

Lines changed: 29 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -321,44 +321,32 @@ module NavigationImpl =
321321
and processMembers members enclosingEntityKind =
322322
let members =
323323
members
324-
|> List.groupBy (fun x -> x.Range)
325-
|> List.map (fun (range, members) ->
326-
range,
327-
(match members with
328-
| [ memb ] ->
329-
match memb with
330-
| SynMemberDefn.LetBindings (binds, _, _, _) -> List.collect (processBinding false enclosingEntityKind false) binds
331-
| SynMemberDefn.Member (bind, _) -> processBinding true enclosingEntityKind false bind
332-
| SynMemberDefn.ValField (SynField (_, _, Some (rcid), _, _, _, access, range), _) ->
333-
[
334-
createMember (rcid, NavigationItemKind.Field, FSharpGlyph.Field, range, enclosingEntityKind, false, access)
335-
]
336-
| SynMemberDefn.AutoProperty (ident = id; accessibility = access) ->
337-
[
338-
createMember (id, NavigationItemKind.Field, FSharpGlyph.Field, id.idRange, enclosingEntityKind, false, access)
339-
]
340-
| SynMemberDefn.AbstractSlot (SynValSig (ident = SynIdent (id, _); synType = ty; accessibility = access), _, _) ->
341-
[
342-
createMember (id, NavigationItemKind.Method, FSharpGlyph.OverridenMethod, ty.Range, enclosingEntityKind, true, access)
343-
]
344-
| SynMemberDefn.NestedType _ -> failwith "tycon as member????" //processTycon tycon
345-
| SynMemberDefn.Interface(members = Some (membs)) -> processMembers membs enclosingEntityKind |> snd
346-
| _ -> []
347-
// can happen if one is a getter and one is a setter
348-
| [ SynMemberDefn.Member(memberDefn = SynBinding(headPat = SynPat.LongIdent (longDotId = lid1; extraId = Some (info1))) as binding1)
349-
SynMemberDefn.Member(memberDefn = SynBinding(headPat = SynPat.LongIdent (longDotId = lid2; extraId = Some (info2))) as binding2) ] ->
350-
// ensure same long id
351-
assert
352-
((lid1.LongIdent, lid2.LongIdent)
353-
||> List.forall2 (fun x y -> x.idText = y.idText))
354-
// ensure one is getter, other is setter
355-
assert
356-
((info1.idText = "set" && info2.idText = "get")
357-
|| (info2.idText = "set" && info1.idText = "get"))
358-
// both binding1 and binding2 have same range, so just try the first one, else try the second one
359-
match processBinding true enclosingEntityKind false binding1 with
360-
| [] -> processBinding true enclosingEntityKind false binding2
361-
| x -> x
324+
|> List.map (fun md ->
325+
md.Range,
326+
(match md with
327+
| SynMemberDefn.LetBindings (binds, _, _, _) -> List.collect (processBinding false enclosingEntityKind false) binds
328+
| SynMemberDefn.GetSetMember (Some bind, None, _, _)
329+
| SynMemberDefn.GetSetMember (None, Some bind, _, _)
330+
| SynMemberDefn.Member (bind, _) -> processBinding true enclosingEntityKind false bind
331+
| SynMemberDefn.ValField (SynField (_, _, Some (rcid), _, _, _, access, range), _) ->
332+
[
333+
createMember (rcid, NavigationItemKind.Field, FSharpGlyph.Field, range, enclosingEntityKind, false, access)
334+
]
335+
| SynMemberDefn.AutoProperty (ident = id; accessibility = access) ->
336+
[
337+
createMember (id, NavigationItemKind.Field, FSharpGlyph.Field, id.idRange, enclosingEntityKind, false, access)
338+
]
339+
| SynMemberDefn.AbstractSlot (SynValSig (ident = SynIdent (id, _); synType = ty; accessibility = access), _, _) ->
340+
[
341+
createMember (id, NavigationItemKind.Method, FSharpGlyph.OverridenMethod, ty.Range, enclosingEntityKind, true, access)
342+
]
343+
| SynMemberDefn.NestedType _ -> failwith "tycon as member????" //processTycon tycon
344+
| SynMemberDefn.Interface(members = Some (membs)) -> processMembers membs enclosingEntityKind |> snd
345+
| SynMemberDefn.GetSetMember (Some getBinding, Some setBinding, _, _) ->
346+
[
347+
yield! processBinding true enclosingEntityKind false getBinding
348+
yield! processBinding true enclosingEntityKind false setBinding
349+
]
362350
| _ -> []))
363351

364352
let m2 = members |> Seq.map fst |> Seq.fold unionRangesChecked range.Zero
@@ -997,6 +985,9 @@ module NavigateTo =
997985
walkSynMemberDefn m container
998986
| None -> ()
999987
| SynMemberDefn.Member (binding, _) -> addBinding binding None container
988+
| SynMemberDefn.GetSetMember (getBinding, setBinding, _, _) ->
989+
Option.iter (fun b -> addBinding b None container) getBinding
990+
Option.iter (fun b -> addBinding b None container) setBinding
1000991
| SynMemberDefn.NestedType (typeDef, _, _) -> walkSynTypeDefn typeDef container
1001992
| SynMemberDefn.ValField (field, _) -> addField field false container
1002993
| SynMemberDefn.LetBindings (bindings, _, _, _) ->

0 commit comments

Comments
 (0)