diff --git a/IDEHelper/Compiler/BfExprEvaluator.cpp b/IDEHelper/Compiler/BfExprEvaluator.cpp index f52384e9..4a85e271 100644 --- a/IDEHelper/Compiler/BfExprEvaluator.cpp +++ b/IDEHelper/Compiler/BfExprEvaluator.cpp @@ -3768,7 +3768,8 @@ void BfExprEvaluator::Visit(BfIdentifierNode* identifierNode) } } - mModule->Fail("Identifier not found", identifierNode); + if ((mBfEvalExprFlags & BfEvalExprFlags_NoLookupError) == 0) + mModule->Fail("Identifier not found", identifierNode); } } @@ -4173,7 +4174,7 @@ BfTypedValue BfExprEvaluator::LookupField(BfAstNode* targetSrc, BfTypedValue tar return retVal; } else if (!target) - { + { if ((flags & BfLookupFieldFlag_CheckingOuter) != 0) mModule->Fail(StrFormat("An instance reference is required to reference non-static outer field '%s.%s'", mModule->TypeToString(curCheckType).c_str(), field->mName.c_str()), targetSrc); @@ -8722,7 +8723,8 @@ void BfExprEvaluator::LookupQualifiedStaticField(BfQualifiedNameNode* nameNode, } } - mModule->Fail("Field not found", nameNode->mRight); + if ((mBfEvalExprFlags & BfEvalExprFlags_NoLookupError) == 0) + mModule->Fail("Field not found", nameNode->mRight); return; } } @@ -8825,7 +8827,8 @@ void BfExprEvaluator::LookupQualifiedStaticField(BfAstNode* nameNode, BfIdentifi } } - mModule->Fail("Field not found", nameRight); + if ((mBfEvalExprFlags & BfEvalExprFlags_NoLookupError) == 0) + mModule->Fail("Field not found", nameRight); return; } } @@ -17885,8 +17888,14 @@ void BfExprEvaluator::Visit(BfIndexerExpression* indexerExpr) // Try first as a non-static indexer, then as a static indexer for (int pass = 0; pass < 2; pass++) { - SetAndRestoreValue ignoreErrors(mModule->mIgnoreErrors, (mModule->mIgnoreErrors) || (pass == 0)); - VisitChild(indexerExpr->mTarget); +// SetAndRestoreValue prevIgnoreErrors(mModule->mIgnoreErrors, (mModule->mIgnoreErrors) || (pass == 0)); +// SetAndRestoreValue prevHadIgnoredError(mModule->mHadIgnoredError, false); + + + { + SetAndRestoreValue prevFlags(mBfEvalExprFlags, (BfEvalExprFlags)(mBfEvalExprFlags | BfEvalExprFlags_NoLookupError)); + VisitChild(indexerExpr->mTarget); + } ResolveGenericType(); target = GetResult(true); if (target) @@ -17894,6 +17903,7 @@ void BfExprEvaluator::Visit(BfIndexerExpression* indexerExpr) if (pass == 0) { + SetAndRestoreValue prevIgnoreErrors(mModule->mIgnoreErrors, (mModule->mIgnoreErrors) || (pass == 0)); auto staticType = mModule->ResolveTypeRef(indexerExpr->mTarget, {}); if (staticType != NULL) { diff --git a/IDEHelper/Compiler/BfModule.cpp b/IDEHelper/Compiler/BfModule.cpp index 8b917596..dc27ccba 100644 --- a/IDEHelper/Compiler/BfModule.cpp +++ b/IDEHelper/Compiler/BfModule.cpp @@ -833,6 +833,7 @@ BfModule::BfModule(BfContext* context, const StringImpl& moduleName) mHadBuildError = false; mHadBuildWarning = false; mIgnoreErrors = false; + mHadIgnoredError = false; mIgnoreWarnings = false; mReportErrors = true; mIsInsideAutoComplete = false; @@ -2672,7 +2673,8 @@ BfError* BfModule::Fail(const StringImpl& error, BfAstNode* refNode, bool isPers BP_ZONE("BfModule::Fail"); if (mIgnoreErrors) - { + { + mHadIgnoredError = true; if (mAttributeState != NULL) mAttributeState->mFlags = (BfAttributeState::Flags)(mAttributeState->mFlags | BfAttributeState::Flag_HadError); return NULL; diff --git a/IDEHelper/Compiler/BfModule.h b/IDEHelper/Compiler/BfModule.h index 903ee543..361cc7dd 100644 --- a/IDEHelper/Compiler/BfModule.h +++ b/IDEHelper/Compiler/BfModule.h @@ -67,7 +67,8 @@ enum BfEvalExprFlags BfEvalExprFlags_VariableDeclaration = 0x4000, BfEvalExprFlags_NoAutoComplete = 0x8000, BfEvalExprFlags_AllowNonConst = 0x10000, - BfEvalExprFlags_StringInterpolateFormat = 0x20000 + BfEvalExprFlags_StringInterpolateFormat = 0x20000, + BfEvalExprFlags_NoLookupError = 0x40000, }; enum BfCastFlags @@ -994,6 +995,7 @@ public: bool mAllowUinitReads; bool mCancelledDeferredCall; bool mNoObjectAccessChecks; + bool mHadIgnoredError; int mCurLocalVarId; // Can also refer to a label int mCurAccessId; // For checking to see if a block reads from or writes to a local @@ -1031,7 +1033,7 @@ public: mAllowUinitReads = false; mCancelledDeferredCall = false; mNoObjectAccessChecks = false; - mInDeferredBlock = false; + mInDeferredBlock = false; mDeferredLocalAssignData = NULL; mCurLocalVarId = 0; mCurAccessId = 1; @@ -1445,7 +1447,8 @@ public: bool mWroteToLib; bool mHadBuildError; bool mHadBuildWarning; - bool mIgnoreErrors; + bool mIgnoreErrors; + bool mHadIgnoredError; bool mIgnoreWarnings; bool mSetIllegalSrcPosition; bool mReportErrors; // Still puts system in error state when set to false diff --git a/IDEHelper/Compiler/BfModuleTypeUtils.cpp b/IDEHelper/Compiler/BfModuleTypeUtils.cpp index 141e4f57..c9b89b9f 100644 --- a/IDEHelper/Compiler/BfModuleTypeUtils.cpp +++ b/IDEHelper/Compiler/BfModuleTypeUtils.cpp @@ -9566,8 +9566,8 @@ BfType* BfModule::ResolveInnerType(BfType* outerType, BfIdentifierNode* identifi { BfDirectStrTypeReference typeRef; typeRef.Init(identifier->ToString()); - - auto type = ResolveInnerType(outerType, &typeRef, populateType, ignoreErrors); + // There is no ref node so we ignore errors + auto type = ResolveInnerType(outerType, &typeRef, populateType, /*ignoreErrors*/true); return type; }