Skip to content

Fixes package import stmt missing from .package.swiftinterface. #72282

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Mar 14, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 30 additions & 9 deletions lib/Frontend/ModuleInterfaceSupport.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -286,6 +286,30 @@ static void printImports(raw_ostream &out,
allImportFilter |= ModuleDecl::ImportFilterKind::SPIOnly;
}

// Collect the public imports as a subset so that we can mark them with
// '@_exported'.
SmallVector<ImportedModule, 8> exportedImports;
M->getImportedModules(exportedImports, ModuleDecl::ImportFilterKind::Exported);
llvm::SmallSet<ImportedModule, 8, ImportedModule::Order> exportedImportSet;
exportedImportSet.insert(exportedImports.begin(), exportedImports.end());

// All of the above are considered `public` including `@_spiOnly public import`
// and `@_spi(name) public import`, and should override `package import`.
// Track the `public` imports here to determine whether to override.
llvm::SmallSet<ImportedModule, 8, ImportedModule::Order> publicImportSet;
SmallVector<ImportedModule, 8> publicImports;
M->getImportedModules(publicImports, allImportFilter);
publicImportSet.insert(publicImports.begin(), publicImports.end());

// Used to determine whether `package import` should be overriden below.
llvm::SmallSet<ImportedModule, 8, ImportedModule::Order> packageOnlyImportSet;
if (Opts.printPackageInterface()) {
SmallVector<ImportedModule, 8> packageOnlyImports;
M->getImportedModules(packageOnlyImports, ModuleDecl::ImportFilterKind::PackageOnly);
packageOnlyImportSet.insert(packageOnlyImports.begin(), packageOnlyImports.end());
allImportFilter |= ModuleDecl::ImportFilterKind::PackageOnly;
}

SmallVector<ImportedModule, 8> allImports;
M->getImportedModules(allImports, allImportFilter);

Expand All @@ -295,13 +319,6 @@ static void printImports(raw_ostream &out,
ImportedModule::removeDuplicates(allImports);
diagnoseScopedImports(ctx.Diags, allImports);

// Collect the public imports as a subset so that we can mark them with
// '@_exported'.
SmallVector<ImportedModule, 8> publicImports;
M->getImportedModules(publicImports, ModuleDecl::ImportFilterKind::Exported);
llvm::SmallSet<ImportedModule, 8, ImportedModule::Order> publicImportSet;
publicImportSet.insert(publicImports.begin(), publicImports.end());

for (auto import : allImports) {
auto importedModule = import.importedModule;
if (importedModule->isOnoneSupportModule()) {
Expand Down Expand Up @@ -332,7 +349,7 @@ static void printImports(raw_ostream &out,
out << "@_implementationOnly ";
}

if (publicImportSet.count(import))
if (exportedImportSet.count(import))
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That rename was long overdue, thanks!

out << "@_exported ";

if (!Opts.printPublicInterface()) {
Expand All @@ -351,7 +368,11 @@ static void printImports(raw_ostream &out,
out << "@_spi(" << spiName << ") ";
}

if (ctx.LangOpts.hasFeature(Feature::InternalImportsByDefault)) {
if (Opts.printPackageInterface() &&
!publicImportSet.count(import) &&
packageOnlyImportSet.count(import))
out << "package ";
else if (ctx.LangOpts.hasFeature(Feature::InternalImportsByDefault)) {
out << "public ";
}

Expand Down
138 changes: 133 additions & 5 deletions test/ModuleInterface/access-level-import-swiftinterfaces.swift
Original file line number Diff line number Diff line change
Expand Up @@ -16,74 +16,137 @@
// RUN: -swift-version 5 -enable-library-evolution
// RUN: %target-swift-frontend -emit-module %t/PrivateLib.swift -o %t \
// RUN: -swift-version 5 -enable-library-evolution
// RUN: %target-swift-frontend -emit-module %t/LibX.swift -o %t \
// RUN: -swift-version 5 -enable-library-evolution
// RUN: %target-swift-frontend -emit-module %t/LibY.swift -o %t \
// RUN: -swift-version 5 -enable-library-evolution
// RUN: %target-swift-frontend -emit-module %t/LibZ.swift -o %t \
// RUN: -swift-version 5 -enable-library-evolution
// RUN: %target-swift-frontend -emit-module %t/LibS.swift -o %t \
// RUN: -swift-version 5 -enable-library-evolution
// RUN: %target-swift-frontend -emit-module %t/LibT.swift -o %t \
// RUN: -swift-version 5 -enable-library-evolution
// RUN: %target-swift-frontend -emit-module %t/LibU.swift -o %t \
// RUN: -swift-version 5 -enable-library-evolution
// RUN: %target-swift-frontend -emit-module %t/LibV.swift -o %t \
// RUN: -swift-version 5 -enable-library-evolution

/// Build client and generate swiftinterfaces.
// RUN: %target-swift-frontend -typecheck %t/Client.swift -I %t \
// RUN: -package-name TestPackage \
// RUN: -enable-library-evolution -swift-version 5 \
// RUN: -emit-module-interface-path %t/Client.swiftinterface \
// RUN: -emit-private-module-interface-path %t/Client.private.swiftinterface
// RUN: -emit-private-module-interface-path %t/Client.private.swiftinterface \
// RUN: -emit-package-module-interface-path %t/Client.package.swiftinterface

// RUN: %target-swift-typecheck-module-from-interface(%t/Client.swiftinterface) -I %t
// RUN: %target-swift-typecheck-module-from-interface(%t/Client.private.swiftinterface) -I %t \
// RUN: -module-name Client
// RUN: %target-swift-typecheck-module-from-interface(%t/Client.package.swiftinterface) -I %t \
// RUN: -module-name Client

// RUN: %FileCheck --check-prefixes=CHECK,CHECK-5 %s < %t/Client.swiftinterface
// RUN: %FileCheck --check-prefixes=CHECK,CHECK-5 %s < %t/Client.private.swiftinterface
// RUN: %FileCheck --check-prefixes=CHECK-5-PKG %s < %t/Client.package.swiftinterface

/// Build a client composed of many files.
// RUN: %target-swift-frontend -typecheck %t/MultiFiles?.swift -I %t \
// RUN: -package-name TestPackage \
// RUN: -experimental-spi-only-imports \
// RUN: -enable-library-evolution -swift-version 5 \
// RUN: -emit-module-interface-path %t/MultiFiles.swiftinterface \
// RUN: -emit-private-module-interface-path %t/MultiFiles.private.swiftinterface
// RUN: -emit-private-module-interface-path %t/MultiFiles.private.swiftinterface \
// RUN: -emit-package-module-interface-path %t/MultiFiles.package.swiftinterface

// RUN: %target-swift-typecheck-module-from-interface(%t/MultiFiles.swiftinterface) -I %t
// RUN: %target-swift-typecheck-module-from-interface(%t/MultiFiles.private.swiftinterface) -I %t \
// RUN: -module-name MultiFiles
// RUN: %target-swift-typecheck-module-from-interface(%t/MultiFiles.package.swiftinterface) -I %t \
// RUN: -module-name MultiFiles

// RUN: %FileCheck --check-prefixes=CHECK,CHECK-5 %s < %t/MultiFiles.swiftinterface
// RUN: %FileCheck --check-prefixes=CHECK,CHECK-5 %s < %t/MultiFiles.private.swiftinterface
// RUN: %FileCheck --check-prefixes=CHECK-5-MUL %s < %t/MultiFiles.swiftinterface
// RUN: %FileCheck --check-prefixes=CHECK-5-MUL-PRV %s < %t/MultiFiles.private.swiftinterface
// RUN: %FileCheck --check-prefixes=CHECK-5-MUL-PKG %s < %t/MultiFiles.package.swiftinterface

/// Swift 6 mode.
// RUN: %target-swift-frontend -typecheck %t/Client.swift -I %t \
// RUN: -package-name TestPackage -module-name Client_Swift6 \
// RUN: -enable-library-evolution -swift-version 6 \
// RUN: -emit-module-interface-path %t/Client_Swift6.swiftinterface \
// RUN: -emit-private-module-interface-path %t/Client_Swift6.private.swiftinterface
// RUN: -emit-private-module-interface-path %t/Client_Swift6.private.swiftinterface \
// RUN: -emit-package-module-interface-path %t/Client_Swift6.package.swiftinterface

// RUN: %target-swift-typecheck-module-from-interface(%t/Client_Swift6.swiftinterface) -I %t
// RUN: %target-swift-typecheck-module-from-interface(%t/Client_Swift6.private.swiftinterface) -I %t \
// RUN: -module-name Client_Swift6
// RUN: %target-swift-typecheck-module-from-interface(%t/Client_Swift6.package.swiftinterface) -I %t \
// RUN: -module-name Client_Swift6

// RUN: %FileCheck %s --check-prefixes=CHECK,CHECK-6 < %t/Client_Swift6.swiftinterface
// RUN: %FileCheck %s --check-prefixes=CHECK,CHECK-6 < %t/Client_Swift6.private.swiftinterface
// RUN: %FileCheck %s --check-prefixes=CHECK-6-PKG < %t/Client_Swift6.package.swiftinterface

/// Feature flag.
// RUN: %target-swift-frontend -typecheck %t/Client.swift -I %t \
// RUN: -package-name TestPackage -module-name Client_FeatureFlag \
// RUN: -enable-library-evolution -swift-version 5 \
// RUN: -emit-module-interface-path %t/Client_FeatureFlag.swiftinterface \
// RUN: -emit-private-module-interface-path %t/Client_FeatureFlag.private.swiftinterface \
// RUN: -emit-package-module-interface-path %t/Client_FeatureFlag.package.swiftinterface \
// RUN: -enable-upcoming-feature InternalImportsByDefault

// RUN: %target-swift-typecheck-module-from-interface(%t/Client_FeatureFlag.swiftinterface) -I %t
// RUN: %target-swift-typecheck-module-from-interface(%t/Client_FeatureFlag.private.swiftinterface) -I %t \
// RUN: -module-name Client_FeatureFlag
// RUN: %target-swift-typecheck-module-from-interface(%t/Client_FeatureFlag.package.swiftinterface) -I %t \
// RUN: -module-name Client_FeatureFlag

// RUN: %FileCheck %s --check-prefixes=CHECK,CHECK-6,CHECK-FLAG < %t/Client_FeatureFlag.swiftinterface
// RUN: %FileCheck %s --check-prefixes=CHECK,CHECK-6,CHECK-FLAG < %t/Client_FeatureFlag.private.swiftinterface
// RUN: %FileCheck %s --check-prefixes=CHECK-6-PKG,CHECK-FLAG < %t/Client_FeatureFlag.package.swiftinterface

/// Build a client with multiple files.
// RUN: %target-swift-frontend -typecheck %t/MultiFiles?.swift -I %t \
// RUN: -package-name TestPackage -module-name MultiFiles_Swift6 \
// RUN: -experimental-spi-only-imports -experimental-spi-imports \
// RUN: -enable-library-evolution -swift-version 6 \
// RUN: -emit-module-interface-path %t/MultiFiles_Swift6.swiftinterface \
// RUN: -emit-private-module-interface-path %t/MultiFiles_Swift6.private.swiftinterface \
// RUN: -emit-package-module-interface-path %t/MultiFiles_Swift6.package.swiftinterface

// RUN: %target-swift-typecheck-module-from-interface(%t/MultiFiles_Swift6.swiftinterface) -I %t
// RUN: %target-swift-typecheck-module-from-interface(%t/MultiFiles_Swift6.private.swiftinterface) -I %t \
// RUN: -module-name MultiFiles_Swift6
// RUN: %target-swift-typecheck-module-from-interface(%t/MultiFiles_Swift6.package.swiftinterface) -I %t \
// RUN: -module-name MultiFiles_Swift6

// RUN: %FileCheck --check-prefixes=CHECK-6-MUL %s < %t/MultiFiles_Swift6.swiftinterface
// RUN: %FileCheck --check-prefixes=CHECK-6-MUL-PRV %s < %t/MultiFiles_Swift6.private.swiftinterface
// RUN: %FileCheck --check-prefixes=CHECK-6-MUL-PKG %s < %t/MultiFiles_Swift6.package.swiftinterface

//--- PublicLib.swift
//--- PackageLib.swift
//--- InternalLib.swift
//--- FileprivateLib.swift
//--- PrivateLib.swift
//--- LibX.swift
//--- LibY.swift
//--- LibZ.swift
//--- LibS.swift
//--- LibT.swift
//--- LibU.swift
//--- LibV.swift

//--- Client.swift

// CHECK-5-NOT: public
// CHECK-5-PKG: package import PackageLib
// CHECK-5-PKG: import PublicLib

// CHECK-FLAG: -enable-upcoming-feature InternalImportsByDefault
// CHECK-6: public
// CHECK-6-PKG: package import PackageLib
// CHECK-6-PKG: public import PublicLib

public import PublicLib
// CHECK: PublicLib
Expand All @@ -101,9 +164,74 @@ private import PrivateLib
// CHECK-NOT: PrivateLib

//--- MultiFilesA.swift

public import PublicLib
package import PackageLib
private import InternalLib
public import LibX
@_exported public import LibY
internal import LibZ
@_spiOnly public import LibS
@_spiOnly public import LibT
@_spi(Lib) public import LibU
@_spi(Lib) public import LibV

//--- MultiFilesB.swift

internal import PublicLib
internal import PackageLib
internal import InternalLib
package import LibX
package import LibY
fileprivate import LibZ
package import LibS
internal import LibT
package import LibU
internal import LibV

// CHECK-5-MUL-NOT: public
// CHECK-5-MUL: import LibU
// CHECK-5-MUL: import LibV
// CHECK-5-MUL: import LibX
// CHECK-5-MUL: @_exported import LibY
// CHECK-5-MUL: import PublicLib

// CHECK-6-MUL: public import LibU
// CHECK-6-MUL: public import LibV
// CHECK-6-MUL: public import LibX
// CHECK-6-MUL: @_exported public import LibY
// CHECK-6-MUL: public import PublicLib

// CHECK-5-MUL-PKG: @_spiOnly import LibS
// CHECK-5-MUL-PKG: @_spiOnly import LibT
// CHECK-5-MUL-PKG: @_spi(Lib) import LibU
// CHECK-5-MUL-PKG: @_spi(Lib) import LibV
// CHECK-5-MUL-PKG: import LibX
// CHECK-5-MUL-PKG: @_exported import LibY
// CHECK-5-MUL-PKG: package import PackageLib
// CHECK-5-MUL-PKG: import PublicLib

// CHECK-6-MUL-PKG: @_spiOnly public import LibS
// CHECK-6-MUL-PKG: @_spiOnly public import LibT
// CHECK-6-MUL-PKG: @_spi(Lib) public import LibU
// CHECK-6-MUL-PKG: @_spi(Lib) public import LibV
// CHECK-6-MUL-PKG: public import LibX
// CHECK-6-MUL-PKG: @_exported public import LibY
// CHECK-6-MUL-PKG: package import PackageLib
// CHECK-6-MUL-PKG: public import PublicLib

// CHECK-5-MUL-PRV: @_spiOnly import LibS
// CHECK-5-MUL-PRV: @_spiOnly import LibT
// CHECK-5-MUL-PRV: @_spi(Lib) import LibU
// CHECK-5-MUL-PRV: @_spi(Lib) import LibV
// CHECK-5-MUL-PRV: import LibX
// CHECK-5-MUL-PRV: @_exported import LibY
// CHECK-5-MUL-PRV: import PublicLib

// CHECK-6-MUL-PRV: @_spiOnly public import LibS
// CHECK-6-MUL-PRV: @_spiOnly public import LibT
// CHECK-6-MUL-PRV: @_spi(Lib) public import LibU
// CHECK-6-MUL-PRV: @_spi(Lib) public import LibV
// CHECK-6-MUL-PRV: public import LibX
// CHECK-6-MUL-PRV: @_exported public import LibY
// CHECK-6-MUL-PRV: public import PublicLib