1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-08 11:38:21 +02:00

Fix inherited properties on interface

This commit is contained in:
Fusioon 2025-03-12 03:02:38 +01:00
parent 9c79d8aa6c
commit 410a6ead6a

View file

@ -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,10 +6244,18 @@ BfTypedValue BfExprEvaluator::LookupField(BfAstNode* targetSrc, BfTypedValue tar
}
}
if ((!isBaseLookup) && (startCheckType->IsInterface() && (checkInterfaceIdx < (int)startCheckType->mInterfaces.size())))
{
curCheckType = startCheckType->mInterfaces[checkInterfaceIdx].mInterfaceType;
checkInterfaceIdx++;
}
else
{
isBaseLookup = true;
curCheckType = curCheckType->mBaseType;
}
}
}
auto outerTypeDef = mModule->GetOuterType(startCheckType);
if (outerTypeDef != NULL)
@ -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)