From 234b3591eb91b8b51efc46c499a3ac65d7037f61 Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Mon, 16 Nov 2020 08:47:45 -0800 Subject: [PATCH] Fixed member field lookup from generic constraint --- IDEHelper/Compiler/BfExprEvaluator.cpp | 37 ++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/IDEHelper/Compiler/BfExprEvaluator.cpp b/IDEHelper/Compiler/BfExprEvaluator.cpp index f0597264..6dbab837 100644 --- a/IDEHelper/Compiler/BfExprEvaluator.cpp +++ b/IDEHelper/Compiler/BfExprEvaluator.cpp @@ -3781,6 +3781,43 @@ void BfExprEvaluator::FixitAddMember(BfTypeInstance* typeInst, BfType* fieldType BfTypedValue BfExprEvaluator::LookupField(BfAstNode* targetSrc, BfTypedValue target, const StringImpl& fieldName, BfLookupFieldFlags flags) { + if ((target.mType != NULL && (target.mType->IsGenericParam()))) + { + auto genericParamInst = mModule->GetGenericParamInstance((BfGenericParamType*)target.mType); + if (mModule->mCurMethodInstance->mIsUnspecialized) + { + if (genericParamInst->mTypeConstraint != NULL) + target.mType = genericParamInst->mTypeConstraint; + else + target.mType = mModule->mContext->mBfObjectType; + + if ((genericParamInst->mGenericParamFlags & BfGenericParamFlag_Var) != 0) + { + target.mType = mModule->GetPrimitiveType(BfTypeCode_Var); + } + } + else + { + if ((genericParamInst->mGenericParamFlags & BfGenericParamFlag_Var) != 0) + { + //target.mType = mModule->ResolveGenericType(mResult.mType); + } + else if (genericParamInst->mTypeConstraint != NULL) + { + target = mModule->Cast(targetSrc, target, genericParamInst->mTypeConstraint); + BF_ASSERT(target); + } + else + { + // This shouldn't occur - this would infer that we are accessing a member of Object or something... + //target.mType = mModule->ResolveGenericType(mResult.mType); + } + } + } + + if ((target.mType != NULL) && (target.mType->IsVar())) + return BfTypedValue(mModule->GetDefaultValue(target.mType), target.mType, true); + BfTypeInstance* startCheckType = mModule->mCurTypeInstance; mPropDef = NULL; mPropDefBypassVirtual = false;