Browse Source

Allow static method overrides in extensions

Brian Fiete 4 years ago
parent
commit
bd3fa65692
1 changed files with 13 additions and 10 deletions
  1. 13 10
      IDEHelper/Compiler/BfModule.cpp

+ 13 - 10
IDEHelper/Compiler/BfModule.cpp

@@ -21542,16 +21542,6 @@ void BfModule::DoMethodDeclaration(BfMethodDeclaration* methodDeclaration, bool
 	else if (methodDeclaration != NULL)
 	else if (methodDeclaration != NULL)
 		virtualToken = methodDeclaration->mVirtualSpecifier;
 		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
 	// Don't compare specialized generic methods against normal methods
 	if ((((mCurMethodInstance->mIsUnspecialized) || (mCurMethodInstance->mMethodDef->mGenericParams.size() == 0))) &&
 	if ((((mCurMethodInstance->mIsUnspecialized) || (mCurMethodInstance->mMethodDef->mGenericParams.size() == 0))) &&
 		(!methodDef->mIsLocalMethod))
 		(!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->mStats.mMethodDeclarations++;
 	mCompiler->UpdateCompletion();
 	mCompiler->UpdateCompletion();
 }
 }