From d806ba53f637e0d9f97c5047420211aacd713b8e Mon Sep 17 00:00:00 2001 From: Martin Boehme Date: Thu, 18 Jun 2020 15:45:43 +0200 Subject: [PATCH] Give OptionSet an initializer_list constructor. This makes it easier to specify OptionSet arguments. Also modify appropriate uses of ModuleDecl::ImportFilter to take advantage of the new constructor. --- include/swift/Basic/OptionSet.h | 13 ++++++++++++ lib/AST/ImportCache.cpp | 18 +++++++--------- lib/Frontend/ModuleInterfaceSupport.cpp | 10 ++++----- lib/FrontendTool/ImportedModules.cpp | 11 ++++------ lib/IDE/CodeCompletion.cpp | 21 ++++++++----------- lib/IRGen/IRGenDebugInfo.cpp | 9 ++++---- lib/Index/Index.cpp | 8 +++---- lib/Index/IndexRecord.cpp | 16 ++++++-------- lib/Serialization/Serialization.cpp | 11 +++++----- lib/Serialization/SerializedModuleLoader.cpp | 7 ++----- .../lib/SwiftLang/CodeCompletionOrganizer.cpp | 7 +++---- .../lib/SwiftLang/SwiftASTManager.cpp | 6 +++--- 12 files changed, 65 insertions(+), 72 deletions(-) diff --git a/include/swift/Basic/OptionSet.h b/include/swift/Basic/OptionSet.h index a5e0d25aa00b6..c5758b250ca9c 100644 --- a/include/swift/Basic/OptionSet.h +++ b/include/swift/Basic/OptionSet.h @@ -21,6 +21,7 @@ #include #include +#include namespace swift { @@ -58,6 +59,10 @@ class OptionSet { /// Create an option set with only the given option set. constexpr OptionSet(Flags flag) : Storage(static_cast(flag)) {} + /// Create an option set containing the given options. + constexpr OptionSet(std::initializer_list flags) + : Storage(combineFlags(flags)) {} + /// Create an option set from raw storage. explicit constexpr OptionSet(StorageType storage) : Storage(storage) {} @@ -136,6 +141,14 @@ class OptionSet { static void _checkResultTypeOperatorOr(...) {} + static constexpr StorageType + combineFlags(const std::initializer_list &flags) { + OptionSet result; + for (Flags flag : flags) + result |= flag; + return result.Storage; + } + static_assert(!std::is_same::value, "operator| should produce an OptionSet"); diff --git a/lib/AST/ImportCache.cpp b/lib/AST/ImportCache.cpp index 352b582990f59..ed9c77b3631f9 100644 --- a/lib/AST/ImportCache.cpp +++ b/lib/AST/ImportCache.cpp @@ -179,11 +179,10 @@ ImportSet &ImportCache::getImportSet(const DeclContext *dc) { ModuleDecl::ImportedModule{ModuleDecl::AccessPathTy(), mod}); if (file) { - ModuleDecl::ImportFilter importFilter; - importFilter |= ModuleDecl::ImportFilterKind::Private; - importFilter |= ModuleDecl::ImportFilterKind::ImplementationOnly; - importFilter |= ModuleDecl::ImportFilterKind::SPIAccessControl; - file->getImportedModules(imports, importFilter); + file->getImportedModules(imports, + {ModuleDecl::ImportFilterKind::Private, + ModuleDecl::ImportFilterKind::ImplementationOnly, + ModuleDecl::ImportFilterKind::SPIAccessControl}); } auto &result = getImportSet(ctx, imports); @@ -265,11 +264,10 @@ ImportCache::getAllAccessPathsNotShadowedBy(const ModuleDecl *mod, ModuleDecl::ImportedModule{ModuleDecl::AccessPathTy(), currentMod}); if (auto *file = dyn_cast(dc)) { - ModuleDecl::ImportFilter importFilter; - importFilter |= ModuleDecl::ImportFilterKind::Private; - importFilter |= ModuleDecl::ImportFilterKind::ImplementationOnly; - importFilter |= ModuleDecl::ImportFilterKind::SPIAccessControl; - file->getImportedModules(stack, importFilter); + file->getImportedModules(stack, + {ModuleDecl::ImportFilterKind::Private, + ModuleDecl::ImportFilterKind::ImplementationOnly, + ModuleDecl::ImportFilterKind::SPIAccessControl}); } SmallVector accessPaths; diff --git a/lib/Frontend/ModuleInterfaceSupport.cpp b/lib/Frontend/ModuleInterfaceSupport.cpp index 27d4c8ec30d3c..3b14762c34523 100644 --- a/lib/Frontend/ModuleInterfaceSupport.cpp +++ b/lib/Frontend/ModuleInterfaceSupport.cpp @@ -100,13 +100,11 @@ static void printImports(raw_ostream &out, ModuleDecl *M) { // FIXME: This is very similar to what's in Serializer::writeInputBlock, but // it's not obvious what higher-level optimization would be factored out here. - ModuleDecl::ImportFilter allImportFilter; - allImportFilter |= ModuleDecl::ImportFilterKind::Public; - allImportFilter |= ModuleDecl::ImportFilterKind::Private; - allImportFilter |= ModuleDecl::ImportFilterKind::SPIAccessControl; - SmallVector allImports; - M->getImportedModules(allImports, allImportFilter); + M->getImportedModules(allImports, + {ModuleDecl::ImportFilterKind::Public, + ModuleDecl::ImportFilterKind::Private, + ModuleDecl::ImportFilterKind::SPIAccessControl}); ModuleDecl::removeDuplicateImports(allImports); diagnoseScopedImports(M->getASTContext().Diags, allImports); diff --git a/lib/FrontendTool/ImportedModules.cpp b/lib/FrontendTool/ImportedModules.cpp index 240d3eda376f1..90a33895ee52a 100644 --- a/lib/FrontendTool/ImportedModules.cpp +++ b/lib/FrontendTool/ImportedModules.cpp @@ -78,15 +78,12 @@ bool swift::emitImportedModules(ASTContext &Context, ModuleDecl *mainModule, StringRef implicitHeaderPath = opts.ImplicitObjCHeaderPath; if (!implicitHeaderPath.empty()) { if (!clangImporter->importBridgingHeader(implicitHeaderPath, mainModule)) { - ModuleDecl::ImportFilter importFilter; - importFilter |= ModuleDecl::ImportFilterKind::Public; - importFilter |= ModuleDecl::ImportFilterKind::Private; - importFilter |= ModuleDecl::ImportFilterKind::ImplementationOnly; - importFilter |= ModuleDecl::ImportFilterKind::SPIAccessControl; - SmallVector imported; clangImporter->getImportedHeaderModule()->getImportedModules( - imported, importFilter); + imported, {ModuleDecl::ImportFilterKind::Public, + ModuleDecl::ImportFilterKind::Private, + ModuleDecl::ImportFilterKind::ImplementationOnly, + ModuleDecl::ImportFilterKind::SPIAccessControl}); for (auto IM : imported) { if (auto clangModule = IM.importedModule->findUnderlyingClangModule()) diff --git a/lib/IDE/CodeCompletion.cpp b/lib/IDE/CodeCompletion.cpp index f05c3c8ffe83a..2f89c9929d376 100644 --- a/lib/IDE/CodeCompletion.cpp +++ b/lib/IDE/CodeCompletion.cpp @@ -2081,15 +2081,13 @@ class CompletionLookup final : public swift::VisibleDeclConsumer { } void collectImportedModules(llvm::StringSet<> &ImportedModules) { - ModuleDecl::ImportFilter ImportFilter; - ImportFilter |= ModuleDecl::ImportFilterKind::Public; - ImportFilter |= ModuleDecl::ImportFilterKind::Private; - ImportFilter |= ModuleDecl::ImportFilterKind::ImplementationOnly; - SmallVector Imported; SmallVector FurtherImported; - CurrDeclContext->getParentSourceFile()->getImportedModules(Imported, - ImportFilter); + CurrDeclContext->getParentSourceFile()->getImportedModules( + Imported, + {ModuleDecl::ImportFilterKind::Public, + ModuleDecl::ImportFilterKind::Private, + ModuleDecl::ImportFilterKind::ImplementationOnly}); while (!Imported.empty()) { ModuleDecl *MD = Imported.back().importedModule; Imported.pop_back(); @@ -6323,13 +6321,12 @@ void CodeCompletionCallbacksImpl::doneParsing() { Lookup.addModuleName(curModule); // Add results for all imported modules. - ModuleDecl::ImportFilter ImportFilter; - ImportFilter |= ModuleDecl::ImportFilterKind::Public; - ImportFilter |= ModuleDecl::ImportFilterKind::Private; - ImportFilter |= ModuleDecl::ImportFilterKind::ImplementationOnly; SmallVector Imports; auto *SF = CurDeclContext->getParentSourceFile(); - SF->getImportedModules(Imports, ImportFilter); + SF->getImportedModules( + Imports, {ModuleDecl::ImportFilterKind::Public, + ModuleDecl::ImportFilterKind::Private, + ModuleDecl::ImportFilterKind::ImplementationOnly}); for (auto Imported : Imports) { for (auto Import : namelookup::getAllImports(Imported.importedModule)) diff --git a/lib/IRGen/IRGenDebugInfo.cpp b/lib/IRGen/IRGenDebugInfo.cpp index 41a640f3e96c3..ceafe16df2594 100644 --- a/lib/IRGen/IRGenDebugInfo.cpp +++ b/lib/IRGen/IRGenDebugInfo.cpp @@ -1832,12 +1832,11 @@ void IRGenDebugInfoImpl::finalize() { // Get the list of imported modules (which may actually be different // from all ImportDecls). - ModuleDecl::ImportFilter ImportFilter; - ImportFilter |= ModuleDecl::ImportFilterKind::Public; - ImportFilter |= ModuleDecl::ImportFilterKind::Private; - ImportFilter |= ModuleDecl::ImportFilterKind::ImplementationOnly; SmallVector ModuleWideImports; - IGM.getSwiftModule()->getImportedModules(ModuleWideImports, ImportFilter); + IGM.getSwiftModule()->getImportedModules( + ModuleWideImports, {ModuleDecl::ImportFilterKind::Public, + ModuleDecl::ImportFilterKind::Private, + ModuleDecl::ImportFilterKind::ImplementationOnly}); for (auto M : ModuleWideImports) if (!ImportedModules.count(M.importedModule)) DBuilder.createImportedModule(MainFile, getOrCreateModule(M), MainFile, diff --git a/lib/Index/Index.cpp b/lib/Index/Index.cpp index 8153592ff4dae..ef8637ac20e7a 100644 --- a/lib/Index/Index.cpp +++ b/lib/Index/Index.cpp @@ -125,10 +125,10 @@ class SourceFileOrModule { void getImportedModules(SmallVectorImpl &Modules) const { - ModuleDecl::ImportFilter ImportFilter; - ImportFilter |= ModuleDecl::ImportFilterKind::Public; - ImportFilter |= ModuleDecl::ImportFilterKind::Private; - ImportFilter |= ModuleDecl::ImportFilterKind::ImplementationOnly; + constexpr ModuleDecl::ImportFilter ImportFilter = { + ModuleDecl::ImportFilterKind::Public, + ModuleDecl::ImportFilterKind::Private, + ModuleDecl::ImportFilterKind::ImplementationOnly}; if (auto *SF = SFOrMod.dyn_cast()) { SF->getImportedModules(Modules, ImportFilter); diff --git a/lib/Index/IndexRecord.cpp b/lib/Index/IndexRecord.cpp index d441ade35075f..9fdfe584c5af6 100644 --- a/lib/Index/IndexRecord.cpp +++ b/lib/Index/IndexRecord.cpp @@ -580,11 +580,9 @@ emitDataForSwiftSerializedModule(ModuleDecl *module, unitWriter.addRecordFile(recordFile, *FE, isSystemModule, mod); } - ModuleDecl::ImportFilter importFilter; - importFilter |= ModuleDecl::ImportFilterKind::Public; - importFilter |= ModuleDecl::ImportFilterKind::Private; SmallVector imports; - module->getImportedModules(imports, importFilter); + module->getImportedModules(imports, {ModuleDecl::ImportFilterKind::Public, + ModuleDecl::ImportFilterKind::Private}); StringScratchSpace moduleNameScratch; addModuleDependencies(imports, indexStorePath, indexSystemModules, skipStdlib, targetTriple, clangCI, diags, unitWriter, @@ -621,13 +619,11 @@ recordSourceFileUnit(SourceFile *primarySourceFile, StringRef indexUnitToken, getModuleInfoFromOpaqueModule); // Module dependencies. - ModuleDecl::ImportFilter importFilter; - importFilter |= ModuleDecl::ImportFilterKind::Public; - importFilter |= ModuleDecl::ImportFilterKind::Private; - importFilter |= ModuleDecl::ImportFilterKind::ImplementationOnly; - SmallVector imports; - primarySourceFile->getImportedModules(imports, importFilter); + primarySourceFile->getImportedModules( + imports, {ModuleDecl::ImportFilterKind::Public, + ModuleDecl::ImportFilterKind::Private, + ModuleDecl::ImportFilterKind::ImplementationOnly}); StringScratchSpace moduleNameScratch; addModuleDependencies(imports, indexStorePath, indexSystemModules, skipStdlib, targetTriple, clangCI, diags, unitWriter, diff --git a/lib/Serialization/Serialization.cpp b/lib/Serialization/Serialization.cpp index deabf9ed2e215..3a4cc994ea656 100644 --- a/lib/Serialization/Serialization.cpp +++ b/lib/Serialization/Serialization.cpp @@ -1015,13 +1015,12 @@ void Serializer::writeInputBlock(const SerializationOptions &options) { if (!options.ModuleInterface.empty()) ModuleInterface.emit(ScratchRecord, options.ModuleInterface); - ModuleDecl::ImportFilter allImportFilter; - allImportFilter |= ModuleDecl::ImportFilterKind::Public; - allImportFilter |= ModuleDecl::ImportFilterKind::Private; - allImportFilter |= ModuleDecl::ImportFilterKind::ImplementationOnly; - allImportFilter |= ModuleDecl::ImportFilterKind::SPIAccessControl; SmallVector allImports; - M->getImportedModules(allImports, allImportFilter); + M->getImportedModules(allImports, + {ModuleDecl::ImportFilterKind::Public, + ModuleDecl::ImportFilterKind::Private, + ModuleDecl::ImportFilterKind::ImplementationOnly, + ModuleDecl::ImportFilterKind::SPIAccessControl}); ModuleDecl::removeDuplicateImports(allImports); // Collect the public and private imports as a subset so that we can diff --git a/lib/Serialization/SerializedModuleLoader.cpp b/lib/Serialization/SerializedModuleLoader.cpp index 6a8c3be82b06b..6105c5314de12 100644 --- a/lib/Serialization/SerializedModuleLoader.cpp +++ b/lib/Serialization/SerializedModuleLoader.cpp @@ -1085,12 +1085,9 @@ void SerializedASTFile::getImportedModules( void SerializedASTFile::collectLinkLibrariesFromImports( ModuleDecl::LinkLibraryCallback callback) const { - ModuleDecl::ImportFilter ImportFilter; - ImportFilter |= ModuleDecl::ImportFilterKind::Public; - ImportFilter |= ModuleDecl::ImportFilterKind::Private; - llvm::SmallVector Imports; - File.getImportedModules(Imports, ImportFilter); + File.getImportedModules(Imports, {ModuleDecl::ImportFilterKind::Public, + ModuleDecl::ImportFilterKind::Private}); for (auto Import : Imports) Import.importedModule->collectLinkLibraries(callback); diff --git a/tools/SourceKit/lib/SwiftLang/CodeCompletionOrganizer.cpp b/tools/SourceKit/lib/SwiftLang/CodeCompletionOrganizer.cpp index fabdc567da6f2..8ac901da4de3c 100644 --- a/tools/SourceKit/lib/SwiftLang/CodeCompletionOrganizer.cpp +++ b/tools/SourceKit/lib/SwiftLang/CodeCompletionOrganizer.cpp @@ -355,12 +355,11 @@ ImportDepth::ImportDepth(ASTContext &context, // Private imports from this module. // FIXME: only the private imports from the current source file. - ModuleDecl::ImportFilter importFilter; - importFilter |= ModuleDecl::ImportFilterKind::Private; - importFilter |= ModuleDecl::ImportFilterKind::ImplementationOnly; // FIXME: ImportFilterKind::ShadowedBySeparateOverlay? SmallVector mainImports; - main->getImportedModules(mainImports, importFilter); + main->getImportedModules(mainImports, + {ModuleDecl::ImportFilterKind::Private, + ModuleDecl::ImportFilterKind::ImplementationOnly}); for (auto &import : mainImports) { uint8_t depth = 1; if (auxImports.count(import.importedModule->getName().str())) diff --git a/tools/SourceKit/lib/SwiftLang/SwiftASTManager.cpp b/tools/SourceKit/lib/SwiftLang/SwiftASTManager.cpp index eba624bce0d32..7b30a003845b7 100644 --- a/tools/SourceKit/lib/SwiftLang/SwiftASTManager.cpp +++ b/tools/SourceKit/lib/SwiftLang/SwiftASTManager.cpp @@ -907,9 +907,9 @@ static void collectModuleDependencies(ModuleDecl *TopMod, auto ClangModuleLoader = TopMod->getASTContext().getClangModuleLoader(); - ModuleDecl::ImportFilter ImportFilter; - ImportFilter |= ModuleDecl::ImportFilterKind::Public; - ImportFilter |= ModuleDecl::ImportFilterKind::Private; + ModuleDecl::ImportFilter ImportFilter = { + ModuleDecl::ImportFilterKind::Public, + ModuleDecl::ImportFilterKind::Private}; if (Visited.empty()) { // Only collect implementation-only dependencies from the main module. ImportFilter |= ModuleDecl::ImportFilterKind::ImplementationOnly;