@@ -961,13 +961,52 @@ 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 (ModuleDependenciesCache &cache, ASTContext &scanASTContext,
965+ ArrayRef<ModuleDependencyID> swiftModuleDependents,
966+ ModuleDependencyIDSetVector &allDiscoveredClangModules,
967+ std::unordered_map<ModuleDependencyID, ModuleDependencyIDSetVector>
968+ &resolvedClangDependenciesMap) {
969+ for (const auto &moduleID : swiftModuleDependents) {
970+ auto &moduleDependencyInfo = cache.findKnownDependency (moduleID);
971+ if (!moduleDependencyInfo.getImportedClangDependencies ().empty ())
972+ continue ;
973+
974+ auto resolveImportIfCached = [&](const ScannerImportStatementInfo &importInfo) {
975+ auto dependencyID = ModuleDependencyID{importInfo.importIdentifier ,
976+ ModuleDependencyKind::Clang};
977+ auto visibleFromDependencyID = cache.getVisibleClangModulesFrom (dependencyID);
978+ if (cache.hasDependency (dependencyID) &&
979+ !visibleFromDependencyID.empty ()) {
980+ cache.addVisibleClangModules (
981+ moduleID, dependencyID, visibleFromDependencyID);
982+ resolvedClangDependenciesMap[moduleID].insert (dependencyID);
983+ }
984+ };
985+
986+ for (const auto &depImport : moduleDependencyInfo.getModuleImports ())
987+ resolveImportIfCached (depImport);
988+ for (const auto &depImport : moduleDependencyInfo.getOptionalModuleImports ())
989+ resolveImportIfCached (depImport);
990+ }
991+ }
992+
993+ static void findAllReachableClangModules (ModuleDependencyID moduleID,
994+ const ModuleDependenciesCache &cache,
995+ ModuleDependencyIDSetVector &reachableClangModules) {
996+ if (!reachableClangModules.insert (moduleID))
997+ return ;
998+ for (const auto &depID : cache.getImportedClangDependencies (moduleID))
999+ findAllReachableClangModules (depID, cache, reachableClangModules);
1000+ }
1001+
1002+ static void gatherUnresolvedImports (
1003+ ModuleDependenciesCache &cache, ASTContext &scanASTContext,
1004+ ArrayRef<ModuleDependencyID> swiftModuleDependents,
1005+ ModuleDependencyIDSetVector &allDiscoveredClangModules,
1006+ ImportStatementInfoMap &unresolvedImportsMap,
1007+ ImportStatementInfoMap &unresolvedOptionalImportsMap,
1008+ const std::unordered_map<ModuleDependencyID, ModuleDependencyIDSetVector>
1009+ &resolvedClangDependenciesMap) {
9711010 for (const auto &moduleID : swiftModuleDependents) {
9721011 auto moduleDependencyInfo = cache.findKnownDependency (moduleID);
9731012 auto unresolvedImports =
@@ -986,27 +1025,24 @@ gatherUnresolvedImports(ModuleDependenciesCache &cache,
9861025 if (!moduleDependencyInfo.getImportedClangDependencies ().empty ()) {
9871026 auto directClangDeps = cache.getImportedClangDependencies (moduleID);
9881027 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 ());
1028+ for (const auto &depID : directClangDeps)
1029+ findAllReachableClangModules (depID, cache, reachableClangModules);
1030+ allDiscoveredClangModules.insert (reachableClangModules.getArrayRef ().begin (),
1031+ reachableClangModules.getArrayRef ().end ());
10011032 continue ;
10021033 } else {
10031034 // We need to query the Clang dependency scanner for this module's
1004- // non-Swift imports
1035+ // unresolved imports
10051036 llvm::StringSet<> resolvedImportIdentifiers;
10061037 for (const auto &resolvedDep :
10071038 moduleDependencyInfo.getImportedSwiftDependencies ())
10081039 resolvedImportIdentifiers.insert (resolvedDep.ModuleName );
10091040
1041+ if (resolvedClangDependenciesMap.find (moduleID) != resolvedClangDependenciesMap.end ())
1042+ for (const auto &cacheResolvedDep :
1043+ resolvedClangDependenciesMap.at (moduleID))
1044+ resolvedImportIdentifiers.insert (cacheResolvedDep.ModuleName );
1045+
10101046 // When querying a *clang* module 'CxxStdlib' we must
10111047 // instead expect a module called 'std'...
10121048 auto addCanonicalClangModuleImport =
@@ -1074,7 +1110,8 @@ void ModuleDependencyScanner::reQueryMissedModulesFromCache(
10741110 resolvedClangDependenciesMap[unresolvedImport.first ].insert (
10751111 unresolvedModuleID);
10761112 DependencyCache.addVisibleClangModules (
1077- unresolvedImport.first , {unresolvedImport.second .importIdentifier });
1113+ unresolvedImport.first , unresolvedModuleID,
1114+ {unresolvedImport.second .importIdentifier });
10781115 } else {
10791116 // Failed to resolve module dependency.
10801117 IssueReporter.diagnoseModuleNotFoundFailure (
@@ -1156,7 +1193,8 @@ void ModuleDependencyScanner::cacheComputedClangModuleLookupResults(
11561193 // Swift module
11571194 if (lookupResult.visibleModules .contains (moduleIdentifier))
11581195 DependencyCache.addVisibleClangModules (
1159- moduleID, lookupResult.visibleModules .at (moduleIdentifier));
1196+ moduleID, dependencyID,
1197+ lookupResult.visibleModules .at (moduleIdentifier));
11601198
11611199 // Add the resolved dependency ID
11621200 if (lookupResult.discoveredDependencyInfos .contains (
@@ -1204,13 +1242,21 @@ void ModuleDependencyScanner::cacheComputedClangModuleLookupResults(
12041242void ModuleDependencyScanner::resolveAllClangModuleDependencies (
12051243 ArrayRef<ModuleDependencyID> swiftModuleDependents,
12061244 ModuleDependencyIDSetVector &allDiscoveredClangModules) {
1207- // Gather all unresolved imports which must correspond to
1245+ std::unordered_map<ModuleDependencyID, ModuleDependencyIDSetVector>
1246+ resolvedClangDependenciesMap;
1247+ resolveClangDependenciesFromCache (DependencyCache, ScanASTContext,
1248+ swiftModuleDependents,
1249+ allDiscoveredClangModules,
1250+ resolvedClangDependenciesMap);
1251+
1252+ // Gather all remaining unresolved imports which must correspond to
12081253 // Clang modules (since no Swift module for them was found).
12091254 ImportStatementInfoMap unresolvedImportsMap;
12101255 ImportStatementInfoMap unresolvedOptionalImportsMap;
1211- gatherUnresolvedImports (DependencyCache, ScanASTContext, swiftModuleDependents,
1212- allDiscoveredClangModules, unresolvedImportsMap,
1213- unresolvedOptionalImportsMap);
1256+ gatherUnresolvedImports (DependencyCache, ScanASTContext,
1257+ swiftModuleDependents, allDiscoveredClangModules,
1258+ unresolvedImportsMap, unresolvedOptionalImportsMap,
1259+ resolvedClangDependenciesMap);
12141260
12151261 // Execute parallel lookup of all unresolved import
12161262 // identifiers as Clang modules.
@@ -1222,8 +1268,6 @@ void ModuleDependencyScanner::resolveAllClangModuleDependencies(
12221268 // dependencies.
12231269 std::vector<std::pair<ModuleDependencyID, ScannerImportStatementInfo>>
12241270 failedToResolveImports;
1225- std::unordered_map<ModuleDependencyID, ModuleDependencyIDSetVector>
1226- resolvedClangDependenciesMap;
12271271 cacheComputedClangModuleLookupResults (
12281272 lookupResult, unresolvedImportsMap, unresolvedOptionalImportsMap,
12291273 swiftModuleDependents, allDiscoveredClangModules,
@@ -1506,6 +1550,8 @@ void ModuleDependencyScanner::resolveHeaderDependenciesForModule(
15061550 // Update the set of visible Clang modules
15071551 moduleDependencyInfo.addVisibleClangModules (
15081552 headerScanResult->VisibleModules );
1553+ DependencyCache.addHeaderVisibleClangModules (moduleID,
1554+ headerScanResult->VisibleModules );
15091555 // Update the dependency in the cache
15101556 DependencyCache.updateDependency (moduleID, moduleDependencyInfo);
15111557 } else {
0 commit comments