diff --git a/IDEHelper/Compiler/BfModule.cpp b/IDEHelper/Compiler/BfModule.cpp index f9e59303..c80e927d 100644 --- a/IDEHelper/Compiler/BfModule.cpp +++ b/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; diff --git a/IDEHelper/Compiler/BfModuleTypeUtils.cpp b/IDEHelper/Compiler/BfModuleTypeUtils.cpp index 5b0c156c..34ec848c 100644 --- a/IDEHelper/Compiler/BfModuleTypeUtils.cpp +++ b/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); } diff --git a/IDEHelper/Compiler/BfParser.cpp b/IDEHelper/Compiler/BfParser.cpp index f836998b..00c6bd8d 100644 --- a/IDEHelper/Compiler/BfParser.cpp +++ b/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()