@@ -412,6 +412,7 @@ ModuleDependencyScanner::getMainModuleDependencyInfo(ModuleDecl *mainModule) {
412412 // Add any implicit module names.
413413 for (const auto &import : importInfo.AdditionalUnloadedImports ) {
414414 mainDependencies.addModuleImport (import .module .getModulePath (),
415+ import .options .contains (ImportFlags::Exported),
415416 &alreadyAddedModules,
416417 &ScanASTContext.SourceMgr );
417418 }
@@ -420,6 +421,7 @@ ModuleDependencyScanner::getMainModuleDependencyInfo(ModuleDecl *mainModule) {
420421 for (const auto &import : importInfo.AdditionalImports ) {
421422 mainDependencies.addModuleImport (
422423 import .module .importedModule ->getNameStr (),
424+ import .options .contains (ImportFlags::Exported),
423425 &alreadyAddedModules);
424426 }
425427
@@ -432,6 +434,7 @@ ModuleDependencyScanner::getMainModuleDependencyInfo(ModuleDecl *mainModule) {
432434 // add a dependency with the same name to trigger the search.
433435 if (importInfo.ShouldImportUnderlyingModule ) {
434436 mainDependencies.addModuleImport (mainModule->getName ().str (),
437+ /* isExported */ true ,
435438 &alreadyAddedModules);
436439 }
437440
@@ -441,6 +444,7 @@ ModuleDependencyScanner::getMainModuleDependencyInfo(ModuleDecl *mainModule) {
441444 for (const auto &tbdSymbolModule :
442445 ScanCompilerInvocation.getTBDGenOptions ().embedSymbolsFromModules ) {
443446 mainDependencies.addModuleImport (tbdSymbolModule,
447+ /* isExported */ false ,
444448 &alreadyAddedModules);
445449 }
446450 }
@@ -586,18 +590,19 @@ static void discoverCrossImportOverlayFiles(
586590 mainModuleName.str (), ModuleDependencyKind::SwiftSource});
587591
588592 llvm::StringMap<ModuleDependencyIDSet> perSourceFileDependencies;
589- const ModuleDependencyIDSet directSwiftDepsSet {
593+ const ModuleDependencyIDSet mainModuleDirectSwiftDepsSet {
590594 mainModuleInfo.getImportedSwiftDependencies ().begin (),
591595 mainModuleInfo.getImportedSwiftDependencies ().end ()};
592- const ModuleDependencyIDSet directClangDepsSet {
596+ const ModuleDependencyIDSet mainModuleDirectClangDepsSet {
593597 mainModuleInfo.getImportedClangDependencies ().begin (),
594598 mainModuleInfo.getImportedClangDependencies ().end ()};
595599
596600 // A utility to map an import identifier to one of the
597601 // known resolved module dependencies
598602 auto getModuleIDForImportIdentifier =
599- [directSwiftDepsSet, directClangDepsSet](
600- const std::string &importIdentifierStr) -> ModuleDependencyID {
603+ [](const std::string &importIdentifierStr,
604+ const ModuleDependencyIDSet &directSwiftDepsSet,
605+ const ModuleDependencyIDSet &directClangDepsSet) -> ModuleDependencyID {
601606 if (auto textualDepIt = directSwiftDepsSet.find (
602607 {importIdentifierStr, ModuleDependencyKind::SwiftInterface});
603608 textualDepIt != directSwiftDepsSet.end ())
@@ -617,8 +622,9 @@ static void discoverCrossImportOverlayFiles(
617622 // Collect the set of directly-imported module dependencies
618623 // for each source file in the source module under scan.
619624 for (const auto &import : mainModuleInfo.getModuleImports ()) {
620- auto importResolvedModuleID =
621- getModuleIDForImportIdentifier (import .importIdentifier );
625+ auto importResolvedModuleID = getModuleIDForImportIdentifier (
626+ import .importIdentifier , mainModuleDirectSwiftDepsSet,
627+ mainModuleDirectClangDepsSet);
622628 for (const auto &importLocation : import .importLocations )
623629 perSourceFileDependencies[importLocation.bufferIdentifier ].insert (
624630 importResolvedModuleID);
@@ -636,19 +642,29 @@ static void discoverCrossImportOverlayFiles(
636642 auto moduleID = worklist.pop_back_val ();
637643 perSourceFileDependencies[bufferIdentifier].insert (moduleID);
638644 if (isSwiftDependencyKind (moduleID.Kind )) {
639- for (const auto &directSwiftDepID :
640- cache.getImportedSwiftDependencies (moduleID)) {
641- if (perSourceFileDependencies[bufferIdentifier].count (directSwiftDepID))
642- continue ;
643- worklist.push_back (directSwiftDepID);
645+ auto moduleInfo = cache.findKnownDependency (moduleID);
646+ if (llvm::any_of (moduleInfo.getModuleImports (),
647+ [](const ScannerImportStatementInfo &importInfo) {
648+ return importInfo.isExported ;
649+ })) {
650+ const ModuleDependencyIDSet directSwiftDepsSet{
651+ moduleInfo.getImportedSwiftDependencies ().begin (),
652+ moduleInfo.getImportedSwiftDependencies ().end ()};
653+ const ModuleDependencyIDSet directClangDepsSet{
654+ moduleInfo.getImportedClangDependencies ().begin (),
655+ moduleInfo.getImportedClangDependencies ().end ()};
656+ for (const auto &import : moduleInfo.getModuleImports ()) {
657+ if (import .isExported ) {
658+ auto importResolvedDepID = getModuleIDForImportIdentifier (
659+ import .importIdentifier , directSwiftDepsSet,
660+ directClangDepsSet);
661+ if (!perSourceFileDependencies[bufferIdentifier].count (
662+ importResolvedDepID))
663+ worklist.push_back (importResolvedDepID);
664+ }
665+ }
644666 }
645667 }
646- for (const auto &directClangDepID :
647- cache.getImportedClangDependencies (moduleID)) {
648- if (perSourceFileDependencies[bufferIdentifier].count (directClangDepID))
649- continue ;
650- worklist.push_back (directClangDepID);
651- }
652668 }
653669 }
654670
@@ -1354,7 +1370,8 @@ void ModuleDependencyScanner::resolveCrossImportOverlayDependencies(
13541370 ModuleDependencyInfo::forSwiftSourceModule ();
13551371 std::for_each (newOverlays.begin (), newOverlays.end (),
13561372 [&](Identifier modName) {
1357- dummyMainDependencies.addModuleImport (modName.str ());
1373+ dummyMainDependencies.addModuleImport (modName.str (),
1374+ /* isExported */ false );
13581375 });
13591376
13601377 // Record the dummy main module's direct dependencies. The dummy main module
0 commit comments