njames93 updated this revision to Diff 458285.
njames93 added a comment.

Fix failing test case


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D133371/new/

https://reviews.llvm.org/D133371

Files:
  clang-tools-extra/clang-tidy/ClangTidy.cpp
  clang-tools-extra/clang-tidy/ClangTidy.h
  clang-tools-extra/clang-tidy/ClangTidyCheck.cpp
  clang-tools-extra/clang-tidy/ClangTidyCheck.h
  clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.h
  clang-tools-extra/clang-tidy/abseil/StringFindStartswithCheck.cpp
  clang-tools-extra/clang-tidy/abseil/StringFindStrContainsCheck.cpp
  clang-tools-extra/clang-tidy/android/ComparisonInTempFailureRetryCheck.cpp
  clang-tools-extra/clang-tidy/bugprone/AssertSideEffectCheck.cpp
  clang-tools-extra/clang-tidy/bugprone/DanglingHandleCheck.cpp
  clang-tools-extra/clang-tidy/bugprone/DynamicStaticInitializersCheck.cpp
  clang-tools-extra/clang-tidy/bugprone/EasilySwappableParametersCheck.cpp
  clang-tools-extra/clang-tidy/bugprone/ReservedIdentifierCheck.cpp
  clang-tools-extra/clang-tidy/bugprone/SignedCharMisuseCheck.cpp
  clang-tools-extra/clang-tidy/bugprone/StringConstructorCheck.cpp
  clang-tools-extra/clang-tidy/bugprone/SuspiciousIncludeCheck.cpp
  clang-tools-extra/clang-tidy/bugprone/SuspiciousStringCompareCheck.cpp
  clang-tools-extra/clang-tidy/bugprone/UnusedReturnValueCheck.cpp
  clang-tools-extra/clang-tidy/cert/NonTrivialTypesLibcMemoryCallsCheck.cpp
  clang-tools-extra/clang-tidy/cppcoreguidelines/NarrowingConversionsCheck.cpp
  clang-tools-extra/clang-tidy/cppcoreguidelines/NoMallocCheck.h
  clang-tools-extra/clang-tidy/cppcoreguidelines/OwningMemoryCheck.h
  clang-tools-extra/clang-tidy/google/GlobalNamesInHeadersCheck.cpp
  clang-tools-extra/clang-tidy/google/UnnamedNamespaceInHeaderCheck.cpp
  clang-tools-extra/clang-tidy/misc/DefinitionsInHeadersCheck.cpp
  clang-tools-extra/clang-tidy/modernize/UseEmplaceCheck.cpp
  clang-tools-extra/clang-tidy/objc/ForbiddenSubclassingCheck.cpp
  clang-tools-extra/clang-tidy/performance/FasterStringFindCheck.cpp
  clang-tools-extra/clang-tidy/performance/ForRangeCopyCheck.cpp
  clang-tools-extra/clang-tidy/performance/InefficientVectorOperationCheck.cpp
  clang-tools-extra/clang-tidy/performance/NoAutomaticMoveCheck.cpp
  clang-tools-extra/clang-tidy/performance/UnnecessaryCopyInitialization.cpp
  clang-tools-extra/clang-tidy/performance/UnnecessaryValueParamCheck.cpp
  clang-tools-extra/clang-tidy/readability/MagicNumbersCheck.cpp
  clang-tools-extra/clang-tidy/readability/RedundantStringInitCheck.cpp
  clang-tools-extra/clang-tidy/readability/SimplifySubscriptExprCheck.cpp
  clang-tools-extra/clang-tidy/readability/SuspiciousCallArgumentCheck.cpp
  clang-tools-extra/clang-tidy/readability/UppercaseLiteralSuffixCheck.cpp
  clang-tools-extra/clang-tidy/tool/ClangTidyMain.cpp
  clang-tools-extra/clang-tidy/utils/HeaderGuard.h

Index: clang-tools-extra/clang-tidy/utils/HeaderGuard.h
===================================================================
--- clang-tools-extra/clang-tidy/utils/HeaderGuard.h
+++ clang-tools-extra/clang-tidy/utils/HeaderGuard.h
@@ -28,7 +28,7 @@
 public:
   HeaderGuardCheck(StringRef Name, ClangTidyContext *Context)
       : ClangTidyCheck(Name, Context),
-        RawStringHeaderFileExtensions(Options.getLocalOrGlobal(
+        RawStringHeaderFileExtensions(Options.getLocalOrGlobalList(
             "HeaderFileExtensions", utils::defaultHeaderFileExtensions())) {
     utils::parseFileExtensions(RawStringHeaderFileExtensions,
                                HeaderFileExtensions,
Index: clang-tools-extra/clang-tidy/tool/ClangTidyMain.cpp
===================================================================
--- clang-tools-extra/clang-tidy/tool/ClangTidyMain.cpp
+++ clang-tools-extra/clang-tidy/tool/ClangTidyMain.cpp
@@ -19,6 +19,7 @@
 #include "../ClangTidyForceLinker.h"
 #include "../GlobList.h"
 #include "clang/Tooling/CommonOptionsParser.h"
+#include "clang/Tooling/Syntax/Nodes.h"
 #include "llvm/ADT/StringSet.h"
 #include "llvm/Support/InitLLVM.h"
 #include "llvm/Support/PluginLoader.h"
@@ -26,6 +27,7 @@
 #include "llvm/Support/Signals.h"
 #include "llvm/Support/TargetSelect.h"
 #include "llvm/Support/WithColor.h"
+#include "llvm/Support/raw_ostream.h"
 
 using namespace clang::tooling;
 using namespace llvm;
@@ -262,6 +264,17 @@
 )"),
                                   cl::init(false), cl::cat(ClangTidyCategory));
 
+static cl::opt<bool> ListOptions("list-options", cl::desc(R"(
+Print the available options for the enabled checks.
+)"),
+                                 cl::init(false), cl::cat(ClangTidyCategory));
+
+static cl::opt<bool> ListAllOptions("list-all-options", cl::desc(R"(
+Print the available options for all supported checks.
+)"),
+                                    cl::init(false),
+                                    cl::cat(ClangTidyCategory));
+
 namespace clang {
 namespace tidy {
 
@@ -390,10 +403,11 @@
   return FS;
 }
 
-static StringRef closest(StringRef Value, const StringSet<> &Allowed) {
+template <typename Range>
+static StringRef closest(StringRef Value, Range &&Allowed) {
   unsigned MaxEdit = 5U;
   StringRef Closest;
-  for (auto Item : Allowed.keys()) {
+  for (StringRef Item : Allowed) {
     unsigned Cur = Value.edit_distance_insensitive(Item, true, MaxEdit);
     if (Cur < MaxEdit) {
       Closest = Item;
@@ -449,7 +463,7 @@
       AnyInvalid = true;
       llvm::raw_ostream &Output = llvm::WithColor::warning(llvm::errs(), Source)
                                   << "unknown check '" << Cur << '\'';
-      llvm::StringRef Closest = closest(Cur, AllChecks);
+      llvm::StringRef Closest = closest(Cur, AllChecks.keys());
       if (!Closest.empty())
         Output << "; did you mean '" << Closest << '\'';
       Output << VerifyConfigWarningEnd;
@@ -458,6 +472,11 @@
   return AnyInvalid;
 }
 
+static bool sortOptCollection(const OptionsCollection::MapEntryTy *L,
+                              const OptionsCollection::MapEntryTy *R) {
+  return L->getKey() < R->getKey();
+}
+
 int clangTidyMain(int argc, const char **argv) {
   llvm::InitLLVM X(argc, argv);
 
@@ -542,6 +561,95 @@
     return 0;
   }
 
+  if (ListOptions || ListAllOptions) {
+    NamesAndOptions Valid = getAllChecksAndOptions(
+        ListAllOptions
+            ? "*"
+            : OptionsProvider->getOptions(FileName).Checks.value_or(""),
+        AllowEnablingAnalyzerAlphaCheckers);
+    std::vector<OptionsCollection::MapEntryTy *> Items;
+    std::vector<OptionsCollection::MapEntryTy *> GlobalItems;
+    for (auto &Item : Valid.Options) {
+      if (Item.getKey().contains('.'))
+        Items.push_back(&Item);
+      else
+        GlobalItems.push_back(&Item);
+    }
+    if (GlobalItems.empty() && Items.empty()) {
+      llvm::errs() << "No options available.\n";
+      return 1;
+    }
+    llvm::sort(Items, &sortOptCollection);
+    llvm::sort(GlobalItems, &sortOptCollection);
+
+    if (GlobalItems.empty() && Items.empty()) {
+      llvm::errs() << "No options available.\n";
+      return 1;
+    }
+
+    // FIXME: explore creating a json schema output format.
+    auto Output = [](llvm::raw_ostream &O, const OptionType &Type) {
+      switch (Type.getType()) {
+      case OptionType::String:
+        O << "String";
+        break;
+      case OptionType::Boolean:
+        O << "Bool";
+        break;
+      case OptionType::Unsigned:
+        O << "Unsigned integer";
+        break;
+      case OptionType::Signed:
+        O << "Signed integer";
+        break;
+      case OptionType::Custom:
+        O << "Enumeration";
+        if (Type.hasEnum()) {
+          O << '<';
+          auto Values = Type.getEnumValue();
+          if (!Values.empty()) {
+            O << Values.front();
+            for (auto Item : Values.drop_front()) {
+              O << '|' << Item;
+            }
+          }
+          O << '>';
+        }
+        break;
+      case OptionType::List:
+        O << "List";
+        break;
+      }
+    };
+    if (!GlobalItems.empty()) {
+      llvm::outs() << "Global Options:\n";
+      for (const auto *Item : GlobalItems) {
+        llvm::outs() << " - " << Item->getKey() << ": ";
+        Output(llvm::outs(), Item->getValue());
+        llvm::outs() << "\n";
+      }
+    }
+
+    if (!Items.empty()) {
+      llvm::outs() << "Check Options:\n";
+      StringRef Current = "**INVALID_CHECK**";
+      for (const auto *Item : Items) {
+        StringRef Name = Item->getKey();
+        if (!Name.consume_front(Current)) {
+          auto Idx = Name.find('.');
+          assert(Idx != StringRef::npos);
+          Current = Name.take_front(Idx + 1);
+          Name = Name.substr(Idx + 1);
+          llvm::outs() << " - " << Current.drop_back() << ":\n";
+        }
+        llvm::outs() << "   - " << Name << ": ";
+        Output(llvm::outs(), Item->getValue());
+        llvm::outs() << "\n";
+      }
+    }
+    return 0;
+  }
+
   if (DumpConfig) {
     EffectiveOptions.CheckOptions =
         getCheckOptions(EffectiveOptions, AllowEnablingAnalyzerAlphaCheckers);
@@ -555,7 +663,7 @@
     std::vector<ClangTidyOptionsProvider::OptionsSource> RawOptions =
         OptionsProvider->getRawOptions(FileName);
     NamesAndOptions Valid =
-        getAllChecksAndOptions(AllowEnablingAnalyzerAlphaCheckers);
+        getAllChecksAndOptions("*", AllowEnablingAnalyzerAlphaCheckers);
     bool AnyInvalid = false;
     for (const std::pair<ClangTidyOptions, std::string> &OptionWithSource :
          RawOptions) {
@@ -565,13 +673,13 @@
             verifyChecks(Valid.Names, *Opts.Checks, OptionWithSource.second);
 
       for (auto Key : Opts.CheckOptions.keys()) {
-        if (Valid.Options.contains(Key))
+        if (Valid.Options.count(Key) != 0)
           continue;
         AnyInvalid = true;
         auto &Output =
             llvm::WithColor::warning(llvm::errs(), OptionWithSource.second)
             << "unknown check option '" << Key << '\'';
-        llvm::StringRef Closest = closest(Key, Valid.Options);
+        llvm::StringRef Closest = closest(Key, Valid.Options.keys());
         if (!Closest.empty())
           Output << "; did you mean '" << Closest << '\'';
         Output << VerifyConfigWarningEnd;
Index: clang-tools-extra/clang-tidy/readability/UppercaseLiteralSuffixCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/readability/UppercaseLiteralSuffixCheck.cpp
+++ clang-tools-extra/clang-tidy/readability/UppercaseLiteralSuffixCheck.cpp
@@ -188,7 +188,7 @@
     StringRef Name, ClangTidyContext *Context)
     : ClangTidyCheck(Name, Context),
       NewSuffixes(
-          utils::options::parseStringList(Options.get("NewSuffixes", ""))),
+          utils::options::parseStringList(Options.getList("NewSuffixes", ""))),
       IgnoreMacros(Options.getLocalOrGlobal("IgnoreMacros", true)) {}
 
 void UppercaseLiteralSuffixCheck::storeOptions(
Index: clang-tools-extra/clang-tidy/readability/SuspiciousCallArgumentCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/readability/SuspiciousCallArgumentCheck.cpp
+++ clang-tools-extra/clang-tidy/readability/SuspiciousCallArgumentCheck.cpp
@@ -527,7 +527,7 @@
   }
 
   for (StringRef Abbreviation : optutils::parseStringList(
-           Options.get("Abbreviations", DefaultAbbreviations))) {
+           Options.getList("Abbreviations", DefaultAbbreviations))) {
     auto KeyAndValue = Abbreviation.split("=");
     assert(!KeyAndValue.first.empty() && !KeyAndValue.second.empty());
     AbbreviationDictionary.insert(
Index: clang-tools-extra/clang-tidy/readability/SimplifySubscriptExprCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/readability/SimplifySubscriptExprCheck.cpp
+++ clang-tools-extra/clang-tidy/readability/SimplifySubscriptExprCheck.cpp
@@ -22,9 +22,9 @@
 
 SimplifySubscriptExprCheck::SimplifySubscriptExprCheck(
     StringRef Name, ClangTidyContext *Context)
-    : ClangTidyCheck(Name, Context), Types(utils::options::parseStringList(
-                                         Options.get("Types", KDefaultTypes))) {
-}
+    : ClangTidyCheck(Name, Context),
+      Types(utils::options::parseStringList(
+          Options.getList("Types", KDefaultTypes))) {}
 
 void SimplifySubscriptExprCheck::registerMatchers(MatchFinder *Finder) {
   const auto TypesMatcher = hasUnqualifiedDesugaredType(
Index: clang-tools-extra/clang-tidy/readability/RedundantStringInitCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/readability/RedundantStringInitCheck.cpp
+++ clang-tools-extra/clang-tidy/readability/RedundantStringInitCheck.cpp
@@ -58,7 +58,7 @@
                                                    ClangTidyContext *Context)
     : ClangTidyCheck(Name, Context),
       StringNames(utils::options::parseStringList(
-          Options.get("StringNames", DefaultStringNames))) {}
+          Options.getList("StringNames", DefaultStringNames))) {}
 
 void RedundantStringInitCheck::storeOptions(ClangTidyOptions::OptionMap &Opts) {
   Options.store(Opts, "StringNames", DefaultStringNames);
Index: clang-tools-extra/clang-tidy/readability/MagicNumbersCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/readability/MagicNumbersCheck.cpp
+++ clang-tools-extra/clang-tidy/readability/MagicNumbersCheck.cpp
@@ -68,8 +68,8 @@
       IgnorePowersOf2IntegerValues(
           Options.get("IgnorePowersOf2IntegerValues", false)),
       RawIgnoredIntegerValues(
-          Options.get("IgnoredIntegerValues", DefaultIgnoredIntegerValues)),
-      RawIgnoredFloatingPointValues(Options.get(
+          Options.getList("IgnoredIntegerValues", DefaultIgnoredIntegerValues)),
+      RawIgnoredFloatingPointValues(Options.getList(
           "IgnoredFloatingPointValues", DefaultIgnoredFloatingPointValues)) {
   // Process the set of ignored integer values.
   const std::vector<StringRef> IgnoredIntegerValuesInput =
Index: clang-tools-extra/clang-tidy/performance/UnnecessaryValueParamCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/performance/UnnecessaryValueParamCheck.cpp
+++ clang-tools-extra/clang-tidy/performance/UnnecessaryValueParamCheck.cpp
@@ -59,8 +59,8 @@
       Inserter(Options.getLocalOrGlobal("IncludeStyle",
                                         utils::IncludeSorter::IS_LLVM),
                areDiagsSelfContained()),
-      AllowedTypes(
-          utils::options::parseStringList(Options.get("AllowedTypes", ""))) {}
+      AllowedTypes(utils::options::parseStringList(
+          Options.getList("AllowedTypes", ""))) {}
 
 void UnnecessaryValueParamCheck::registerMatchers(MatchFinder *Finder) {
   const auto ExpensiveValueParamDecl = parmVarDecl(
Index: clang-tools-extra/clang-tidy/performance/UnnecessaryCopyInitialization.cpp
===================================================================
--- clang-tools-extra/clang-tidy/performance/UnnecessaryCopyInitialization.cpp
+++ clang-tools-extra/clang-tidy/performance/UnnecessaryCopyInitialization.cpp
@@ -220,9 +220,9 @@
     StringRef Name, ClangTidyContext *Context)
     : ClangTidyCheck(Name, Context),
       AllowedTypes(
-          utils::options::parseStringList(Options.get("AllowedTypes", ""))),
+          utils::options::parseStringList(Options.getList("AllowedTypes", ""))),
       ExcludedContainerTypes(utils::options::parseStringList(
-          Options.get("ExcludedContainerTypes", ""))) {}
+          Options.getList("ExcludedContainerTypes", ""))) {}
 
 void UnnecessaryCopyInitialization::registerMatchers(MatchFinder *Finder) {
   auto LocalVarCopiedFrom = [this](const internal::Matcher<Expr> &CopyCtorArg) {
Index: clang-tools-extra/clang-tidy/performance/NoAutomaticMoveCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/performance/NoAutomaticMoveCheck.cpp
+++ clang-tools-extra/clang-tidy/performance/NoAutomaticMoveCheck.cpp
@@ -21,8 +21,8 @@
 NoAutomaticMoveCheck::NoAutomaticMoveCheck(StringRef Name,
                                            ClangTidyContext *Context)
     : ClangTidyCheck(Name, Context),
-      AllowedTypes(
-          utils::options::parseStringList(Options.get("AllowedTypes", ""))) {}
+      AllowedTypes(utils::options::parseStringList(
+          Options.getList("AllowedTypes", ""))) {}
 
 void NoAutomaticMoveCheck::registerMatchers(MatchFinder *Finder) {
   const auto ConstLocalVariable =
Index: clang-tools-extra/clang-tidy/performance/InefficientVectorOperationCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/performance/InefficientVectorOperationCheck.cpp
+++ clang-tools-extra/clang-tidy/performance/InefficientVectorOperationCheck.cpp
@@ -78,7 +78,7 @@
     StringRef Name, ClangTidyContext *Context)
     : ClangTidyCheck(Name, Context),
       VectorLikeClasses(utils::options::parseStringList(
-          Options.get("VectorLikeClasses", "::std::vector"))),
+          Options.getList("VectorLikeClasses", "::std::vector"))),
       EnableProto(Options.getLocalOrGlobal("EnableProto", false)) {}
 
 void InefficientVectorOperationCheck::storeOptions(
Index: clang-tools-extra/clang-tidy/performance/ForRangeCopyCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/performance/ForRangeCopyCheck.cpp
+++ clang-tools-extra/clang-tidy/performance/ForRangeCopyCheck.cpp
@@ -24,8 +24,8 @@
 ForRangeCopyCheck::ForRangeCopyCheck(StringRef Name, ClangTidyContext *Context)
     : ClangTidyCheck(Name, Context),
       WarnOnAllAutoCopies(Options.get("WarnOnAllAutoCopies", false)),
-      AllowedTypes(
-          utils::options::parseStringList(Options.get("AllowedTypes", ""))) {}
+      AllowedTypes(utils::options::parseStringList(
+          Options.getList("AllowedTypes", ""))) {}
 
 void ForRangeCopyCheck::storeOptions(ClangTidyOptions::OptionMap &Opts) {
   Options.store(Opts, "WarnOnAllAutoCopies", WarnOnAllAutoCopies);
Index: clang-tools-extra/clang-tidy/performance/FasterStringFindCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/performance/FasterStringFindCheck.cpp
+++ clang-tools-extra/clang-tidy/performance/FasterStringFindCheck.cpp
@@ -51,8 +51,8 @@
                                              ClangTidyContext *Context)
     : ClangTidyCheck(Name, Context),
       StringLikeClasses(utils::options::parseStringList(
-          Options.get("StringLikeClasses",
-                      "::std::basic_string;::std::basic_string_view"))) {}
+          Options.getList("StringLikeClasses",
+                          "::std::basic_string;::std::basic_string_view"))) {}
 
 void FasterStringFindCheck::storeOptions(ClangTidyOptions::OptionMap &Opts) {
   Options.store(Opts, "StringLikeClasses",
Index: clang-tools-extra/clang-tidy/objc/ForbiddenSubclassingCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/objc/ForbiddenSubclassingCheck.cpp
+++ clang-tools-extra/clang-tidy/objc/ForbiddenSubclassingCheck.cpp
@@ -39,14 +39,11 @@
 
 } // namespace
 
-ForbiddenSubclassingCheck::ForbiddenSubclassingCheck(
-    StringRef Name,
-    ClangTidyContext *Context)
+ForbiddenSubclassingCheck::ForbiddenSubclassingCheck(StringRef Name,
+                                                     ClangTidyContext *Context)
     : ClangTidyCheck(Name, Context),
-      ForbiddenSuperClassNames(
-          utils::options::parseStringList(
-              Options.get("ClassNames", DefaultForbiddenSuperClassNames))) {
-}
+      ForbiddenSuperClassNames(utils::options::parseStringList(
+          Options.getList("ClassNames", DefaultForbiddenSuperClassNames))) {}
 
 void ForbiddenSubclassingCheck::registerMatchers(MatchFinder *Finder) {
   Finder->addMatcher(
Index: clang-tools-extra/clang-tidy/modernize/UseEmplaceCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/modernize/UseEmplaceCheck.cpp
+++ clang-tools-extra/clang-tidy/modernize/UseEmplaceCheck.cpp
@@ -111,20 +111,20 @@
 UseEmplaceCheck::UseEmplaceCheck(StringRef Name, ClangTidyContext *Context)
     : ClangTidyCheck(Name, Context), IgnoreImplicitConstructors(Options.get(
                                          "IgnoreImplicitConstructors", false)),
-      ContainersWithPushBack(utils::options::parseStringList(Options.get(
+      ContainersWithPushBack(utils::options::parseStringList(Options.getList(
           "ContainersWithPushBack", DefaultContainersWithPushBack))),
       ContainersWithPush(utils::options::parseStringList(
           Options.get("ContainersWithPush", DefaultContainersWithPush))),
-      ContainersWithPushFront(utils::options::parseStringList(Options.get(
+      ContainersWithPushFront(utils::options::parseStringList(Options.getList(
           "ContainersWithPushFront", DefaultContainersWithPushFront))),
       SmartPointers(utils::options::parseStringList(
-          Options.get("SmartPointers", DefaultSmartPointers))),
+          Options.getList("SmartPointers", DefaultSmartPointers))),
       TupleTypes(utils::options::parseStringList(
-          Options.get("TupleTypes", DefaultTupleTypes))),
+          Options.getList("TupleTypes", DefaultTupleTypes))),
       TupleMakeFunctions(utils::options::parseStringList(
-          Options.get("TupleMakeFunctions", DefaultTupleMakeFunctions))),
+          Options.getList("TupleMakeFunctions", DefaultTupleMakeFunctions))),
       EmplacyFunctions(utils::options::parseStringList(
-          Options.get("EmplacyFunctions", DefaultEmplacyFunctions))) {}
+          Options.getList("EmplacyFunctions", DefaultEmplacyFunctions))) {}
 
 void UseEmplaceCheck::registerMatchers(MatchFinder *Finder) {
   // FIXME: Bunch of functionality that could be easily added:
Index: clang-tools-extra/clang-tidy/misc/DefinitionsInHeadersCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/misc/DefinitionsInHeadersCheck.cpp
+++ clang-tools-extra/clang-tidy/misc/DefinitionsInHeadersCheck.cpp
@@ -31,7 +31,7 @@
                                                      ClangTidyContext *Context)
     : ClangTidyCheck(Name, Context),
       UseHeaderFileExtension(Options.get("UseHeaderFileExtension", true)),
-      RawStringHeaderFileExtensions(Options.getLocalOrGlobal(
+      RawStringHeaderFileExtensions(Options.getLocalOrGlobalList(
           "HeaderFileExtensions", utils::defaultHeaderFileExtensions())) {
   if (!utils::parseFileExtensions(RawStringHeaderFileExtensions,
                                   HeaderFileExtensions,
Index: clang-tools-extra/clang-tidy/google/UnnamedNamespaceInHeaderCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/google/UnnamedNamespaceInHeaderCheck.cpp
+++ clang-tools-extra/clang-tidy/google/UnnamedNamespaceInHeaderCheck.cpp
@@ -21,7 +21,7 @@
 UnnamedNamespaceInHeaderCheck::UnnamedNamespaceInHeaderCheck(
     StringRef Name, ClangTidyContext *Context)
     : ClangTidyCheck(Name, Context),
-      RawStringHeaderFileExtensions(Options.getLocalOrGlobal(
+      RawStringHeaderFileExtensions(Options.getLocalOrGlobalList(
           "HeaderFileExtensions", utils::defaultHeaderFileExtensions())) {
   if (!utils::parseFileExtensions(RawStringHeaderFileExtensions,
                                   HeaderFileExtensions,
Index: clang-tools-extra/clang-tidy/google/GlobalNamesInHeadersCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/google/GlobalNamesInHeadersCheck.cpp
+++ clang-tools-extra/clang-tidy/google/GlobalNamesInHeadersCheck.cpp
@@ -22,7 +22,7 @@
 GlobalNamesInHeadersCheck::GlobalNamesInHeadersCheck(StringRef Name,
                                                      ClangTidyContext *Context)
     : ClangTidyCheck(Name, Context),
-      RawStringHeaderFileExtensions(Options.getLocalOrGlobal(
+      RawStringHeaderFileExtensions(Options.getLocalOrGlobalList(
           "HeaderFileExtensions", utils::defaultHeaderFileExtensions())) {
   if (!utils::parseFileExtensions(RawStringHeaderFileExtensions,
                                   HeaderFileExtensions,
Index: clang-tools-extra/clang-tidy/cppcoreguidelines/OwningMemoryCheck.h
===================================================================
--- clang-tools-extra/clang-tidy/cppcoreguidelines/OwningMemoryCheck.h
+++ clang-tools-extra/clang-tidy/cppcoreguidelines/OwningMemoryCheck.h
@@ -24,10 +24,10 @@
 public:
   OwningMemoryCheck(StringRef Name, ClangTidyContext *Context)
       : ClangTidyCheck(Name, Context),
-        LegacyResourceProducers(Options.get(
+        LegacyResourceProducers(Options.getList(
             "LegacyResourceProducers", "::malloc;::aligned_alloc;::realloc;"
                                        "::calloc;::fopen;::freopen;::tmpfile")),
-        LegacyResourceConsumers(Options.get(
+        LegacyResourceConsumers(Options.getList(
             "LegacyResourceConsumers", "::free;::realloc;::freopen;::fclose")) {
   }
   bool isLanguageVersionSupported(const LangOptions &LangOpts) const override {
Index: clang-tools-extra/clang-tidy/cppcoreguidelines/NoMallocCheck.h
===================================================================
--- clang-tools-extra/clang-tidy/cppcoreguidelines/NoMallocCheck.h
+++ clang-tools-extra/clang-tidy/cppcoreguidelines/NoMallocCheck.h
@@ -27,9 +27,9 @@
   /// Construct Checker and read in configuration for function names.
   NoMallocCheck(StringRef Name, ClangTidyContext *Context)
       : ClangTidyCheck(Name, Context),
-        AllocList(Options.get("Allocations", "::malloc;::calloc")),
-        ReallocList(Options.get("Reallocations", "::realloc")),
-        DeallocList(Options.get("Deallocations", "::free")) {}
+        AllocList(Options.getList("Allocations", "::malloc;::calloc")),
+        ReallocList(Options.getList("Reallocations", "::realloc")),
+        DeallocList(Options.getList("Deallocations", "::free")) {}
 
   bool isLanguageVersionSupported(const LangOptions &LangOpts) const override {
     return LangOpts.CPlusPlus;
Index: clang-tools-extra/clang-tidy/cppcoreguidelines/NarrowingConversionsCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/cppcoreguidelines/NarrowingConversionsCheck.cpp
+++ clang-tools-extra/clang-tidy/cppcoreguidelines/NarrowingConversionsCheck.cpp
@@ -37,7 +37,8 @@
       WarnWithinTemplateInstantiation(
           Options.get("WarnWithinTemplateInstantiation", false)),
       WarnOnEquivalentBitWidth(Options.get("WarnOnEquivalentBitWidth", true)),
-      IgnoreConversionFromTypes(Options.get("IgnoreConversionFromTypes", "")),
+      IgnoreConversionFromTypes(
+          Options.getList("IgnoreConversionFromTypes", "")),
       PedanticMode(Options.get("PedanticMode", false)) {}
 
 void NarrowingConversionsCheck::storeOptions(
Index: clang-tools-extra/clang-tidy/cert/NonTrivialTypesLibcMemoryCallsCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/cert/NonTrivialTypesLibcMemoryCallsCheck.cpp
+++ clang-tools-extra/clang-tidy/cert/NonTrivialTypesLibcMemoryCallsCheck.cpp
@@ -55,9 +55,9 @@
 NonTrivialTypesLibcMemoryCallsCheck::NonTrivialTypesLibcMemoryCallsCheck(
     StringRef Name, ClangTidyContext *Context)
     : ClangTidyCheck(Name, Context),
-      MemSetNames(Options.get("MemSetNames", "")),
-      MemCpyNames(Options.get("MemCpyNames", "")),
-      MemCmpNames(Options.get("MemCmpNames", "")) {}
+      MemSetNames(Options.getList("MemSetNames", "")),
+      MemCpyNames(Options.getList("MemCpyNames", "")),
+      MemCmpNames(Options.getList("MemCmpNames", "")) {}
 
 void NonTrivialTypesLibcMemoryCallsCheck::storeOptions(
     ClangTidyOptions::OptionMap &Opts) {
Index: clang-tools-extra/clang-tidy/bugprone/UnusedReturnValueCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/bugprone/UnusedReturnValueCheck.cpp
+++ clang-tools-extra/clang-tidy/bugprone/UnusedReturnValueCheck.cpp
@@ -35,98 +35,98 @@
 UnusedReturnValueCheck::UnusedReturnValueCheck(llvm::StringRef Name,
                                                ClangTidyContext *Context)
     : ClangTidyCheck(Name, Context),
-      CheckedFunctions(Options.get("CheckedFunctions",
-                                   "::std::async;"
-                                   "::std::launder;"
-                                   "::std::remove;"
-                                   "::std::remove_if;"
-                                   "::std::unique;"
-                                   "::std::unique_ptr::release;"
-                                   "::std::basic_string::empty;"
-                                   "::std::vector::empty;"
-                                   "::std::back_inserter;"
-                                   "::std::distance;"
-                                   "::std::find;"
-                                   "::std::find_if;"
-                                   "::std::inserter;"
-                                   "::std::lower_bound;"
-                                   "::std::make_pair;"
-                                   "::std::map::count;"
-                                   "::std::map::find;"
-                                   "::std::map::lower_bound;"
-                                   "::std::multimap::equal_range;"
-                                   "::std::multimap::upper_bound;"
-                                   "::std::set::count;"
-                                   "::std::set::find;"
-                                   "::std::setfill;"
-                                   "::std::setprecision;"
-                                   "::std::setw;"
-                                   "::std::upper_bound;"
-                                   "::std::vector::at;"
-                                   // C standard library
-                                   "::bsearch;"
-                                   "::ferror;"
-                                   "::feof;"
-                                   "::isalnum;"
-                                   "::isalpha;"
-                                   "::isblank;"
-                                   "::iscntrl;"
-                                   "::isdigit;"
-                                   "::isgraph;"
-                                   "::islower;"
-                                   "::isprint;"
-                                   "::ispunct;"
-                                   "::isspace;"
-                                   "::isupper;"
-                                   "::iswalnum;"
-                                   "::iswprint;"
-                                   "::iswspace;"
-                                   "::isxdigit;"
-                                   "::memchr;"
-                                   "::memcmp;"
-                                   "::strcmp;"
-                                   "::strcoll;"
-                                   "::strncmp;"
-                                   "::strpbrk;"
-                                   "::strrchr;"
-                                   "::strspn;"
-                                   "::strstr;"
-                                   "::wcscmp;"
-                                   // POSIX
-                                   "::access;"
-                                   "::bind;"
-                                   "::connect;"
-                                   "::difftime;"
-                                   "::dlsym;"
-                                   "::fnmatch;"
-                                   "::getaddrinfo;"
-                                   "::getopt;"
-                                   "::htonl;"
-                                   "::htons;"
-                                   "::iconv_open;"
-                                   "::inet_addr;"
-                                   "::isascii;"
-                                   "::isatty;"
-                                   "::mmap;"
-                                   "::newlocale;"
-                                   "::openat;"
-                                   "::pathconf;"
-                                   "::pthread_equal;"
-                                   "::pthread_getspecific;"
-                                   "::pthread_mutex_trylock;"
-                                   "::readdir;"
-                                   "::readlink;"
-                                   "::recvmsg;"
-                                   "::regexec;"
-                                   "::scandir;"
-                                   "::semget;"
-                                   "::setjmp;"
-                                   "::shm_open;"
-                                   "::shmget;"
-                                   "::sigismember;"
-                                   "::strcasecmp;"
-                                   "::strsignal;"
-                                   "::ttyname")) {}
+      CheckedFunctions(Options.getList("CheckedFunctions",
+                                       "::std::async;"
+                                       "::std::launder;"
+                                       "::std::remove;"
+                                       "::std::remove_if;"
+                                       "::std::unique;"
+                                       "::std::unique_ptr::release;"
+                                       "::std::basic_string::empty;"
+                                       "::std::vector::empty;"
+                                       "::std::back_inserter;"
+                                       "::std::distance;"
+                                       "::std::find;"
+                                       "::std::find_if;"
+                                       "::std::inserter;"
+                                       "::std::lower_bound;"
+                                       "::std::make_pair;"
+                                       "::std::map::count;"
+                                       "::std::map::find;"
+                                       "::std::map::lower_bound;"
+                                       "::std::multimap::equal_range;"
+                                       "::std::multimap::upper_bound;"
+                                       "::std::set::count;"
+                                       "::std::set::find;"
+                                       "::std::setfill;"
+                                       "::std::setprecision;"
+                                       "::std::setw;"
+                                       "::std::upper_bound;"
+                                       "::std::vector::at;"
+                                       // C standard library
+                                       "::bsearch;"
+                                       "::ferror;"
+                                       "::feof;"
+                                       "::isalnum;"
+                                       "::isalpha;"
+                                       "::isblank;"
+                                       "::iscntrl;"
+                                       "::isdigit;"
+                                       "::isgraph;"
+                                       "::islower;"
+                                       "::isprint;"
+                                       "::ispunct;"
+                                       "::isspace;"
+                                       "::isupper;"
+                                       "::iswalnum;"
+                                       "::iswprint;"
+                                       "::iswspace;"
+                                       "::isxdigit;"
+                                       "::memchr;"
+                                       "::memcmp;"
+                                       "::strcmp;"
+                                       "::strcoll;"
+                                       "::strncmp;"
+                                       "::strpbrk;"
+                                       "::strrchr;"
+                                       "::strspn;"
+                                       "::strstr;"
+                                       "::wcscmp;"
+                                       // POSIX
+                                       "::access;"
+                                       "::bind;"
+                                       "::connect;"
+                                       "::difftime;"
+                                       "::dlsym;"
+                                       "::fnmatch;"
+                                       "::getaddrinfo;"
+                                       "::getopt;"
+                                       "::htonl;"
+                                       "::htons;"
+                                       "::iconv_open;"
+                                       "::inet_addr;"
+                                       "::isascii;"
+                                       "::isatty;"
+                                       "::mmap;"
+                                       "::newlocale;"
+                                       "::openat;"
+                                       "::pathconf;"
+                                       "::pthread_equal;"
+                                       "::pthread_getspecific;"
+                                       "::pthread_mutex_trylock;"
+                                       "::readdir;"
+                                       "::readlink;"
+                                       "::recvmsg;"
+                                       "::regexec;"
+                                       "::scandir;"
+                                       "::semget;"
+                                       "::setjmp;"
+                                       "::shm_open;"
+                                       "::shmget;"
+                                       "::sigismember;"
+                                       "::strcasecmp;"
+                                       "::strsignal;"
+                                       "::ttyname")) {}
 
 void UnusedReturnValueCheck::storeOptions(ClangTidyOptions::OptionMap &Opts) {
   Options.store(Opts, "CheckedFunctions", CheckedFunctions);
Index: clang-tools-extra/clang-tidy/bugprone/SuspiciousStringCompareCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/bugprone/SuspiciousStringCompareCheck.cpp
+++ clang-tools-extra/clang-tidy/bugprone/SuspiciousStringCompareCheck.cpp
@@ -73,7 +73,7 @@
       WarnOnLogicalNotComparison(
           Options.get("WarnOnLogicalNotComparison", false)),
       StringCompareLikeFunctions(
-          Options.get("StringCompareLikeFunctions", "")) {}
+          Options.getList("StringCompareLikeFunctions", "")) {}
 
 void SuspiciousStringCompareCheck::storeOptions(
     ClangTidyOptions::OptionMap &Opts) {
Index: clang-tools-extra/clang-tidy/bugprone/SuspiciousIncludeCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/bugprone/SuspiciousIncludeCheck.cpp
+++ clang-tools-extra/clang-tidy/bugprone/SuspiciousIncludeCheck.cpp
@@ -38,7 +38,7 @@
 SuspiciousIncludeCheck::SuspiciousIncludeCheck(StringRef Name,
                                                ClangTidyContext *Context)
     : ClangTidyCheck(Name, Context),
-      RawStringHeaderFileExtensions(Options.getLocalOrGlobal(
+      RawStringHeaderFileExtensions(Options.getLocalOrGlobalList(
           "HeaderFileExtensions", utils::defaultHeaderFileExtensions())),
       RawStringImplementationFileExtensions(Options.getLocalOrGlobal(
           "ImplementationFileExtensions",
Index: clang-tools-extra/clang-tidy/bugprone/StringConstructorCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/bugprone/StringConstructorCheck.cpp
+++ clang-tools-extra/clang-tidy/bugprone/StringConstructorCheck.cpp
@@ -48,7 +48,7 @@
       WarnOnLargeLength(Options.get("WarnOnLargeLength", true)),
       LargeLengthThreshold(Options.get("LargeLengthThreshold", 0x800000)),
       StringNames(utils::options::parseStringList(
-          Options.get("StringNames", DefaultStringNames))) {}
+          Options.getList("StringNames", DefaultStringNames))) {}
 
 void StringConstructorCheck::storeOptions(ClangTidyOptions::OptionMap &Opts) {
   Options.store(Opts, "WarnOnLargeLength", WarnOnLargeLength);
Index: clang-tools-extra/clang-tidy/bugprone/SignedCharMisuseCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/bugprone/SignedCharMisuseCheck.cpp
+++ clang-tools-extra/clang-tidy/bugprone/SignedCharMisuseCheck.cpp
@@ -23,7 +23,7 @@
 SignedCharMisuseCheck::SignedCharMisuseCheck(StringRef Name,
                                              ClangTidyContext *Context)
     : ClangTidyCheck(Name, Context),
-      CharTypdefsToIgnoreList(Options.get("CharTypdefsToIgnore", "")),
+      CharTypdefsToIgnoreList(Options.getList("CharTypdefsToIgnore", "")),
       DiagnoseSignedUnsignedCharComparisons(
           Options.get("DiagnoseSignedUnsignedCharComparisons", true)) {}
 
Index: clang-tools-extra/clang-tidy/bugprone/ReservedIdentifierCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/bugprone/ReservedIdentifierCheck.cpp
+++ clang-tools-extra/clang-tidy/bugprone/ReservedIdentifierCheck.cpp
@@ -45,7 +45,7 @@
     : RenamerClangTidyCheck(Name, Context),
       Invert(Options.get("Invert", false)),
       AllowedIdentifiers(utils::options::parseStringList(
-          Options.get("AllowedIdentifiers", ""))) {}
+          Options.getList("AllowedIdentifiers", ""))) {}
 
 void ReservedIdentifierCheck::storeOptions(ClangTidyOptions::OptionMap &Opts) {
   RenamerClangTidyCheck::storeOptions(Opts);
Index: clang-tools-extra/clang-tidy/bugprone/EasilySwappableParametersCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/bugprone/EasilySwappableParametersCheck.cpp
+++ clang-tools-extra/clang-tidy/bugprone/EasilySwappableParametersCheck.cpp
@@ -2086,11 +2086,11 @@
     : ClangTidyCheck(Name, Context),
       MinimumLength(clampMinimumLength(
           Options.get("MinimumLength", DefaultMinimumLength))),
-      IgnoredParameterNames(optutils::parseStringList(
-          Options.get("IgnoredParameterNames", DefaultIgnoredParameterNames))),
+      IgnoredParameterNames(optutils::parseStringList(Options.getList(
+          "IgnoredParameterNames", DefaultIgnoredParameterNames))),
       IgnoredParameterTypeSuffixes(optutils::parseStringList(
-          Options.get("IgnoredParameterTypeSuffixes",
-                      DefaultIgnoredParameterTypeSuffixes))),
+          Options.getList("IgnoredParameterTypeSuffixes",
+                          DefaultIgnoredParameterTypeSuffixes))),
       QualifiersMix(Options.get("QualifiersMix", DefaultQualifiersMix)),
       ModelImplicitConversions(Options.get("ModelImplicitConversions",
                                            DefaultModelImplicitConversions)),
Index: clang-tools-extra/clang-tidy/bugprone/DynamicStaticInitializersCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/bugprone/DynamicStaticInitializersCheck.cpp
+++ clang-tools-extra/clang-tidy/bugprone/DynamicStaticInitializersCheck.cpp
@@ -26,11 +26,11 @@
   return false;
 }
 
-DynamicStaticInitializersCheck::DynamicStaticInitializersCheck(StringRef Name,
-                                                               ClangTidyContext *Context)
+DynamicStaticInitializersCheck::DynamicStaticInitializersCheck(
+    StringRef Name, ClangTidyContext *Context)
     : ClangTidyCheck(Name, Context),
-      RawStringHeaderFileExtensions(Options.getLocalOrGlobal(
-        "HeaderFileExtensions", utils::defaultHeaderFileExtensions())) {
+      RawStringHeaderFileExtensions(Options.getLocalOrGlobalList(
+          "HeaderFileExtensions", utils::defaultHeaderFileExtensions())) {
   if (!utils::parseFileExtensions(RawStringHeaderFileExtensions,
                                   HeaderFileExtensions,
                                   utils::defaultFileExtensionDelimiters())) {
Index: clang-tools-extra/clang-tidy/bugprone/DanglingHandleCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/bugprone/DanglingHandleCheck.cpp
+++ clang-tools-extra/clang-tidy/bugprone/DanglingHandleCheck.cpp
@@ -91,7 +91,7 @@
 DanglingHandleCheck::DanglingHandleCheck(StringRef Name,
                                          ClangTidyContext *Context)
     : ClangTidyCheck(Name, Context),
-      HandleClasses(utils::options::parseStringList(Options.get(
+      HandleClasses(utils::options::parseStringList(Options.getList(
           "HandleClasses",
           "std::basic_string_view;std::experimental::basic_string_view"))),
       IsAHandle(cxxRecordDecl(hasAnyName(HandleClasses)).bind("handle")) {}
Index: clang-tools-extra/clang-tidy/bugprone/AssertSideEffectCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/bugprone/AssertSideEffectCheck.cpp
+++ clang-tools-extra/clang-tidy/bugprone/AssertSideEffectCheck.cpp
@@ -79,7 +79,7 @@
       CheckFunctionCalls(Options.get("CheckFunctionCalls", false)),
       RawAssertList(Options.get("AssertMacros", "assert,NSAssert,NSCAssert")),
       IgnoredFunctions(utils::options::parseListPair(
-          "__builtin_expect;", Options.get("IgnoredFunctions", ""))) {
+          "__builtin_expect;", Options.getList("IgnoredFunctions", ""))) {
   StringRef(RawAssertList).split(AssertMacros, ",", -1, false);
 }
 
Index: clang-tools-extra/clang-tidy/android/ComparisonInTempFailureRetryCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/android/ComparisonInTempFailureRetryCheck.cpp
+++ clang-tools-extra/clang-tidy/android/ComparisonInTempFailureRetryCheck.cpp
@@ -21,7 +21,7 @@
 ComparisonInTempFailureRetryCheck::ComparisonInTempFailureRetryCheck(
     StringRef Name, ClangTidyContext *Context)
     : ClangTidyCheck(Name, Context),
-      RawRetryList(Options.get("RetryMacros", "TEMP_FAILURE_RETRY")) {
+      RawRetryList(Options.getList("RetryMacros", "TEMP_FAILURE_RETRY")) {
   StringRef(RawRetryList).split(RetryMacros, ",", -1, false);
 }
 
Index: clang-tools-extra/clang-tidy/abseil/StringFindStrContainsCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/abseil/StringFindStrContainsCheck.cpp
+++ clang-tools-extra/clang-tidy/abseil/StringFindStrContainsCheck.cpp
@@ -86,7 +86,7 @@
     StringRef Name, ClangTidyContext *Context)
     : TransformerClangTidyCheck(Name, Context),
       StringLikeClassesOption(utils::options::parseStringList(
-          Options.get("StringLikeClasses", DefaultStringLikeClasses))),
+          Options.getList("StringLikeClasses", DefaultStringLikeClasses))),
       AbseilStringsMatchHeaderOption(Options.get(
           "AbseilStringsMatchHeader", DefaultAbseilStringsMatchHeader)) {
   setRule(
Index: clang-tools-extra/clang-tidy/abseil/StringFindStartswithCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/abseil/StringFindStartswithCheck.cpp
+++ clang-tools-extra/clang-tidy/abseil/StringFindStartswithCheck.cpp
@@ -25,7 +25,7 @@
                                                      ClangTidyContext *Context)
     : ClangTidyCheck(Name, Context),
       StringLikeClasses(utils::options::parseStringList(
-          Options.get("StringLikeClasses", "::std::basic_string"))),
+          Options.getList("StringLikeClasses", "::std::basic_string"))),
       IncludeInserter(Options.getLocalOrGlobal("IncludeStyle",
                                                utils::IncludeSorter::IS_LLVM),
                       areDiagsSelfContained()),
Index: clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.h
===================================================================
--- clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.h
+++ clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.h
@@ -15,8 +15,9 @@
 #include "clang/Basic/Diagnostic.h"
 #include "clang/Tooling/Core/Diagnostic.h"
 #include "llvm/ADT/DenseMap.h"
-#include "llvm/ADT/StringSet.h"
+#include "llvm/ADT/PointerIntPair.h"
 #include "llvm/Support/Regex.h"
+#include <memory>
 
 namespace clang {
 
@@ -55,6 +56,40 @@
   }
 };
 
+class OptionType {
+public:
+  enum Type { String, Boolean, Unsigned, Signed, List, Custom };
+  OptionType(const OptionType &) = delete;
+  OptionType(OptionType &&) = delete;
+  OptionType &operator=(const OptionType &) = delete;
+  OptionType &operator=(OptionType &&) = delete;
+
+  explicit OptionType(Type T) : Data(nullptr, T){};
+  explicit OptionType(std::unique_ptr<std::vector<StringRef>> EnumValues)
+      : Data(EnumValues.release(), Custom) {}
+
+  Type getType() const { return Data.getInt(); }
+  bool hasEnum() const {
+    return getType() == Custom && Data.getPointer() != nullptr;
+  }
+
+  ArrayRef<StringRef> getEnumValue() const {
+    assert(hasEnum());
+    return *Data.getPointer();
+  }
+
+  ~OptionType() {
+    if (hasEnum()) {
+      delete Data.getPointer();
+    }
+  }
+
+private:
+  llvm::PointerIntPair<std::vector<StringRef> *, 3, Type> Data;
+};
+
+using OptionsCollection = llvm::StringMap<OptionType>;
+
 /// Every \c ClangTidyCheck reports errors through a \c DiagnosticsEngine
 /// provided by this context.
 ///
@@ -202,10 +237,10 @@
             DiagEngine->getDiagnosticIDs()->getDescription(DiagnosticID)));
   }
 
-  void setOptionsCollector(llvm::StringSet<> *Collector) {
+  void setOptionsCollector(OptionsCollection *Collector) {
     OptionsCollector = Collector;
   }
-  llvm::StringSet<> *getOptionsCollector() const { return OptionsCollector; }
+  OptionsCollection *getOptionsCollector() const { return OptionsCollector; }
 
 private:
   // Writes to Stats.
@@ -236,7 +271,7 @@
   bool SelfContainedDiags;
 
   NoLintDirectiveHandler NoLintHandler;
-  llvm::StringSet<> *OptionsCollector = nullptr;
+  OptionsCollection *OptionsCollector = nullptr;
 };
 
 /// Gets the Fix attached to \p Diagnostic.
Index: clang-tools-extra/clang-tidy/ClangTidyCheck.h
===================================================================
--- clang-tools-extra/clang-tidy/ClangTidyCheck.h
+++ clang-tools-extra/clang-tidy/ClangTidyCheck.h
@@ -164,6 +164,9 @@
     /// \p Default.
     StringRef get(StringRef LocalName, StringRef Default) const;
 
+    StringRef getList(StringRef LocalName, StringRef Default) const;
+    llvm::Optional<StringRef> getList(StringRef LocalName) const;
+
     /// Read a named option from the ``Context``.
     ///
     /// Reads the option with the check-local name \p LocalName from local or
@@ -172,6 +175,8 @@
     /// present either, return ``None``.
     llvm::Optional<StringRef> getLocalOrGlobal(StringRef LocalName) const;
 
+    llvm::Optional<StringRef> getLocalOrGlobalList(StringRef LocalName) const;
+
     /// Read a named option from the ``Context``.
     ///
     /// Reads the option with the check-local name \p LocalName from local or
@@ -179,6 +184,8 @@
     /// present, falls back to get global option. If global option is not
     /// present either, returns \p Default.
     StringRef getLocalOrGlobal(StringRef LocalName, StringRef Default) const;
+    StringRef getLocalOrGlobalList(StringRef LocalName,
+                                   StringRef Default) const;
 
     /// Read a named option from the ``Context`` and parse it as an
     /// integral type ``T``.
@@ -192,7 +199,9 @@
     template <typename T>
     std::enable_if_t<std::is_integral<T>::value, llvm::Optional<T>>
     get(StringRef LocalName) const {
-      if (llvm::Optional<StringRef> Value = get(LocalName)) {
+      if (llvm::Optional<StringRef> Value = getInternal(
+              LocalName, std::is_signed_v<T> ? OptionType::Signed
+                                             : OptionType::Unsigned)) {
         T Result{};
         if (!StringRef(*Value).getAsInteger(10, Result))
           return Result;
@@ -229,11 +238,13 @@
     template <typename T>
     std::enable_if_t<std::is_integral<T>::value, llvm::Optional<T>>
     getLocalOrGlobal(StringRef LocalName) const {
-      llvm::Optional<StringRef> ValueOr = get(LocalName);
+      static constexpr OptionType::Type Type =
+          std::is_signed_v<T> ? OptionType::Signed : OptionType::Unsigned;
+      llvm::Optional<StringRef> ValueOr = getInternal(LocalName, Type);
       bool IsGlobal = false;
       if (!ValueOr) {
         IsGlobal = true;
-        ValueOr = getLocalOrGlobal(LocalName);
+        ValueOr = getInternalGlobal(LocalName, Type);
         if (!ValueOr)
           return None;
       }
@@ -399,7 +410,10 @@
     void storeInt(ClangTidyOptions::OptionMap &Options, StringRef LocalName,
                   int64_t Value) const;
 
-
+    Optional<StringRef> getInternal(StringRef Name,
+                                    OptionType::Type Type) const;
+    Optional<StringRef> getInternalGlobal(StringRef Name,
+                                          OptionType::Type Type) const;
     std::string NamePrefix;
     const ClangTidyOptions::OptionMap &CheckOptions;
     ClangTidyContext *Context;
Index: clang-tools-extra/clang-tidy/ClangTidyCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/ClangTidyCheck.cpp
+++ clang-tools-extra/clang-tidy/ClangTidyCheck.cpp
@@ -7,6 +7,8 @@
 //===----------------------------------------------------------------------===//
 
 #include "ClangTidyCheck.h"
+#include "ClangTidyDiagnosticConsumer.h"
+#include "llvm/ADT/STLExtras.h"
 #include "llvm/ADT/SmallString.h"
 #include "llvm/ADT/StringRef.h"
 #include "llvm/Support/Error.h"
@@ -52,22 +54,29 @@
       Context(Context) {}
 
 llvm::Optional<StringRef>
-ClangTidyCheck::OptionsView::get(StringRef LocalName) const {
+ClangTidyCheck::OptionsView::getInternal(StringRef LocalName,
+                                         OptionType::Type Type) const {
   if (Context->getOptionsCollector())
-    Context->getOptionsCollector()->insert((NamePrefix + LocalName).str());
+    Context->getOptionsCollector()->try_emplace((NamePrefix + LocalName).str(),
+                                                Type);
   const auto &Iter = CheckOptions.find((NamePrefix + LocalName).str());
   if (Iter != CheckOptions.end())
     return StringRef(Iter->getValue().Value);
   return None;
 }
 
+llvm::Optional<StringRef>
+ClangTidyCheck::OptionsView::get(StringRef LocalName) const {
+  return getInternal(LocalName, OptionType::String);
+}
+
 static ClangTidyOptions::OptionMap::const_iterator
 findPriorityOption(const ClangTidyOptions::OptionMap &Options,
                    StringRef NamePrefix, StringRef LocalName,
-                   llvm::StringSet<> *Collector) {
+                   OptionsCollection *Collector, OptionType::Type Type) {
   if (Collector) {
-    Collector->insert((NamePrefix + LocalName).str());
-    Collector->insert(LocalName);
+    Collector->try_emplace((NamePrefix + LocalName).str(), Type);
+    Collector->try_emplace(LocalName, Type);
   }
   auto IterLocal = Options.find((NamePrefix + LocalName).str());
   auto IterGlobal = Options.find(LocalName);
@@ -81,16 +90,27 @@
 }
 
 llvm::Optional<StringRef>
-ClangTidyCheck::OptionsView::getLocalOrGlobal(StringRef LocalName) const {
+ClangTidyCheck::OptionsView::getInternalGlobal(StringRef LocalName,
+                                               OptionType::Type Type) const {
+
   auto Iter = findPriorityOption(CheckOptions, NamePrefix, LocalName,
-                                 Context->getOptionsCollector());
+                                 Context->getOptionsCollector(), Type);
   if (Iter != CheckOptions.end())
     return StringRef(Iter->getValue().Value);
   return None;
 }
 
-static Optional<bool> getAsBool(StringRef Value,
-                                const llvm::Twine &LookupName) {
+llvm::Optional<StringRef>
+ClangTidyCheck::OptionsView::getLocalOrGlobal(StringRef LocalName) const {
+  return getInternalGlobal(LocalName, OptionType::String);
+}
+
+llvm::Optional<StringRef>
+ClangTidyCheck::OptionsView::getLocalOrGlobalList(StringRef LocalName) const {
+  return getInternalGlobal(LocalName, OptionType::List);
+}
+
+static Optional<bool> getAsBool(StringRef Value) {
 
   if (llvm::Optional<bool> Parsed = llvm::yaml::parseBool(Value))
     return *Parsed;
@@ -105,8 +125,9 @@
 template <>
 llvm::Optional<bool>
 ClangTidyCheck::OptionsView::get<bool>(StringRef LocalName) const {
-  if (llvm::Optional<StringRef> ValueOr = get(LocalName)) {
-    if (auto Result = getAsBool(*ValueOr, NamePrefix + LocalName))
+  if (llvm::Optional<StringRef> ValueOr =
+          getInternal(LocalName, OptionType::Boolean)) {
+    if (auto Result = getAsBool(*ValueOr))
       return Result;
     diagnoseBadBooleanOption(NamePrefix + LocalName, *ValueOr);
   }
@@ -116,10 +137,11 @@
 template <>
 llvm::Optional<bool>
 ClangTidyCheck::OptionsView::getLocalOrGlobal<bool>(StringRef LocalName) const {
-  auto Iter = findPriorityOption(CheckOptions, NamePrefix, LocalName,
-                                 Context->getOptionsCollector());
+  auto Iter =
+      findPriorityOption(CheckOptions, NamePrefix, LocalName,
+                         Context->getOptionsCollector(), OptionType::Boolean);
   if (Iter != CheckOptions.end()) {
-    if (auto Result = getAsBool(Iter->getValue().Value, Iter->getKey()))
+    if (auto Result = getAsBool(Iter->getValue().Value))
       return Result;
     diagnoseBadBooleanOption(Iter->getKey(), Iter->getValue().Value);
   }
@@ -148,11 +170,19 @@
 llvm::Optional<int64_t> ClangTidyCheck::OptionsView::getEnumInt(
     StringRef LocalName, ArrayRef<NameAndValue> Mapping, bool CheckGlobal,
     bool IgnoreCase) const {
-  if (!CheckGlobal && Context->getOptionsCollector())
-    Context->getOptionsCollector()->insert((NamePrefix + LocalName).str());
+  if (Context->getOptionsCollector()) {
+    auto ItemRange = llvm::make_second_range(Mapping);
+    auto Items = std::make_unique<std::vector<StringRef>>(ItemRange.begin(),
+                                                          ItemRange.end());
+    if (CheckGlobal)
+      Context->getOptionsCollector()->try_emplace(
+          LocalName, std::make_unique<std::vector<StringRef>>(*Items.get()));
+    Context->getOptionsCollector()->try_emplace((NamePrefix + LocalName).str(),
+                                                std::move(Items));
+  }
   auto Iter = CheckGlobal
                   ? findPriorityOption(CheckOptions, NamePrefix, LocalName,
-                                       Context->getOptionsCollector())
+                                       nullptr, OptionType::Custom)
                   : CheckOptions.find((NamePrefix + LocalName).str());
   if (Iter == CheckOptions.end())
     return None;
@@ -224,5 +254,21 @@
                                               StringRef Default) const {
   return getLocalOrGlobal(LocalName).value_or(Default);
 }
+
+StringRef
+ClangTidyCheck::OptionsView::getLocalOrGlobalList(StringRef LocalName,
+                                                  StringRef Default) const {
+  return getLocalOrGlobalList(LocalName).value_or(Default);
+}
+
+StringRef ClangTidyCheck::OptionsView::getList(StringRef LocalName,
+                                               StringRef Default) const {
+  return getList(LocalName).value_or(Default);
+}
+
+llvm::Optional<StringRef>
+ClangTidyCheck::OptionsView::getList(StringRef LocalName) const {
+  return getInternal(LocalName, OptionType::List);
+}
 } // namespace tidy
 } // namespace clang
Index: clang-tools-extra/clang-tidy/ClangTidy.h
===================================================================
--- clang-tools-extra/clang-tidy/ClangTidy.h
+++ clang-tools-extra/clang-tidy/ClangTidy.h
@@ -60,11 +60,12 @@
 
 struct NamesAndOptions {
   llvm::StringSet<> Names;
-  llvm::StringSet<> Options;
+  OptionsCollection Options;
 };
 
 NamesAndOptions
-getAllChecksAndOptions(bool AllowEnablingAnalyzerAlphaCheckers = true);
+getAllChecksAndOptions(StringRef EnabledChecks = "*",
+                       bool AllowEnablingAnalyzerAlphaCheckers = true);
 
 /// Returns the effective check-specific options.
 ///
Index: clang-tools-extra/clang-tidy/ClangTidy.cpp
===================================================================
--- clang-tools-extra/clang-tidy/ClangTidy.cpp
+++ clang-tools-extra/clang-tidy/ClangTidy.cpp
@@ -624,10 +624,11 @@
 }
 
 NamesAndOptions
-getAllChecksAndOptions(bool AllowEnablingAnalyzerAlphaCheckers) {
+getAllChecksAndOptions(StringRef EnabledChecks,
+                       bool AllowEnablingAnalyzerAlphaCheckers) {
   NamesAndOptions Result;
   ClangTidyOptions Opts;
-  Opts.Checks = "*";
+  Opts.Checks.emplace(EnabledChecks);
   clang::tidy::ClangTidyContext Context(
       std::make_unique<DefaultOptionsProvider>(ClangTidyGlobalOptions(), Opts),
       AllowEnablingAnalyzerAlphaCheckers);
@@ -653,7 +654,8 @@
 
   Context.setOptionsCollector(&Result.Options);
   for (const auto &Factory : Factories) {
-    Factory.getValue()(Factory.getKey(), &Context);
+    if (Context.isCheckEnabled(Factory.getKey()))
+      Factory.getValue()(Factory.getKey(), &Context);
   }
 
   return Result;
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to