Skip to content

Commit c13067a

Browse files
committed
[NFC] Rework ImplicitImportInfo::ModuleNames
Replace with an array of AttributedImport<UnloadedImportedModule> to add flexibility.
1 parent 563386b commit c13067a

File tree

6 files changed

+62
-52
lines changed

6 files changed

+62
-52
lines changed

include/swift/AST/Import.h

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -572,13 +572,14 @@ struct ImplicitImportInfo {
572572
/// The bridging header path for this module, empty if there is none.
573573
StringRef BridgingHeaderPath;
574574

575-
/// The names of additional modules to be implicitly imported.
576-
SmallVector<Identifier, 4> ModuleNames;
575+
/// The names of additional modules to be loaded and implicitly imported.
576+
SmallVector<AttributedImport<UnloadedImportedModule>, 4>
577+
AdditionalUnloadedImports;
577578

578579
/// An additional list of already-loaded modules which should be implicitly
579580
/// imported.
580-
SmallVector<std::pair<ModuleDecl *, /*exported*/ bool>, 4>
581-
AdditionalModules;
581+
SmallVector<AttributedImport<ImportedModule>, 4>
582+
AdditionalImports;
582583

583584
ImplicitImportInfo()
584585
: StdlibKind(ImplicitStdlibKind::None),

lib/Frontend/Frontend.cpp

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -740,11 +740,20 @@ ImplicitImportInfo CompilerInstance::getImplicitImportInfo() const {
740740
ImplicitImportInfo imports;
741741
imports.StdlibKind = Invocation.getImplicitStdlibKind();
742742

743-
for (auto &moduleStr : frontendOpts.getImplicitImportModuleNames())
744-
imports.ModuleNames.push_back(Context->getIdentifier(moduleStr));
743+
auto pushImport = [&](StringRef moduleStr) {
744+
ImportPath::Builder importPath(Context->getIdentifier(moduleStr));
745+
UnloadedImportedModule import(importPath.copyTo(*Context),
746+
/*isScoped=*/false);
747+
imports.AdditionalUnloadedImports.emplace_back(import, ImportOptions());
748+
};
749+
750+
for (auto &moduleStr : frontendOpts.getImplicitImportModuleNames()) {
751+
pushImport(moduleStr);
752+
}
745753

746-
if (Invocation.shouldImportSwiftONoneSupport())
747-
imports.ModuleNames.push_back(Context->getIdentifier(SWIFT_ONONE_SUPPORT));
754+
if (Invocation.shouldImportSwiftONoneSupport()) {
755+
pushImport(SWIFT_ONONE_SUPPORT);
756+
}
748757

749758
imports.ShouldImportUnderlyingModule = frontendOpts.ImportUnderlyingModule;
750759
imports.BridgingHeaderPath = frontendOpts.ImplicitObjCHeaderPath;

lib/FrontendTool/ScanDependencies.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -817,13 +817,13 @@ bool swift::scanDependencies(CompilerInstance &instance) {
817817
}
818818

819819
// Add any implicit module names.
820-
for (const auto &moduleName : importInfo.ModuleNames) {
821-
mainDependencies.addModuleDependency(moduleName.str(), &alreadyAddedModules);
820+
for (const auto &import : importInfo.AdditionalUnloadedImports) {
821+
mainDependencies.addModuleDependency(import.module.getModulePath().front().Item.str(), &alreadyAddedModules);
822822
}
823823

824824
// Already-loaded, implicitly imported module names.
825-
for (const auto &module : importInfo.AdditionalModules) {
826-
mainDependencies.addModuleDependency(module.first->getNameStr(), &alreadyAddedModules);
825+
for (const auto &import : importInfo.AdditionalImports) {
826+
mainDependencies.addModuleDependency(import.module.importedModule->getNameStr(), &alreadyAddedModules);
827827
}
828828

829829
// Add the bridging header.

lib/IDE/REPLCodeCompletion.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -221,16 +221,17 @@ doCodeCompletion(SourceFile &SF, StringRef EnteredCode, unsigned *BufferID,
221221
auto *lastModule = SF.getParentModule();
222222

223223
ImplicitImportInfo implicitImports;
224-
implicitImports.AdditionalModules.emplace_back(lastModule,
225-
/*exported*/ false);
224+
{
225+
ImportedModule import(ImportPath::Access(), lastModule);
226+
implicitImports.AdditionalImports.emplace_back(import, ImportOptions());
227+
}
226228

227229
// Carry over the private imports from the last module.
228230
SmallVector<ImportedModule, 8> imports;
229231
lastModule->getImportedModules(imports,
230232
ModuleDecl::ImportFilterKind::Default);
231233
for (auto &import : imports) {
232-
implicitImports.AdditionalModules.emplace_back(import.importedModule,
233-
/*exported*/ false);
234+
implicitImports.AdditionalImports.emplace_back(import, ImportOptions());
234235
}
235236

236237
// Create a new module and file for the code completion buffer, similar to how

lib/Sema/ImportResolution.cpp

Lines changed: 33 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -392,6 +392,27 @@ UnboundImport::getTopLevelModule(ModuleDecl *M, SourceFile &SF) {
392392
// MARK: Implicit imports
393393
//===----------------------------------------------------------------------===//
394394

395+
static void diagnoseNoSuchModule(ASTContext &ctx, SourceLoc importLoc,
396+
ImportPath::Module modulePath,
397+
bool nonfatalInREPL) {
398+
SmallString<64> modulePathStr;
399+
llvm::interleave(modulePath, [&](ImportPath::Element elem) {
400+
modulePathStr += elem.Item.str();
401+
},
402+
[&] { modulePathStr += "."; });
403+
404+
auto diagKind = diag::sema_no_import;
405+
if (nonfatalInREPL && ctx.LangOpts.DebuggerSupport)
406+
diagKind = diag::sema_no_import_repl;
407+
ctx.Diags.diagnose(importLoc, diagKind, modulePathStr);
408+
409+
if (ctx.SearchPathOpts.SDKPath.empty() &&
410+
llvm::Triple(llvm::sys::getProcessTriple()).isMacOSX()) {
411+
ctx.Diags.diagnose(SourceLoc(), diag::sema_no_import_no_sdk);
412+
ctx.Diags.diagnose(SourceLoc(), diag::sema_no_import_no_sdk_xcrun);
413+
}
414+
}
415+
395416
ImplicitImportList
396417
ModuleImplicitImportsRequest::evaluate(Evaluator &evaluator,
397418
ModuleDecl *module) const {
@@ -422,27 +443,22 @@ ModuleImplicitImportsRequest::evaluate(Evaluator &evaluator,
422443
}
423444

424445
// Add any modules we were asked to implicitly import.
425-
for (auto moduleName : importInfo.ModuleNames) {
426-
auto *importModule = ctx.getModuleByIdentifier(moduleName);
446+
for (auto unloadedImport : importInfo.AdditionalUnloadedImports) {
447+
auto *importModule = ctx.getModule(unloadedImport.module.getModulePath());
427448
if (!importModule) {
428-
ctx.Diags.diagnose(SourceLoc(), diag::sema_no_import, moduleName.str());
429-
if (ctx.SearchPathOpts.SDKPath.empty() &&
430-
llvm::Triple(llvm::sys::getProcessTriple()).isMacOSX()) {
431-
ctx.Diags.diagnose(SourceLoc(), diag::sema_no_import_no_sdk);
432-
ctx.Diags.diagnose(SourceLoc(), diag::sema_no_import_no_sdk_xcrun);
433-
}
449+
diagnoseNoSuchModule(ctx, SourceLoc(),
450+
unloadedImport.module.getModulePath(),
451+
/*nonfatalInREPL=*/false);
434452
continue;
435453
}
436-
ImportedModule import(ImportPath::Access(), importModule);
437-
imports.emplace_back(import, ImportOptions());
454+
ImportedModule import(unloadedImport.module.getAccessPath(), importModule);
455+
imports.emplace_back(import, unloadedImport.options,
456+
unloadedImport.sourceFileArg,
457+
unloadedImport.spiGroups);
438458
}
439459

440460
// Add any pre-loaded modules.
441-
for (auto &module : importInfo.AdditionalModules) {
442-
ImportedModule import(ImportPath::Access(), module.first);
443-
imports.emplace_back(import, module.second ? ImportFlags::Exported
444-
: ImportOptions());
445-
}
461+
llvm::copy(importInfo.AdditionalImports, std::back_inserter(imports));
446462

447463
auto *clangImporter =
448464
static_cast<ClangImporter *>(ctx.getClangModuleLoader());
@@ -547,25 +563,8 @@ bool UnboundImport::checkModuleLoaded(ModuleDecl *M, SourceFile &SF) {
547563
if (M)
548564
return true;
549565

550-
ASTContext &ctx = SF.getASTContext();
551-
552-
SmallString<64> modulePathStr;
553-
llvm::interleave(import.module.getModulePath(),
554-
[&](ImportPath::Element elem) {
555-
modulePathStr += elem.Item.str();
556-
},
557-
[&] { modulePathStr += "."; });
558-
559-
auto diagKind = diag::sema_no_import;
560-
if (ctx.LangOpts.DebuggerSupport)
561-
diagKind = diag::sema_no_import_repl;
562-
ctx.Diags.diagnose(importLoc, diagKind, modulePathStr);
563-
564-
if (ctx.SearchPathOpts.SDKPath.empty() &&
565-
llvm::Triple(llvm::sys::getProcessTriple()).isMacOSX()) {
566-
ctx.Diags.diagnose(SourceLoc(), diag::sema_no_import_no_sdk);
567-
ctx.Diags.diagnose(SourceLoc(), diag::sema_no_import_no_sdk_xcrun);
568-
}
566+
diagnoseNoSuchModule(SF.getASTContext(), importLoc,
567+
import.module.getModulePath(), /*nonfatalInREPL=*/true);
569568
return false;
570569
}
571570

lib/Serialization/ModuleDependencyScanner.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -149,8 +149,8 @@ ErrorOr<ModuleDependencies> ModuleDependencyScanner::scanInterfaceFile(
149149
// Collect implicitly imported modules in case they are not explicitly
150150
// printed in the interface file, e.g. SwiftOnoneSupport.
151151
auto &imInfo = mainMod->getImplicitImportInfo();
152-
for (auto name: imInfo.ModuleNames) {
153-
Result->addModuleDependency(name.str(), &alreadyAddedModules);
152+
for (auto import: imInfo.AdditionalUnloadedImports) {
153+
Result->addModuleDependency(import.module.getModulePath().front().Item.str(), &alreadyAddedModules);
154154
}
155155
return std::error_code();
156156
});

0 commit comments

Comments
 (0)