1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-10 04:22:20 +02:00

Allow extensions to declare abstract methods

This commit is contained in:
Brian Fiete 2021-08-02 12:09:48 -07:00
parent 3cd94cbc8e
commit 16829900bc
2 changed files with 5 additions and 3 deletions

View file

@ -447,8 +447,6 @@ BfMethodDef* BfDefBuilder::CreateMethodDef(BfMethodDeclaration* methodDeclaratio
if (methodDef->mIsAbstract)
{
if ((!mCurTypeDef->mIsAbstract) && (mCurTypeDef->mTypeCode != BfTypeCode_Interface))
Fail("Method is abstract but it is contained in non-abstract class", methodDeclaration);
if (methodDeclaration->mBody != NULL)
Fail("Abstract method cannot declare a body", methodDeclaration);
}

View file

@ -5582,7 +5582,11 @@ void BfModule::DoTypeInstanceMethodProcessing(BfTypeInstance* typeInstance)
{
if (methodInstance->mMethodDef->mIsAbstract)
{
if (!typeInstance->IsUnspecializedTypeVariation())
if (typeInstance->mVirtualMethodTable[methodIdx].mDeclaringMethod.mTypeInstance == typeInstance)
{
Fail("Method is abstract but it is declared in non-abstract class", methodInstance->mMethodDef->GetRefNode());
}
else if (!typeInstance->IsUnspecializedTypeVariation())
{
if (Fail(StrFormat("'%s' does not implement inherited abstract method '%s'", TypeToString(typeInstance).c_str(), MethodToString(methodInstance).c_str()), typeDef->mTypeDeclaration->mNameNode, true) != NULL)
mCompiler->mPassInstance->MoreInfo("Abstract method declared", methodInstance->mMethodDef->GetRefNode());