From 83bed6b00483690755c16ecd8fd16f3ec71a92b0 Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Thu, 20 Jan 2022 10:39:57 -0500 Subject: [PATCH] Incorporate extern constraints from method in lookupField --- IDEHelper/Compiler/BfExprEvaluator.cpp | 28 +++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/IDEHelper/Compiler/BfExprEvaluator.cpp b/IDEHelper/Compiler/BfExprEvaluator.cpp index 5296bfa3..ae435e33 100644 --- a/IDEHelper/Compiler/BfExprEvaluator.cpp +++ b/IDEHelper/Compiler/BfExprEvaluator.cpp @@ -4351,11 +4351,11 @@ BfTypedValue BfExprEvaluator::LookupField(BfAstNode* targetSrc, BfTypedValue tar if (isUnspecializedSection) { + auto origTarget = target; + if (genericParamInst->mTypeConstraint != NULL) { - target.mType = genericParamInst->mTypeConstraint; - if (target.mType->IsWrappableType()) - target.mType = mModule->GetWrappedStructType(target.mType); + target.mType = genericParamInst->mTypeConstraint; } else target.mType = mModule->mContext->mBfObjectType; @@ -4364,6 +4364,28 @@ BfTypedValue BfExprEvaluator::LookupField(BfAstNode* targetSrc, BfTypedValue tar { target.mType = mModule->GetPrimitiveType(BfTypeCode_Var); } + + if (origTarget.mType->IsTypeGenericParam()) + { + // Check for extern constraint in method generic params + if ((mModule->mCurMethodInstance != NULL) && (mModule->mCurMethodInstance->mMethodInfoEx != NULL)) + { + for (auto genericParam : mModule->mCurMethodInstance->mMethodInfoEx->mGenericParams) + { + if (genericParam->mExternType == origTarget.mType) + { + if (genericParam->mTypeConstraint != NULL) + { + target.mType = genericParam->mTypeConstraint; + break; + } + } + } + } + } + + if (target.mType->IsWrappableType()) + target.mType = mModule->GetWrappedStructType(target.mType); } else {