Skip to content

Commit 306f5b9

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 f1bec99 commit 306f5b9

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
@@ -854,12 +854,22 @@ void ModuleDependencyScanner::discoverCrossImportOverlayDependencies(
854854
}
855855

856856
// Update main module's dependencies to include these new overlays.
857+
auto resolvedDummyDep =
858+
*(cache.findDependency(dummyMainName, ModuleDependencyKind::SwiftSource)
859+
.value());
857860
auto mainDep =
858861
*(cache.findDependency(mainModuleName, ModuleDependencyKind::SwiftSource)
859862
.value());
860-
std::for_each(/* +1 to exclude dummy main*/ allModules.begin() + 1,
861-
allModules.end(), [&](ModuleDependencyID dependencyID) {
862-
mainDep.addModuleDependency(dependencyID);
863+
auto newOverlayDeps = resolvedDummyDep.getDirectModuleDependencies();
864+
auto existingMainDeps = mainDep.getDirectModuleDependencies();
865+
ModuleDependencyIDSet existingMainDepsSet(existingMainDeps.begin(),
866+
existingMainDeps.end());
867+
// Ensure we do not add cross-import overlay dependencies in case they
868+
// were already explicitly imported
869+
std::for_each(newOverlayDeps.begin(), newOverlayDeps.end(),
870+
[&](ModuleDependencyID crossImportOverlayModID) {
871+
if (!existingMainDepsSet.count(crossImportOverlayModID))
872+
mainDep.addModuleDependency(crossImportOverlayModID);
863873
});
864874
cache.updateDependency(
865875
{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)