@@ -270,6 +270,15 @@ static void printImports(raw_ostream &out,
270
270
ModuleDecl::ImportFilterKind::Default,
271
271
ModuleDecl::ImportFilterKind::ShadowedByCrossImportOverlay};
272
272
273
+ using ImportSet = llvm::SmallSet<ImportedModule, 8 , ImportedModule::Order>;
274
+ auto getImports = [M](ModuleDecl::ImportFilter filter) -> ImportSet {
275
+ SmallVector<ImportedModule, 8 > matchingImports;
276
+ M->getImportedModules (matchingImports, filter);
277
+ ImportSet importSet;
278
+ importSet.insert (matchingImports.begin (), matchingImports.end ());
279
+ return importSet;
280
+ };
281
+
273
282
// With -experimental-spi-imports:
274
283
// When printing the private or package swiftinterface file, print implementation-only
275
284
// imports only if they are also SPI. First, list all implementation-only imports and
@@ -282,10 +291,7 @@ static void printImports(raw_ostream &out,
282
291
ModuleDecl::ImportFilterKind::ImplementationOnly);
283
292
284
293
// Only consider modules imported consistently as implementation-only.
285
- M->getImportedModules (allImports,
286
- allImportFilter);
287
- llvm::SmallSet<ImportedModule, 8 , ImportedModule::Order> allImportSet;
288
- allImportSet.insert (allImports.begin (), allImports.end ());
294
+ ImportSet allImportSet = getImports (allImportFilter);
289
295
290
296
for (auto import : ioiImports)
291
297
if (allImportSet.count (import ) == 0 )
@@ -295,16 +301,13 @@ static void printImports(raw_ostream &out,
295
301
}
296
302
297
303
// / Collect @_spiOnly imports that are not imported elsewhere publicly.
298
- llvm::SmallSet<ImportedModule, 4 , ImportedModule::Order> spiOnlyImportSet;
304
+ ImportSet spiOnlyImportSet;
299
305
if (!Opts.printPublicInterface ()) {
300
306
SmallVector<ImportedModule, 4 > spiOnlyImports, otherImports;
301
307
M->getImportedModules (spiOnlyImports,
302
308
ModuleDecl::ImportFilterKind::SPIOnly);
303
309
304
- M->getImportedModules (otherImports,
305
- allImportFilter);
306
- llvm::SmallSet<ImportedModule, 8 , ImportedModule::Order> otherImportsSet;
307
- otherImportsSet.insert (otherImports.begin (), otherImports.end ());
310
+ ImportSet otherImportsSet = getImports (allImportFilter);
308
311
309
312
// Rule out inconsistent imports.
310
313
for (auto import : spiOnlyImports)
@@ -316,25 +319,19 @@ static void printImports(raw_ostream &out,
316
319
317
320
// Collect the public imports as a subset so that we can mark them with
318
321
// '@_exported'.
319
- SmallVector<ImportedModule, 8 > exportedImports;
320
- M->getImportedModules (exportedImports, ModuleDecl::ImportFilterKind::Exported);
321
- llvm::SmallSet<ImportedModule, 8 , ImportedModule::Order> exportedImportSet;
322
- exportedImportSet.insert (exportedImports.begin (), exportedImports.end ());
322
+ ImportSet exportedImportSet =
323
+ getImports (ModuleDecl::ImportFilterKind::Exported);
323
324
324
325
// All of the above are considered `public` including `@_spiOnly public import`
325
326
// and `@_spi(name) public import`, and should override `package import`.
326
327
// Track the `public` imports here to determine whether to override.
327
- llvm::SmallSet<ImportedModule, 8 , ImportedModule::Order> publicImportSet;
328
- SmallVector<ImportedModule, 8 > publicImports;
329
- M->getImportedModules (publicImports, allImportFilter);
330
- publicImportSet.insert (publicImports.begin (), publicImports.end ());
328
+ ImportSet publicImportSet = getImports (allImportFilter);
331
329
332
330
// Used to determine whether `package import` should be overriden below.
333
- llvm::SmallSet<ImportedModule, 8 , ImportedModule::Order> packageOnlyImportSet;
331
+ ImportSet packageOnlyImportSet;
334
332
if (Opts.printPackageInterface ()) {
335
- SmallVector<ImportedModule, 8 > packageOnlyImports;
336
- M->getImportedModules (packageOnlyImports, ModuleDecl::ImportFilterKind::PackageOnly);
337
- packageOnlyImportSet.insert (packageOnlyImports.begin (), packageOnlyImports.end ());
333
+ packageOnlyImportSet =
334
+ getImports (ModuleDecl::ImportFilterKind::PackageOnly);
338
335
allImportFilter |= ModuleDecl::ImportFilterKind::PackageOnly;
339
336
}
340
337
@@ -382,12 +379,6 @@ static void printImports(raw_ostream &out,
382
379
383
380
if (!Opts.printPublicInterface ()) {
384
381
// An import visible in the private or package swiftinterface only.
385
- //
386
- // In the long term, we want to print this attribute for consistency and
387
- // to enforce exportability analysis of generated code.
388
- // For now, not printing the attribute allows us to have backwards
389
- // compatible swiftinterfaces and we can live without
390
- // checking the generate code for a while.
391
382
if (spiOnlyImportSet.count (import ))
392
383
out << " @_spiOnly " ;
393
384
0 commit comments