Ver Fonte

Improved error handling in Compiler.Emit

Brian Fiete há 3 anos atrás
pai
commit
a086de3d8e

+ 2 - 8
IDEHelper/Compiler/BfModule.cpp

@@ -3143,14 +3143,6 @@ BfError* BfModule::Fail(const StringImpl& error, BfAstNode* refNode, bool isPers
 	if (!mHadBuildError)
 		mHadBuildError = true;
 
-	if ((mCurMethodState != NULL) && (mCurMethodState->mEmitRefNode != NULL))
-	{
-		bfError = mCompiler->mPassInstance->Fail("Emitted code had errors", mCurMethodState->mEmitRefNode);
-		if (bfError != NULL)
-			mCompiler->mPassInstance->MoreInfo(errorString, refNode);	
-		return bfError;
-	}
-
 	// Check mixins
 	{
 		auto checkMethodState = mCurMethodState;
@@ -3199,6 +3191,8 @@ BfError* BfModule::Fail(const StringImpl& error, BfAstNode* refNode, bool isPers
 
 		if ((mCurMethodState != NULL) && (mCurMethodState->mDeferredCallEmitState != NULL) && (mCurMethodState->mDeferredCallEmitState->mCloseNode != NULL))
 			mCompiler->mPassInstance->MoreInfo("Error during deferred statement handling", mCurMethodState->mDeferredCallEmitState->mCloseNode);
+		else if ((mCurMethodState != NULL) && (mCurMethodState->mEmitRefNode != NULL))
+			mCompiler->mPassInstance->MoreInfo("Error in emitted code", mCurMethodState->mEmitRefNode);
 	}
 
 	return bfError;

+ 20 - 0
IDEHelper/Compiler/BfModuleTypeUtils.cpp

@@ -2252,6 +2252,18 @@ BfCEParseContext BfModule::CEEmitParse(BfTypeInstance* typeInstance, BfTypeDef*
 	}
 	else if (ceEmitSource->mSrcStart == -1)
 	{
+		auto parserData = refNode->GetParserData();
+		if (parserData != NULL)
+		{
+			// Add the warning changes occur before the start of the buffer.
+			//  We use this conservatively now - any temporary disabling will permanently disable
+			for (auto& warning : parserData->mWarningEnabledChanges)			
+			{
+				if (!warning.mValue.mEnable)
+					emitParser->mParserData->mWarningEnabledChanges[-warning.mValue.mWarningNumber] = warning.mValue;
+			}
+		}
+
 		ceEmitSource->mSrcStart = emitSrcStart;
 		ceEmitSource->mSrcEnd = emitParser->mSrcLength;
 	}
@@ -2555,6 +2567,12 @@ void BfModule::CEMixin(BfAstNode* refNode, const StringImpl& code)
 	if (code.IsEmpty())
 		return;
 
+	if (mCurMethodInstance == NULL)
+	{
+		Fail("Invalid code mixin", refNode);
+		return;
+	}	
+
 	auto activeTypeDef = mCurMethodInstance->mMethodDef->mDeclaringType;
 	//auto emitParser = activeTypeDef->mEmitParser;
 			
@@ -2632,6 +2650,8 @@ void BfModule::CEMixin(BfAstNode* refNode, const StringImpl& code)
 	mBfIRBuilder->RestoreDebugLocation();
 	mBfIRBuilder->DupDebugLocation();
 
+	prevCustomAttribute.Restore();
+
 	FinishCEParseContext(refNode, mCurTypeInstance, &ceParseContext);
 }
 

+ 8 - 3
IDEHelper/Compiler/BfParser.cpp

@@ -305,7 +305,7 @@ bool BfParserData::IsUnwarnedAt(BfAstNode* node)
 
 bool BfParserData::IsWarningEnabledAtSrcIndex(int warningNumber, int srcIdx)
 {
-	bool enabled = true; //CDH TODO if/when we add warning level support, this default will change based on the warning number and the general project warning level setting
+	int enabled = 1; //CDH TODO if/when we add warning level support, this default will change based on the warning number and the general project warning level setting
 	int lastUnwarnPos = 0;
 
 	for (const auto& it : mWarningEnabledChanges)
@@ -313,11 +313,16 @@ bool BfParserData::IsWarningEnabledAtSrcIndex(int warningNumber, int srcIdx)
 		if (it.mKey > srcIdx)
 			break;
 		if (it.mValue.mWarningNumber == warningNumber)
-			enabled = it.mValue.mEnable;
+		{
+			if (it.mValue.mEnable)
+				enabled++;
+			else
+				enabled--;
+		}
 		if (it.mValue.mWarningNumber == -1)
 			lastUnwarnPos = -1;
 	}
-	return enabled;
+	return enabled > 0;
 }
 
 void BfParserData::Deref()