@@ -8953,26 +8953,39 @@ and TcValueItemThen cenv overallTy env vref tpenv mItem afterResolution delayed
89538953and TcPropertyItemThen cenv overallTy env nm pinfos tpenv mItem afterResolution delayed =
89548954 let g = cenv.g
89558955 let ad = env.eAccessRights
8956- if isNil pinfos then error (InternalError ("Unexpected error: empty property list", mItem))
8957- // if there are both intrinsics and extensions in pinfos, intrinsics will be listed first.
8956+
8957+ if isNil pinfos then
8958+ error (InternalError ("Unexpected error: empty property list", mItem))
8959+
8960+ // If there are both intrinsics and extensions in pinfos, intrinsics will be listed first.
89588961 // by looking at List.Head we are letting the intrinsics determine indexed/non-indexed
89598962 let pinfo = List.head pinfos
8963+
89608964 let _, tyargsOpt, args, delayed, tpenv =
8961- if pinfo.IsIndexer
8962- then GetMemberApplicationArgs delayed cenv env tpenv
8963- else ExprAtomicFlag.Atomic, None, [mkSynUnit mItem], delayed, tpenv
8964- if not pinfo.IsStatic then error (Error (FSComp.SR.tcPropertyIsNotStatic nm, mItem))
8965+ if pinfo.IsIndexer then
8966+ GetMemberApplicationArgs delayed cenv env tpenv
8967+ else
8968+ ExprAtomicFlag.Atomic, None, [mkSynUnit mItem], delayed, tpenv
8969+
8970+ if not pinfo.IsStatic then
8971+ error (Error (FSComp.SR.tcPropertyIsNotStatic nm, mItem))
8972+
89658973 match delayed with
89668974 | DelayedSet(e2, mStmt) :: otherDelayed ->
89678975 if not (isNil otherDelayed) then error(Error(FSComp.SR.tcInvalidAssignment(), mStmt))
8976+
89688977 // Static Property Set (possibly indexer)
89698978 UnifyTypes cenv env mStmt overallTy.Commit g.unit_ty
8979+
89708980 let meths = pinfos |> SettersOfPropInfos
8981+
89718982 if meths.IsEmpty then
89728983 let meths = pinfos |> GettersOfPropInfos
89738984 let isByrefMethReturnSetter = meths |> List.exists (function _,Some pinfo -> isByrefTy g (pinfo.GetPropertyType(cenv.amap,mItem)) | _ -> false)
8985+
89748986 if not isByrefMethReturnSetter then
89758987 errorR (Error (FSComp.SR.tcPropertyCannotBeSet1 nm, mItem))
8988+
89768989 // x.P <- ... byref setter
89778990 if isNil meths then error (Error (FSComp.SR.tcPropertyIsNotReadable nm, mItem))
89788991 TcMethodApplicationThen cenv env overallTy None tpenv tyargsOpt [] mItem mItem nm ad NeverMutates true meths afterResolution NormalValUse args ExprAtomicFlag.Atomic delayed
@@ -9067,7 +9080,6 @@ and GetSynMemberApplicationArgs delayed tpenv =
90679080 | otherDelayed ->
90689081 (ExprAtomicFlag.NonAtomic, None, [], otherDelayed, tpenv)
90699082
9070-
90719083and TcMemberTyArgsOpt cenv env tpenv tyargsOpt =
90729084 match tyargsOpt with
90739085 | None -> None, tpenv
@@ -9233,15 +9245,15 @@ and TcEventItemThen cenv overallTy env tpenv mItem mExprAndItem objDetails (einf
92339245 | None, false -> error (Error (FSComp.SR.tcEventIsNotStatic nm, mItem))
92349246 | _ -> ()
92359247
9236- let delegateType = einfo.GetDelegateType(cenv.amap, mItem)
9237- let (SigOfFunctionForDelegate(invokeMethInfo, compiledViewOfDelArgTys , _, _)) = GetSigOfFunctionForDelegate cenv.infoReader delegateType mItem ad
9248+ let delTy = einfo.GetDelegateType(cenv.amap, mItem)
9249+ let (SigOfFunctionForDelegate(delInvokeMeth, delArgTys , _, _)) = GetSigOfFunctionForDelegate cenv.infoReader delTy mItem ad
92389250 let objArgs = Option.toList (Option.map fst objDetails)
9239- MethInfoChecks g cenv.amap true None objArgs env.eAccessRights mItem invokeMethInfo
9251+ MethInfoChecks g cenv.amap true None objArgs env.eAccessRights mItem delInvokeMeth
92409252
92419253 // This checks for and drops the 'object' sender
92429254 let argsTy = ArgsTypOfEventInfo cenv.infoReader mItem ad einfo
9243- if not (slotSigHasVoidReturnTy (invokeMethInfo .GetSlotSig(cenv.amap, mItem))) then errorR (nonStandardEventError einfo.EventName mItem)
9244- let delEventTy = mkIEventType g delegateType argsTy
9255+ if not (slotSigHasVoidReturnTy (delInvokeMeth .GetSlotSig(cenv.amap, mItem))) then errorR (nonStandardEventError einfo.EventName mItem)
9256+ let delEventTy = mkIEventType g delTy argsTy
92459257
92469258 let bindObjArgs f =
92479259 match objDetails with
@@ -9253,17 +9265,17 @@ and TcEventItemThen cenv overallTy env tpenv mItem mExprAndItem objDetails (einf
92539265 let expr =
92549266 bindObjArgs (fun objVars ->
92559267 // EventHelper ((fun d -> e.add_X(d)), (fun d -> e.remove_X(d)), (fun f -> new 'Delegate(f)))
9256- mkCallCreateEvent g mItem delegateType argsTy
9257- (let dv, de = mkCompGenLocal mItem "eventDelegate" delegateType
9268+ mkCallCreateEvent g mItem delTy argsTy
9269+ (let dv, de = mkCompGenLocal mItem "eventDelegate" delTy
92589270 let callExpr, _ = BuildPossiblyConditionalMethodCall cenv env PossiblyMutates mItem false einfo.AddMethod NormalValUse [] objVars [de]
92599271 mkLambda mItem dv (callExpr, g.unit_ty))
9260- (let dv, de = mkCompGenLocal mItem "eventDelegate" delegateType
9272+ (let dv, de = mkCompGenLocal mItem "eventDelegate" delTy
92619273 let callExpr, _ = BuildPossiblyConditionalMethodCall cenv env PossiblyMutates mItem false einfo.RemoveMethod NormalValUse [] objVars [de]
92629274 mkLambda mItem dv (callExpr, g.unit_ty))
92639275 (let fvty = mkFunTy g g.obj_ty (mkFunTy g argsTy g.unit_ty)
92649276 let fv, fe = mkCompGenLocal mItem "callback" fvty
9265- let createExpr = BuildNewDelegateExpr (Some einfo, g, cenv.amap, delegateType, invokeMethInfo, compiledViewOfDelArgTys , fe, fvty, mItem)
9266- mkLambda mItem fv (createExpr, delegateType )))
9277+ let createExpr = BuildNewDelegateExpr (Some einfo, g, cenv.amap, delTy, delInvokeMeth, delArgTys , fe, fvty, mItem)
9278+ mkLambda mItem fv (createExpr, delTy )))
92679279
92689280 let exprty = delEventTy
92699281 PropagateThenTcDelayed cenv overallTy env tpenv mExprAndItem (MakeApplicableExprNoFlex cenv expr) exprty ExprAtomicFlag.Atomic delayed
@@ -9986,23 +9998,28 @@ and TcMethodArg cenv env (lambdaPropagationInfo, tpenv) (lambdaPropagationInfoFo
99869998
99879999 CallerArg(callerArgTy, mArg, isOpt, e'), (lambdaPropagationInfo, tpenv)
998810000
9989- /// Typecheck "new Delegate(fun x y z -> ...)" constructs
9990- and TcNewDelegateThen cenv (overallTy: OverallTy) env tpenv mDelTy mExprAndArg delegateTy arg atomicFlag delayed =
10001+ /// Typecheck "Delegate(fun x y z -> ...)" constructs
10002+ and TcNewDelegateThen cenv (overallTy: OverallTy) env tpenv mDelTy mExprAndArg delegateTy synArg atomicFlag delayed =
999110003 let g = cenv.g
999210004 let ad = env.eAccessRights
9993- UnifyTypes cenv env mExprAndArg overallTy.Commit delegateTy
9994- let (SigOfFunctionForDelegate(invokeMethInfo, delArgTys, _, fty)) = GetSigOfFunctionForDelegate cenv.infoReader delegateTy mDelTy ad
10005+
10006+ let intermediateTy = if isNil delayed then overallTy.Commit else NewInferenceType g
10007+
10008+ UnifyTypes cenv env mExprAndArg intermediateTy delegateTy
10009+
10010+ let (SigOfFunctionForDelegate(delInvokeMeth, delArgTys, _, delFuncTy)) = GetSigOfFunctionForDelegate cenv.infoReader delegateTy mDelTy ad
999510011
999610012 // We pass isInstance = true here because we're checking the rights to access the "Invoke" method
9997- MethInfoChecks g cenv.amap true None [] env.eAccessRights mExprAndArg invokeMethInfo
9998- let args = GetMethodArgs arg
10013+ MethInfoChecks g cenv.amap true None [] env.eAccessRights mExprAndArg delInvokeMeth
999910014
10000- match args with
10001- | [farg], [] ->
10002- let m = arg.Range
10003- let callerArg, (_, tpenv) = TcMethodArg cenv env (Array.empty, tpenv) (Array.empty, CallerArg(fty, m, false, farg))
10004- let expr = BuildNewDelegateExpr (None, g, cenv.amap, delegateTy, invokeMethInfo, delArgTys, callerArg.Expr, fty, m)
10005- PropagateThenTcDelayed cenv overallTy env tpenv m (MakeApplicableExprNoFlex cenv expr) delegateTy atomicFlag delayed
10015+ let synArgs = GetMethodArgs synArg
10016+
10017+ match synArgs with
10018+ | [synFuncArg], [] ->
10019+ let m = synArg.Range
10020+ let callerArg, (_, tpenv) = TcMethodArg cenv env (Array.empty, tpenv) (Array.empty, CallerArg(delFuncTy, m, false, synFuncArg))
10021+ let expr = BuildNewDelegateExpr (None, g, cenv.amap, delegateTy, delInvokeMeth, delArgTys, callerArg.Expr, delFuncTy, m)
10022+ PropagateThenTcDelayed cenv overallTy env tpenv m (MakeApplicableExprNoFlex cenv expr) intermediateTy atomicFlag delayed
1000610023 | _ ->
1000710024 error(Error(FSComp.SR.tcDelegateConstructorMustBePassed(), mExprAndArg))
1000810025
0 commit comments