@@ -687,6 +687,88 @@ ModuleDependencyScanner::getMainModuleDependencyInfo(ModuleDecl *mainModule) {
687
687
return mainDependencies;
688
688
}
689
689
690
+ // / Retrieve the module dependencies for the Clang module with the given name.
691
+ std::optional<const ModuleDependencyInfo *>
692
+ ModuleDependencyScanner::getNamedClangModuleDependencyInfo (
693
+ StringRef moduleName, ModuleDependenciesCache &cache,
694
+ ModuleDependencyIDSetVector &discoveredClangModules) {
695
+ // Check whether we've cached this result.
696
+ auto moduleID = ModuleDependencyID{moduleName.str (),
697
+ ModuleDependencyKind::Clang};
698
+ if (auto found = cache.findDependency (moduleID)) {
699
+ discoveredClangModules.insert (moduleID);
700
+ auto directClangDeps = cache.getImportedClangDependencies (moduleID);
701
+ ModuleDependencyIDSetVector reachableClangModules;
702
+ reachableClangModules.insert (directClangDeps.begin (),
703
+ directClangDeps.end ());
704
+ for (unsigned currentModuleIdx = 0 ;
705
+ currentModuleIdx < reachableClangModules.size ();
706
+ ++currentModuleIdx) {
707
+ auto moduleID = reachableClangModules[currentModuleIdx];
708
+ auto dependencies =
709
+ cache.findKnownDependency (moduleID).getImportedClangDependencies ();
710
+ reachableClangModules.insert (dependencies.begin (), dependencies.end ());
711
+ }
712
+ discoveredClangModules.insert (reachableClangModules.begin (),
713
+ reachableClangModules.end ());
714
+ return found;
715
+ }
716
+
717
+ // Otherwise perform filesystem scan
718
+ auto moduleIdentifier = getModuleImportIdentifier (moduleName);
719
+ auto moduleDependencies = withDependencyScanningWorker (
720
+ [&cache, moduleIdentifier](ModuleDependencyScanningWorker *ScanningWorker) {
721
+ return ScanningWorker->scanFilesystemForClangModuleDependency (
722
+ moduleIdentifier, cache.getModuleOutputPath (),
723
+ cache.getSDKModuleOutputPath (),
724
+ cache.getAlreadySeenClangModules (),
725
+ cache.getScanService ().getPrefixMapper ());
726
+ });
727
+ if (moduleDependencies.empty ())
728
+ return std::nullopt;
729
+
730
+ discoveredClangModules.insert (moduleID);
731
+ for (const auto &dep : moduleDependencies)
732
+ discoveredClangModules.insert (dep.first );
733
+
734
+ cache.recordDependencies (moduleDependencies, Diagnostics);
735
+ return cache.findDependency (moduleID);
736
+ }
737
+
738
+ // / Retrieve the module dependencies for the Swift module with the given name.
739
+ std::optional<const ModuleDependencyInfo *>
740
+ ModuleDependencyScanner::getNamedSwiftModuleDependencyInfo (
741
+ StringRef moduleName, ModuleDependenciesCache &cache) {
742
+ // Check whether we've cached this result.
743
+ if (auto found =
744
+ cache.findDependency (moduleName, ModuleDependencyKind::SwiftSource))
745
+ return found;
746
+ if (auto found = cache.findDependency (moduleName,
747
+ ModuleDependencyKind::SwiftInterface))
748
+ return found;
749
+ if (auto found =
750
+ cache.findDependency (moduleName, ModuleDependencyKind::SwiftBinary))
751
+ return found;
752
+ if (auto found = cache.findDependency (moduleName,
753
+ ModuleDependencyKind::SwiftPlaceholder))
754
+ return found;
755
+
756
+ // Otherwise perform filesystem scan
757
+ auto moduleIdentifier = getModuleImportIdentifier (moduleName);
758
+ auto moduleDependencies = withDependencyScanningWorker (
759
+ [&cache, moduleIdentifier](ModuleDependencyScanningWorker *ScanningWorker) {
760
+ return ScanningWorker->scanFilesystemForSwiftModuleDependency (
761
+ moduleIdentifier, cache.getModuleOutputPath (),
762
+ cache.getSDKModuleOutputPath (),
763
+ cache.getScanService ().getPrefixMapper ());
764
+ });
765
+ if (moduleDependencies.empty ())
766
+ return std::nullopt;
767
+
768
+ cache.recordDependencies (moduleDependencies, Diagnostics);
769
+ return cache.findDependency (moduleName);
770
+ }
771
+
690
772
// / For the dependency set of the main module, discover all
691
773
// / cross-import overlays and their corresponding '.swiftcrossimport'
692
774
// / files. Cross-import overlay dependencies are required when
@@ -998,38 +1080,19 @@ void ModuleDependencyScanner::resolveAllClangModuleDependencies(
998
1080
// We need to query the Clang dependency scanner for this module's
999
1081
// unresolved imports
1000
1082
llvm::StringSet<> resolvedImportIdentifiers;
1001
- for (const auto &resolvedDep :
1002
- moduleDependencyInfo.getImportedSwiftDependencies ())
1083
+ for (const auto &resolvedDep : moduleDependencyInfo.getImportedSwiftDependencies ())
1003
1084
resolvedImportIdentifiers.insert (resolvedDep.ModuleName );
1004
1085
1005
- // When querying a *clang* module 'CxxStdlib' we must
1006
- // instead expect a module called 'std'...
1007
- auto addCanonicalClangModuleImport =
1008
- [this ](const ScannerImportStatementInfo &importInfo,
1009
- std::vector<ScannerImportStatementInfo> &unresolvedImports,
1010
- llvm::StringSet<> &unresolvedImportIdentifiers) {
1011
- if (importInfo.importIdentifier ==
1012
- ScanASTContext.Id_CxxStdlib .str ()) {
1013
- auto canonicalImportInfo = ScannerImportStatementInfo (
1014
- " std" , importInfo.isExported , importInfo.importLocations );
1015
- unresolvedImports.push_back (canonicalImportInfo);
1016
- unresolvedImportIdentifiers.insert (
1017
- canonicalImportInfo.importIdentifier );
1018
- } else {
1019
- unresolvedImports.push_back (importInfo);
1020
- unresolvedImportIdentifiers.insert (importInfo.importIdentifier );
1021
- }
1022
- };
1023
-
1024
1086
for (const auto &depImport : moduleDependencyInfo.getModuleImports ())
1025
- if (!resolvedImportIdentifiers.contains (depImport.importIdentifier ))
1026
- addCanonicalClangModuleImport (depImport, *unresolvedImports,
1027
- unresolvedImportIdentifiers);
1028
- for (const auto &depImport :
1029
- moduleDependencyInfo.getOptionalModuleImports ())
1030
- if (!resolvedImportIdentifiers.contains (depImport.importIdentifier ))
1031
- addCanonicalClangModuleImport (depImport, *unresolvedOptionalImports,
1032
- unresolvedOptionalImportIdentifiers);
1087
+ if (!resolvedImportIdentifiers.contains (depImport.importIdentifier )) {
1088
+ unresolvedImports->push_back (depImport);
1089
+ unresolvedImportIdentifiers.insert (depImport.importIdentifier );
1090
+ }
1091
+ for (const auto &depImport : moduleDependencyInfo.getOptionalModuleImports ())
1092
+ if (!resolvedImportIdentifiers.contains (depImport.importIdentifier )) {
1093
+ unresolvedOptionalImports->push_back (depImport);
1094
+ unresolvedOptionalImportIdentifiers.insert (depImport.importIdentifier );
1095
+ }
1033
1096
}
1034
1097
}
1035
1098
0 commit comments