From 410a6ead6aa9d71e8c9c52a32b5aa90929bfcb91 Mon Sep 17 00:00:00 2001 From: Fusioon Date: Wed, 12 Mar 2025 03:02:38 +0100 Subject: [PATCH] Fix inherited properties on interface --- IDEHelper/Compiler/BfExprEvaluator.cpp | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/IDEHelper/Compiler/BfExprEvaluator.cpp b/IDEHelper/Compiler/BfExprEvaluator.cpp index 72f3f2cf..900e51ef 100644 --- a/IDEHelper/Compiler/BfExprEvaluator.cpp +++ b/IDEHelper/Compiler/BfExprEvaluator.cpp @@ -5886,6 +5886,7 @@ BfTypedValue BfExprEvaluator::LookupField(BfAstNode* targetSrc, BfTypedValue tar flags = (BfLookupFieldFlags)(flags | BfLookupFieldFlag_IsFailurePass); bool isBaseLookup = false; + int checkInterfaceIdx = 0; while (curCheckType != NULL) { if (((flags & BfLookupFieldFlag_CheckingOuter) != 0) && ((mBfEvalExprFlags & BfEvalExprFlags_Comptime) != 0)) @@ -6243,8 +6244,16 @@ BfTypedValue BfExprEvaluator::LookupField(BfAstNode* targetSrc, BfTypedValue tar } } - isBaseLookup = true; - curCheckType = curCheckType->mBaseType; + if ((!isBaseLookup) && (startCheckType->IsInterface() && (checkInterfaceIdx < (int)startCheckType->mInterfaces.size()))) + { + curCheckType = startCheckType->mInterfaces[checkInterfaceIdx].mInterfaceType; + checkInterfaceIdx++; + } + else + { + isBaseLookup = true; + curCheckType = curCheckType->mBaseType; + } } } @@ -19919,6 +19928,19 @@ BfModuleMethodInstance BfExprEvaluator::GetPropertyMethodInstance(BfMethodDef* m if (bestIFaceEntry != NULL) { + if ((checkTypeInst->IsInterface())) + { + auto propTypeInst = bestIFaceEntry->mInterfaceType->ToTypeInstance(); + if (propTypeInst == NULL) + { + mModule->Fail("INTERNAL ERROR: Invalid property target", mPropSrc); + return BfModuleMethodInstance(); + } + BF_ASSERT(propTypeInst->mTypeDef->mFullNameEx == methodDef->mDeclaringType->mFullNameEx); + + return mModule->GetMethodInstance(propTypeInst, methodDef, BfTypeVector(), mPropGetMethodFlags); + } + auto ifaceMethodEntry = checkTypeInst->mInterfaceMethodTable[bestIFaceEntry->mStartInterfaceTableIdx + methodDef->mIdx]; BfMethodInstance* bestMethodInstance = ifaceMethodEntry.mMethodRef; if (bestMethodInstance != NULL)