Skip to content

Commit 563386b

Browse files
committed
[NFC] Eliminate ImplicitImport
Instead, we will use AttributedImport<ImportedModule>, a common currency type which supports a superset of ImplicitImport’s current behavior.
1 parent d55c5bd commit 563386b

File tree

3 files changed

+64
-32
lines changed

3 files changed

+64
-32
lines changed

include/swift/AST/Import.h

Lines changed: 12 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -532,26 +532,21 @@ struct AttributedImport {
532532
options.contains(ImportFlags::ImplementationOnly)) ||
533533
options.contains(ImportFlags::Reserved));
534534
}
535-
};
536-
537-
// MARK: - Implicit imports
538-
539-
/// A module which has been implicitly imported.
540-
struct ImplicitImport {
541-
ModuleDecl *Module;
542-
ImportOptions Options;
543535

544-
ImplicitImport(ModuleDecl *module, ImportOptions opts = {})
545-
: Module(module), Options(opts) {}
546-
547-
friend bool operator==(const ImplicitImport &lhs,
548-
const ImplicitImport &rhs) {
549-
return lhs.Module == rhs.Module &&
550-
lhs.Options.toRaw() == rhs.Options.toRaw();
536+
friend bool operator==(const AttributedImport<ModuleInfo> &lhs,
537+
const AttributedImport<ModuleInfo> &rhs) {
538+
return lhs.module == rhs.module &&
539+
lhs.options.toRaw() == rhs.options.toRaw() &&
540+
lhs.sourceFileArg == rhs.sourceFileArg &&
541+
lhs.spiGroups == rhs.spiGroups;
551542
}
552543
};
553544

554-
void simple_display(llvm::raw_ostream &out, const ImplicitImport &import);
545+
/// A module which has been implicitly imported.
546+
void simple_display(llvm::raw_ostream &out,
547+
const AttributedImport<ImportedModule> &import);
548+
549+
// MARK: - Implicit imports
555550

556551
/// The kind of stdlib that should be imported.
557552
enum class ImplicitStdlibKind {
@@ -592,7 +587,7 @@ struct ImplicitImportInfo {
592587

593588
/// Contains names of and pointers to modules that must be implicitly imported.
594589
struct ImplicitImportList {
595-
ArrayRef<ImplicitImport> imports;
590+
ArrayRef<AttributedImport<ImportedModule>> imports;
596591

597592
friend bool operator==(const ImplicitImportList &lhs,
598593
const ImplicitImportList &rhs) {

lib/AST/TypeCheckRequests.cpp

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1392,9 +1392,37 @@ TypeCheckFunctionBodyRequest::readDependencySource(
13921392
//----------------------------------------------------------------------------//
13931393

13941394
void swift::simple_display(llvm::raw_ostream &out,
1395-
const ImplicitImport &import) {
1396-
out << "implicit import of ";
1397-
simple_display(out, import.Module);
1395+
const AttributedImport<ImportedModule> &import) {
1396+
out << "import of ";
1397+
1398+
if (!import.module.accessPath.empty()) {
1399+
simple_display(out, import.module.accessPath.front().Item);
1400+
out << " in ";
1401+
}
1402+
1403+
simple_display(out, import.module.importedModule);
1404+
1405+
out << " [";
1406+
if (import.options.contains(ImportFlags::Exported))
1407+
out << " exported";
1408+
if (import.options.contains(ImportFlags::Testable))
1409+
out << " testable";
1410+
if (import.options.contains(ImportFlags::ImplementationOnly))
1411+
out << " implementation-only";
1412+
if (import.options.contains(ImportFlags::PrivateImport))
1413+
out << " private(" << import.sourceFileArg << ")";
1414+
1415+
if (import.options.contains(ImportFlags::SPIAccessControl)) {
1416+
out << " spi(";
1417+
llvm::interleave(import.spiGroups,
1418+
[&out](Identifier name) {
1419+
simple_display(out, name);
1420+
},
1421+
[&out]() { out << " "; });
1422+
out << ")";
1423+
}
1424+
1425+
out << " ]";
13981426
}
13991427

14001428
void swift::simple_display(llvm::raw_ostream &out,

lib/Sema/ImportResolution.cpp

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -395,26 +395,32 @@ UnboundImport::getTopLevelModule(ModuleDecl *M, SourceFile &SF) {
395395
ImplicitImportList
396396
ModuleImplicitImportsRequest::evaluate(Evaluator &evaluator,
397397
ModuleDecl *module) const {
398-
SmallVector<ImplicitImport, 4> imports;
398+
SmallVector<AttributedImport<ImportedModule>, 4> imports;
399399

400400
auto &ctx = module->getASTContext();
401401
auto &importInfo = module->getImplicitImportInfo();
402402

403403
// Add an implicit stdlib if needed.
404+
ModuleDecl *stdlib;
404405
switch (importInfo.StdlibKind) {
405406
case ImplicitStdlibKind::None:
407+
stdlib = nullptr;
406408
break;
407409
case ImplicitStdlibKind::Builtin:
408-
imports.emplace_back(ctx.TheBuiltinModule);
410+
stdlib = ctx.TheBuiltinModule;
409411
break;
410412
case ImplicitStdlibKind::Stdlib: {
411-
auto *stdlib = ctx.getStdlibModule(/*loadIfAbsent*/ true);
413+
stdlib = ctx.getStdlibModule(/*loadIfAbsent*/ true);
412414
assert(stdlib && "Missing stdlib?");
413-
imports.emplace_back(stdlib);
414415
break;
415416
}
416417
}
417418

419+
if (stdlib) {
420+
ImportedModule import(ImportPath::Access(), stdlib);
421+
imports.emplace_back(import, ImportOptions());
422+
}
423+
418424
// Add any modules we were asked to implicitly import.
419425
for (auto moduleName : importInfo.ModuleNames) {
420426
auto *importModule = ctx.getModuleByIdentifier(moduleName);
@@ -427,13 +433,15 @@ ModuleImplicitImportsRequest::evaluate(Evaluator &evaluator,
427433
}
428434
continue;
429435
}
430-
imports.emplace_back(importModule);
436+
ImportedModule import(ImportPath::Access(), importModule);
437+
imports.emplace_back(import, ImportOptions());
431438
}
432439

433440
// Add any pre-loaded modules.
434441
for (auto &module : importInfo.AdditionalModules) {
435-
imports.emplace_back(module.first, module.second ? ImportFlags::Exported
436-
: ImportOptions());
442+
ImportedModule import(ImportPath::Access(), module.first);
443+
imports.emplace_back(import, module.second ? ImportFlags::Exported
444+
: ImportOptions());
437445
}
438446

439447
auto *clangImporter =
@@ -445,15 +453,17 @@ ModuleImplicitImportsRequest::evaluate(Evaluator &evaluator,
445453
!clangImporter->importBridgingHeader(bridgingHeaderPath, module)) {
446454
auto *headerModule = clangImporter->getImportedHeaderModule();
447455
assert(headerModule && "Didn't load bridging header?");
448-
imports.emplace_back(headerModule, ImportFlags::Exported);
456+
ImportedModule import(ImportPath::Access(), headerModule);
457+
imports.emplace_back(import, ImportFlags::Exported);
449458
}
450459

451460
// Implicitly import the underlying Clang half of this module if needed.
452461
if (importInfo.ShouldImportUnderlyingModule) {
453462
auto *underlyingMod = clangImporter->loadModule(
454463
SourceLoc(), ImportPath::Module::Builder(module->getName()).get());
455464
if (underlyingMod) {
456-
imports.emplace_back(underlyingMod, ImportFlags::Exported);
465+
ImportedModule import(ImportPath::Access(), underlyingMod);
466+
imports.emplace_back(import, ImportFlags::Exported);
457467
} else {
458468
ctx.Diags.diagnose(SourceLoc(), diag::error_underlying_module_not_found,
459469
module->getName());
@@ -469,9 +479,8 @@ void ImportResolver::addImplicitImports() {
469479
// TODO: Support cross-module imports.
470480
for (auto &import : implicitImports.imports) {
471481
assert(!(SF.Kind == SourceFileKind::SIL &&
472-
import.Module->isStdlibModule()));
473-
ImportedModule importedMod{ImportPath::Access(), import.Module};
474-
boundImports.emplace_back(importedMod, import.Options);
482+
import.module.importedModule->isStdlibModule()));
483+
boundImports.push_back(import);
475484
}
476485
}
477486

0 commit comments

Comments
 (0)