Skip to content

Commit 378884e

Browse files
authored
Merge pull request #72282 from apple/elsh/pkg-import-pkg-interface
Fixes package import stmt missing from .package.swiftinterface.
2 parents 131ca21 + 2d90423 commit 378884e

File tree

2 files changed

+163
-14
lines changed

2 files changed

+163
-14
lines changed

lib/Frontend/ModuleInterfaceSupport.cpp

Lines changed: 30 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,30 @@ static void printImports(raw_ostream &out,
286286
allImportFilter |= ModuleDecl::ImportFilterKind::SPIOnly;
287287
}
288288

289+
// Collect the public imports as a subset so that we can mark them with
290+
// '@_exported'.
291+
SmallVector<ImportedModule, 8> exportedImports;
292+
M->getImportedModules(exportedImports, ModuleDecl::ImportFilterKind::Exported);
293+
llvm::SmallSet<ImportedModule, 8, ImportedModule::Order> exportedImportSet;
294+
exportedImportSet.insert(exportedImports.begin(), exportedImports.end());
295+
296+
// All of the above are considered `public` including `@_spiOnly public import`
297+
// and `@_spi(name) public import`, and should override `package import`.
298+
// Track the `public` imports here to determine whether to override.
299+
llvm::SmallSet<ImportedModule, 8, ImportedModule::Order> publicImportSet;
300+
SmallVector<ImportedModule, 8> publicImports;
301+
M->getImportedModules(publicImports, allImportFilter);
302+
publicImportSet.insert(publicImports.begin(), publicImports.end());
303+
304+
// Used to determine whether `package import` should be overriden below.
305+
llvm::SmallSet<ImportedModule, 8, ImportedModule::Order> packageOnlyImportSet;
306+
if (Opts.printPackageInterface()) {
307+
SmallVector<ImportedModule, 8> packageOnlyImports;
308+
M->getImportedModules(packageOnlyImports, ModuleDecl::ImportFilterKind::PackageOnly);
309+
packageOnlyImportSet.insert(packageOnlyImports.begin(), packageOnlyImports.end());
310+
allImportFilter |= ModuleDecl::ImportFilterKind::PackageOnly;
311+
}
312+
289313
SmallVector<ImportedModule, 8> allImports;
290314
M->getImportedModules(allImports, allImportFilter);
291315

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

298-
// Collect the public imports as a subset so that we can mark them with
299-
// '@_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());
304-
305322
for (auto import : allImports) {
306323
auto importedModule = import.importedModule;
307324
if (importedModule->isOnoneSupportModule()) {
@@ -332,7 +349,7 @@ static void printImports(raw_ostream &out,
332349
out << "@_implementationOnly ";
333350
}
334351

335-
if (publicImportSet.count(import))
352+
if (exportedImportSet.count(import))
336353
out << "@_exported ";
337354

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

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

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

Lines changed: 133 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,74 @@ 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+
internal 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+
fileprivate 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: @_spiOnly 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: @_spiOnly public 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: package import PackageLib
221+
// CHECK-6-MUL-PKG: public import PublicLib
222+
223+
// CHECK-5-MUL-PRV: @_spiOnly import LibS
224+
// CHECK-5-MUL-PRV: @_spiOnly import LibT
225+
// CHECK-5-MUL-PRV: @_spi(Lib) import LibU
226+
// CHECK-5-MUL-PRV: @_spi(Lib) import LibV
227+
// CHECK-5-MUL-PRV: import LibX
228+
// CHECK-5-MUL-PRV: @_exported import LibY
229+
// CHECK-5-MUL-PRV: import PublicLib
230+
231+
// CHECK-6-MUL-PRV: @_spiOnly public import LibS
232+
// CHECK-6-MUL-PRV: @_spiOnly public import LibT
233+
// CHECK-6-MUL-PRV: @_spi(Lib) public import LibU
234+
// CHECK-6-MUL-PRV: @_spi(Lib) public import LibV
235+
// CHECK-6-MUL-PRV: public import LibX
236+
// CHECK-6-MUL-PRV: @_exported public import LibY
237+
// CHECK-6-MUL-PRV: public import PublicLib

0 commit comments

Comments
 (0)