diff --git a/IDEHelper/Compiler/BfCompiler.cpp b/IDEHelper/Compiler/BfCompiler.cpp index 5ab7cc2d..7cf6ae6e 100644 --- a/IDEHelper/Compiler/BfCompiler.cpp +++ b/IDEHelper/Compiler/BfCompiler.cpp @@ -7027,6 +7027,7 @@ bool BfCompiler::DoCompile(const StringImpl& outputDirectory) String toolsetErrors; for (auto project : mSystem->mProjects) { + project->mDependencySet.Clear(); if (project->mDisabled) continue; if (project->mCodeGenOptions.mLTOType != BfLTOType_None) diff --git a/IDEHelper/Compiler/BfModule.cpp b/IDEHelper/Compiler/BfModule.cpp index ed701381..e02c5a08 100644 --- a/IDEHelper/Compiler/BfModule.cpp +++ b/IDEHelper/Compiler/BfModule.cpp @@ -2629,6 +2629,23 @@ BfProjectSet* BfModule::GetVisibleProjectSet() return &mCurMethodState->mVisibleProjectSet; } +bool BfModule::IsProjectVisible(BfProject* project) +{ + auto visibleProjectSet = GetVisibleProjectSet(); + if (visibleProjectSet != NULL) + return visibleProjectSet->Contains(project); + + auto activeTypeDef = GetActiveTypeDef(); + if (activeTypeDef != NULL) + { + if (activeTypeDef->mProject == project) + return true; + return activeTypeDef->mProject->HasDependency(project); + } + + return false; +} + BfFileInstance* BfModule::GetFileFromNode(BfAstNode* astNode) { auto bfParser = astNode->GetSourceData()->ToParserData(); diff --git a/IDEHelper/Compiler/BfModule.h b/IDEHelper/Compiler/BfModule.h index c0f7a98e..a2c2b310 100644 --- a/IDEHelper/Compiler/BfModule.h +++ b/IDEHelper/Compiler/BfModule.h @@ -1698,6 +1698,7 @@ public: BfIRValue ValueScopeStart(); void ValueScopeEnd(BfIRValue valueScopeStart); BfProjectSet* GetVisibleProjectSet(); + bool IsProjectVisible(BfProject* project); void AddBasicBlock(BfIRBlock bb, bool activate = true); void VisitEmbeddedStatement(BfAstNode* stmt, BfExprEvaluator* exprEvaluator = NULL, BfEmbeddedStatementFlags flags = BfEmbeddedStatementFlags_None); diff --git a/IDEHelper/Compiler/BfModuleTypeUtils.cpp b/IDEHelper/Compiler/BfModuleTypeUtils.cpp index 2cecb095..57ad962a 100644 --- a/IDEHelper/Compiler/BfModuleTypeUtils.cpp +++ b/IDEHelper/Compiler/BfModuleTypeUtils.cpp @@ -4961,7 +4961,7 @@ void BfModule::DoPopulateType(BfType* resolvedTypeRef, BfPopulateType populateTy // For 'let', make read-only } else - { + { BfResolveTypeRefFlags resolveFlags = BfResolveTypeRefFlag_NoResolveGenericParam; if (initializer != NULL) resolveFlags = (BfResolveTypeRefFlags)(resolveFlags | BfResolveTypeRefFlag_AllowInferredSizedArray); @@ -8547,13 +8547,9 @@ BfType* BfModule::ResolveInnerType(BfType* outerType, BfAstNode* typeRef, BfPopu if ((!isFailurePass) && ((resolveFlags & BfResolveTypeRefFlag_IgnoreProtection) == 0) && (!CheckProtection(latestCheckType->mProtection, latestCheckType, allowProtected, allowPrivate))) continue; - - if (checkType->mProject != checkOuterType->mTypeDef->mProject) - { - auto visibleProjectSet = GetVisibleProjectSet(); - if ((visibleProjectSet == NULL) || (!visibleProjectSet->Contains(checkType->mProject))) - continue; - } + + if ((checkType->mProject != checkOuterType->mTypeDef->mProject) && (!IsProjectVisible(checkType->mProject))) + continue; if ((checkType->mName->mString == findName) && (checkType->GetSelfGenericParamCount() == numGenericArgs)) { diff --git a/IDEHelper/Compiler/BfSystem.cpp b/IDEHelper/Compiler/BfSystem.cpp index 4d37d542..a54211bc 100644 --- a/IDEHelper/Compiler/BfSystem.cpp +++ b/IDEHelper/Compiler/BfSystem.cpp @@ -1113,6 +1113,24 @@ bool BfProject::IsTestProject() return mTargetType == BfTargetType_BeefTest; } +bool BfProject::HasDependency(BfProject* project) +{ + if (mDependencySet.IsEmpty()) + { + auto _AddProject = [&](BfProject* addProject) + { + if (mDependencySet.Add(addProject)) + { + for (auto dep : addProject->mDependencies) + mDependencySet.Add(dep); + } + }; + _AddProject(this); + + } + return mDependencySet.Contains(project); +} + ////////////////////////////////////////////////////////////////////////// BfErrorBase::~BfErrorBase() diff --git a/IDEHelper/Compiler/BfSystem.h b/IDEHelper/Compiler/BfSystem.h index c938ab75..f81bdcef 100644 --- a/IDEHelper/Compiler/BfSystem.h +++ b/IDEHelper/Compiler/BfSystem.h @@ -1422,6 +1422,7 @@ public: HashSet mUsedModules; HashSet mReferencedTypeData; + HashSet mDependencySet; Val128 mBuildConfigHash; Val128 mVDataConfigHash; @@ -1435,6 +1436,7 @@ public: bool ContainsReference(BfProject* refProject); bool ReferencesOrReferencedBy(BfProject* refProject); bool IsTestProject(); + bool HasDependency(BfProject* project); }; //CDH TODO move these out to separate header if list gets big/unwieldy