@@ -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