Forráskód Böngészése

Extension inner type visibility fix

Brian Fiete 8 hónapja
szülő
commit
69fab22a39

+ 1 - 0
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)

+ 17 - 0
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();

+ 1 - 0
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);

+ 4 - 8
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))
 							{

+ 18 - 0
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()

+ 2 - 0
IDEHelper/Compiler/BfSystem.h

@@ -1422,6 +1422,7 @@ public:
 
 	HashSet<BfModule*> mUsedModules;
 	HashSet<BfType*> mReferencedTypeData;
+	HashSet<BfProject*> 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