Ver Fonte

Fixed errors related to duplicate local method names

Brian Fiete há 4 dias atrás
pai
commit
b7f8dc444c
1 ficheiros alterados com 32 adições e 17 exclusões
  1. 32 17
      IDEHelper/Compiler/BfStmtEvaluator.cpp

+ 32 - 17
IDEHelper/Compiler/BfStmtEvaluator.cpp

@@ -3592,13 +3592,21 @@ void BfModule::VisitCodeBlock(BfBlock* block)
 						localMethod->mDeclMixinState->mHasDeferredUsage = true;
 					mCurMethodState->mLocalMethods.push_back(localMethod);
 
+					bool valid = true;
+
 					String* namePtr;
 					if (!mCurMethodState->mLocalMethodMap.TryAdd(localMethod->mMethodName, &namePtr, &localMethodPtr))
 					{
-						BF_ASSERT(localMethod != *localMethodPtr);
-						localMethod->mNextWithSameName = *localMethodPtr;
+						if (localMethod == *localMethodPtr)
+						{
+							valid = false;
+							Fail("Duplicate local method name", localMethodDecl->mMethodDeclaration->mNameNode);
+						}						
+						if (valid)
+							localMethod->mNextWithSameName = *localMethodPtr;
 					}
-					*localMethodPtr = localMethod;
+					if (valid)
+						*localMethodPtr = localMethod;
 				}
 			}
 			++itr;
@@ -3650,23 +3658,29 @@ void BfModule::VisitCodeBlock(BfBlock* block)
 			else if (localMethodDecl->mMethodDeclaration->mNameNode != NULL)
 			{
 				BfLocalMethod* localMethod = mCurMethodState->mLocalMethods[curLocalMethodIdx];
-				BF_ASSERT(localMethod->mMethodDeclaration == localMethodDecl->mMethodDeclaration);
-
-				bool wantsLocalMethod = (wantsAllLocalMethods) || (autoComplete->IsAutocompleteNode(localMethod->mMethodDeclaration));
-
-				if ((!wantsLocalMethod) && (mCurMethodInstance->mMethodDef->mIsLocalMethod))
-					wantsLocalMethod = true;
 
-				if (wantsLocalMethod)
+				if (localMethod->mMethodDeclaration != localMethodDecl->mMethodDeclaration)
 				{
-					if (!mCurMethodInstance->IsSpecializedGenericMethodOrType())
-						GetLocalMethodInstance(localMethod, BfTypeVector(), NULL, true); // Only necessary on unspecialized pass
+					AssertErrorState();
 				}
+				else
+				{
+					bool wantsLocalMethod = (wantsAllLocalMethods) || (autoComplete->IsAutocompleteNode(localMethod->mMethodDeclaration));
 
-				if ((mCompiler->mResolvePassData != NULL) && (mCompiler->mResolvePassData->mAutoComplete != NULL))
-					mCompiler->mResolvePassData->mAutoComplete->CheckMethod(localMethod->mMethodDeclaration, true);
+					if ((!wantsLocalMethod) && (mCurMethodInstance->mMethodDef->mIsLocalMethod))
+						wantsLocalMethod = true;
 
-				curLocalMethodIdx++;
+					if (wantsLocalMethod)
+					{
+						if (!mCurMethodInstance->IsSpecializedGenericMethodOrType())
+							GetLocalMethodInstance(localMethod, BfTypeVector(), NULL, true); // Only necessary on unspecialized pass
+					}
+
+					if ((mCompiler->mResolvePassData != NULL) && (mCompiler->mResolvePassData->mAutoComplete != NULL))
+						mCompiler->mResolvePassData->mAutoComplete->CheckMethod(localMethod->mMethodDeclaration, true);
+
+					curLocalMethodIdx++;
+				}
 			}
 
 			++itr;
@@ -3811,8 +3825,9 @@ void BfModule::VisitCodeBlock(BfBlock* block)
 
 #if _DEBUG
 			BfLocalMethod** localMethodPtr = NULL;
-			mCurMethodState->mLocalMethodMap.TryGetValue(localMethod->mMethodName, &localMethodPtr);
-			BF_ASSERT(*localMethodPtr == localMethod);
+			mCurMethodState->mLocalMethodMap.TryGetValue(localMethod->mMethodName, &localMethodPtr);			
+			if ((localMethodPtr == NULL) || (*localMethodPtr != localMethod))
+				AssertErrorState();
 #endif
 			if (localMethod->mNextWithSameName == NULL)
 				mCurMethodState->mLocalMethodMap.Remove(localMethod->mMethodName);