Author: Nathan James Date: 2020-06-29T09:44:11+01:00 New Revision: e34523c87c3f1cfabcf741568dede026bbb12d3a
URL: https://github.com/llvm/llvm-project/commit/e34523c87c3f1cfabcf741568dede026bbb12d3a DIFF: https://github.com/llvm/llvm-project/commit/e34523c87c3f1cfabcf741568dede026bbb12d3a.diff LOG: Revert "[clang-tidy] relanding b9306fd" This reverts commit 37cc4fa2eaa3d03ca8cd4947eb0d4c60e3c9b45c. More investigation needed Added: Modified: clang-tools-extra/clang-tidy/ClangTidyCheck.cpp clang-tools-extra/clang-tidy/ClangTidyCheck.h clang-tools-extra/clang-tidy/abseil/StringFindStartswithCheck.cpp clang-tools-extra/clang-tidy/cppcoreguidelines/InitVariablesCheck.cpp clang-tools-extra/clang-tidy/cppcoreguidelines/ProBoundsConstantArrayIndexCheck.cpp clang-tools-extra/clang-tidy/modernize/LoopConvertCheck.cpp clang-tools-extra/clang-tidy/modernize/MakeSmartPtrCheck.cpp clang-tools-extra/clang-tidy/modernize/PassByValueCheck.cpp clang-tools-extra/clang-tidy/modernize/ReplaceAutoPtrCheck.cpp clang-tools-extra/clang-tidy/modernize/ReplaceRandomShuffleCheck.cpp clang-tools-extra/clang-tidy/performance/MoveConstructorInitCheck.cpp clang-tools-extra/clang-tidy/performance/TypePromotionInMathFnCheck.cpp clang-tools-extra/clang-tidy/performance/UnnecessaryValueParamCheck.cpp clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.cpp clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.h clang-tools-extra/clang-tidy/utils/IncludeSorter.cpp clang-tools-extra/clang-tidy/utils/IncludeSorter.h clang-tools-extra/clang-tidy/utils/TransformerClangTidyCheck.cpp clang-tools-extra/unittests/clang-tidy/ClangTidyDiagnosticConsumerTest.cpp clang-tools-extra/unittests/clang-tidy/ClangTidyOptionsTest.cpp Removed: ################################################################################ diff --git a/clang-tools-extra/clang-tidy/ClangTidyCheck.cpp b/clang-tools-extra/clang-tidy/ClangTidyCheck.cpp index 39c049948809..7ddf054a21a9 100644 --- a/clang-tools-extra/clang-tidy/ClangTidyCheck.cpp +++ b/clang-tools-extra/clang-tidy/ClangTidyCheck.cpp @@ -158,7 +158,7 @@ void ClangTidyCheck::OptionsView::store(ClangTidyOptions::OptionMap &Options, } llvm::Expected<int64_t> ClangTidyCheck::OptionsView::getEnumInt( - StringRef LocalName, ArrayRef<std::pair<int64_t, StringRef>> Mapping, + StringRef LocalName, ArrayRef<std::pair<StringRef, int64_t>> Mapping, bool CheckGlobal, bool IgnoreCase) { auto Iter = CheckOptions.find((NamePrefix + LocalName).str()); if (CheckGlobal && Iter == CheckOptions.end()) @@ -171,19 +171,19 @@ llvm::Expected<int64_t> ClangTidyCheck::OptionsView::getEnumInt( unsigned EditDistance = -1; for (const auto &NameAndEnum : Mapping) { if (IgnoreCase) { - if (Value.equals_lower(NameAndEnum.second)) - return NameAndEnum.first; - } else if (Value.equals(NameAndEnum.second)) { - return NameAndEnum.first; - } else if (Value.equals_lower(NameAndEnum.second)) { - Closest = NameAndEnum.second; + if (Value.equals_lower(NameAndEnum.first)) + return NameAndEnum.second; + } else if (Value.equals(NameAndEnum.first)) { + return NameAndEnum.second; + } else if (Value.equals_lower(NameAndEnum.first)) { + Closest = NameAndEnum.first; EditDistance = 0; continue; } - unsigned Distance = Value.edit_distance(NameAndEnum.second); + unsigned Distance = Value.edit_distance(NameAndEnum.first); if (Distance < EditDistance) { EditDistance = Distance; - Closest = NameAndEnum.second; + Closest = NameAndEnum.first; } } if (EditDistance < 3) diff --git a/clang-tools-extra/clang-tidy/ClangTidyCheck.h b/clang-tools-extra/clang-tidy/ClangTidyCheck.h index 84ad16c9eea8..84438c21a30b 100644 --- a/clang-tools-extra/clang-tidy/ClangTidyCheck.h +++ b/clang-tools-extra/clang-tidy/ClangTidyCheck.h @@ -27,13 +27,6 @@ class CompilerInstance; namespace tidy { -/// This class should be specialized by any enum type that needs to be converted -/// to and from an \ref llvm::StringRef. -template <class T> struct OptionEnumMapping { - // Specializations of this struct must implement this function. - static ArrayRef<std::pair<T, StringRef>> getEnumMapping() = delete; -}; - template <typename T> class OptionError : public llvm::ErrorInfo<T> { std::error_code convertToErrorCode() const override { return llvm::inconvertibleErrorCode(); @@ -320,38 +313,36 @@ class ClangTidyCheck : public ast_matchers::MatchFinder::MatchCallback { } /// Read a named option from the ``Context`` and parse it as an - /// enum type ``T``. + /// enum type ``T`` using the \p Mapping provided. If \p IgnoreCase is set, + /// it will search the mapping ignoring the case. /// /// Reads the option with the check-local name \p LocalName from the /// ``CheckOptions``. If the corresponding key is not present, returns a /// ``MissingOptionError``. If the key can't be parsed as a ``T`` returns a /// ``UnparseableEnumOptionError``. - /// - /// \ref clang::tidy::OptionEnumMapping must be specialized for ``T`` to - /// supply the mapping required to convert between ``T`` and a string. template <typename T> std::enable_if_t<std::is_enum<T>::value, llvm::Expected<T>> - get(StringRef LocalName, bool IgnoreCase = false) { - if (llvm::Expected<int64_t> ValueOr = - getEnumInt(LocalName, typeEraseMapping<T>(), false, IgnoreCase)) + get(StringRef LocalName, ArrayRef<std::pair<StringRef, T>> Mapping, + bool IgnoreCase = false) { + if (llvm::Expected<int64_t> ValueOr = getEnumInt( + LocalName, typeEraseMapping(Mapping), false, IgnoreCase)) return static_cast<T>(*ValueOr); else return std::move(ValueOr.takeError()); } /// Read a named option from the ``Context`` and parse it as an - /// enum type ``T``. + /// enum type ``T`` using the \p Mapping provided. If \p IgnoreCase is set, + /// it will search the mapping ignoring the case. /// /// Reads the option with the check-local name \p LocalName from the /// ``CheckOptions``. If the corresponding key is not present or it can't be /// parsed as a ``T``, returns \p Default. - /// - /// \ref clang::tidy::OptionEnumMapping must be specialized for ``T`` to - /// supply the mapping required to convert between ``T`` and a string. template <typename T> std::enable_if_t<std::is_enum<T>::value, T> - get(StringRef LocalName, T Default, bool IgnoreCase = false) { - if (auto ValueOr = get<T>(LocalName, IgnoreCase)) + get(StringRef LocalName, ArrayRef<std::pair<StringRef, T>> Mapping, + T Default, bool IgnoreCase = false) { + if (auto ValueOr = get(LocalName, Mapping, IgnoreCase)) return *ValueOr; else logErrToStdErr(ValueOr.takeError()); @@ -359,41 +350,40 @@ class ClangTidyCheck : public ast_matchers::MatchFinder::MatchCallback { } /// Read a named option from the ``Context`` and parse it as an - /// enum type ``T``. + /// enum type ``T`` using the \p Mapping provided. If \p IgnoreCase is set, + /// it will search the mapping ignoring the case. /// /// Reads the option with the check-local name \p LocalName from local or /// global ``CheckOptions``. Gets local option first. If local is not /// present, falls back to get global option. If global option is not /// present either, returns a ``MissingOptionError``. If the key can't be /// parsed as a ``T`` returns a ``UnparseableEnumOptionError``. - /// - /// \ref clang::tidy::OptionEnumMapping must be specialized for ``T`` to - /// supply the mapping required to convert between ``T`` and a string. template <typename T> std::enable_if_t<std::is_enum<T>::value, llvm::Expected<T>> getLocalOrGlobal(StringRef LocalName, + ArrayRef<std::pair<StringRef, T>> Mapping, bool IgnoreCase = false) { - if (llvm::Expected<int64_t> ValueOr = - getEnumInt(LocalName, typeEraseMapping<T>(), true, IgnoreCase)) + if (llvm::Expected<int64_t> ValueOr = getEnumInt( + LocalName, typeEraseMapping(Mapping), true, IgnoreCase)) return static_cast<T>(*ValueOr); else return std::move(ValueOr.takeError()); } /// Read a named option from the ``Context`` and parse it as an - /// enum type ``T``. + /// enum type ``T`` using the \p Mapping provided. If \p IgnoreCase is set, + /// it will search the mapping ignoring the case. /// /// Reads the option with the check-local name \p LocalName from local or /// global ``CheckOptions``. Gets local option first. If local is not /// present, falls back to get global option. If global option is not /// present either or it can't be parsed as a ``T``, returns \p Default. - /// - /// \ref clang::tidy::OptionEnumMapping must be specialized for ``T`` to - /// supply the mapping required to convert between ``T`` and a string. template <typename T> std::enable_if_t<std::is_enum<T>::value, T> - getLocalOrGlobal(StringRef LocalName, T Default, bool IgnoreCase = false) { - if (auto ValueOr = getLocalOrGlobal<T>(LocalName, IgnoreCase)) + getLocalOrGlobal(StringRef LocalName, + ArrayRef<std::pair<StringRef, T>> Mapping, T Default, + bool IgnoreCase = false) { + if (auto ValueOr = getLocalOrGlobal(LocalName, Mapping, IgnoreCase)) return *ValueOr; else logErrToStdErr(ValueOr.takeError()); @@ -411,25 +401,21 @@ class ClangTidyCheck : public ast_matchers::MatchFinder::MatchCallback { int64_t Value) const; /// Stores an option with the check-local name \p LocalName as the string - /// representation of the Enum \p Value to \p Options. - /// - /// \ref clang::tidy::OptionEnumMapping must be specialized for ``T`` to - /// supply the mapping required to convert between ``T`` and a string. + /// representation of the Enum \p Value using the \p Mapping to \p Options. template <typename T> std::enable_if_t<std::is_enum<T>::value> - store(ClangTidyOptions::OptionMap &Options, StringRef LocalName, T Value) { - ArrayRef<std::pair<T, StringRef>> Mapping = - OptionEnumMapping<T>::getEnumMapping(); + store(ClangTidyOptions::OptionMap &Options, StringRef LocalName, T Value, + ArrayRef<std::pair<StringRef, T>> Mapping) { auto Iter = llvm::find_if( - Mapping, [&](const std::pair<T, StringRef> &NameAndEnum) { - return NameAndEnum.first == Value; + Mapping, [&](const std::pair<StringRef, T> &NameAndEnum) { + return NameAndEnum.second == Value; }); assert(Iter != Mapping.end() && "Unknown Case Value"); - store(Options, LocalName, Iter->second); + store(Options, LocalName, Iter->first); } private: - using NameAndValue = std::pair<int64_t, StringRef>; + using NameAndValue = std::pair<StringRef, int64_t>; llvm::Expected<int64_t> getEnumInt(StringRef LocalName, ArrayRef<NameAndValue> Mapping, @@ -437,14 +423,12 @@ class ClangTidyCheck : public ast_matchers::MatchFinder::MatchCallback { template <typename T> std::enable_if_t<std::is_enum<T>::value, std::vector<NameAndValue>> - typeEraseMapping() { - ArrayRef<std::pair<T, StringRef>> Mapping = - OptionEnumMapping<T>::getEnumMapping(); + typeEraseMapping(ArrayRef<std::pair<StringRef, T>> Mapping) { std::vector<NameAndValue> Result; Result.reserve(Mapping.size()); for (auto &MappedItem : Mapping) { - Result.emplace_back(static_cast<int64_t>(MappedItem.first), - MappedItem.second); + Result.emplace_back(MappedItem.first, + static_cast<int64_t>(MappedItem.second)); } return Result; } diff --git a/clang-tools-extra/clang-tidy/abseil/StringFindStartswithCheck.cpp b/clang-tools-extra/clang-tidy/abseil/StringFindStartswithCheck.cpp index 7a8b71da6100..9539e28cd790 100644 --- a/clang-tools-extra/clang-tidy/abseil/StringFindStartswithCheck.cpp +++ b/clang-tools-extra/clang-tidy/abseil/StringFindStartswithCheck.cpp @@ -27,6 +27,7 @@ StringFindStartswithCheck::StringFindStartswithCheck(StringRef Name, StringLikeClasses(utils::options::parseStringList( Options.get("StringLikeClasses", "::std::basic_string"))), IncludeStyle(Options.getLocalOrGlobal("IncludeStyle", + utils::IncludeSorter::getMapping(), utils::IncludeSorter::IS_LLVM)), AbseilStringsMatchHeader( Options.get("AbseilStringsMatchHeader", "absl/strings/match.h")) {} @@ -121,7 +122,8 @@ void StringFindStartswithCheck::storeOptions( ClangTidyOptions::OptionMap &Opts) { Options.store(Opts, "StringLikeClasses", utils::options::serializeStringList(StringLikeClasses)); - Options.store(Opts, "IncludeStyle", IncludeStyle); + Options.store(Opts, "IncludeStyle", IncludeStyle, + utils::IncludeSorter::getMapping()); Options.store(Opts, "AbseilStringsMatchHeader", AbseilStringsMatchHeader); } diff --git a/clang-tools-extra/clang-tidy/cppcoreguidelines/InitVariablesCheck.cpp b/clang-tools-extra/clang-tidy/cppcoreguidelines/InitVariablesCheck.cpp index 0864bb5f451d..608df8a0ab44 100644 --- a/clang-tools-extra/clang-tidy/cppcoreguidelines/InitVariablesCheck.cpp +++ b/clang-tools-extra/clang-tidy/cppcoreguidelines/InitVariablesCheck.cpp @@ -25,11 +25,13 @@ InitVariablesCheck::InitVariablesCheck(StringRef Name, ClangTidyContext *Context) : ClangTidyCheck(Name, Context), IncludeStyle(Options.getLocalOrGlobal("IncludeStyle", + utils::IncludeSorter::getMapping(), utils::IncludeSorter::IS_LLVM)), MathHeader(Options.get("MathHeader", "math.h")) {} void InitVariablesCheck::storeOptions(ClangTidyOptions::OptionMap &Opts) { - Options.store(Opts, "IncludeStyle", IncludeStyle); + Options.store(Opts, "IncludeStyle", IncludeStyle, + utils::IncludeSorter::getMapping()); Options.store(Opts, "MathHeader", MathHeader); } diff --git a/clang-tools-extra/clang-tidy/cppcoreguidelines/ProBoundsConstantArrayIndexCheck.cpp b/clang-tools-extra/clang-tidy/cppcoreguidelines/ProBoundsConstantArrayIndexCheck.cpp index dd0bedd742a4..b48511287f88 100644 --- a/clang-tools-extra/clang-tidy/cppcoreguidelines/ProBoundsConstantArrayIndexCheck.cpp +++ b/clang-tools-extra/clang-tidy/cppcoreguidelines/ProBoundsConstantArrayIndexCheck.cpp @@ -22,6 +22,7 @@ ProBoundsConstantArrayIndexCheck::ProBoundsConstantArrayIndexCheck( StringRef Name, ClangTidyContext *Context) : ClangTidyCheck(Name, Context), GslHeader(Options.get("GslHeader", "")), IncludeStyle(Options.getLocalOrGlobal("IncludeStyle", + utils::IncludeSorter::getMapping(), utils::IncludeSorter::IS_LLVM)) {} void ProBoundsConstantArrayIndexCheck::storeOptions( diff --git a/clang-tools-extra/clang-tidy/modernize/LoopConvertCheck.cpp b/clang-tools-extra/clang-tidy/modernize/LoopConvertCheck.cpp index 720d43a2283b..dd18d866e508 100644 --- a/clang-tools-extra/clang-tidy/modernize/LoopConvertCheck.cpp +++ b/clang-tools-extra/clang-tidy/modernize/LoopConvertCheck.cpp @@ -28,31 +28,6 @@ using namespace llvm; namespace clang { namespace tidy { - -template <> struct OptionEnumMapping<modernize::Confidence::Level> { - static llvm::ArrayRef<std::pair<modernize::Confidence::Level, StringRef>> - getEnumMapping() { - static constexpr std::pair<modernize::Confidence::Level, StringRef> - Mapping[] = {{modernize::Confidence::CL_Reasonable, "reasonable"}, - {modernize::Confidence::CL_Safe, "safe"}, - {modernize::Confidence::CL_Risky, "risky"}}; - return makeArrayRef(Mapping); - } -}; - -template <> struct OptionEnumMapping<modernize::VariableNamer::NamingStyle> { - static llvm::ArrayRef< - std::pair<modernize::VariableNamer::NamingStyle, StringRef>> - getEnumMapping() { - static constexpr std::pair<modernize::VariableNamer::NamingStyle, StringRef> - Mapping[] = {{modernize::VariableNamer::NS_CamelCase, "CamelCase"}, - {modernize::VariableNamer::NS_CamelBack, "camelBack"}, - {modernize::VariableNamer::NS_LowerCase, "lower_case"}, - {modernize::VariableNamer::NS_UpperCase, "UPPER_CASE"}}; - return makeArrayRef(Mapping); - } -}; - namespace modernize { static const char LoopNameArray[] = "forLoopArray"; @@ -69,6 +44,25 @@ static const char EndVarName[] = "endVar"; static const char DerefByValueResultName[] = "derefByValueResult"; static const char DerefByRefResultName[] = "derefByRefResult"; +static ArrayRef<std::pair<StringRef, Confidence::Level>> +getConfidenceMapping() { + static constexpr std::pair<StringRef, Confidence::Level> Mapping[] = { + {"reasonable", Confidence::CL_Reasonable}, + {"safe", Confidence::CL_Safe}, + {"risky", Confidence::CL_Risky}}; + return makeArrayRef(Mapping); +} + +static ArrayRef<std::pair<StringRef, VariableNamer::NamingStyle>> +getStyleMapping() { + static constexpr std::pair<StringRef, VariableNamer::NamingStyle> Mapping[] = + {{"CamelCase", VariableNamer::NS_CamelCase}, + {"camelBack", VariableNamer::NS_CamelBack}, + {"lower_case", VariableNamer::NS_LowerCase}, + {"UPPER_CASE", VariableNamer::NS_UpperCase}}; + return makeArrayRef(Mapping); +} + // shared matchers static const TypeMatcher AnyType() { return anything(); } @@ -483,13 +477,15 @@ LoopConvertCheck::RangeDescriptor::RangeDescriptor() LoopConvertCheck::LoopConvertCheck(StringRef Name, ClangTidyContext *Context) : ClangTidyCheck(Name, Context), TUInfo(new TUTrackingInfo), MaxCopySize(Options.get("MaxCopySize", 16ULL)), - MinConfidence(Options.get("MinConfidence", Confidence::CL_Reasonable)), - NamingStyle(Options.get("NamingStyle", VariableNamer::NS_CamelCase)) {} + MinConfidence(Options.get("MinConfidence", getConfidenceMapping(), + Confidence::CL_Reasonable)), + NamingStyle(Options.get("NamingStyle", getStyleMapping(), + VariableNamer::NS_CamelCase)) {} void LoopConvertCheck::storeOptions(ClangTidyOptions::OptionMap &Opts) { Options.store(Opts, "MaxCopySize", std::to_string(MaxCopySize)); - Options.store(Opts, "MinConfidence", MinConfidence); - Options.store(Opts, "NamingStyle", NamingStyle); + Options.store(Opts, "MinConfidence", MinConfidence, getConfidenceMapping()); + Options.store(Opts, "NamingStyle", NamingStyle, getStyleMapping()); } void LoopConvertCheck::registerMatchers(MatchFinder *Finder) { diff --git a/clang-tools-extra/clang-tidy/modernize/MakeSmartPtrCheck.cpp b/clang-tools-extra/clang-tidy/modernize/MakeSmartPtrCheck.cpp index c677043946f7..e34fd7038bb8 100644 --- a/clang-tools-extra/clang-tidy/modernize/MakeSmartPtrCheck.cpp +++ b/clang-tools-extra/clang-tidy/modernize/MakeSmartPtrCheck.cpp @@ -45,6 +45,7 @@ MakeSmartPtrCheck::MakeSmartPtrCheck(StringRef Name, ClangTidyContext *Context, StringRef MakeSmartPtrFunctionName) : ClangTidyCheck(Name, Context), IncludeStyle(Options.getLocalOrGlobal("IncludeStyle", + utils::IncludeSorter::getMapping(), utils::IncludeSorter::IS_LLVM)), MakeSmartPtrFunctionHeader( Options.get("MakeSmartPtrFunctionHeader", StdMemoryHeader)), @@ -53,7 +54,8 @@ MakeSmartPtrCheck::MakeSmartPtrCheck(StringRef Name, ClangTidyContext *Context, IgnoreMacros(Options.getLocalOrGlobal("IgnoreMacros", true)) {} void MakeSmartPtrCheck::storeOptions(ClangTidyOptions::OptionMap &Opts) { - Options.store(Opts, "IncludeStyle", IncludeStyle); + Options.store(Opts, "IncludeStyle", IncludeStyle, + utils::IncludeSorter::getMapping()); Options.store(Opts, "MakeSmartPtrFunctionHeader", MakeSmartPtrFunctionHeader); Options.store(Opts, "MakeSmartPtrFunction", MakeSmartPtrFunctionName); Options.store(Opts, "IgnoreMacros", IgnoreMacros); diff --git a/clang-tools-extra/clang-tidy/modernize/PassByValueCheck.cpp b/clang-tools-extra/clang-tidy/modernize/PassByValueCheck.cpp index b6dedfbc2b6e..ed1a1a26bb62 100644 --- a/clang-tools-extra/clang-tidy/modernize/PassByValueCheck.cpp +++ b/clang-tools-extra/clang-tidy/modernize/PassByValueCheck.cpp @@ -121,11 +121,13 @@ collectParamDecls(const CXXConstructorDecl *Ctor, PassByValueCheck::PassByValueCheck(StringRef Name, ClangTidyContext *Context) : ClangTidyCheck(Name, Context), IncludeStyle(Options.getLocalOrGlobal("IncludeStyle", + utils::IncludeSorter::getMapping(), utils::IncludeSorter::IS_LLVM)), ValuesOnly(Options.get("ValuesOnly", false)) {} void PassByValueCheck::storeOptions(ClangTidyOptions::OptionMap &Opts) { - Options.store(Opts, "IncludeStyle", IncludeStyle); + Options.store(Opts, "IncludeStyle", IncludeStyle, + utils::IncludeSorter::getMapping()); Options.store(Opts, "ValuesOnly", ValuesOnly); } diff --git a/clang-tools-extra/clang-tidy/modernize/ReplaceAutoPtrCheck.cpp b/clang-tools-extra/clang-tidy/modernize/ReplaceAutoPtrCheck.cpp index f98254dbf7c8..295be200bca6 100644 --- a/clang-tools-extra/clang-tidy/modernize/ReplaceAutoPtrCheck.cpp +++ b/clang-tools-extra/clang-tidy/modernize/ReplaceAutoPtrCheck.cpp @@ -75,10 +75,12 @@ ReplaceAutoPtrCheck::ReplaceAutoPtrCheck(StringRef Name, ClangTidyContext *Context) : ClangTidyCheck(Name, Context), IncludeStyle(Options.getLocalOrGlobal("IncludeStyle", + utils::IncludeSorter::getMapping(), utils::IncludeSorter::IS_LLVM)) {} void ReplaceAutoPtrCheck::storeOptions(ClangTidyOptions::OptionMap &Opts) { - Options.store(Opts, "IncludeStyle", IncludeStyle); + Options.store(Opts, "IncludeStyle", IncludeStyle, + utils::IncludeSorter::getMapping()); } void ReplaceAutoPtrCheck::registerMatchers(MatchFinder *Finder) { diff --git a/clang-tools-extra/clang-tidy/modernize/ReplaceRandomShuffleCheck.cpp b/clang-tools-extra/clang-tidy/modernize/ReplaceRandomShuffleCheck.cpp index 66917df3e91d..9cfbd87239dc 100644 --- a/clang-tools-extra/clang-tidy/modernize/ReplaceRandomShuffleCheck.cpp +++ b/clang-tools-extra/clang-tidy/modernize/ReplaceRandomShuffleCheck.cpp @@ -24,6 +24,7 @@ ReplaceRandomShuffleCheck::ReplaceRandomShuffleCheck(StringRef Name, ClangTidyContext *Context) : ClangTidyCheck(Name, Context), IncludeStyle(Options.getLocalOrGlobal("IncludeStyle", + utils::IncludeSorter::getMapping(), utils::IncludeSorter::IS_LLVM)) {} void ReplaceRandomShuffleCheck::registerMatchers(MatchFinder *Finder) { @@ -51,7 +52,8 @@ void ReplaceRandomShuffleCheck::registerPPCallbacks( void ReplaceRandomShuffleCheck::storeOptions( ClangTidyOptions::OptionMap &Opts) { - Options.store(Opts, "IncludeStyle", IncludeStyle); + Options.store(Opts, "IncludeStyle", IncludeStyle, + utils::IncludeSorter::getMapping()); } void ReplaceRandomShuffleCheck::check(const MatchFinder::MatchResult &Result) { diff --git a/clang-tools-extra/clang-tidy/performance/MoveConstructorInitCheck.cpp b/clang-tools-extra/clang-tidy/performance/MoveConstructorInitCheck.cpp index 4cbb014867c4..d09673fa7f23 100644 --- a/clang-tools-extra/clang-tidy/performance/MoveConstructorInitCheck.cpp +++ b/clang-tools-extra/clang-tidy/performance/MoveConstructorInitCheck.cpp @@ -24,6 +24,7 @@ MoveConstructorInitCheck::MoveConstructorInitCheck(StringRef Name, ClangTidyContext *Context) : ClangTidyCheck(Name, Context), IncludeStyle(Options.getLocalOrGlobal("IncludeStyle", + utils::IncludeSorter::getMapping(), utils::IncludeSorter::IS_LLVM)) {} void MoveConstructorInitCheck::registerMatchers(MatchFinder *Finder) { @@ -96,7 +97,8 @@ void MoveConstructorInitCheck::registerPPCallbacks( } void MoveConstructorInitCheck::storeOptions(ClangTidyOptions::OptionMap &Opts) { - Options.store(Opts, "IncludeStyle", IncludeStyle); + Options.store(Opts, "IncludeStyle", IncludeStyle, + utils::IncludeSorter::getMapping()); } } // namespace performance diff --git a/clang-tools-extra/clang-tidy/performance/TypePromotionInMathFnCheck.cpp b/clang-tools-extra/clang-tidy/performance/TypePromotionInMathFnCheck.cpp index 597445d0fc26..d08cec1a2c3c 100644 --- a/clang-tools-extra/clang-tidy/performance/TypePromotionInMathFnCheck.cpp +++ b/clang-tools-extra/clang-tidy/performance/TypePromotionInMathFnCheck.cpp @@ -32,6 +32,7 @@ TypePromotionInMathFnCheck::TypePromotionInMathFnCheck( StringRef Name, ClangTidyContext *Context) : ClangTidyCheck(Name, Context), IncludeStyle(Options.getLocalOrGlobal("IncludeStyle", + utils::IncludeSorter::getMapping(), utils::IncludeSorter::IS_LLVM)) {} void TypePromotionInMathFnCheck::registerPPCallbacks( @@ -43,7 +44,8 @@ void TypePromotionInMathFnCheck::registerPPCallbacks( void TypePromotionInMathFnCheck::storeOptions( ClangTidyOptions::OptionMap &Opts) { - Options.store(Opts, "IncludeStyle", IncludeStyle); + Options.store(Opts, "IncludeStyle", IncludeStyle, + utils::IncludeSorter::getMapping()); } void TypePromotionInMathFnCheck::registerMatchers(MatchFinder *Finder) { diff --git a/clang-tools-extra/clang-tidy/performance/UnnecessaryValueParamCheck.cpp b/clang-tools-extra/clang-tidy/performance/UnnecessaryValueParamCheck.cpp index 5de53b1840f1..5b5f2ff99478 100644 --- a/clang-tools-extra/clang-tidy/performance/UnnecessaryValueParamCheck.cpp +++ b/clang-tools-extra/clang-tidy/performance/UnnecessaryValueParamCheck.cpp @@ -69,6 +69,7 @@ UnnecessaryValueParamCheck::UnnecessaryValueParamCheck( StringRef Name, ClangTidyContext *Context) : ClangTidyCheck(Name, Context), IncludeStyle(Options.getLocalOrGlobal("IncludeStyle", + utils::IncludeSorter::getMapping(), utils::IncludeSorter::IS_LLVM)), AllowedTypes( utils::options::parseStringList(Options.get("AllowedTypes", ""))) {} @@ -180,7 +181,8 @@ void UnnecessaryValueParamCheck::registerPPCallbacks( void UnnecessaryValueParamCheck::storeOptions( ClangTidyOptions::OptionMap &Opts) { - Options.store(Opts, "IncludeStyle", IncludeStyle); + Options.store(Opts, "IncludeStyle", IncludeStyle, + utils::IncludeSorter::getMapping()); Options.store(Opts, "AllowedTypes", utils::options::serializeStringList(AllowedTypes)); } diff --git a/clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.cpp b/clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.cpp index c885aac89072..6e7fcaa4345a 100644 --- a/clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.cpp +++ b/clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.cpp @@ -26,26 +26,6 @@ using namespace clang::ast_matchers; namespace clang { namespace tidy { - -llvm::ArrayRef< - std::pair<readability::IdentifierNamingCheck::CaseType, StringRef>> -OptionEnumMapping< - readability::IdentifierNamingCheck::CaseType>::getEnumMapping() { - static constexpr std::pair<readability::IdentifierNamingCheck::CaseType, - StringRef> - Mapping[] = { - {readability::IdentifierNamingCheck::CT_AnyCase, "aNy_CasE"}, - {readability::IdentifierNamingCheck::CT_LowerCase, "lower_case"}, - {readability::IdentifierNamingCheck::CT_UpperCase, "UPPER_CASE"}, - {readability::IdentifierNamingCheck::CT_CamelBack, "camelBack"}, - {readability::IdentifierNamingCheck::CT_CamelCase, "CamelCase"}, - {readability::IdentifierNamingCheck::CT_CamelSnakeCase, - "Camel_Snake_Case"}, - {readability::IdentifierNamingCheck::CT_CamelSnakeBack, - "camel_Snake_Back"}}; - return llvm::makeArrayRef(Mapping); -} - namespace readability { // clang-format off @@ -119,6 +99,16 @@ static StringRef const StyleNames[] = { #undef NAMING_KEYS // clang-format on +static constexpr std::pair<StringRef, IdentifierNamingCheck::CaseType> + Mapping[] = { + {"aNy_CasE", IdentifierNamingCheck::CT_AnyCase}, + {"lower_case", IdentifierNamingCheck::CT_LowerCase}, + {"UPPER_CASE", IdentifierNamingCheck::CT_UpperCase}, + {"camelBack", IdentifierNamingCheck::CT_CamelBack}, + {"CamelCase", IdentifierNamingCheck::CT_CamelCase}, + {"Camel_Snake_Case", IdentifierNamingCheck::CT_CamelSnakeCase}, + {"camel_Snake_Back", IdentifierNamingCheck::CT_CamelSnakeBack}}; + IdentifierNamingCheck::IdentifierNamingCheck(StringRef Name, ClangTidyContext *Context) : RenamerClangTidyCheck(Name, Context), @@ -127,7 +117,7 @@ IdentifierNamingCheck::IdentifierNamingCheck(StringRef Name, for (auto const &Name : StyleNames) { auto CaseOptional = [&]() -> llvm::Optional<CaseType> { - auto ValueOr = Options.get<CaseType>((Name + "Case").str()); + auto ValueOr = Options.get((Name + "Case").str(), makeArrayRef(Mapping)); if (ValueOr) return *ValueOr; llvm::logAllUnhandledErrors( @@ -158,7 +148,7 @@ void IdentifierNamingCheck::storeOptions(ClangTidyOptions::OptionMap &Opts) { if (NamingStyles[i]) { if (NamingStyles[i]->Case) { Options.store(Opts, (StyleNames[i] + "Case").str(), - *NamingStyles[i]->Case); + *NamingStyles[i]->Case, llvm::makeArrayRef(Mapping)); } Options.store(Opts, (StyleNames[i] + "Prefix").str(), NamingStyles[i]->Prefix); diff --git a/clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.h b/clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.h index 0f6c77b2c9a8..04bf53fe16b5 100644 --- a/clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.h +++ b/clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.h @@ -75,12 +75,6 @@ class IdentifierNamingCheck final : public RenamerClangTidyCheck { }; } // namespace readability -template <> -struct OptionEnumMapping<readability::IdentifierNamingCheck::CaseType> { - static llvm::ArrayRef< - std::pair<readability::IdentifierNamingCheck::CaseType, StringRef>> - getEnumMapping(); -}; } // namespace tidy } // namespace clang diff --git a/clang-tools-extra/clang-tidy/utils/IncludeSorter.cpp b/clang-tools-extra/clang-tidy/utils/IncludeSorter.cpp index 1ae8c29990f9..6013412a4138 100644 --- a/clang-tools-extra/clang-tidy/utils/IncludeSorter.cpp +++ b/clang-tools-extra/clang-tidy/utils/IncludeSorter.cpp @@ -174,14 +174,13 @@ Optional<FixItHint> IncludeSorter::CreateIncludeInsertion(StringRef FileName, IncludeStmt); } -} // namespace utils - -llvm::ArrayRef<std::pair<utils::IncludeSorter::IncludeStyle, StringRef>> -OptionEnumMapping<utils::IncludeSorter::IncludeStyle>::getEnumMapping() { - static constexpr std::pair<utils::IncludeSorter::IncludeStyle, StringRef> - Mapping[] = {{utils::IncludeSorter::IS_LLVM, "llvm"}, - {utils::IncludeSorter::IS_Google, "google"}}; +llvm::ArrayRef<std::pair<StringRef, IncludeSorter::IncludeStyle>> +IncludeSorter::getMapping() { + static constexpr std::pair<StringRef, IncludeSorter::IncludeStyle> Mapping[] = + {{"llvm", IS_LLVM}, {"google", IS_Google}}; return makeArrayRef(Mapping); } + +} // namespace utils } // namespace tidy } // namespace clang diff --git a/clang-tools-extra/clang-tidy/utils/IncludeSorter.h b/clang-tools-extra/clang-tidy/utils/IncludeSorter.h index 1abe1b93604d..7dab2cc536a4 100644 --- a/clang-tools-extra/clang-tidy/utils/IncludeSorter.h +++ b/clang-tools-extra/clang-tidy/utils/IncludeSorter.h @@ -25,6 +25,8 @@ class IncludeSorter { /// Supported include styles. enum IncludeStyle { IS_LLVM = 0, IS_Google = 1 }; + static ArrayRef<std::pair<StringRef, IncludeStyle>> getMapping(); + /// The classifications of inclusions, in the order they should be sorted. enum IncludeKinds { IK_MainTUInclude = 0, ///< e.g. ``#include "foo.h"`` when editing foo.cc @@ -64,11 +66,6 @@ class IncludeSorter { }; } // namespace utils - -template <> struct OptionEnumMapping<utils::IncludeSorter::IncludeStyle> { - static ArrayRef<std::pair<utils::IncludeSorter::IncludeStyle, StringRef>> - getEnumMapping(); -}; } // namespace tidy } // namespace clang #endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_INCLUDESORTER_H diff --git a/clang-tools-extra/clang-tidy/utils/TransformerClangTidyCheck.cpp b/clang-tools-extra/clang-tidy/utils/TransformerClangTidyCheck.cpp index 4a7a41867286..0a57856b7972 100644 --- a/clang-tools-extra/clang-tidy/utils/TransformerClangTidyCheck.cpp +++ b/clang-tools-extra/clang-tidy/utils/TransformerClangTidyCheck.cpp @@ -32,6 +32,7 @@ TransformerClangTidyCheck::TransformerClangTidyCheck( StringRef Name, ClangTidyContext *Context) : ClangTidyCheck(Name, Context), Rule(MakeRule(getLangOpts(), Options)), IncludeStyle(Options.getLocalOrGlobal("IncludeStyle", + IncludeSorter::getMapping(), IncludeSorter::IS_LLVM)) { if (Rule) assert(llvm::all_of(Rule->Cases, hasExplanation) && @@ -44,6 +45,7 @@ TransformerClangTidyCheck::TransformerClangTidyCheck(RewriteRule R, ClangTidyContext *Context) : ClangTidyCheck(Name, Context), Rule(std::move(R)), IncludeStyle(Options.getLocalOrGlobal("IncludeStyle", + IncludeSorter::getMapping(), IncludeSorter::IS_LLVM)) { assert(llvm::all_of(Rule->Cases, hasExplanation) && "clang-tidy checks must have an explanation by default;" @@ -109,7 +111,8 @@ void TransformerClangTidyCheck::check( void TransformerClangTidyCheck::storeOptions( ClangTidyOptions::OptionMap &Opts) { - Options.store(Opts, "IncludeStyle", IncludeStyle); + Options.store(Opts, "IncludeStyle", IncludeStyle, + IncludeSorter::getMapping()); } } // namespace utils diff --git a/clang-tools-extra/unittests/clang-tidy/ClangTidyDiagnosticConsumerTest.cpp b/clang-tools-extra/unittests/clang-tidy/ClangTidyDiagnosticConsumerTest.cpp index b3999a60cb87..2a4ed64b8850 100644 --- a/clang-tools-extra/unittests/clang-tidy/ClangTidyDiagnosticConsumerTest.cpp +++ b/clang-tools-extra/unittests/clang-tidy/ClangTidyDiagnosticConsumerTest.cpp @@ -2,8 +2,6 @@ #include "ClangTidyTest.h" #include "gtest/gtest.h" -using namespace clang::ast_matchers; - namespace clang { namespace tidy { namespace test { @@ -12,35 +10,21 @@ class TestCheck : public ClangTidyCheck { public: TestCheck(StringRef Name, ClangTidyContext *Context) : ClangTidyCheck(Name, Context) {} - void registerMatchers(MatchFinder *Finder) override { - Finder->addMatcher(varDecl().bind("var"), this); - DidRegister = true; + void registerMatchers(ast_matchers::MatchFinder *Finder) override { + Finder->addMatcher(ast_matchers::varDecl().bind("var"), this); } - void check(const MatchFinder::MatchResult &Result) override { + void check(const ast_matchers::MatchFinder::MatchResult &Result) override { const auto *Var = Result.Nodes.getNodeAs<VarDecl>("var"); - - assert(Var && "Node isn't bound"); - DidFire = true; - // Add diagnostics in the wrong order. diag(Var->getLocation(), "variable"); diag(Var->getTypeSpecStartLoc(), "type specifier"); } - - ~TestCheck() { - assert(DidRegister && "Check never registered"); - assert(DidFire && "Check never fired"); - } - -private: - bool DidRegister = false; - bool DidFire = false; }; TEST(ClangTidyDiagnosticConsumer, SortsErrors) { std::vector<ClangTidyError> Errors; runCheckOnCode<TestCheck>("int a;", &Errors); - EXPECT_EQ(2u, Errors.size()); + EXPECT_EQ(2ul, Errors.size()); EXPECT_EQ("type specifier", Errors[0].Message.Message); EXPECT_EQ("variable", Errors[1].Message.Message); } diff --git a/clang-tools-extra/unittests/clang-tidy/ClangTidyOptionsTest.cpp b/clang-tools-extra/unittests/clang-tidy/ClangTidyOptionsTest.cpp index c4331f4f1bf8..a089281bf16c 100644 --- a/clang-tools-extra/unittests/clang-tidy/ClangTidyOptionsTest.cpp +++ b/clang-tools-extra/unittests/clang-tidy/ClangTidyOptionsTest.cpp @@ -6,20 +6,6 @@ namespace clang { namespace tidy { - -enum class Colours { Red, Orange, Yellow, Green, Blue, Indigo, Violet }; - -template <> struct OptionEnumMapping<Colours> { - static llvm::ArrayRef<std::pair<Colours, StringRef>> getEnumMapping() { - static constexpr std::pair<Colours, StringRef> Mapping[] = { - {Colours::Red, "Red"}, {Colours::Orange, "Orange"}, - {Colours::Yellow, "Yellow"}, {Colours::Green, "Green"}, - {Colours::Blue, "Blue"}, {Colours::Indigo, "Indigo"}, - {Colours::Violet, "Violet"}}; - return makeArrayRef(Mapping); - } -}; - namespace test { TEST(ParseLineFilter, EmptyFilter) { @@ -223,6 +209,15 @@ TEST(CheckOptionsValidation, ValidIntOptions) { } TEST(ValidConfiguration, ValidEnumOptions) { + + enum class Colours { Red, Orange, Yellow, Green, Blue, Indigo, Violet }; + static constexpr std::pair<StringRef, Colours> Mapping[] = { + {"Red", Colours::Red}, {"Orange", Colours::Orange}, + {"Yellow", Colours::Yellow}, {"Green", Colours::Green}, + {"Blue", Colours::Blue}, {"Indigo", Colours::Indigo}, + {"Violet", Colours::Violet}}; + static const auto Map = makeArrayRef(Mapping); + ClangTidyOptions Options; auto &CheckOptions = Options.CheckOptions; @@ -242,30 +237,29 @@ TEST(ValidConfiguration, ValidEnumOptions) { #define CHECK_ERROR_ENUM(Name, Expected) \ CHECK_ERROR(Name, UnparseableEnumOptionError, Expected) - CHECK_VAL(TestCheck.getIntLocal<Colours>("Valid"), Colours::Red); - CHECK_VAL(TestCheck.getIntGlobal<Colours>("GlobalValid"), Colours::Violet); + CHECK_VAL(TestCheck.getLocal("Valid", Map), Colours::Red); + CHECK_VAL(TestCheck.getGlobal("GlobalValid", Map), Colours::Violet); + CHECK_VAL(TestCheck.getLocal("ValidWrongCase", Map, /*IgnoreCase*/ true), + Colours::Red); CHECK_VAL( - TestCheck.getIntLocal<Colours>("ValidWrongCase", /*IgnoreCase*/ true), - Colours::Red); - CHECK_VAL(TestCheck.getIntGlobal<Colours>("GlobalValidWrongCase", - /*IgnoreCase*/ true), - Colours::Violet); - CHECK_ERROR_ENUM(TestCheck.getIntLocal<Colours>("Invalid"), + TestCheck.getGlobal("GlobalValidWrongCase", Map, /*IgnoreCase*/ true), + Colours::Violet); + CHECK_ERROR_ENUM(TestCheck.getLocal("Invalid", Map), "invalid configuration value " "'Scarlet' for option 'test.Invalid'"); - CHECK_ERROR_ENUM(TestCheck.getIntLocal<Colours>("ValidWrongCase"), + CHECK_ERROR_ENUM(TestCheck.getLocal("ValidWrongCase", Map), "invalid configuration value 'rED' for option " "'test.ValidWrongCase'; did you mean 'Red'?"); - CHECK_ERROR_ENUM(TestCheck.getIntLocal<Colours>("NearMiss"), + CHECK_ERROR_ENUM(TestCheck.getLocal("NearMiss", Map), "invalid configuration value 'Oragne' for option " "'test.NearMiss'; did you mean 'Orange'?"); - CHECK_ERROR_ENUM(TestCheck.getIntGlobal<Colours>("GlobalInvalid"), + CHECK_ERROR_ENUM(TestCheck.getGlobal("GlobalInvalid", Map), "invalid configuration value " "'Purple' for option 'GlobalInvalid'"); - CHECK_ERROR_ENUM(TestCheck.getIntGlobal<Colours>("GlobalValidWrongCase"), + CHECK_ERROR_ENUM(TestCheck.getGlobal("GlobalValidWrongCase", Map), "invalid configuration value 'vIOLET' for option " "'GlobalValidWrongCase'; did you mean 'Violet'?"); - CHECK_ERROR_ENUM(TestCheck.getIntGlobal<Colours>("GlobalNearMiss"), + CHECK_ERROR_ENUM(TestCheck.getGlobal("GlobalNearMiss", Map), "invalid configuration value 'Yelow' for option " "'GlobalNearMiss'; did you mean 'Yellow'?"); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits