Skip to content

Commit 453667f

Browse files
committed
[Frontend] Validate ImplicitImportModuleNames early
Check whether the user has provided a valid identifier when parsing the options. Also make ImplicitImportModuleNames a private member of FrontendOptions to prevent mutation after being parsed.
1 parent 82cdf91 commit 453667f

File tree

4 files changed

+18
-6
lines changed

4 files changed

+18
-6
lines changed

include/swift/Frontend/FrontendOptions.h

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@ namespace swift {
3333
class FrontendOptions {
3434
friend class ArgsToFrontendOptionsConverter;
3535

36+
/// A list of arbitrary modules to import and make implicitly visible.
37+
std::vector<std::string> ImplicitImportModuleNames;
38+
3639
public:
3740
FrontendInputsAndOutputs InputsAndOutputs;
3841

@@ -44,9 +47,6 @@ class FrontendOptions {
4447

4548
bool isOutputFileDirectory() const;
4649

47-
/// A list of arbitrary modules to import and make implicitly visible.
48-
std::vector<std::string> ImplicitImportModuleNames;
49-
5050
/// An Objective-C header to import and make implicitly visible.
5151
std::string ImplicitObjCHeaderPath;
5252

@@ -322,6 +322,12 @@ class FrontendOptions {
322322
const PrimarySpecificPaths &
323323
getPrimarySpecificPathsForPrimary(StringRef) const;
324324

325+
/// Retrieves the list of arbitrary modules to import and make implicitly
326+
/// visible.
327+
ArrayRef<std::string> getImplicitImportModuleNames() const {
328+
return ImplicitImportModuleNames;
329+
}
330+
325331
private:
326332
static bool canActionEmitDependencies(ActionType);
327333
static bool canActionEmitReferenceDependencies(ActionType);

lib/Frontend/ArgsToFrontendOptionsConverter.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -564,7 +564,13 @@ void ArgsToFrontendOptionsConverter::computeImportObjCHeaderOptions() {
564564
void ArgsToFrontendOptionsConverter::computeImplicitImportModuleNames() {
565565
using namespace options;
566566
for (const Arg *A : Args.filtered(OPT_import_module)) {
567-
Opts.ImplicitImportModuleNames.push_back(A->getValue());
567+
auto *moduleStr = A->getValue();
568+
if (!Lexer::isIdentifier(moduleStr)) {
569+
Diags.diagnose(SourceLoc(), diag::error_bad_module_name, moduleStr,
570+
/*suggestModuleNameFlag*/ false);
571+
continue;
572+
}
573+
Opts.ImplicitImportModuleNames.push_back(moduleStr);
568574
}
569575
}
570576
void ArgsToFrontendOptionsConverter::computeLLVMArgs() {

lib/Frontend/Frontend.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -882,7 +882,7 @@ void CompilerInstance::getImplicitlyImportedModules(
882882
SmallVectorImpl<ModuleDecl *> &importModules) {
883883
FrontendStatsTracer tracer(getStatsReporter(), "get-implicitly-imported-modules");
884884
for (auto &ImplicitImportModuleName :
885-
Invocation.getFrontendOptions().ImplicitImportModuleNames) {
885+
Invocation.getFrontendOptions().getImplicitImportModuleNames()) {
886886
if (Lexer::isIdentifier(ImplicitImportModuleName)) {
887887
auto moduleID = Context->getIdentifier(ImplicitImportModuleName);
888888
ModuleDecl *importModule =

tools/SourceKit/lib/SwiftLang/CodeCompletionOrganizer.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -337,7 +337,7 @@ ImportDepth::ImportDepth(ASTContext &context,
337337
// specially by applying import depth 0.
338338
llvm::StringSet<> auxImports;
339339
for (StringRef moduleName :
340-
invocation.getFrontendOptions().ImplicitImportModuleNames)
340+
invocation.getFrontendOptions().getImplicitImportModuleNames())
341341
auxImports.insert(moduleName);
342342

343343
// Private imports from this module.

0 commit comments

Comments
 (0)