Skip to content

Commit e9cab7a

Browse files
committed
Fixes package import stmt missing from .package.swiftinterface.
Resolves rdar://124309585
1 parent d3ed4a4 commit e9cab7a

File tree

2 files changed

+161
-11
lines changed

2 files changed

+161
-11
lines changed

lib/Frontend/ModuleInterfaceSupport.cpp

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,22 @@ static void printImports(raw_ostream &out,
242242
ModuleDecl::ImportFilterKind::Exported,
243243
ModuleDecl::ImportFilterKind::Default};
244244

245+
// Default filter kind is public, which also includes `@_spi(name) public import`.
246+
// Used to determine whether to override `package import` below.
247+
llvm::SmallSet<ImportedModule, 8, ImportedModule::Order> publicImportSet;
248+
SmallVector<ImportedModule, 8> publicImports;
249+
M->getImportedModules(publicImports, allImportFilter);
250+
publicImportSet.insert(publicImports.begin(), publicImports.end());
251+
252+
// Used to gather `package import` modules.
253+
llvm::SmallSet<ImportedModule, 8, ImportedModule::Order> packageOnlyImportSet;
254+
if (Opts.printPackageInterface()) {
255+
SmallVector<ImportedModule, 8> packageOnlyImports;
256+
M->getImportedModules(packageOnlyImports, ModuleDecl::ImportFilterKind::PackageOnly);
257+
packageOnlyImportSet.insert(packageOnlyImports.begin(), packageOnlyImports.end());
258+
allImportFilter |= ModuleDecl::ImportFilterKind::PackageOnly;
259+
}
260+
245261
// With -experimental-spi-imports:
246262
// When printing the private or package swiftinterface file, print implementation-only
247263
// imports only if they are also SPI. First, list all implementation-only imports and
@@ -297,10 +313,10 @@ static void printImports(raw_ostream &out,
297313

298314
// Collect the public imports as a subset so that we can mark them with
299315
// '@_exported'.
300-
SmallVector<ImportedModule, 8> publicImports;
301-
M->getImportedModules(publicImports, ModuleDecl::ImportFilterKind::Exported);
302-
llvm::SmallSet<ImportedModule, 8, ImportedModule::Order> publicImportSet;
303-
publicImportSet.insert(publicImports.begin(), publicImports.end());
316+
SmallVector<ImportedModule, 8> exportedImports;
317+
M->getImportedModules(exportedImports, ModuleDecl::ImportFilterKind::Exported);
318+
llvm::SmallSet<ImportedModule, 8, ImportedModule::Order> exportedImportSet;
319+
exportedImportSet.insert(exportedImports.begin(), exportedImports.end());
304320

305321
for (auto import : allImports) {
306322
auto importedModule = import.importedModule;
@@ -332,7 +348,7 @@ static void printImports(raw_ostream &out,
332348
out << "@_implementationOnly ";
333349
}
334350

335-
if (publicImportSet.count(import))
351+
if (exportedImportSet.count(import))
336352
out << "@_exported ";
337353

338354
if (!Opts.printPublicInterface()) {
@@ -351,7 +367,11 @@ static void printImports(raw_ostream &out,
351367
out << "@_spi(" << spiName << ") ";
352368
}
353369

354-
if (ctx.LangOpts.hasFeature(Feature::InternalImportsByDefault)) {
370+
if (Opts.printPackageInterface() &&
371+
!publicImportSet.count(import) &&
372+
packageOnlyImportSet.count(import))
373+
out << "package ";
374+
else if (ctx.LangOpts.hasFeature(Feature::InternalImportsByDefault)) {
355375
out << "public ";
356376
}
357377

test/ModuleInterface/access-level-import-swiftinterfaces.swift

Lines changed: 135 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,74 +16,137 @@
1616
// RUN: -swift-version 5 -enable-library-evolution
1717
// RUN: %target-swift-frontend -emit-module %t/PrivateLib.swift -o %t \
1818
// RUN: -swift-version 5 -enable-library-evolution
19+
// RUN: %target-swift-frontend -emit-module %t/LibX.swift -o %t \
20+
// RUN: -swift-version 5 -enable-library-evolution
21+
// RUN: %target-swift-frontend -emit-module %t/LibY.swift -o %t \
22+
// RUN: -swift-version 5 -enable-library-evolution
23+
// RUN: %target-swift-frontend -emit-module %t/LibZ.swift -o %t \
24+
// RUN: -swift-version 5 -enable-library-evolution
25+
// RUN: %target-swift-frontend -emit-module %t/LibS.swift -o %t \
26+
// RUN: -swift-version 5 -enable-library-evolution
27+
// RUN: %target-swift-frontend -emit-module %t/LibT.swift -o %t \
28+
// RUN: -swift-version 5 -enable-library-evolution
29+
// RUN: %target-swift-frontend -emit-module %t/LibU.swift -o %t \
30+
// RUN: -swift-version 5 -enable-library-evolution
31+
// RUN: %target-swift-frontend -emit-module %t/LibV.swift -o %t \
32+
// RUN: -swift-version 5 -enable-library-evolution
1933

2034
/// Build client and generate swiftinterfaces.
2135
// RUN: %target-swift-frontend -typecheck %t/Client.swift -I %t \
2236
// RUN: -package-name TestPackage \
2337
// RUN: -enable-library-evolution -swift-version 5 \
2438
// RUN: -emit-module-interface-path %t/Client.swiftinterface \
25-
// RUN: -emit-private-module-interface-path %t/Client.private.swiftinterface
39+
// RUN: -emit-private-module-interface-path %t/Client.private.swiftinterface \
40+
// RUN: -emit-package-module-interface-path %t/Client.package.swiftinterface
2641

2742
// RUN: %target-swift-typecheck-module-from-interface(%t/Client.swiftinterface) -I %t
2843
// RUN: %target-swift-typecheck-module-from-interface(%t/Client.private.swiftinterface) -I %t \
2944
// RUN: -module-name Client
45+
// RUN: %target-swift-typecheck-module-from-interface(%t/Client.package.swiftinterface) -I %t \
46+
// RUN: -module-name Client
3047

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

3452
/// Build a client composed of many files.
3553
// RUN: %target-swift-frontend -typecheck %t/MultiFiles?.swift -I %t \
3654
// RUN: -package-name TestPackage \
55+
// RUN: -experimental-spi-only-imports \
3756
// RUN: -enable-library-evolution -swift-version 5 \
3857
// RUN: -emit-module-interface-path %t/MultiFiles.swiftinterface \
39-
// RUN: -emit-private-module-interface-path %t/MultiFiles.private.swiftinterface
58+
// RUN: -emit-private-module-interface-path %t/MultiFiles.private.swiftinterface \
59+
// RUN: -emit-package-module-interface-path %t/MultiFiles.package.swiftinterface
4060

4161
// RUN: %target-swift-typecheck-module-from-interface(%t/MultiFiles.swiftinterface) -I %t
4262
// RUN: %target-swift-typecheck-module-from-interface(%t/MultiFiles.private.swiftinterface) -I %t \
4363
// RUN: -module-name MultiFiles
64+
// RUN: %target-swift-typecheck-module-from-interface(%t/MultiFiles.package.swiftinterface) -I %t \
65+
// RUN: -module-name MultiFiles
4466

45-
// RUN: %FileCheck --check-prefixes=CHECK,CHECK-5 %s < %t/MultiFiles.swiftinterface
46-
// RUN: %FileCheck --check-prefixes=CHECK,CHECK-5 %s < %t/MultiFiles.private.swiftinterface
67+
// RUN: %FileCheck --check-prefixes=CHECK-5-MUL %s < %t/MultiFiles.swiftinterface
68+
// RUN: %FileCheck --check-prefixes=CHECK-5-MUL-PRV %s < %t/MultiFiles.private.swiftinterface
69+
// RUN: %FileCheck --check-prefixes=CHECK-5-MUL-PKG %s < %t/MultiFiles.package.swiftinterface
4770

4871
/// Swift 6 mode.
4972
// RUN: %target-swift-frontend -typecheck %t/Client.swift -I %t \
5073
// RUN: -package-name TestPackage -module-name Client_Swift6 \
5174
// RUN: -enable-library-evolution -swift-version 6 \
5275
// RUN: -emit-module-interface-path %t/Client_Swift6.swiftinterface \
53-
// RUN: -emit-private-module-interface-path %t/Client_Swift6.private.swiftinterface
76+
// RUN: -emit-private-module-interface-path %t/Client_Swift6.private.swiftinterface \
77+
// RUN: -emit-package-module-interface-path %t/Client_Swift6.package.swiftinterface
5478

5579
// RUN: %target-swift-typecheck-module-from-interface(%t/Client_Swift6.swiftinterface) -I %t
5680
// RUN: %target-swift-typecheck-module-from-interface(%t/Client_Swift6.private.swiftinterface) -I %t \
5781
// RUN: -module-name Client_Swift6
82+
// RUN: %target-swift-typecheck-module-from-interface(%t/Client_Swift6.package.swiftinterface) -I %t \
83+
// RUN: -module-name Client_Swift6
5884

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

6289
/// Feature flag.
6390
// RUN: %target-swift-frontend -typecheck %t/Client.swift -I %t \
6491
// RUN: -package-name TestPackage -module-name Client_FeatureFlag \
6592
// RUN: -enable-library-evolution -swift-version 5 \
6693
// RUN: -emit-module-interface-path %t/Client_FeatureFlag.swiftinterface \
6794
// RUN: -emit-private-module-interface-path %t/Client_FeatureFlag.private.swiftinterface \
95+
// RUN: -emit-package-module-interface-path %t/Client_FeatureFlag.package.swiftinterface \
6896
// RUN: -enable-upcoming-feature InternalImportsByDefault
6997

7098
// RUN: %target-swift-typecheck-module-from-interface(%t/Client_FeatureFlag.swiftinterface) -I %t
7199
// RUN: %target-swift-typecheck-module-from-interface(%t/Client_FeatureFlag.private.swiftinterface) -I %t \
72100
// RUN: -module-name Client_FeatureFlag
101+
// RUN: %target-swift-typecheck-module-from-interface(%t/Client_FeatureFlag.package.swiftinterface) -I %t \
102+
// RUN: -module-name Client_FeatureFlag
73103

74104
// RUN: %FileCheck %s --check-prefixes=CHECK,CHECK-6,CHECK-FLAG < %t/Client_FeatureFlag.swiftinterface
75105
// RUN: %FileCheck %s --check-prefixes=CHECK,CHECK-6,CHECK-FLAG < %t/Client_FeatureFlag.private.swiftinterface
106+
// RUN: %FileCheck %s --check-prefixes=CHECK-6-PKG,CHECK-FLAG < %t/Client_FeatureFlag.package.swiftinterface
107+
108+
/// Build a client with multiple files.
109+
// RUN: %target-swift-frontend -typecheck %t/MultiFiles?.swift -I %t \
110+
// RUN: -package-name TestPackage -module-name MultiFiles_Swift6 \
111+
// RUN: -experimental-spi-only-imports -experimental-spi-imports \
112+
// RUN: -enable-library-evolution -swift-version 6 \
113+
// RUN: -emit-module-interface-path %t/MultiFiles_Swift6.swiftinterface \
114+
// RUN: -emit-private-module-interface-path %t/MultiFiles_Swift6.private.swiftinterface \
115+
// RUN: -emit-package-module-interface-path %t/MultiFiles_Swift6.package.swiftinterface
116+
117+
// RUN: %target-swift-typecheck-module-from-interface(%t/MultiFiles_Swift6.swiftinterface) -I %t
118+
// RUN: %target-swift-typecheck-module-from-interface(%t/MultiFiles_Swift6.private.swiftinterface) -I %t \
119+
// RUN: -module-name MultiFiles_Swift6
120+
// RUN: %target-swift-typecheck-module-from-interface(%t/MultiFiles_Swift6.package.swiftinterface) -I %t \
121+
// RUN: -module-name MultiFiles_Swift6
122+
123+
// RUN: %FileCheck --check-prefixes=CHECK-6-MUL %s < %t/MultiFiles_Swift6.swiftinterface
124+
// RUN: %FileCheck --check-prefixes=CHECK-6-MUL-PRV %s < %t/MultiFiles_Swift6.private.swiftinterface
125+
// RUN: %FileCheck --check-prefixes=CHECK-6-MUL-PKG %s < %t/MultiFiles_Swift6.package.swiftinterface
76126

77127
//--- PublicLib.swift
78128
//--- PackageLib.swift
79129
//--- InternalLib.swift
80130
//--- FileprivateLib.swift
81131
//--- PrivateLib.swift
132+
//--- LibX.swift
133+
//--- LibY.swift
134+
//--- LibZ.swift
135+
//--- LibS.swift
136+
//--- LibT.swift
137+
//--- LibU.swift
138+
//--- LibV.swift
82139

83140
//--- Client.swift
141+
84142
// CHECK-5-NOT: public
143+
// CHECK-5-PKG: package import PackageLib
144+
// CHECK-5-PKG: import PublicLib
145+
85146
// CHECK-FLAG: -enable-upcoming-feature InternalImportsByDefault
86147
// CHECK-6: public
148+
// CHECK-6-PKG: package import PackageLib
149+
// CHECK-6-PKG: public import PublicLib
87150

88151
public import PublicLib
89152
// CHECK: PublicLib
@@ -101,9 +164,76 @@ private import PrivateLib
101164
// CHECK-NOT: PrivateLib
102165

103166
//--- MultiFilesA.swift
167+
104168
public import PublicLib
169+
package import PackageLib
105170
private import InternalLib
171+
public import LibX
172+
@_exported public import LibY
173+
@_implementationOnly @_spi(Lib) import LibZ
174+
@_spiOnly public import LibS
175+
@_spiOnly public import LibT
176+
@_spi(Lib) public import LibU
177+
@_spi(Lib) public import LibV
106178

107179
//--- MultiFilesB.swift
180+
108181
internal import PublicLib
182+
internal import PackageLib
109183
internal import InternalLib
184+
package import LibX
185+
package import LibY
186+
@_implementationOnly import LibZ
187+
package import LibS
188+
internal import LibT
189+
package import LibU
190+
internal import LibV
191+
192+
// CHECK-5-MUL-NOT: public
193+
// CHECK-5-MUL: import LibU
194+
// CHECK-5-MUL: import LibV
195+
// CHECK-5-MUL: import LibX
196+
// CHECK-5-MUL: @_exported import LibY
197+
// CHECK-5-MUL: import PublicLib
198+
199+
// CHECK-6-MUL: public import LibU
200+
// CHECK-6-MUL: public import LibV
201+
// CHECK-6-MUL: public import LibX
202+
// CHECK-6-MUL: @_exported public import LibY
203+
// CHECK-6-MUL: public import PublicLib
204+
205+
// CHECK-5-MUL-PKG: package import LibS
206+
// CHECK-5-MUL-PKG: @_spiOnly import LibT
207+
// CHECK-5-MUL-PKG: @_spi(Lib) import LibU
208+
// CHECK-5-MUL-PKG: @_spi(Lib) import LibV
209+
// CHECK-5-MUL-PKG: import LibX
210+
// CHECK-5-MUL-PKG: @_exported import LibY
211+
// CHECK-5-MUL-PKG: package import PackageLib
212+
// CHECK-5-MUL-PKG: import PublicLib
213+
214+
// CHECK-6-MUL-PKG: package import LibS
215+
// CHECK-6-MUL-PKG: @_spiOnly public import LibT
216+
// CHECK-6-MUL-PKG: @_spi(Lib) public import LibU
217+
// CHECK-6-MUL-PKG: @_spi(Lib) public import LibV
218+
// CHECK-6-MUL-PKG: public import LibX
219+
// CHECK-6-MUL-PKG: @_exported public import LibY
220+
// CHECK-6-MUL-PKG: @_implementationOnly @_spi(Lib) public import LibZ
221+
// CHECK-6-MUL-PKG: package import PackageLib
222+
// CHECK-6-MUL-PKG: public import PublicLib
223+
224+
// CHECK-5-MUL-PRV: @_spiOnly import LibS
225+
// CHECK-5-MUL-PRV: @_spiOnly import LibT
226+
// CHECK-5-MUL-PRV: @_spi(Lib) import LibU
227+
// CHECK-5-MUL-PRV: @_spi(Lib) import LibV
228+
// CHECK-5-MUL-PRV: import LibX
229+
// CHECK-5-MUL-PRV: @_exported import LibY
230+
// CHECK-5-MUL-PRV: import PublicLib
231+
232+
// CHECK-6-MUL-PRV: @_spiOnly public import LibS
233+
// CHECK-6-MUL-PRV: @_spiOnly public import LibT
234+
// CHECK-6-MUL-PRV: @_spi(Lib) public import LibU
235+
// CHECK-6-MUL-PRV: @_spi(Lib) public import LibV
236+
// CHECK-6-MUL-PRV: public import LibX
237+
// CHECK-6-MUL-PRV: @_exported public import LibY
238+
// CHECK-6-MUL-PRV: @_implementationOnly @_spi(Lib) public import LibZ
239+
// CHECK-6-MUL-PRV: public import PublicLib

0 commit comments

Comments
 (0)