ModuleInterface: Print imports shadowed by a cross-import overlay

In some cases this import may be superfluous as it's also
`@_exported` imported by the overlay. However, when the overlay
is hidden and the import not printed, the import can go entierly
missing.
This commit is contained in:
Alexis Laferrière
2024-06-11 16:32:45 -07:00
parent 7c69bec9b4
commit f53be71874
3 changed files with 74 additions and 3 deletions

View File

@@ -240,7 +240,8 @@ static void printImports(raw_ostream &out,
// it's not obvious what higher-level optimization would be factored out here.
ModuleDecl::ImportFilter allImportFilter = {
ModuleDecl::ImportFilterKind::Exported,
ModuleDecl::ImportFilterKind::Default};
ModuleDecl::ImportFilterKind::Default,
ModuleDecl::ImportFilterKind::ShadowedByCrossImportOverlay};
// With -experimental-spi-imports:
// When printing the private or package swiftinterface file, print implementation-only

View File

@@ -10,7 +10,6 @@
// RUN: %target-swift-emit-module-interface(%t.swiftinterface) %s -enable-cross-import-overlays -I %t/lib/swift -module-name ClientLibrary
// RUN: %target-swift-typecheck-module-from-interface(%t.swiftinterface) -enable-cross-import-overlays -I %t/lib/swift -module-name ClientLibrary
// RUN: %FileCheck %s < %t.swiftinterface
// RUN: %FileCheck -check-prefix NEGATIVE %s < %t.swiftinterface
//
// Should fail with -disable-cross-import-overlays
@@ -38,9 +37,9 @@ public func shadow(_: DeclaringLibrary.ShadowTy, _: ShadowTy) {}
// CHECK: // swift-module-flags: {{.*}} -module-name ClientLibrary
// CHECK-DAG: import Swift
// CHECK-DAG: import DeclaringLibrary
// CHECK-DAG: import BystandingLibrary
// CHECK-DAG: import _OverlayLibrary
// NEGATIVE-NOT: import DeclaringLibrary
// CHECK-DAG: public func fn(_: DeclaringLibrary.DeclaringLibraryTy, _: BystandingLibrary.BystandingLibraryTy, _: _OverlayLibrary.OverlayLibraryTy)
// CHECK-DAG: public func alias(_: _OverlayLibrary.OverlayLibraryTy)

View File

@@ -0,0 +1,71 @@
/// Check cross-import overlays with @_implementationOnly imports.
// RUN: %empty-directory(%t)
// RUN: cp -r %S/Inputs/lib-templates/* %t/
// RUN: split-file --leading-lines %s %t
//--- BothPublic.swift
// RUN: %target-swift-emit-module-interface(%t.swiftinterface) %t/BothPublic.swift -enable-cross-import-overlays -I %t/lib/swift -module-name ClientLibrary
// RUN: %target-swift-typecheck-module-from-interface(%t.swiftinterface) -enable-cross-import-overlays -I %t/lib/swift -module-name ClientLibrary
// RUN: %FileCheck %t/BothPublic.swift < %t.swiftinterface
import DeclaringLibrary
import BystandingLibrary
// CHECK: // swift-interface-format-version
// CHECK: // swift-module-flags: {{.*}} -module-name ClientLibrary
// CHECK-DAG: import Swift
// CHECK-DAG: import DeclaringLibrary
// CHECK-DAG: import BystandingLibrary
// CHECK-DAG: import _OverlayLibrary
//--- BothHidden.swift
// RUN: %target-swift-emit-module-interface(%t.swiftinterface) %t/BothHidden.swift -enable-cross-import-overlays -I %t/lib/swift -module-name ClientLibrary
// RUN: %target-swift-typecheck-module-from-interface(%t.swiftinterface) -enable-cross-import-overlays -I %t/lib/swift -module-name ClientLibrary
// RUN: %FileCheck %t/BothHidden.swift < %t.swiftinterface
// RUN: %FileCheck -check-prefix NEGATIVE %t/BothHidden.swift < %t.swiftinterface
@_implementationOnly import DeclaringLibrary
@_implementationOnly import BystandingLibrary
// CHECK: // swift-interface-format-version
// CHECK: // swift-module-flags: {{.*}} -module-name ClientLibrary
// CHECK-DAG: import Swift
// NEGATIVE-NOT: import DeclaringLibrary
// NEGATIVE-NOT: import BystandingLibrary
// NEGATIVE-NOT: import _OverlayLibrary
//--- FirstHidden.swift
// RUN: %target-swift-emit-module-interface(%t.swiftinterface) %t/FirstHidden.swift -enable-cross-import-overlays -I %t/lib/swift -module-name ClientLibrary
// RUN: %target-swift-typecheck-module-from-interface(%t.swiftinterface) -enable-cross-import-overlays -I %t/lib/swift -module-name ClientLibrary
// RUN: %FileCheck %t/FirstHidden.swift < %t.swiftinterface
// RUN: %FileCheck -check-prefix NEGATIVE %t/FirstHidden.swift < %t.swiftinterface
@_implementationOnly import DeclaringLibrary
import BystandingLibrary
// CHECK: // swift-interface-format-version
// CHECK: // swift-module-flags: {{.*}} -module-name ClientLibrary
// CHECK-DAG: import Swift
// CHECK-DAG: import BystandingLibrary
// NEGATIVE-NOT: import DeclaringLibrary
// NEGATIVE-NOT: import _OverlayLibrary
//--- SecondHidden.swift
// RUN: %target-swift-emit-module-interface(%t.swiftinterface) %t/SecondHidden.swift -enable-cross-import-overlays -I %t/lib/swift -module-name ClientLibrary
// RUN: %target-swift-typecheck-module-from-interface(%t.swiftinterface) -enable-cross-import-overlays -I %t/lib/swift -module-name ClientLibrary
// RUN: %FileCheck %t/SecondHidden.swift < %t.swiftinterface
// RUN: %FileCheck -check-prefix NEGATIVE %t/SecondHidden.swift < %t.swiftinterface
import DeclaringLibrary
@_implementationOnly import BystandingLibrary
// CHECK: // swift-interface-format-version
// CHECK: // swift-module-flags: {{.*}} -module-name ClientLibrary
// CHECK-DAG: import Swift
// CHECK-DAG: import DeclaringLibrary
// NEGATIVE-NOT: import BystandingLibrary
// NEGATIVE-NOT: import _OverlayLibrary