From f53be7187486feeff8398ee9569df72077d1e7db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexis=20Laferri=C3=A8re?= Date: Tue, 11 Jun 2024 16:32:45 -0700 Subject: [PATCH] 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. --- lib/Frontend/ModuleInterfaceSupport.cpp | 3 +- test/CrossImport/module-interface.swift | 3 +- .../with-implementation-only.swift | 71 +++++++++++++++++++ 3 files changed, 74 insertions(+), 3 deletions(-) create mode 100644 test/CrossImport/with-implementation-only.swift diff --git a/lib/Frontend/ModuleInterfaceSupport.cpp b/lib/Frontend/ModuleInterfaceSupport.cpp index 491baa89e67..83db1e19b75 100644 --- a/lib/Frontend/ModuleInterfaceSupport.cpp +++ b/lib/Frontend/ModuleInterfaceSupport.cpp @@ -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 diff --git a/test/CrossImport/module-interface.swift b/test/CrossImport/module-interface.swift index 991e1e52f3c..2b0d52b7012 100644 --- a/test/CrossImport/module-interface.swift +++ b/test/CrossImport/module-interface.swift @@ -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) diff --git a/test/CrossImport/with-implementation-only.swift b/test/CrossImport/with-implementation-only.swift new file mode 100644 index 00000000000..a78c9d540be --- /dev/null +++ b/test/CrossImport/with-implementation-only.swift @@ -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