@@ -961,13 +961,57 @@ void ModuleDependencyScanner::resolveSwiftModuleDependencies(
961961 return ;
962962}
963963
964- static void
965- gatherUnresolvedImports (ModuleDependenciesCache &cache,
966- ASTContext &scanASTContext,
967- ArrayRef<ModuleDependencyID> swiftModuleDependents,
968- ModuleDependencyIDSetVector &allDiscoveredClangModules,
969- ImportStatementInfoMap &unresolvedImportsMap,
970- ImportStatementInfoMap &unresolvedOptionalImportsMap) {
964+ static void resolveClangDependenciesFromCache (
965+ ModuleDependenciesCache &cache, ASTContext &scanASTContext,
966+ ArrayRef<ModuleDependencyID> swiftModuleDependents,
967+ ModuleDependencyIDSetVector &allDiscoveredClangModules,
968+ std::unordered_map<ModuleDependencyID, ModuleDependencyIDSetVector>
969+ &resolvedClangDependenciesMap) {
970+ for (const auto &moduleID : swiftModuleDependents) {
971+ ModuleDependencyInfo moduleDependencyInfo =
972+ cache.findKnownDependency (moduleID);
973+ if (!moduleDependencyInfo.getImportedClangDependencies ().empty ())
974+ continue ;
975+
976+ auto resolveImportIfCached =
977+ [&](const ScannerImportStatementInfo &importInfo) {
978+ auto dependencyID = ModuleDependencyID{importInfo.importIdentifier ,
979+ ModuleDependencyKind::Clang};
980+ auto visibleFromDependencyID =
981+ cache.getVisibleClangModulesFrom (dependencyID);
982+ if (cache.hasDependency (dependencyID) &&
983+ !visibleFromDependencyID.empty ()) {
984+ cache.addVisibleClangModules (moduleID, dependencyID,
985+ visibleFromDependencyID);
986+ resolvedClangDependenciesMap[moduleID].insert (dependencyID);
987+ }
988+ };
989+
990+ for (const auto &depImport : moduleDependencyInfo.getModuleImports ())
991+ resolveImportIfCached (depImport);
992+ for (const auto &depImport :
993+ moduleDependencyInfo.getOptionalModuleImports ())
994+ resolveImportIfCached (depImport);
995+ }
996+ }
997+
998+ static void findAllReachableClangModules (ModuleDependencyID moduleID,
999+ const ModuleDependenciesCache &cache,
1000+ ModuleDependencyIDSetVector &reachableClangModules) {
1001+ if (!reachableClangModules.insert (moduleID))
1002+ return ;
1003+ for (const auto &depID : cache.getImportedClangDependencies (moduleID))
1004+ findAllReachableClangModules (depID, cache, reachableClangModules);
1005+ }
1006+
1007+ static void gatherUnresolvedImports (
1008+ ModuleDependenciesCache &cache, ASTContext &scanASTContext,
1009+ ArrayRef<ModuleDependencyID> swiftModuleDependents,
1010+ ModuleDependencyIDSetVector &allDiscoveredClangModules,
1011+ ImportStatementInfoMap &unresolvedImportsMap,
1012+ ImportStatementInfoMap &unresolvedOptionalImportsMap,
1013+ const std::unordered_map<ModuleDependencyID, ModuleDependencyIDSetVector>
1014+ &resolvedClangDependenciesMap) {
9711015 for (const auto &moduleID : swiftModuleDependents) {
9721016 auto moduleDependencyInfo = cache.findKnownDependency (moduleID);
9731017 auto unresolvedImports =
@@ -986,27 +1030,24 @@ gatherUnresolvedImports(ModuleDependenciesCache &cache,
9861030 if (!moduleDependencyInfo.getImportedClangDependencies ().empty ()) {
9871031 auto directClangDeps = cache.getImportedClangDependencies (moduleID);
9881032 ModuleDependencyIDSetVector reachableClangModules;
989- reachableClangModules.insert (directClangDeps.begin (),
990- directClangDeps.end ());
991- for (unsigned currentModuleIdx = 0 ;
992- currentModuleIdx < reachableClangModules.size ();
993- ++currentModuleIdx) {
994- auto moduleID = reachableClangModules[currentModuleIdx];
995- auto dependencies =
996- cache.findKnownDependency (moduleID).getImportedClangDependencies ();
997- reachableClangModules.insert (dependencies.begin (), dependencies.end ());
998- }
999- allDiscoveredClangModules.insert (reachableClangModules.begin (),
1000- reachableClangModules.end ());
1033+ for (const auto &depID : directClangDeps)
1034+ findAllReachableClangModules (depID, cache, reachableClangModules);
1035+ allDiscoveredClangModules.insert (reachableClangModules.getArrayRef ().begin (),
1036+ reachableClangModules.getArrayRef ().end ());
10011037 continue ;
10021038 } else {
10031039 // We need to query the Clang dependency scanner for this module's
1004- // non-Swift imports
1040+ // unresolved imports
10051041 llvm::StringSet<> resolvedImportIdentifiers;
10061042 for (const auto &resolvedDep :
10071043 moduleDependencyInfo.getImportedSwiftDependencies ())
10081044 resolvedImportIdentifiers.insert (resolvedDep.ModuleName );
10091045
1046+ if (resolvedClangDependenciesMap.find (moduleID) != resolvedClangDependenciesMap.end ())
1047+ for (const auto &cacheResolvedDep :
1048+ resolvedClangDependenciesMap.at (moduleID))
1049+ resolvedImportIdentifiers.insert (cacheResolvedDep.ModuleName );
1050+
10101051 // When querying a *clang* module 'CxxStdlib' we must
10111052 // instead expect a module called 'std'...
10121053 auto addCanonicalClangModuleImport =
@@ -1074,7 +1115,8 @@ void ModuleDependencyScanner::reQueryMissedModulesFromCache(
10741115 resolvedClangDependenciesMap[unresolvedImport.first ].insert (
10751116 unresolvedModuleID);
10761117 DependencyCache.addVisibleClangModules (
1077- unresolvedImport.first , {unresolvedImport.second .importIdentifier });
1118+ unresolvedImport.first , unresolvedModuleID,
1119+ {unresolvedImport.second .importIdentifier });
10781120 } else {
10791121 // Failed to resolve module dependency.
10801122 IssueReporter.diagnoseModuleNotFoundFailure (
@@ -1156,7 +1198,8 @@ void ModuleDependencyScanner::cacheComputedClangModuleLookupResults(
11561198 // Swift module
11571199 if (lookupResult.visibleModules .contains (moduleIdentifier))
11581200 DependencyCache.addVisibleClangModules (
1159- moduleID, lookupResult.visibleModules .at (moduleIdentifier));
1201+ moduleID, dependencyID,
1202+ lookupResult.visibleModules .at (moduleIdentifier));
11601203
11611204 // Add the resolved dependency ID
11621205 if (lookupResult.discoveredDependencyInfos .contains (
@@ -1204,13 +1247,21 @@ void ModuleDependencyScanner::cacheComputedClangModuleLookupResults(
12041247void ModuleDependencyScanner::resolveAllClangModuleDependencies (
12051248 ArrayRef<ModuleDependencyID> swiftModuleDependents,
12061249 ModuleDependencyIDSetVector &allDiscoveredClangModules) {
1207- // Gather all unresolved imports which must correspond to
1250+ std::unordered_map<ModuleDependencyID, ModuleDependencyIDSetVector>
1251+ resolvedClangDependenciesMap;
1252+ resolveClangDependenciesFromCache (DependencyCache, ScanASTContext,
1253+ swiftModuleDependents,
1254+ allDiscoveredClangModules,
1255+ resolvedClangDependenciesMap);
1256+
1257+ // Gather all remaining unresolved imports which must correspond to
12081258 // Clang modules (since no Swift module for them was found).
12091259 ImportStatementInfoMap unresolvedImportsMap;
12101260 ImportStatementInfoMap unresolvedOptionalImportsMap;
1211- gatherUnresolvedImports (DependencyCache, ScanASTContext, swiftModuleDependents,
1212- allDiscoveredClangModules, unresolvedImportsMap,
1213- unresolvedOptionalImportsMap);
1261+ gatherUnresolvedImports (DependencyCache, ScanASTContext,
1262+ swiftModuleDependents, allDiscoveredClangModules,
1263+ unresolvedImportsMap, unresolvedOptionalImportsMap,
1264+ resolvedClangDependenciesMap);
12141265
12151266 // Execute parallel lookup of all unresolved import
12161267 // identifiers as Clang modules.
@@ -1222,8 +1273,6 @@ void ModuleDependencyScanner::resolveAllClangModuleDependencies(
12221273 // dependencies.
12231274 std::vector<std::pair<ModuleDependencyID, ScannerImportStatementInfo>>
12241275 failedToResolveImports;
1225- std::unordered_map<ModuleDependencyID, ModuleDependencyIDSetVector>
1226- resolvedClangDependenciesMap;
12271276 cacheComputedClangModuleLookupResults (
12281277 lookupResult, unresolvedImportsMap, unresolvedOptionalImportsMap,
12291278 swiftModuleDependents, allDiscoveredClangModules,
@@ -1506,6 +1555,8 @@ void ModuleDependencyScanner::resolveHeaderDependenciesForModule(
15061555 // Update the set of visible Clang modules
15071556 moduleDependencyInfo.addVisibleClangModules (
15081557 headerScanResult->VisibleModules );
1558+ DependencyCache.addHeaderVisibleClangModules (moduleID,
1559+ headerScanResult->VisibleModules );
15091560 // Update the dependency in the cache
15101561 DependencyCache.updateDependency (moduleID, moduleDependencyInfo);
15111562 } else {
0 commit comments