소스 검색

Allow static method overrides in extensions

Brian Fiete 4 년 전
부모
커밋
bd3fa65692
1개의 변경된 파일13개의 추가작업 그리고 10개의 파일을 삭제
  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)
 		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();
 }