diff --git a/include/swift/AST/ModuleDependencies.h b/include/swift/AST/ModuleDependencies.h index 391b2acc0b4a..c756e6c546ba 100644 --- a/include/swift/AST/ModuleDependencies.h +++ b/include/swift/AST/ModuleDependencies.h @@ -1209,6 +1209,10 @@ class ModuleDependenciesCache { ModuleDependencyIDSetVector getAllDependencies(const ModuleDependencyID &moduleID) const; + /// Query all directly-imported dependencies + ModuleDependencyIDSetVector + getDirectDependencies(const ModuleDependencyID &moduleID) const; + /// Query all Clang module dependencies. ModuleDependencyIDSetVector getClangDependencies(const ModuleDependencyID &moduleID) const; diff --git a/lib/AST/ModuleDependencies.cpp b/lib/AST/ModuleDependencies.cpp index 063493bb92bb..7aeb05459d83 100644 --- a/lib/AST/ModuleDependencies.cpp +++ b/lib/AST/ModuleDependencies.cpp @@ -976,19 +976,19 @@ ModuleDependenciesCache::setCrossImportOverlayDependencies(ModuleDependencyID mo } ModuleDependencyIDSetVector -ModuleDependenciesCache::getAllDependencies(const ModuleDependencyID &moduleID) const { +ModuleDependenciesCache::getDirectDependencies(const ModuleDependencyID &moduleID) const { const auto &moduleInfo = findKnownDependency(moduleID); ModuleDependencyIDSetVector result; if (moduleInfo.isSwiftModule()) { auto swiftImportedDepsRef = moduleInfo.getImportedSwiftDependencies(); - auto headerClangDepsRef = moduleInfo.getHeaderClangDependencies(); - auto overlayDependenciesRef = moduleInfo.getSwiftOverlayDependencies(); result.insert(swiftImportedDepsRef.begin(), swiftImportedDepsRef.end()); + + // FIXME: Remove the header clang dependencies from this set, + // and when doing so, add it to `getAllDependencies`. + auto headerClangDepsRef = moduleInfo.getHeaderClangDependencies(); result.insert(headerClangDepsRef.begin(), headerClangDepsRef.end()); - result.insert(overlayDependenciesRef.begin(), - overlayDependenciesRef.end()); } if (moduleInfo.isSwiftSourceModule()) { @@ -1004,6 +1004,19 @@ ModuleDependenciesCache::getAllDependencies(const ModuleDependencyID &moduleID) return result; } +ModuleDependencyIDSetVector +ModuleDependenciesCache::getAllDependencies(const ModuleDependencyID &moduleID) const { + const auto &moduleInfo = findKnownDependency(moduleID); + ModuleDependencyIDSetVector result = getDirectDependencies(moduleID); + if (moduleInfo.isSwiftModule()) { + auto overlayDependenciesRef = moduleInfo.getSwiftOverlayDependencies(); + result.insert(overlayDependenciesRef.begin(), + overlayDependenciesRef.end()); + } + + return result; +} + ModuleDependencyIDSetVector ModuleDependenciesCache::getClangDependencies(const ModuleDependencyID &moduleID) const { const auto &moduleInfo = findKnownDependency(moduleID); diff --git a/lib/DependencyScan/ScanDependencies.cpp b/lib/DependencyScan/ScanDependencies.cpp index 12d900ffd7c5..1cb254013b9a 100644 --- a/lib/DependencyScan/ScanDependencies.cpp +++ b/lib/DependencyScan/ScanDependencies.cpp @@ -357,8 +357,8 @@ class ExplicitModuleDependencyResolver { void addMacroDependencies(ModuleDependencyID moduleID, const ModuleDependencyInfoStorageBase &dep) { - auto directDeps = cache.getAllDependencies(this->moduleID); - if (llvm::find(directDeps, moduleID) == directDeps.end()) + auto dependencies = cache.getAllDependencies(this->moduleID); + if (llvm::find(dependencies, moduleID) == dependencies.end()) return; for (auto &entry : dep.macroDependencies) @@ -738,7 +738,7 @@ generateFullDependencyGraph(const CompilerInstance &instance, sourceFiles = clangDeps->fileDependencies; } - auto directDependencies = cache.getAllDependencies(moduleID); + auto directDependencies = cache.getDirectDependencies(moduleID); std::vector clangHeaderDependencyNames; for (const auto &headerDepID : moduleDependencyInfo.getHeaderClangDependencies()) clangHeaderDependencyNames.push_back(headerDepID.ModuleName); diff --git a/test/CAS/module_deps.swift b/test/CAS/module_deps.swift index 509f3d2984b3..f79674c26f80 100644 --- a/test/CAS/module_deps.swift +++ b/test/CAS/module_deps.swift @@ -91,6 +91,32 @@ import SubE // CHECK-DAG: "swift": "A" // CHECK-DAG: "swift": "F" +/// --------Swift module F +// CHECK: "modulePath": "{{.*}}{{/|\\}}F-{{.*}}.swiftmodule", +// CHECK-NEXT: "sourceFiles": [ +// CHECK-NEXT: ], +// CHECK-NEXT: "directDependencies": [ +// CHECK-NEXT: { +// CHECK-DAG: "clang": "F" +// CHECK-DAG: "swift": "Swift" +// CHECK-DAG: "swift": "SwiftOnoneSupport" +// CHECK-NEXT: } +// CHECK-NEXT: ], +// CHECK: "details": +// CHECK: "moduleCacheKey": + +/// --------Swift module A +// CHECK-LABEL: "modulePath": "{{.*}}{{/|\\}}A-{{.*}}.swiftmodule", + +// CHECK: directDependencies +// CHECK-NEXT: { +// CHECK-DAG: "clang": "A" +// CHECK-DAG: "swift": "Swift" +// CHECK-DAG: "swift": "SwiftOnoneSupport" +// CHECK-NEXT: } +// CHECK: "details": +// CHECK: "moduleCacheKey": + /// --------Clang module C // CHECK-LABEL: "modulePath": "{{.*}}{{/|\\}}C-{{.*}}.pcm", @@ -123,32 +149,6 @@ import SubE // CHECK-MAKE-DEPS-SAME: BridgingOther.h // CHECK-MAKE-DEPS-SAME: module.modulemap -/// --------Swift module F -// CHECK: "modulePath": "{{.*}}{{/|\\}}F-{{.*}}.swiftmodule", -// CHECK-NEXT: "sourceFiles": [ -// CHECK-NEXT: ], -// CHECK-NEXT: "directDependencies": [ -// CHECK-NEXT: { -// CHECK-DAG: "clang": "F" -// CHECK-DAG: "swift": "Swift" -// CHECK-DAG: "swift": "SwiftOnoneSupport" -// CHECK-NEXT: } -// CHECK-NEXT: ], -// CHECK: "details": -// CHECK: "moduleCacheKey": - -/// --------Swift module A -// CHECK-LABEL: "modulePath": "{{.*}}{{/|\\}}A-{{.*}}.swiftmodule", - -// CHECK: directDependencies -// CHECK-NEXT: { -// CHECK-DAG: "clang": "A" -// CHECK-DAG: "swift": "Swift" -// CHECK-DAG: "swift": "SwiftOnoneSupport" -// CHECK-NEXT: } -// CHECK: "details": -// CHECK: "moduleCacheKey": - /// --------Swift module G // CHECK-LABEL: "modulePath": "{{.*}}{{/|\\}}G-{{.*}}.swiftmodule" // CHECK: "directDependencies" diff --git a/test/CAS/module_deps_include_tree.swift b/test/CAS/module_deps_include_tree.swift index 711d84a68086..8bdf2bab0d7e 100644 --- a/test/CAS/module_deps_include_tree.swift +++ b/test/CAS/module_deps_include_tree.swift @@ -85,6 +85,31 @@ import SubE // CHECK-DAG: "swift": "A" // CHECK-DAG: "swift": "F" +/// --------Swift module F +// CHECK: "modulePath": "{{.*}}{{/|\\}}F-{{.*}}.swiftmodule", +// CHECK-NEXT: "sourceFiles": [ +// CHECK-NEXT: ], +// CHECK-NEXT: "directDependencies": [ +// CHECK-NEXT: { +// CHECK-DAG: "clang": "F" +// CHECK-DAG: "swift": "Swift" +// CHECK-DAG: "swift": "SwiftOnoneSupport" +// CHECK-NEXT: } +// CHECK-NEXT: ], +// CHECK: "details": +// CHECK: "moduleCacheKey": + +/// --------Swift module A +// CHECK-LABEL: "modulePath": "{{.*}}{{/|\\}}A-{{.*}}.swiftmodule", + +// CHECK: directDependencies +// CHECK-NEXT: { +// CHECK-DAG: "clang": "A" +// CHECK-DAG: "swift": "Swift" +// CHECK-NEXT: } +// CHECK: "details": +// CHECK: "moduleCacheKey": + /// --------Clang module C // CHECK-LABEL: "modulePath": "{{.*}}{{/|\\}}C-{{.*}}.pcm", @@ -124,31 +149,6 @@ import SubE // CHECK-MAKE-DEPS-SAME: BridgingOther.h // CHECK-MAKE-DEPS-SAME: module.modulemap -/// --------Swift module F -// CHECK: "modulePath": "{{.*}}{{/|\\}}F-{{.*}}.swiftmodule", -// CHECK-NEXT: "sourceFiles": [ -// CHECK-NEXT: ], -// CHECK-NEXT: "directDependencies": [ -// CHECK-NEXT: { -// CHECK-DAG: "clang": "F" -// CHECK-DAG: "swift": "Swift" -// CHECK-DAG: "swift": "SwiftOnoneSupport" -// CHECK-NEXT: } -// CHECK-NEXT: ], -// CHECK: "details": -// CHECK: "moduleCacheKey": - -/// --------Swift module A -// CHECK-LABEL: "modulePath": "{{.*}}{{/|\\}}A-{{.*}}.swiftmodule", - -// CHECK: directDependencies -// CHECK-NEXT: { -// CHECK-DAG: "clang": "A" -// CHECK-DAG: "swift": "Swift" -// CHECK-NEXT: } -// CHECK: "details": -// CHECK: "moduleCacheKey": - /// --------Swift module G // CHECK-LABEL: "modulePath": "{{.*}}{{/|\\}}G-{{.*}}.swiftmodule" // CHECK: "directDependencies" diff --git a/test/CAS/plugin_cas.swift b/test/CAS/plugin_cas.swift index 735fc133d5b9..591a2c574af7 100644 --- a/test/CAS/plugin_cas.swift +++ b/test/CAS/plugin_cas.swift @@ -74,6 +74,30 @@ import SubE // CHECK-DAG: "swift": "A" // CHECK-DAG: "swift": "F" +/// --------Swift module F +// CHECK: "modulePath": "{{.*}}{{/|\\}}F-{{.*}}.swiftmodule", +// CHECK-NEXT: "sourceFiles": [ +// CHECK-NEXT: ], +// CHECK-NEXT: "directDependencies": [ +// CHECK-NEXT: { +// CHECK-DAG: "clang": "F" +// CHECK-DAG: "swift": "Swift" +// CHECK-DAG: "swift": "SwiftOnoneSupport" +// CHECK-NEXT: } +// CHECK-NEXT: ], +// CHECK: "details": +// CHECK: "moduleCacheKey": + +/// --------Swift module A +// CHECK-LABEL: "modulePath": "{{.*}}{{/|\\}}A-{{.*}}.swiftmodule", + +// CHECK: directDependencies +// CHECK-NEXT: { +// CHECK-DAG: "clang": "A" +// CHECK-DAG: "swift": "Swift" +// CHECK-NEXT: } +// CHECK: "details": +// CHECK: "moduleCacheKey": /// --------Clang module C // CHECK-LABEL: "modulePath": "{{.*}}{{/|\\}}C-{{.*}}.pcm", @@ -107,31 +131,6 @@ import SubE // CHECK-MAKE-DEPS-SAME: BridgingOther.h // CHECK-MAKE-DEPS-SAME: module.modulemap -/// --------Swift module F -// CHECK: "modulePath": "{{.*}}{{/|\\}}F-{{.*}}.swiftmodule", -// CHECK-NEXT: "sourceFiles": [ -// CHECK-NEXT: ], -// CHECK-NEXT: "directDependencies": [ -// CHECK-NEXT: { -// CHECK-DAG: "clang": "F" -// CHECK-DAG: "swift": "Swift" -// CHECK-DAG: "swift": "SwiftOnoneSupport" -// CHECK-NEXT: } -// CHECK-NEXT: ], -// CHECK: "details": -// CHECK: "moduleCacheKey": - -/// --------Swift module A -// CHECK-LABEL: "modulePath": "{{.*}}{{/|\\}}A-{{.*}}.swiftmodule", - -// CHECK: directDependencies -// CHECK-NEXT: { -// CHECK-DAG: "clang": "A" -// CHECK-DAG: "swift": "Swift" -// CHECK-NEXT: } -// CHECK: "details": -// CHECK: "moduleCacheKey": - /// --------Swift module G // CHECK-LABEL: "modulePath": "{{.*}}{{/|\\}}G-{{.*}}.swiftmodule" // CHECK: "directDependencies" diff --git a/test/ScanDependencies/module_deps_binary_dep_swift_overlay.swift b/test/ScanDependencies/module_deps_binary_dep_swift_overlay.swift index 8814a95ecfb3..3dfc51d4d9b7 100644 --- a/test/ScanDependencies/module_deps_binary_dep_swift_overlay.swift +++ b/test/ScanDependencies/module_deps_binary_dep_swift_overlay.swift @@ -27,7 +27,6 @@ import BinaryModuleDep // CHECK-DAG: "swift": "_StringProcessing" // CHECK-DAG: "clang": "ClangModuleWithOverlayedDep" // CHECK-DAG: "swiftPrebuiltExternal": "BinaryModuleDep" -// CHECK-DAG: "swift": "F" // CHECK: ], // CHECK: "swiftOverlayDependencies": [ // CHECK-NEXT: { @@ -43,7 +42,6 @@ import BinaryModuleDep // CHECK-DAG: "clang": "_SwiftConcurrencyShims" // CHECK-DAG: "swift": "_StringProcessing" // CHECK-DAG: "clang": "ClangModuleWithOverlayedDep" -// CHECK-DAG: "swift": "F" // CHECK: ], // CHECK: "swiftOverlayDependencies": [ // CHECK-NEXT: { diff --git a/test/ScanDependencies/module_deps_cache_reuse.swift b/test/ScanDependencies/module_deps_cache_reuse.swift index fc11cfadb266..a5202d449bad 100644 --- a/test/ScanDependencies/module_deps_cache_reuse.swift +++ b/test/ScanDependencies/module_deps_cache_reuse.swift @@ -62,6 +62,24 @@ import SubE // CHECK-DAG: "swift": "F" // CHECK-DAG: "swift": "A" +/// --------Swift module F +// CHECK-LABEL: "modulePath": "{{.*}}{{/|\\}}F-{{.*}}.swiftmodule", +// CHECK-NEXT: "sourceFiles": [ +// CHECK-NEXT: ], +// CHECK-NEXT: "directDependencies": [ +// CHECK-NEXT: { +// CHECK-DAG: "clang": "F" +// CHECK-DAG: "swift": "Swift" +// CHECK-DAG: "swift": "SwiftOnoneSupport" +// CHECK: ], + +/// --------Swift module A +// CHECK-LABEL: "modulePath": "{{.*}}{{/|\\}}A-{{.*}}.swiftmodule", +// CHECK: directDependencies +// CHECK-NEXT: { +// CHECK-DAG: "clang": "A" +// CHECK-DAG: "swift": "Swift" + /// --------Clang module C // CHECK-LABEL: "modulePath": "{{.*}}/C-{{.*}}.pcm", @@ -99,25 +117,6 @@ import SubE // CHECK: "clang": "A" // CHECK-NEXT: } -/// --------Swift module F -// CHECK-LABEL: "modulePath": "{{.*}}{{/|\\}}F-{{.*}}.swiftmodule", -// CHECK-NEXT: "sourceFiles": [ -// CHECK-NEXT: ], -// CHECK-NEXT: "directDependencies": [ -// CHECK-NEXT: { -// CHECK-DAG: "clang": "F" -// CHECK-DAG: "swift": "Swift" -// CHECK-DAG: "swift": "SwiftOnoneSupport" -// CHECK: ], - -/// --------Swift module A -// CHECK-LABEL: "modulePath": "{{.*}}{{/|\\}}A-{{.*}}.swiftmodule", - -// CHECK: directDependencies -// CHECK-NEXT: { -// CHECK-DAG: "clang": "A" -// CHECK-DAG: "swift": "Swift" - /// --------Swift module G // CHECK-LABEL: "modulePath": "{{.*}}{{/|\\}}G-{{.*}}.swiftmodule" // CHECK: "directDependencies" diff --git a/test/ScanDependencies/module_deps_cross_import_overlay.swift b/test/ScanDependencies/module_deps_cross_import_overlay.swift index df6d225d6241..c3235bc06233 100644 --- a/test/ScanDependencies/module_deps_cross_import_overlay.swift +++ b/test/ScanDependencies/module_deps_cross_import_overlay.swift @@ -17,7 +17,6 @@ import SubEWrapper // CHECK: "directDependencies": [ // CHECK-DAG: "swift": "EWrapper" -// CHECK-DAG: "swift": "F" // CHECK-DAG: "swift": "SubEWrapper" // CHECK-DAG: "swift": "Swift" // CHECK-DAG: "swift": "SwiftOnoneSupport" @@ -37,5 +36,11 @@ import SubEWrapper // CHECK-NEXT: "E", // CHECK-NEXT: SubE.swiftoverlay +// CHECK: "swiftOverlayDependencies": [ +// CHECK: { +// CHECK: "swift": "F" +// CHECK: } +// CHECK: ] + // Ensure a transitive dependency via "_cross_import_E" is recorded in the graph still // CHECK: "clang": "X"