Skip to content

Commit f21926c

Browse files
committed
[Dependency Scanning] On discovering cross-import overlays, do not add their discovered dependencies to the main module's direct dependencies
Instead, only add the overlay itself, and let it refer to its own dependencies, which will still get recorded in the overall output. Resolves rdar://117010118
1 parent b037664 commit f21926c

File tree

3 files changed

+19
-3
lines changed

3 files changed

+19
-3
lines changed

lib/DependencyScan/ModuleDependencyScanner.cpp

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -850,12 +850,22 @@ void ModuleDependencyScanner::discoverCrossImportOverlayDependencies(
850850
}
851851

852852
// Update main module's dependencies to include these new overlays.
853+
auto resolvedDummyDep =
854+
*(cache.findDependency(dummyMainName, ModuleDependencyKind::SwiftSource)
855+
.value());
853856
auto mainDep =
854857
*(cache.findDependency(mainModuleName, ModuleDependencyKind::SwiftSource)
855858
.value());
856-
std::for_each(/* +1 to exclude dummy main*/ allModules.begin() + 1,
857-
allModules.end(), [&](ModuleDependencyID dependencyID) {
858-
mainDep.addModuleDependency(dependencyID);
859+
auto newOverlayDeps = resolvedDummyDep.getDirectModuleDependencies();
860+
auto existingMainDeps = mainDep.getDirectModuleDependencies();
861+
ModuleDependencyIDSet existingMainDepsSet(existingMainDeps.begin(),
862+
existingMainDeps.end());
863+
// Ensure we do not add cross-import overlay dependencies in case they
864+
// were already explicitly imported
865+
std::for_each(newOverlayDeps.begin(), newOverlayDeps.end(),
866+
[&](ModuleDependencyID crossImportOverlayModID) {
867+
if (!existingMainDepsSet.count(crossImportOverlayModID))
868+
mainDep.addModuleDependency(crossImportOverlayModID);
859869
});
860870
cache.updateDependency(
861871
{mainModuleName.str(), ModuleDependencyKind::SwiftSource}, mainDep);

test/ScanDependencies/Inputs/Swift/_cross_import_E.swiftinterface

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,5 @@
33
import Swift
44
import E
55
import SubE
6+
import X
67
public func funcCrossImportE() {}

test/ScanDependencies/module_deps_cross_import_overlay.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,9 @@ import SubEWrapper
2424
// CHECK-DAG: "swift": "_StringProcessing"
2525
// CHECK-DAG: "swift": "_cross_import_E"
2626
// CHECK-DAG: "clang": "_SwiftConcurrencyShims"
27+
// Ensure a transitive dependency via "_cross_import_E" is not a direct dep of main module
28+
// CHECK-NOT: "clang": "X"
2729
// CHECK: ],
30+
31+
// Ensure a transitive dependency via "_cross_import_E" is recorded in the graph still
32+
// CHECK: "clang": "X"

0 commit comments

Comments
 (0)