Skip to content

Commit 1e78d39

Browse files
nojafdawedawe
andauthored
Report auto property (#15589)
Co-authored-by: dawe <[email protected]>
1 parent b645ace commit 1e78d39

File tree

257 files changed

+921
-704
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

257 files changed

+921
-704
lines changed

src/Compiler/Checking/CheckDeclarations.fs

Lines changed: 59 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -957,8 +957,8 @@ module MutRecBindingChecking =
957957

958958
| Some (SynMemberDefn.Member (bind, m)), _ ->
959959
// Phase2A: member binding - create prelim valspec (for recursive reference) and RecursiveBindingInfo
960-
let NormalizedBinding(_, _, _, _, _, _, _, valSynData, _, _, _, _) as bind = BindingNormalization.NormalizeBinding ValOrMemberBinding cenv envForTycon bind
961-
let (SynValData(memberFlagsOpt, _, _)) = valSynData
960+
let NormalizedBinding(valSynData = valSynData) as bind = BindingNormalization.NormalizeBinding ValOrMemberBinding cenv envForTycon bind
961+
let (SynValData(memberFlags = memberFlagsOpt)) = valSynData
962962

963963
match tcref.TypeOrMeasureKind with
964964
| TyparKind.Type -> ()
@@ -993,6 +993,32 @@ module MutRecBindingChecking =
993993
| definition ->
994994
error(InternalError(sprintf "Unexpected definition %A" definition, m)))
995995

996+
// Report any desugared properties
997+
if defnAs.Length > 1 then
998+
for b1, b2 in List.pairwise defnAs do
999+
match b1, b2 with
1000+
| TyconBindingPhase2A.Phase2AMember {
1001+
SyntacticBinding = NormalizedBinding(valSynData = SynValData(transformedFromProperty = Some getPropertyIdent; memberFlags = Some mf))
1002+
RecBindingInfo = RecursiveBindingInfo(vspec = vGet)
1003+
},
1004+
TyconBindingPhase2A.Phase2AMember {
1005+
SyntacticBinding = NormalizedBinding(valSynData = SynValData(transformedFromProperty = Some setPropertyIdent))
1006+
RecBindingInfo = RecursiveBindingInfo(vspec = vSet)
1007+
} when Range.equals getPropertyIdent.idRange setPropertyIdent.idRange ->
1008+
match vGet.ApparentEnclosingEntity with
1009+
| ParentNone -> ()
1010+
| Parent parentRef ->
1011+
let apparentEnclosingType = generalizedTyconRef g parentRef
1012+
let vGet, vSet = if mf.MemberKind = SynMemberKind.PropertyGet then vGet, vSet else vSet, vGet
1013+
let item =
1014+
Item.Property(
1015+
getPropertyIdent.idText,
1016+
[ PropInfo.FSProp(g, apparentEnclosingType, Some (mkLocalValRef vGet), Some (mkLocalValRef vSet)) ],
1017+
Some getPropertyIdent.idRange
1018+
)
1019+
CallNameResolutionSink cenv.tcSink (getPropertyIdent.idRange, envForTycon.NameEnv, item, emptyTyparInst, ItemOccurence.Binding, envForTycon.eAccessRights)
1020+
| _ -> ()
1021+
9961022
// If no constructor call, insert Phase2AIncrClassCtorJustAfterSuperInit at start
9971023
let defnAs =
9981024
match defnAs with
@@ -4229,8 +4255,6 @@ module TcDeclarations =
42294255
// Only the keep the non-field-targeted attributes
42304256
let attribs = attribs |> List.filter (fun a -> match a.Target with Some t when t.idText = "field" -> false | _ -> true)
42314257
let fldId = ident (CompilerGeneratedName id.idText, mMemberPortion)
4232-
let headPatIds = if isStatic then [id] else [ident ("__", mMemberPortion);id]
4233-
let headPat = SynPat.LongIdent (SynLongIdent(headPatIds, [], List.replicate headPatIds.Length None), None, Some noInferredTypars, SynArgPats.Pats [], None, mMemberPortion)
42344258
let memberFlags = { memberFlags with GetterOrSetterIsCompilerGenerated = true }
42354259
let memberFlagsForSet = { memberFlagsForSet with GetterOrSetterIsCompilerGenerated = true }
42364260

@@ -4247,7 +4271,20 @@ module TcDeclarations =
42474271
let rhsExpr = SynExpr.Ident fldId
42484272
let retInfo = match tyOpt with None -> None | Some ty -> Some (None, SynReturnInfo((ty, SynInfo.unnamedRetVal), ty.Range))
42494273
let attribs = mkAttributeList attribs mMemberPortion
4274+
let headPatIds =
4275+
let id =
4276+
match mGetSetOpt with
4277+
| Some (GetSetKeywords.GetSet(get = mGet)) -> Ident(id.idText, mGet)
4278+
| _ -> id
4279+
if isStatic then [id] else [ident ("__", mMemberPortion);id]
4280+
let headPat = SynPat.LongIdent (SynLongIdent(headPatIds, [], List.replicate headPatIds.Length None), None, Some noInferredTypars, SynArgPats.Pats [], None, mMemberPortion)
42504281
let binding = mkSynBinding (xmlDoc, headPat) (access, false, false, mMemberPortion, DebugPointAtBinding.NoneAtInvisible, retInfo, rhsExpr, rhsExpr.Range, [], attribs, Some memberFlags, SynBindingTrivia.Zero)
4282+
let binding =
4283+
match mGetSetOpt with
4284+
| Some (GetSetKeywords.GetSet _) ->
4285+
// Only add the additional meta data to the SynBinding (SynValData) is both get and set are present.
4286+
updatePropertyIdentInSynBinding id binding
4287+
| _ -> binding
42514288
SynMemberDefn.Member (binding, mMemberPortion)
42524289
yield getter
42534290
| _ -> ()
@@ -4256,11 +4293,26 @@ module TcDeclarations =
42564293
| SynMemberKind.PropertySet
42574294
| SynMemberKind.PropertyGetSet ->
42584295
let setter =
4259-
let vId = ident("v", mMemberPortion)
4296+
let vId =
4297+
match mGetSetOpt with
4298+
| Some (GetSetKeywords.GetSet(set = mSet)) -> ident("v", mSet)
4299+
| _ -> ident("v", mMemberPortion)
4300+
let headPatIds =
4301+
let id =
4302+
match mGetSetOpt with
4303+
| Some (GetSetKeywords.GetSet(set = mSet)) -> Ident(id.idText, mSet)
4304+
| _ -> id
4305+
if isStatic then [id] else [ident ("__", mMemberPortion);id]
42604306
let headPat = SynPat.LongIdent (SynLongIdent(headPatIds, [], List.replicate headPatIds.Length None), None, Some noInferredTypars, SynArgPats.Pats [mkSynPatVar None vId], None, mMemberPortion)
42614307
let rhsExpr = mkSynAssign (SynExpr.Ident fldId) (SynExpr.Ident vId)
42624308
let binding = mkSynBinding (xmlDoc, headPat) (access, false, false, mMemberPortion, DebugPointAtBinding.NoneAtInvisible, None, rhsExpr, rhsExpr.Range, [], [], Some memberFlagsForSet, SynBindingTrivia.Zero)
4263-
SynMemberDefn.Member (binding, mMemberPortion)
4309+
let binding =
4310+
match mGetSetOpt with
4311+
| Some (GetSetKeywords.GetSet _) ->
4312+
// Only add the additional meta data to the SynBinding (SynValData) is both get and set are present.
4313+
updatePropertyIdentInSynBinding id binding
4314+
| _ -> binding
4315+
SynMemberDefn.Member (binding, mMemberPortion)
42644316
yield setter
42654317
| _ -> ()]
42664318
| SynMemberDefn.Interface (ty, mWith, Some membs, m) ->
@@ -4310,7 +4362,7 @@ module TcDeclarations =
43104362

43114363
let isConcrete =
43124364
members |> List.exists (function
4313-
| SynMemberDefn.Member(SynBinding(valData = SynValData(Some memberFlags, _, _)), _) -> not memberFlags.IsDispatchSlot
4365+
| SynMemberDefn.Member(SynBinding(valData = SynValData(memberFlags = Some memberFlags)), _) -> not memberFlags.IsDispatchSlot
43144366
| SynMemberDefn.Interface (members=defOpt) -> Option.isSome defOpt
43154367
| SynMemberDefn.LetBindings _ -> true
43164368
| SynMemberDefn.ImplicitCtor _ -> true

0 commit comments

Comments
 (0)