From bd3fa65692be12ac7cf59a7f71e2d667e3a3d4c8 Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Tue, 17 Nov 2020 23:19:56 -0800 Subject: [PATCH] Allow static method overrides in extensions --- IDEHelper/Compiler/BfModule.cpp | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/IDEHelper/Compiler/BfModule.cpp b/IDEHelper/Compiler/BfModule.cpp index 589a462b..b14de3a6 100644 --- a/IDEHelper/Compiler/BfModule.cpp +++ b/IDEHelper/Compiler/BfModule.cpp @@ -21542,16 +21542,6 @@ void BfModule::DoMethodDeclaration(BfMethodDeclaration* methodDeclaration, bool else if (methodDeclaration != NULL) virtualToken = methodDeclaration->mVirtualSpecifier; - if ((methodDef->mIsVirtual) && (methodDef->mIsStatic)) - { - Fail("Static members cannot be marked as override, virtual, or abstract", virtualToken, true); - } - else if (methodDef->mIsVirtual) - { - if ((methodDef->mProtection == BfProtection_Private) && (virtualToken != NULL)) - Fail("Virtual or abstract members cannot be private", virtualToken, true); - } - // Don't compare specialized generic methods against normal methods if ((((mCurMethodInstance->mIsUnspecialized) || (mCurMethodInstance->mMethodDef->mGenericParams.size() == 0))) && (!methodDef->mIsLocalMethod)) @@ -21748,6 +21738,19 @@ void BfModule::DoMethodDeclaration(BfMethodDeclaration* methodDeclaration, bool } } + if ((methodDef->mIsVirtual) && (methodDef->mIsStatic) && (!methodInstance->mIsInnerOverride)) + { + if ((virtualToken != NULL) && (virtualToken->mToken == BfToken_Override) && (methodDef->mDeclaringType->mTypeCode == BfTypeCode_Extension)) + Fail("No suitable method found to override", virtualToken, true); + else + Fail("Static members cannot be marked as override, virtual, or abstract", virtualToken, true); + } + else if (methodDef->mIsVirtual) + { + if ((methodDef->mProtection == BfProtection_Private) && (virtualToken != NULL)) + Fail("Virtual or abstract members cannot be private", virtualToken, true); + } + mCompiler->mStats.mMethodDeclarations++; mCompiler->UpdateCompletion(); }