diff --git a/clang-tools-extra/clang-tidy/CMakeLists.txt b/clang-tools-extra/clang-tidy/CMakeLists.txt --- a/clang-tools-extra/clang-tidy/CMakeLists.txt +++ b/clang-tools-extra/clang-tidy/CMakeLists.txt @@ -17,6 +17,8 @@ ClangTidyProfiling.cpp ExpandModularHeadersPPCallbacks.cpp GlobList.cpp + IncludeSorter.cpp + IncludeInserter.cpp DEPENDS ClangSACheckers diff --git a/clang-tools-extra/clang-tidy/ClangTidy.cpp b/clang-tools-extra/clang-tidy/ClangTidy.cpp --- a/clang-tools-extra/clang-tidy/ClangTidy.cpp +++ b/clang-tools-extra/clang-tidy/ClangTidy.cpp @@ -430,6 +430,8 @@ PP->addPPCallbacks(std::move(ModuleExpander)); } + Context.addInserterCallbacks(PP); + for (auto &Check : Checks) { Check->registerMatchers(&*Finder); Check->registerPPCallbacks(*SM, PP, ModuleExpanderPP); @@ -482,6 +484,12 @@ ClangTidyOptions::OptionMap Options; std::vector> Checks = CheckFactories->createChecks(&Context); + if (Context.hasIncludeInserter()) { + ArrayRef Mapping = IncludeSorter::getStyleMapping(); + auto Index = static_cast(Context.getIncludeInserter().getStyle()); + assert(Index < Mapping.size()); + Options["IncludeStyle"] = Mapping[Index]; + } for (const auto &Check : Checks) Check->storeOptions(Options); return Options; diff --git a/clang-tools-extra/clang-tidy/ClangTidyCheck.h b/clang-tools-extra/clang-tidy/ClangTidyCheck.h --- a/clang-tools-extra/clang-tidy/ClangTidyCheck.h +++ b/clang-tools-extra/clang-tidy/ClangTidyCheck.h @@ -125,6 +125,10 @@ configurationDiag(StringRef Description, DiagnosticIDs::Level Level = DiagnosticIDs::Warning) const; + llvm::Optional createMainFileIncludeInsertion(StringRef Include); + llvm::Optional createIncludeInsertion(FileID File, + StringRef Include); + /// Should store all options supported by this check with their /// current values or default values for options that haven't been overridden. /// @@ -413,6 +417,10 @@ ClangTidyContext *Context; protected: + void registerIncludeInserter() { + Context->registerIncludeInserter(CheckName); + } + OptionsView Options; /// Returns the main file name of the current translation unit. StringRef getCurrentMainFile() const { return Context->getCurrentFile(); } diff --git a/clang-tools-extra/clang-tidy/ClangTidyCheck.cpp b/clang-tools-extra/clang-tidy/ClangTidyCheck.cpp --- a/clang-tools-extra/clang-tidy/ClangTidyCheck.cpp +++ b/clang-tools-extra/clang-tidy/ClangTidyCheck.cpp @@ -216,5 +216,25 @@ return std::move(*Val); return Default.str(); } + +llvm::Optional +ClangTidyCheck::createMainFileIncludeInsertion(StringRef Include) { + if (!Context->hasIncludeInserter()) { + // Only crash on debug builds + assert(false && "No IncludeInserter registered"); + return llvm::None; + } + return Context->getIncludeInserter().createMainFileIncludeInsertion(Include); +} + +llvm::Optional +ClangTidyCheck::createIncludeInsertion(FileID File, StringRef Include) { + if (!Context->hasIncludeInserter()) { + // Only crash on debug builds + assert(false && "No IncludeInserter registered"); + return llvm::None; + } + return Context->getIncludeInserter().createIncludeInsertion(File, Include); +} } // namespace tidy } // namespace clang diff --git a/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.h b/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.h --- a/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.h +++ b/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.h @@ -11,7 +11,9 @@ #include "ClangTidyOptions.h" #include "ClangTidyProfiling.h" +#include "IncludeInserter.h" #include "clang/Basic/Diagnostic.h" +#include "clang/Lex/Preprocessor.h" #include "clang/Tooling/Core/Diagnostic.h" #include "llvm/ADT/DenseMap.h" #include "llvm/Support/Regex.h" @@ -183,6 +185,16 @@ DiagEngine->getDiagnosticIDs()->getDescription(DiagnosticID))); } + bool hasIncludeInserter() const { return Inserter.hasValue(); } + IncludeInserter &getIncludeInserter() { + assert(hasIncludeInserter()); + return *Inserter; + } + + void registerIncludeInserter(IncludeSorter::IncludeStyle Style); + void registerIncludeInserter(StringRef CheckName); + void addInserterCallbacks(Preprocessor *PP); + private: // Writes to Stats. friend class ClangTidyDiagnosticConsumer; @@ -193,6 +205,8 @@ std::string CurrentFile; ClangTidyOptions CurrentOptions; + llvm::Optional Inserter; + std::unique_ptr CheckFilter; std::unique_ptr WarningAsErrorFilter; diff --git a/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp b/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp --- a/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp +++ b/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp @@ -18,6 +18,7 @@ #include "ClangTidyDiagnosticConsumer.h" #include "ClangTidyOptions.h" #include "GlobList.h" +#include "IncludeSorter.h" #include "clang/AST/ASTContext.h" #include "clang/AST/ASTDiagnostic.h" #include "clang/AST/Attr.h" @@ -215,6 +216,7 @@ CheckFilter = std::make_unique(*getOptions().Checks); WarningAsErrorFilter = std::make_unique(*getOptions().WarningsAsErrors); + Inserter.reset(); } void ClangTidyContext::setASTContext(ASTContext *Context) { @@ -536,6 +538,64 @@ return Result; } +void ClangTidyContext::registerIncludeInserter( + IncludeSorter::IncludeStyle Style) { + if (!Inserter) { + Inserter.emplace(Style); + } +} + +void ClangTidyContext::registerIncludeInserter(StringRef CheckName) { + const ClangTidyOptions::OptionMap &Options = getOptions().CheckOptions; + { + // Check and warn if the option was set Locally, for old clang-tidy configs. + SmallString<64> Buffer{CheckName, ".IncludeStyle"}; + if (Options.count(Buffer)) { + configurationDiag( + "Option '%0' is deprecated; use the global 'IncludeStyle' instead") + << Buffer; + } + } + if (Inserter) + return; + auto SetDefault = [this] { registerIncludeInserter(IncludeSorter::IS_LLVM); }; + auto It = Options.find("IncludeStyle"); + if (It == Options.end()) { + SetDefault(); + return; + } + StringRef Input = It->getValue().Value; + StringRef Closest; + ArrayRef Mapping = IncludeSorter::getStyleMapping(); + for (unsigned I = 0, E = Mapping.size(); I < E; ++I) { + if (Input == Mapping[I]) { + registerIncludeInserter(static_cast(I)); + return; + } + if (Input.equals_insensitive(Mapping[I])) { + Closest = Mapping[I]; + break; + } + auto Edit = Input.edit_distance(Mapping[I], true, 1); + if (Edit < 2) { + Closest = Mapping[I]; + break; + } + } + if (Closest.empty()) + configurationDiag("Couldn't parse '%0' as an 'IncludeStyle'") + << It->getValue().Value; + else + configurationDiag( + "Couldn't parse '%0' as an 'IncludeStyle'; did you mean %1") + << It->getValue().Value << Closest; + SetDefault(); +} + +void ClangTidyContext::addInserterCallbacks(Preprocessor *PP) { + if (hasIncludeInserter()) + Inserter->registerPreprocessor(PP); +} } // namespace tidy } // namespace clang diff --git a/clang-tools-extra/clang-tidy/utils/IncludeInserter.h b/clang-tools-extra/clang-tidy/IncludeInserter.h rename from clang-tools-extra/clang-tidy/utils/IncludeInserter.h rename to clang-tools-extra/clang-tidy/IncludeInserter.h --- a/clang-tools-extra/clang-tidy/utils/IncludeInserter.h +++ b/clang-tools-extra/clang-tidy/IncludeInserter.h @@ -17,7 +17,6 @@ namespace clang { class Preprocessor; namespace tidy { -namespace utils { /// Produces fixes to insert specified includes to source files, if not /// yet present. @@ -96,7 +95,6 @@ friend class IncludeInserterCallback; }; -} // namespace utils } // namespace tidy } // namespace clang #endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_INCLUDEINSERTER_H diff --git a/clang-tools-extra/clang-tidy/utils/IncludeInserter.cpp b/clang-tools-extra/clang-tidy/IncludeInserter.cpp rename from clang-tools-extra/clang-tidy/utils/IncludeInserter.cpp rename to clang-tools-extra/clang-tidy/IncludeInserter.cpp --- a/clang-tools-extra/clang-tidy/utils/IncludeInserter.cpp +++ b/clang-tools-extra/clang-tidy/IncludeInserter.cpp @@ -13,7 +13,6 @@ namespace clang { namespace tidy { -namespace utils { class IncludeInserterCallback : public PPCallbacks { public: @@ -95,6 +94,5 @@ getOrCreate(FileID).addInclude(FileName, IsAngled, HashLocation, EndLocation); } -} // namespace utils } // namespace tidy } // namespace clang diff --git a/clang-tools-extra/clang-tidy/utils/IncludeSorter.h b/clang-tools-extra/clang-tidy/IncludeSorter.h rename from clang-tools-extra/clang-tidy/utils/IncludeSorter.h rename to clang-tools-extra/clang-tidy/IncludeSorter.h --- a/clang-tools-extra/clang-tidy/utils/IncludeSorter.h +++ b/clang-tools-extra/clang-tidy/IncludeSorter.h @@ -9,12 +9,17 @@ #ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_INCLUDESORTER_H #define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_INCLUDESORTER_H -#include "../ClangTidyCheck.h" +#include "clang/Basic/Diagnostic.h" +#include "clang/Basic/SourceLocation.h" +#include "llvm/ADT/ArrayRef.h" +#include "llvm/ADT/Optional.h" +#include "llvm/ADT/StringMap.h" +#include "llvm/ADT/StringRef.h" #include namespace clang { +class SourceManager; namespace tidy { -namespace utils { /// Class used by ``IncludeInserterCallback`` to record the names of the /// inclusions in a given source file being processed and generate the necessary @@ -24,6 +29,7 @@ public: /// Supported include styles. enum IncludeStyle { IS_LLVM = 0, IS_Google = 1, IS_Google_ObjC }; + static ArrayRef getStyleMapping(); /// The classifications of inclusions, in the order they should be sorted. enum IncludeKinds { @@ -35,8 +41,8 @@ IK_InvalidInclude = 5 ///< total number of valid ``IncludeKind``s }; - /// ``IncludeSorter`` constructor; takes the FileID and name of the file to be - /// processed by the sorter. + /// ``IncludeSorter`` constructor; takes the FileID and name of the file to + /// be processed by the sorter. IncludeSorter(const SourceManager *SourceMgr, const FileID FileID, StringRef FileName, IncludeStyle Style); @@ -44,8 +50,9 @@ void addInclude(StringRef FileName, bool IsAngled, SourceLocation HashLocation, SourceLocation EndLocation); - /// Creates a quoted inclusion directive in the right sort order. Returns None - /// on error or if header inclusion directive for header already exists. + /// Creates a quoted inclusion directive in the right sort order. Returns + /// None on error or if header inclusion directive for header already + /// exists. Optional createIncludeInsertion(StringRef FileName, bool IsAngled); private: @@ -63,13 +70,6 @@ /// Includes sorted into buckets. SmallVector IncludeBucket[IK_InvalidInclude]; }; - -} // namespace utils - -template <> struct OptionEnumMapping { - static ArrayRef> - getEnumMapping(); -}; } // namespace tidy } // namespace clang #endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_INCLUDESORTER_H diff --git a/clang-tools-extra/clang-tidy/utils/IncludeSorter.cpp b/clang-tools-extra/clang-tidy/IncludeSorter.cpp rename from clang-tools-extra/clang-tidy/utils/IncludeSorter.cpp rename to clang-tools-extra/clang-tidy/IncludeSorter.cpp --- a/clang-tools-extra/clang-tidy/utils/IncludeSorter.cpp +++ b/clang-tools-extra/clang-tidy/IncludeSorter.cpp @@ -13,7 +13,6 @@ namespace clang { namespace tidy { -namespace utils { namespace { @@ -49,8 +48,7 @@ if (StartIndex == StringRef::npos) { StartIndex = 0; } - return Canonical.substr( - 0, Canonical.find_first_of('+', StartIndex)); + return Canonical.substr(0, Canonical.find_first_of('+', StartIndex)); } return removeFirstSuffix( removeFirstSuffix(Str, {".cc", ".cpp", ".c", ".h", ".hpp"}), @@ -77,8 +75,8 @@ : IncludeSorter::IK_CXXSystemInclude; } StringRef CanonicalInclude = makeCanonicalName(IncludeFile, Style); - if (CanonicalFile.endswith(CanonicalInclude) - || CanonicalInclude.endswith(CanonicalFile)) { + if (CanonicalFile.endswith(CanonicalInclude) || + CanonicalInclude.endswith(CanonicalFile)) { return IncludeSorter::IK_MainTUInclude; } if ((Style == IncludeSorter::IS_Google) || @@ -222,15 +220,8 @@ return FixItHint::CreateInsertion(FirstIncludeLocation.getBegin(), IncludeStmt); } - -} // namespace utils - -llvm::ArrayRef> -OptionEnumMapping::getEnumMapping() { - static constexpr std::pair - Mapping[] = {{utils::IncludeSorter::IS_LLVM, "llvm"}, - {utils::IncludeSorter::IS_Google, "google"}, - {utils::IncludeSorter::IS_Google_ObjC, "google-objc"}}; +static constexpr StringRef Mapping[] = {"llvm", "google", "google-objc"}; +llvm::ArrayRef IncludeSorter::getStyleMapping() { return makeArrayRef(Mapping); } } // namespace tidy diff --git a/clang-tools-extra/clang-tidy/abseil/StringFindStartswithCheck.h b/clang-tools-extra/clang-tidy/abseil/StringFindStartswithCheck.h --- a/clang-tools-extra/clang-tidy/abseil/StringFindStartswithCheck.h +++ b/clang-tools-extra/clang-tidy/abseil/StringFindStartswithCheck.h @@ -10,7 +10,6 @@ #define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_ABSEIL_STRINGFINDSTARTSWITHCHECK_H #include "../ClangTidyCheck.h" -#include "../utils/IncludeInserter.h" #include "clang/ASTMatchers/ASTMatchFinder.h" #include @@ -28,15 +27,12 @@ public: using ClangTidyCheck::ClangTidyCheck; StringFindStartswithCheck(StringRef Name, ClangTidyContext *Context); - void registerPPCallbacks(const SourceManager &SM, Preprocessor *PP, - Preprocessor *ModuleExpanderPP) override; void registerMatchers(ast_matchers::MatchFinder *Finder) override; void check(const ast_matchers::MatchFinder::MatchResult &Result) override; void storeOptions(ClangTidyOptions::OptionMap &Opts) override; private: const std::vector StringLikeClasses; - utils::IncludeInserter IncludeInserter; const std::string AbseilStringsMatchHeader; }; diff --git a/clang-tools-extra/clang-tidy/abseil/StringFindStartswithCheck.cpp b/clang-tools-extra/clang-tidy/abseil/StringFindStartswithCheck.cpp --- a/clang-tools-extra/clang-tidy/abseil/StringFindStartswithCheck.cpp +++ b/clang-tools-extra/clang-tidy/abseil/StringFindStartswithCheck.cpp @@ -26,10 +26,10 @@ : ClangTidyCheck(Name, Context), StringLikeClasses(utils::options::parseStringList( Options.get("StringLikeClasses", "::std::basic_string"))), - IncludeInserter(Options.getLocalOrGlobal("IncludeStyle", - utils::IncludeSorter::IS_LLVM)), AbseilStringsMatchHeader( - Options.get("AbseilStringsMatchHeader", "absl/strings/match.h")) {} + Options.get("AbseilStringsMatchHeader", "absl/strings/match.h")) { + registerIncludeInserter(); +} void StringFindStartswithCheck::registerMatchers(MatchFinder *Finder) { auto ZeroLiteral = integerLiteral(equals(0)); @@ -124,21 +124,15 @@ // Create a preprocessor #include FixIt hint (createIncludeInsertion checks // whether this already exists). - Diagnostic << IncludeInserter.createIncludeInsertion( + Diagnostic << createIncludeInsertion( Source.getFileID(ComparisonExpr->getBeginLoc()), AbseilStringsMatchHeader); } -void StringFindStartswithCheck::registerPPCallbacks( - const SourceManager &SM, Preprocessor *PP, Preprocessor *ModuleExpanderPP) { - IncludeInserter.registerPreprocessor(PP); -} - void StringFindStartswithCheck::storeOptions( ClangTidyOptions::OptionMap &Opts) { Options.store(Opts, "StringLikeClasses", utils::options::serializeStringList(StringLikeClasses)); - Options.store(Opts, "IncludeStyle", IncludeInserter.getStyle()); Options.store(Opts, "AbseilStringsMatchHeader", AbseilStringsMatchHeader); } diff --git a/clang-tools-extra/clang-tidy/bugprone/ImplicitWideningOfMultiplicationResultCheck.h b/clang-tools-extra/clang-tidy/bugprone/ImplicitWideningOfMultiplicationResultCheck.h --- a/clang-tools-extra/clang-tidy/bugprone/ImplicitWideningOfMultiplicationResultCheck.h +++ b/clang-tools-extra/clang-tidy/bugprone/ImplicitWideningOfMultiplicationResultCheck.h @@ -10,7 +10,6 @@ #define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_BUGPRONE_IMPLICITWIDENINGOFMULTIPLICATIONRESULTCHECK_H #include "../ClangTidyCheck.h" -#include "../utils/IncludeInserter.h" namespace clang { namespace tidy { @@ -33,8 +32,6 @@ public: ImplicitWideningOfMultiplicationResultCheck(StringRef Name, ClangTidyContext *Context); - void registerPPCallbacks(const SourceManager &SM, Preprocessor *PP, - Preprocessor *ModuleExpanderPP) override; void registerMatchers(ast_matchers::MatchFinder *Finder) override; void check(const ast_matchers::MatchFinder::MatchResult &Result) override; void storeOptions(ClangTidyOptions::OptionMap &Opts) override; @@ -42,7 +39,6 @@ private: const bool UseCXXStaticCastsInCppSources; const bool UseCXXHeadersInCppSources; - utils::IncludeInserter IncludeInserter; }; } // namespace bugprone diff --git a/clang-tools-extra/clang-tidy/bugprone/ImplicitWideningOfMultiplicationResultCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/ImplicitWideningOfMultiplicationResultCheck.cpp --- a/clang-tools-extra/clang-tidy/bugprone/ImplicitWideningOfMultiplicationResultCheck.cpp +++ b/clang-tools-extra/clang-tidy/bugprone/ImplicitWideningOfMultiplicationResultCheck.cpp @@ -41,14 +41,9 @@ : ClangTidyCheck(Name, Context), UseCXXStaticCastsInCppSources( Options.get("UseCXXStaticCastsInCppSources", true)), - UseCXXHeadersInCppSources(Options.get("UseCXXHeadersInCppSources", true)), - IncludeInserter(Options.getLocalOrGlobal("IncludeStyle", - utils::IncludeSorter::IS_LLVM)) { -} - -void ImplicitWideningOfMultiplicationResultCheck::registerPPCallbacks( - const SourceManager &SM, Preprocessor *PP, Preprocessor *ModuleExpanderPP) { - IncludeInserter.registerPreprocessor(PP); + UseCXXHeadersInCppSources( + Options.get("UseCXXHeadersInCppSources", true)) { + registerIncludeInserter(); } void ImplicitWideningOfMultiplicationResultCheck::storeOptions( @@ -56,15 +51,14 @@ Options.store(Opts, "UseCXXStaticCastsInCppSources", UseCXXStaticCastsInCppSources); Options.store(Opts, "UseCXXHeadersInCppSources", UseCXXHeadersInCppSources); - Options.store(Opts, "IncludeStyle", IncludeInserter.getStyle()); } llvm::Optional ImplicitWideningOfMultiplicationResultCheck::includeStddefHeader( SourceLocation File) { - return IncludeInserter.createIncludeInsertion( - Result->SourceManager->getFileID(File), - ShouldUseCXXHeader ? "" : ""); + return createIncludeInsertion(Result->SourceManager->getFileID(File), + ShouldUseCXXHeader ? "" + : ""); } void ImplicitWideningOfMultiplicationResultCheck::handleImplicitCastExpr( diff --git a/clang-tools-extra/clang-tidy/cppcoreguidelines/InitVariablesCheck.h b/clang-tools-extra/clang-tidy/cppcoreguidelines/InitVariablesCheck.h --- a/clang-tools-extra/clang-tidy/cppcoreguidelines/InitVariablesCheck.h +++ b/clang-tools-extra/clang-tidy/cppcoreguidelines/InitVariablesCheck.h @@ -10,7 +10,6 @@ #define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_CPPCOREGUIDELINES_INITVARIABLESCHECK_H #include "../ClangTidyCheck.h" -#include "../utils/IncludeInserter.h" #include "../utils/OptionsUtils.h" namespace clang { @@ -25,13 +24,10 @@ public: InitVariablesCheck(StringRef Name, ClangTidyContext *Context); void storeOptions(ClangTidyOptions::OptionMap &Opts) override; - void registerPPCallbacks(const SourceManager &SM, Preprocessor *PP, - Preprocessor *ModuleExpanderPP) override; void registerMatchers(ast_matchers::MatchFinder *Finder) override; void check(const ast_matchers::MatchFinder::MatchResult &Result) override; private: - utils::IncludeInserter IncludeInserter; const std::string MathHeader; }; diff --git a/clang-tools-extra/clang-tidy/cppcoreguidelines/InitVariablesCheck.cpp b/clang-tools-extra/clang-tidy/cppcoreguidelines/InitVariablesCheck.cpp --- a/clang-tools-extra/clang-tidy/cppcoreguidelines/InitVariablesCheck.cpp +++ b/clang-tools-extra/clang-tidy/cppcoreguidelines/InitVariablesCheck.cpp @@ -26,12 +26,11 @@ InitVariablesCheck::InitVariablesCheck(StringRef Name, ClangTidyContext *Context) : ClangTidyCheck(Name, Context), - IncludeInserter(Options.getLocalOrGlobal("IncludeStyle", - utils::IncludeSorter::IS_LLVM)), - MathHeader(Options.get("MathHeader", "")) {} + MathHeader(Options.get("MathHeader", "")) { + registerIncludeInserter(); +} void InitVariablesCheck::storeOptions(ClangTidyOptions::OptionMap &Opts) { - Options.store(Opts, "IncludeStyle", IncludeInserter.getStyle()); Options.store(Opts, "MathHeader", MathHeader); } @@ -48,12 +47,6 @@ this); } -void InitVariablesCheck::registerPPCallbacks(const SourceManager &SM, - Preprocessor *PP, - Preprocessor *ModuleExpanderPP) { - IncludeInserter.registerPreprocessor(PP); -} - void InitVariablesCheck::check(const MatchFinder::MatchResult &Result) { const auto *MatchedDecl = Result.Nodes.getNodeAs("vardecl"); const ASTContext &Context = *Result.Context; @@ -105,7 +98,7 @@ MatchedDecl->getName().size()), *InitializationString); if (AddMathInclude) { - Diagnostic << IncludeInserter.createIncludeInsertion( + Diagnostic << createIncludeInsertion( Source.getFileID(MatchedDecl->getBeginLoc()), MathHeader); } } diff --git a/clang-tools-extra/clang-tidy/cppcoreguidelines/ProBoundsConstantArrayIndexCheck.h b/clang-tools-extra/clang-tidy/cppcoreguidelines/ProBoundsConstantArrayIndexCheck.h --- a/clang-tools-extra/clang-tidy/cppcoreguidelines/ProBoundsConstantArrayIndexCheck.h +++ b/clang-tools-extra/clang-tidy/cppcoreguidelines/ProBoundsConstantArrayIndexCheck.h @@ -10,7 +10,6 @@ #define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_CPPCOREGUIDELINES_PRO_BOUNDS_CONSTANT_ARRAY_INDEX_H #include "../ClangTidyCheck.h" -#include "../utils/IncludeInserter.h" namespace clang { namespace tidy { @@ -23,15 +22,12 @@ /// http://clang.llvm.org/extra/clang-tidy/checks/cppcoreguidelines-pro-bounds-constant-array-index.html class ProBoundsConstantArrayIndexCheck : public ClangTidyCheck { const std::string GslHeader; - utils::IncludeInserter Inserter; public: ProBoundsConstantArrayIndexCheck(StringRef Name, ClangTidyContext *Context); bool isLanguageVersionSupported(const LangOptions &LangOpts) const override { return LangOpts.CPlusPlus; } - void registerPPCallbacks(const SourceManager &SM, Preprocessor *PP, - Preprocessor *ModuleExpanderPP) override; void registerMatchers(ast_matchers::MatchFinder *Finder) override; void storeOptions(ClangTidyOptions::OptionMap &Opts) override; void check(const ast_matchers::MatchFinder::MatchResult &Result) override; diff --git a/clang-tools-extra/clang-tidy/cppcoreguidelines/ProBoundsConstantArrayIndexCheck.cpp b/clang-tools-extra/clang-tidy/cppcoreguidelines/ProBoundsConstantArrayIndexCheck.cpp --- a/clang-tools-extra/clang-tidy/cppcoreguidelines/ProBoundsConstantArrayIndexCheck.cpp +++ b/clang-tools-extra/clang-tidy/cppcoreguidelines/ProBoundsConstantArrayIndexCheck.cpp @@ -20,19 +20,12 @@ ProBoundsConstantArrayIndexCheck::ProBoundsConstantArrayIndexCheck( StringRef Name, ClangTidyContext *Context) - : ClangTidyCheck(Name, Context), GslHeader(Options.get("GslHeader", "")), - Inserter(Options.getLocalOrGlobal("IncludeStyle", - utils::IncludeSorter::IS_LLVM)) {} - + : ClangTidyCheck(Name, Context), GslHeader(Options.get("GslHeader", "")) { + registerIncludeInserter(); +} void ProBoundsConstantArrayIndexCheck::storeOptions( ClangTidyOptions::OptionMap &Opts) { Options.store(Opts, "GslHeader", GslHeader); - Options.store(Opts, "IncludeStyle", Inserter.getStyle()); -} - -void ProBoundsConstantArrayIndexCheck::registerPPCallbacks( - const SourceManager &SM, Preprocessor *PP, Preprocessor *ModuleExpanderPP) { - Inserter.registerPreprocessor(PP); } void ProBoundsConstantArrayIndexCheck::registerMatchers(MatchFinder *Finder) { @@ -85,7 +78,7 @@ IndexRange.getBegin().getLocWithOffset(-1)), ", ") << FixItHint::CreateReplacement(Matched->getEndLoc(), ")") - << Inserter.createMainFileIncludeInsertion(GslHeader); + << createMainFileIncludeInsertion(GslHeader); } return; } diff --git a/clang-tools-extra/clang-tidy/misc/UniqueptrResetReleaseCheck.h b/clang-tools-extra/clang-tidy/misc/UniqueptrResetReleaseCheck.h --- a/clang-tools-extra/clang-tidy/misc/UniqueptrResetReleaseCheck.h +++ b/clang-tools-extra/clang-tidy/misc/UniqueptrResetReleaseCheck.h @@ -10,7 +10,6 @@ #define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MISC_UNIQUEPTRRESETRELEASECHECK_H #include "../ClangTidyCheck.h" -#include "../utils/IncludeInserter.h" namespace clang { namespace tidy { @@ -37,14 +36,8 @@ // provide any benefit to other languages, despite being benign. return LangOpts.CPlusPlus11; } - void registerPPCallbacks(const SourceManager &SM, Preprocessor *PP, - Preprocessor *ModuleExpanderPP) override; void registerMatchers(ast_matchers::MatchFinder *Finder) override; void check(const ast_matchers::MatchFinder::MatchResult &Result) override; - void storeOptions(ClangTidyOptions::OptionMap &Opts) override; - -private: - utils::IncludeInserter Inserter; }; } // namespace misc diff --git a/clang-tools-extra/clang-tidy/misc/UniqueptrResetReleaseCheck.cpp b/clang-tools-extra/clang-tidy/misc/UniqueptrResetReleaseCheck.cpp --- a/clang-tools-extra/clang-tidy/misc/UniqueptrResetReleaseCheck.cpp +++ b/clang-tools-extra/clang-tidy/misc/UniqueptrResetReleaseCheck.cpp @@ -18,18 +18,8 @@ UniqueptrResetReleaseCheck::UniqueptrResetReleaseCheck( StringRef Name, ClangTidyContext *Context) - : ClangTidyCheck(Name, Context), - Inserter(Options.getLocalOrGlobal("IncludeStyle", - utils::IncludeSorter::IS_LLVM)) {} - -void UniqueptrResetReleaseCheck::storeOptions( - ClangTidyOptions::OptionMap &Opts) { - Options.store(Opts, "IncludeStyle", Inserter.getStyle()); -} - -void UniqueptrResetReleaseCheck::registerPPCallbacks( - const SourceManager &SM, Preprocessor *PP, Preprocessor *ModuleExpanderPP) { - Inserter.registerPreprocessor(PP); + : ClangTidyCheck(Name, Context) { + registerIncludeInserter(); } void UniqueptrResetReleaseCheck::registerMatchers(MatchFinder *Finder) { @@ -143,7 +133,7 @@ ResetCall->getEndLoc()), TrailingText); if (NeedsUtilityInclude) - D << Inserter.createIncludeInsertion( + D << createIncludeInsertion( Result.SourceManager->getFileID(ResetMember->getBeginLoc()), ""); } diff --git a/clang-tools-extra/clang-tidy/modernize/LoopConvertCheck.h b/clang-tools-extra/clang-tidy/modernize/LoopConvertCheck.h --- a/clang-tools-extra/clang-tidy/modernize/LoopConvertCheck.h +++ b/clang-tools-extra/clang-tidy/modernize/LoopConvertCheck.h @@ -10,7 +10,6 @@ #define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MODERNIZE_LOOP_CONVERT_H #include "../ClangTidyCheck.h" -#include "../utils/IncludeInserter.h" #include "LoopConvertUtils.h" namespace clang { @@ -25,8 +24,6 @@ } void storeOptions(ClangTidyOptions::OptionMap &Opts) override; void registerMatchers(ast_matchers::MatchFinder *Finder) override; - void registerPPCallbacks(const SourceManager &SM, Preprocessor *PP, - Preprocessor *ModuleExpanderPP) override; void check(const ast_matchers::MatchFinder::MatchResult &Result) override; private: @@ -78,7 +75,6 @@ const unsigned long long MaxCopySize; const Confidence::Level MinConfidence; const VariableNamer::NamingStyle NamingStyle; - utils::IncludeInserter Inserter; bool UseReverseRanges; const bool UseCxx20IfAvailable; std::string ReverseFunction; diff --git a/clang-tools-extra/clang-tidy/modernize/LoopConvertCheck.cpp b/clang-tools-extra/clang-tidy/modernize/LoopConvertCheck.cpp --- a/clang-tools-extra/clang-tidy/modernize/LoopConvertCheck.cpp +++ b/clang-tools-extra/clang-tidy/modernize/LoopConvertCheck.cpp @@ -462,11 +462,10 @@ MaxCopySize(Options.get("MaxCopySize", 16ULL)), MinConfidence(Options.get("MinConfidence", Confidence::CL_Reasonable)), NamingStyle(Options.get("NamingStyle", VariableNamer::NS_CamelCase)), - Inserter(Options.getLocalOrGlobal("IncludeStyle", - utils::IncludeSorter::IS_LLVM)), UseCxx20IfAvailable(Options.get("UseCxx20ReverseRanges", true)), ReverseFunction(Options.get("MakeReverseRangeFunction", "")), ReverseHeader(Options.get("MakeReverseRangeHeader", "")) { + registerIncludeInserter(); if (ReverseFunction.empty() && !ReverseHeader.empty()) { configurationDiag( @@ -485,18 +484,11 @@ Options.store(Opts, "MaxCopySize", MaxCopySize); Options.store(Opts, "MinConfidence", MinConfidence); Options.store(Opts, "NamingStyle", NamingStyle); - Options.store(Opts, "IncludeStyle", Inserter.getStyle()); Options.store(Opts, "UseCxx20ReverseRanges", UseCxx20IfAvailable); Options.store(Opts, "MakeReverseRangeFunction", ReverseFunction); Options.store(Opts, "MakeReverseRangeHeader", ReverseHeader); } -void LoopConvertCheck::registerPPCallbacks(const SourceManager &SM, - Preprocessor *PP, - Preprocessor *ModuleExpanderPP) { - Inserter.registerPreprocessor(PP); -} - void LoopConvertCheck::registerMatchers(MatchFinder *Finder) { Finder->addMatcher(traverse(TK_AsIs, makeArrayLoopMatcher()), this); Finder->addMatcher(traverse(TK_AsIs, makeIteratorLoopMatcher(false)), this); @@ -671,7 +663,7 @@ CharSourceRange::getTokenRange(ParenRange), Range)); if (Descriptor.NeedsReverseCall && !getReverseHeader().empty()) { - if (Optional Insertion = Inserter.createIncludeInsertion( + if (Optional Insertion = createIncludeInsertion( Context->getSourceManager().getFileID(Loop->getBeginLoc()), getReverseHeader())) FixIts.push_back(*Insertion); diff --git a/clang-tools-extra/clang-tidy/modernize/MakeSmartPtrCheck.h b/clang-tools-extra/clang-tidy/modernize/MakeSmartPtrCheck.h --- a/clang-tools-extra/clang-tidy/modernize/MakeSmartPtrCheck.h +++ b/clang-tools-extra/clang-tidy/modernize/MakeSmartPtrCheck.h @@ -10,9 +10,6 @@ #define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MODERNIZE_MAKE_SMART_PTR_H #include "../ClangTidyCheck.h" -#include "../utils/IncludeInserter.h" -#include "clang/ASTMatchers/ASTMatchFinder.h" -#include "clang/ASTMatchers/ASTMatchersInternal.h" #include "llvm/ADT/StringRef.h" #include @@ -26,8 +23,6 @@ MakeSmartPtrCheck(StringRef Name, ClangTidyContext *Context, StringRef MakeSmartPtrFunctionName); void registerMatchers(ast_matchers::MatchFinder *Finder) final; - void registerPPCallbacks(const SourceManager &SM, Preprocessor *PP, - Preprocessor *ModuleExpanderPP) override; void check(const ast_matchers::MatchFinder::MatchResult &Result) final; void storeOptions(ClangTidyOptions::OptionMap &Opts) override; @@ -46,7 +41,6 @@ static const char PointerType[]; private: - utils::IncludeInserter Inserter; const std::string MakeSmartPtrFunctionHeader; const std::string MakeSmartPtrFunctionName; const bool IgnoreMacros; diff --git a/clang-tools-extra/clang-tidy/modernize/MakeSmartPtrCheck.cpp b/clang-tools-extra/clang-tidy/modernize/MakeSmartPtrCheck.cpp --- a/clang-tools-extra/clang-tidy/modernize/MakeSmartPtrCheck.cpp +++ b/clang-tools-extra/clang-tidy/modernize/MakeSmartPtrCheck.cpp @@ -43,18 +43,17 @@ MakeSmartPtrCheck::MakeSmartPtrCheck(StringRef Name, ClangTidyContext *Context, StringRef MakeSmartPtrFunctionName) : ClangTidyCheck(Name, Context), - Inserter(Options.getLocalOrGlobal("IncludeStyle", - utils::IncludeSorter::IS_LLVM)), MakeSmartPtrFunctionHeader( Options.get("MakeSmartPtrFunctionHeader", "")), MakeSmartPtrFunctionName( Options.get("MakeSmartPtrFunction", MakeSmartPtrFunctionName)), IgnoreMacros(Options.getLocalOrGlobal("IgnoreMacros", true)), IgnoreDefaultInitialization( - Options.get("IgnoreDefaultInitialization", true)) {} + Options.get("IgnoreDefaultInitialization", true)) { + registerIncludeInserter(); +} void MakeSmartPtrCheck::storeOptions(ClangTidyOptions::OptionMap &Opts) { - Options.store(Opts, "IncludeStyle", Inserter.getStyle()); Options.store(Opts, "MakeSmartPtrFunctionHeader", MakeSmartPtrFunctionHeader); Options.store(Opts, "MakeSmartPtrFunction", MakeSmartPtrFunctionName); Options.store(Opts, "IgnoreMacros", IgnoreMacros); @@ -67,12 +66,6 @@ return LangOpts.CPlusPlus11; } -void MakeSmartPtrCheck::registerPPCallbacks(const SourceManager &SM, - Preprocessor *PP, - Preprocessor *ModuleExpanderPP) { - Inserter.registerPreprocessor(PP); -} - void MakeSmartPtrCheck::registerMatchers(ast_matchers::MatchFinder *Finder) { // Calling make_smart_ptr from within a member function of a type with a // private or protected constructor would be ill-formed. @@ -435,7 +428,7 @@ if (MakeSmartPtrFunctionHeader.empty()) { return; } - Diag << Inserter.createIncludeInsertion(FD, MakeSmartPtrFunctionHeader); + Diag << createIncludeInsertion(FD, MakeSmartPtrFunctionHeader); } } // namespace modernize diff --git a/clang-tools-extra/clang-tidy/modernize/ModernizeTidyModule.cpp b/clang-tools-extra/clang-tidy/modernize/ModernizeTidyModule.cpp --- a/clang-tools-extra/clang-tidy/modernize/ModernizeTidyModule.cpp +++ b/clang-tools-extra/clang-tidy/modernize/ModernizeTidyModule.cpp @@ -109,8 +109,6 @@ Opts["modernize-loop-convert.MinConfidence"] = "reasonable"; Opts["modernize-loop-convert.NamingStyle"] = "CamelCase"; - Opts["modernize-pass-by-value.IncludeStyle"] = "llvm"; // Also: "google". - Opts["modernize-replace-auto-ptr.IncludeStyle"] = "llvm"; // Also: "google". // Comma-separated list of macros that behave like NULL. Opts["modernize-use-nullptr.NullMacros"] = "NULL"; diff --git a/clang-tools-extra/clang-tidy/modernize/PassByValueCheck.h b/clang-tools-extra/clang-tidy/modernize/PassByValueCheck.h --- a/clang-tools-extra/clang-tidy/modernize/PassByValueCheck.h +++ b/clang-tools-extra/clang-tidy/modernize/PassByValueCheck.h @@ -10,7 +10,6 @@ #define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MODERNIZE_PASS_BY_VALUE_H #include "../ClangTidyCheck.h" -#include "../utils/IncludeInserter.h" #include @@ -25,13 +24,9 @@ return LangOpts.CPlusPlus; } void storeOptions(ClangTidyOptions::OptionMap &Opts) override; - void registerPPCallbacks(const SourceManager &SM, Preprocessor *PP, - Preprocessor *ModuleExpanderPP) override; void registerMatchers(ast_matchers::MatchFinder *Finder) override; void check(const ast_matchers::MatchFinder::MatchResult &Result) override; -private: - utils::IncludeInserter Inserter; const bool ValuesOnly; }; diff --git a/clang-tools-extra/clang-tidy/modernize/PassByValueCheck.cpp b/clang-tools-extra/clang-tidy/modernize/PassByValueCheck.cpp --- a/clang-tools-extra/clang-tidy/modernize/PassByValueCheck.cpp +++ b/clang-tools-extra/clang-tidy/modernize/PassByValueCheck.cpp @@ -189,12 +189,11 @@ PassByValueCheck::PassByValueCheck(StringRef Name, ClangTidyContext *Context) : ClangTidyCheck(Name, Context), - Inserter(Options.getLocalOrGlobal("IncludeStyle", - utils::IncludeSorter::IS_LLVM)), - ValuesOnly(Options.get("ValuesOnly", false)) {} + ValuesOnly(Options.get("ValuesOnly", false)) { + registerIncludeInserter(); +} void PassByValueCheck::storeOptions(ClangTidyOptions::OptionMap &Opts) { - Options.store(Opts, "IncludeStyle", Inserter.getStyle()); Options.store(Opts, "ValuesOnly", ValuesOnly); } @@ -233,12 +232,6 @@ this); } -void PassByValueCheck::registerPPCallbacks(const SourceManager &SM, - Preprocessor *PP, - Preprocessor *ModuleExpanderPP) { - Inserter.registerPreprocessor(PP); -} - void PassByValueCheck::check(const MatchFinder::MatchResult &Result) { const auto *Ctor = Result.Nodes.getNodeAs("Ctor"); const auto *ParamDecl = Result.Nodes.getNodeAs("Param"); @@ -298,7 +291,7 @@ Diag << FixItHint::CreateInsertion(Initializer->getRParenLoc(), ")") << FixItHint::CreateInsertion( Initializer->getLParenLoc().getLocWithOffset(1), "std::move(") - << Inserter.createIncludeInsertion( + << createIncludeInsertion( Result.SourceManager->getFileID(Initializer->getSourceLocation()), ""); } diff --git a/clang-tools-extra/clang-tidy/modernize/ReplaceAutoPtrCheck.h b/clang-tools-extra/clang-tidy/modernize/ReplaceAutoPtrCheck.h --- a/clang-tools-extra/clang-tidy/modernize/ReplaceAutoPtrCheck.h +++ b/clang-tools-extra/clang-tidy/modernize/ReplaceAutoPtrCheck.h @@ -10,7 +10,6 @@ #define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MODERNIZE_REPLACE_AUTO_PTR_H #include "../ClangTidyCheck.h" -#include "../utils/IncludeInserter.h" namespace clang { namespace tidy { @@ -46,14 +45,8 @@ bool isLanguageVersionSupported(const LangOptions &LangOpts) const override { return LangOpts.CPlusPlus; } - void storeOptions(ClangTidyOptions::OptionMap &Opts) override; void registerMatchers(ast_matchers::MatchFinder *Finder) override; - void registerPPCallbacks(const SourceManager &SM, Preprocessor *PP, - Preprocessor *ModuleExpanderPP) override; void check(const ast_matchers::MatchFinder::MatchResult &Result) override; - -private: - utils::IncludeInserter Inserter; }; } // namespace modernize diff --git a/clang-tools-extra/clang-tidy/modernize/ReplaceAutoPtrCheck.cpp b/clang-tools-extra/clang-tidy/modernize/ReplaceAutoPtrCheck.cpp --- a/clang-tools-extra/clang-tidy/modernize/ReplaceAutoPtrCheck.cpp +++ b/clang-tools-extra/clang-tidy/modernize/ReplaceAutoPtrCheck.cpp @@ -39,14 +39,9 @@ ReplaceAutoPtrCheck::ReplaceAutoPtrCheck(StringRef Name, ClangTidyContext *Context) - : ClangTidyCheck(Name, Context), - Inserter(Options.getLocalOrGlobal("IncludeStyle", - utils::IncludeSorter::IS_LLVM)) {} - -void ReplaceAutoPtrCheck::storeOptions(ClangTidyOptions::OptionMap &Opts) { - Options.store(Opts, "IncludeStyle", Inserter.getStyle()); + : ClangTidyCheck(Name, Context) { + registerIncludeInserter(); } - void ReplaceAutoPtrCheck::registerMatchers(MatchFinder *Finder) { auto AutoPtrDecl = recordDecl(hasName("auto_ptr"), isInStdNamespace()); auto AutoPtrType = qualType(hasDeclaration(AutoPtrDecl)); @@ -94,12 +89,6 @@ this); } -void ReplaceAutoPtrCheck::registerPPCallbacks(const SourceManager &SM, - Preprocessor *PP, - Preprocessor *ModuleExpanderPP) { - Inserter.registerPreprocessor(PP); -} - void ReplaceAutoPtrCheck::check(const MatchFinder::MatchResult &Result) { SourceManager &SM = *Result.SourceManager; if (const auto *E = @@ -113,7 +102,7 @@ auto Diag = diag(Range.getBegin(), "use std::move to transfer ownership") << FixItHint::CreateInsertion(Range.getBegin(), "std::move(") << FixItHint::CreateInsertion(Range.getEnd(), ")") - << Inserter.createMainFileIncludeInsertion(""); + << createMainFileIncludeInsertion(""); return; } diff --git a/clang-tools-extra/clang-tidy/modernize/ReplaceRandomShuffleCheck.h b/clang-tools-extra/clang-tidy/modernize/ReplaceRandomShuffleCheck.h --- a/clang-tools-extra/clang-tidy/modernize/ReplaceRandomShuffleCheck.h +++ b/clang-tools-extra/clang-tidy/modernize/ReplaceRandomShuffleCheck.h @@ -10,7 +10,6 @@ #define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MODERNIZE_REPLACE_RANDOM_SHUFFLE_H #include "../ClangTidyCheck.h" -#include "../utils/IncludeInserter.h" namespace clang { namespace tidy { @@ -24,17 +23,11 @@ class ReplaceRandomShuffleCheck : public ClangTidyCheck { public: ReplaceRandomShuffleCheck(StringRef Name, ClangTidyContext *Context); - void registerPPCallbacks(const SourceManager &SM, Preprocessor *PP, - Preprocessor *ModuleExpanderPP) override; bool isLanguageVersionSupported(const LangOptions &LangOpts) const override { return LangOpts.CPlusPlus11; } - void storeOptions(ClangTidyOptions::OptionMap &Opts) override; void registerMatchers(ast_matchers::MatchFinder *Finder) override; void check(const ast_matchers::MatchFinder::MatchResult &Result) override; - -private: - utils::IncludeInserter IncludeInserter; }; } // namespace modernize diff --git a/clang-tools-extra/clang-tidy/modernize/ReplaceRandomShuffleCheck.cpp b/clang-tools-extra/clang-tidy/modernize/ReplaceRandomShuffleCheck.cpp --- a/clang-tools-extra/clang-tidy/modernize/ReplaceRandomShuffleCheck.cpp +++ b/clang-tools-extra/clang-tidy/modernize/ReplaceRandomShuffleCheck.cpp @@ -22,9 +22,8 @@ ReplaceRandomShuffleCheck::ReplaceRandomShuffleCheck(StringRef Name, ClangTidyContext *Context) - : ClangTidyCheck(Name, Context), - IncludeInserter(Options.getLocalOrGlobal("IncludeStyle", - utils::IncludeSorter::IS_LLVM)) { + : ClangTidyCheck(Name, Context) { + registerIncludeInserter(); } void ReplaceRandomShuffleCheck::registerMatchers(MatchFinder *Finder) { @@ -43,16 +42,6 @@ this); } -void ReplaceRandomShuffleCheck::registerPPCallbacks( - const SourceManager &SM, Preprocessor *PP, Preprocessor *ModuleExpanderPP) { - IncludeInserter.registerPreprocessor(PP); -} - -void ReplaceRandomShuffleCheck::storeOptions( - ClangTidyOptions::OptionMap &Opts) { - Options.store(Opts, "IncludeStyle", IncludeInserter.getStyle()); -} - void ReplaceRandomShuffleCheck::check(const MatchFinder::MatchResult &Result) { const auto *MatchedDecl = Result.Nodes.getNodeAs("name"); const auto *MatchedArgumentThree = Result.Nodes.getNodeAs("randomFunc"); @@ -90,10 +79,9 @@ Diag << FixItHint::CreateRemoval(MatchedDecl->getSourceRange()); Diag << FixItHint::CreateInsertion(MatchedDecl->getBeginLoc(), NewName); - Diag << IncludeInserter.createIncludeInsertion( - Result.Context->getSourceManager().getFileID( - MatchedCallExpr->getBeginLoc()), - ""); + Diag << createIncludeInsertion(Result.Context->getSourceManager().getFileID( + MatchedCallExpr->getBeginLoc()), + ""); } } // namespace modernize diff --git a/clang-tools-extra/clang-tidy/performance/TypePromotionInMathFnCheck.h b/clang-tools-extra/clang-tidy/performance/TypePromotionInMathFnCheck.h --- a/clang-tools-extra/clang-tidy/performance/TypePromotionInMathFnCheck.h +++ b/clang-tools-extra/clang-tidy/performance/TypePromotionInMathFnCheck.h @@ -10,7 +10,6 @@ #define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_PERFORMANCE_TYPE_PROMOTION_IN_MATH_FN_H #include "../ClangTidyCheck.h" -#include "../utils/IncludeInserter.h" namespace clang { namespace tidy { @@ -29,14 +28,8 @@ public: TypePromotionInMathFnCheck(StringRef Name, ClangTidyContext *Context); - void registerPPCallbacks(const SourceManager &SM, Preprocessor *PP, - Preprocessor *ModuleExpanderPP) override; - void storeOptions(ClangTidyOptions::OptionMap &Opts) override; void registerMatchers(ast_matchers::MatchFinder *Finder) override; void check(const ast_matchers::MatchFinder::MatchResult &Result) override; - -private: - utils::IncludeInserter IncludeInserter; }; } // namespace performance diff --git a/clang-tools-extra/clang-tidy/performance/TypePromotionInMathFnCheck.cpp b/clang-tools-extra/clang-tidy/performance/TypePromotionInMathFnCheck.cpp --- a/clang-tools-extra/clang-tidy/performance/TypePromotionInMathFnCheck.cpp +++ b/clang-tools-extra/clang-tidy/performance/TypePromotionInMathFnCheck.cpp @@ -30,19 +30,8 @@ TypePromotionInMathFnCheck::TypePromotionInMathFnCheck( StringRef Name, ClangTidyContext *Context) - : ClangTidyCheck(Name, Context), - IncludeInserter(Options.getLocalOrGlobal("IncludeStyle", - utils::IncludeSorter::IS_LLVM)) { -} - -void TypePromotionInMathFnCheck::registerPPCallbacks( - const SourceManager &SM, Preprocessor *PP, Preprocessor *ModuleExpanderPP) { - IncludeInserter.registerPreprocessor(PP); -} - -void TypePromotionInMathFnCheck::storeOptions( - ClangTidyOptions::OptionMap &Opts) { - Options.store(Opts, "IncludeStyle", IncludeInserter.getStyle()); + : ClangTidyCheck(Name, Context) { + registerIncludeInserter(); } void TypePromotionInMathFnCheck::registerMatchers(MatchFinder *Finder) { @@ -190,7 +179,7 @@ // , because the functions we're suggesting moving away from are all // declared in . if (FnInCmath) - Diag << IncludeInserter.createIncludeInsertion( + Diag << createIncludeInsertion( Result.Context->getSourceManager().getFileID(Call->getBeginLoc()), ""); } diff --git a/clang-tools-extra/clang-tidy/performance/UnnecessaryValueParamCheck.h b/clang-tools-extra/clang-tidy/performance/UnnecessaryValueParamCheck.h --- a/clang-tools-extra/clang-tidy/performance/UnnecessaryValueParamCheck.h +++ b/clang-tools-extra/clang-tidy/performance/UnnecessaryValueParamCheck.h @@ -10,7 +10,6 @@ #define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_PERFORMANCE_UNNECESSARY_VALUE_PARAM_H #include "../ClangTidyCheck.h" -#include "../utils/IncludeInserter.h" #include "clang/Analysis/Analyses/ExprMutationAnalyzer.h" namespace clang { @@ -30,8 +29,6 @@ } void registerMatchers(ast_matchers::MatchFinder *Finder) override; void check(const ast_matchers::MatchFinder::MatchResult &Result) override; - void registerPPCallbacks(const SourceManager &SM, Preprocessor *PP, - Preprocessor *ModuleExpanderPP) override; void storeOptions(ClangTidyOptions::OptionMap &Opts) override; void onEndOfTranslationUnit() override; @@ -41,7 +38,6 @@ llvm::DenseMap MutationAnalyzers; - utils::IncludeInserter Inserter; const std::vector AllowedTypes; }; diff --git a/clang-tools-extra/clang-tidy/performance/UnnecessaryValueParamCheck.cpp b/clang-tools-extra/clang-tidy/performance/UnnecessaryValueParamCheck.cpp --- a/clang-tools-extra/clang-tidy/performance/UnnecessaryValueParamCheck.cpp +++ b/clang-tools-extra/clang-tidy/performance/UnnecessaryValueParamCheck.cpp @@ -68,10 +68,10 @@ UnnecessaryValueParamCheck::UnnecessaryValueParamCheck( StringRef Name, ClangTidyContext *Context) : ClangTidyCheck(Name, Context), - Inserter(Options.getLocalOrGlobal("IncludeStyle", - utils::IncludeSorter::IS_LLVM)), AllowedTypes( - utils::options::parseStringList(Options.get("AllowedTypes", ""))) {} + utils::options::parseStringList(Options.get("AllowedTypes", ""))) { + registerIncludeInserter(); +} void UnnecessaryValueParamCheck::registerMatchers(MatchFinder *Finder) { const auto ExpensiveValueParamDecl = parmVarDecl( @@ -168,14 +168,8 @@ } } -void UnnecessaryValueParamCheck::registerPPCallbacks( - const SourceManager &SM, Preprocessor *PP, Preprocessor *ModuleExpanderPP) { - Inserter.registerPreprocessor(PP); -} - void UnnecessaryValueParamCheck::storeOptions( ClangTidyOptions::OptionMap &Opts) { - Options.store(Opts, "IncludeStyle", Inserter.getStyle()); Options.store(Opts, "AllowedTypes", utils::options::serializeStringList(AllowedTypes)); } @@ -199,8 +193,8 @@ Context.getLangOpts()); Diag << FixItHint::CreateInsertion(CopyArgument.getBeginLoc(), "std::move(") << FixItHint::CreateInsertion(EndLoc, ")") - << Inserter.createIncludeInsertion( - SM.getFileID(CopyArgument.getBeginLoc()), ""); + << createIncludeInsertion(SM.getFileID(CopyArgument.getBeginLoc()), + ""); } } // namespace performance diff --git a/clang-tools-extra/clang-tidy/readability/UseAnyOfAllOfCheck.h b/clang-tools-extra/clang-tidy/readability/UseAnyOfAllOfCheck.h --- a/clang-tools-extra/clang-tidy/readability/UseAnyOfAllOfCheck.h +++ b/clang-tools-extra/clang-tidy/readability/UseAnyOfAllOfCheck.h @@ -10,7 +10,6 @@ #define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_READABILITY_USEALGORITHMCHECK_H #include "../ClangTidyCheck.h" -#include "../utils/IncludeInserter.h" namespace clang { namespace tidy { diff --git a/clang-tools-extra/clang-tidy/utils/CMakeLists.txt b/clang-tools-extra/clang-tidy/utils/CMakeLists.txt --- a/clang-tools-extra/clang-tidy/utils/CMakeLists.txt +++ b/clang-tools-extra/clang-tidy/utils/CMakeLists.txt @@ -12,8 +12,6 @@ FileExtensionsUtils.cpp FixItHintUtils.cpp HeaderGuard.cpp - IncludeInserter.cpp - IncludeSorter.cpp LexerUtils.cpp NamespaceAliaser.cpp OptionsUtils.cpp diff --git a/clang-tools-extra/clang-tidy/utils/TransformerClangTidyCheck.h b/clang-tools-extra/clang-tidy/utils/TransformerClangTidyCheck.h --- a/clang-tools-extra/clang-tidy/utils/TransformerClangTidyCheck.h +++ b/clang-tools-extra/clang-tidy/utils/TransformerClangTidyCheck.h @@ -10,8 +10,6 @@ #define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_TRANSFORMER_CLANG_TIDY_CHECK_H #include "../ClangTidyCheck.h" -#include "IncludeInserter.h" -#include "IncludeSorter.h" #include "clang/ASTMatchers/ASTMatchFinder.h" #include "clang/Tooling/Transformer/Transformer.h" @@ -30,12 +28,6 @@ // : TransformerClangTidyCheck(MyCheckAsRewriteRule, Name, Context) {} // }; // -// `TransformerClangTidyCheck` recognizes this clang-tidy option: -// -// * IncludeStyle. A string specifying which file naming convention is used by -// the source code, 'llvm' or 'google'. Default is 'llvm'. The naming -// convention influences how canonical headers are distinguished from other -// includes. class TransformerClangTidyCheck : public ClangTidyCheck { public: TransformerClangTidyCheck(StringRef Name, ClangTidyContext *Context); @@ -58,15 +50,9 @@ TransformerClangTidyCheck(transformer::RewriteRule R, StringRef Name, ClangTidyContext *Context); - void registerPPCallbacks(const SourceManager &SM, Preprocessor *PP, - Preprocessor *ModuleExpanderPP) override; void registerMatchers(ast_matchers::MatchFinder *Finder) final; void check(const ast_matchers::MatchFinder::MatchResult &Result) final; - /// Derived classes that override this function should call this method from - /// the overridden method. - void storeOptions(ClangTidyOptions::OptionMap &Opts) override; - /// Set the rule that this check implements. All cases in the rule must have /// a non-null \c Explanation, even though \c Explanation is optional for /// RewriteRule in general. Because the primary purpose of clang-tidy checks @@ -78,7 +64,6 @@ private: transformer::RewriteRule Rule; - IncludeInserter Inserter; }; } // namespace utils diff --git a/clang-tools-extra/clang-tidy/utils/TransformerClangTidyCheck.cpp b/clang-tools-extra/clang-tidy/utils/TransformerClangTidyCheck.cpp --- a/clang-tools-extra/clang-tidy/utils/TransformerClangTidyCheck.cpp +++ b/clang-tools-extra/clang-tidy/utils/TransformerClangTidyCheck.cpp @@ -29,10 +29,9 @@ TransformerClangTidyCheck::TransformerClangTidyCheck(StringRef Name, ClangTidyContext *Context) - : ClangTidyCheck(Name, Context), - Inserter( - Options.getLocalOrGlobal("IncludeStyle", IncludeSorter::IS_LLVM)) {} - + : ClangTidyCheck(Name, Context) { + registerIncludeInserter(); +} // This constructor cannot dispatch to the simpler one (below), because, in // order to get meaningful results from `getLangOpts` and `Options`, we need the // `ClangTidyCheck()` constructor to have been called. If we were to dispatch, @@ -44,6 +43,7 @@ MakeRule, StringRef Name, ClangTidyContext *Context) : TransformerClangTidyCheck(Name, Context) { + registerIncludeInserter(); if (Optional R = MakeRule(getLangOpts(), Options)) setRule(std::move(*R)); } @@ -52,6 +52,7 @@ StringRef Name, ClangTidyContext *Context) : TransformerClangTidyCheck(Name, Context) { + registerIncludeInserter(); setRule(std::move(R)); } @@ -60,11 +61,6 @@ Rule = std::move(R); } -void TransformerClangTidyCheck::registerPPCallbacks( - const SourceManager &SM, Preprocessor *PP, Preprocessor *ModuleExpanderPP) { - Inserter.registerPreprocessor(PP); -} - void TransformerClangTidyCheck::registerMatchers( ast_matchers::MatchFinder *Finder) { if (!Rule.Cases.empty()) @@ -104,17 +100,12 @@ Diag << FixItHint::CreateReplacement(T.Range, T.Replacement); break; case transformer::EditKind::AddInclude: - Diag << Inserter.createIncludeInsertion( + Diag << createIncludeInsertion( Result.SourceManager->getFileID(T.Range.getBegin()), T.Replacement); break; } } -void TransformerClangTidyCheck::storeOptions( - ClangTidyOptions::OptionMap &Opts) { - Options.store(Opts, "IncludeStyle", Inserter.getStyle()); -} - } // namespace utils } // namespace tidy } // namespace clang diff --git a/clang-tools-extra/clangd/ParsedAST.cpp b/clang-tools-extra/clangd/ParsedAST.cpp --- a/clang-tools-extra/clangd/ParsedAST.cpp +++ b/clang-tools-extra/clangd/ParsedAST.cpp @@ -429,6 +429,7 @@ return !Check->isLanguageVersionSupported(CTContext->getLangOpts()); }); Preprocessor *PP = &Clang->getPreprocessor(); + CTContext->addInserterCallbacks(PP); for (const auto &Check : CTChecks) { Check->registerPPCallbacks(Clang->getSourceManager(), PP, PP); Check->registerMatchers(&CTFinder); diff --git a/clang-tools-extra/unittests/clang-tidy/ClangTidyTest.h b/clang-tools-extra/unittests/clang-tidy/ClangTidyTest.h --- a/clang-tools-extra/unittests/clang-tidy/ClangTidyTest.h +++ b/clang-tools-extra/unittests/clang-tidy/ClangTidyTest.h @@ -67,6 +67,9 @@ // `getLangOpts()`). CheckFactory::createChecks(&Context, Checks); assert(!Checks.empty() && "No checks created"); + + Context.addInserterCallbacks(PP); + for (auto &Check : Checks) { assert(Check.get() && "Checks can't be null"); if (!Check->isLanguageVersionSupported(Context.getLangOpts())) diff --git a/clang-tools-extra/unittests/clang-tidy/IncludeInserterTest.cpp b/clang-tools-extra/unittests/clang-tidy/IncludeInserterTest.cpp --- a/clang-tools-extra/unittests/clang-tidy/IncludeInserterTest.cpp +++ b/clang-tools-extra/unittests/clang-tidy/IncludeInserterTest.cpp @@ -6,7 +6,6 @@ // //===----------------------------------------------------------------------===// -#include "../clang-tidy/utils/IncludeInserter.h" #include "clang/Lex/Preprocessor.h" #include "clang/Frontend/CompilerInstance.h" #include "ClangTidyTest.h" @@ -28,14 +27,11 @@ class IncludeInserterCheckBase : public ClangTidyCheck { public: - IncludeInserterCheckBase(StringRef CheckName, ClangTidyContext *Context, - utils::IncludeSorter::IncludeStyle Style = - utils::IncludeSorter::IS_Google) - : ClangTidyCheck(CheckName, Context), Inserter(Style) {} - - void registerPPCallbacks(const SourceManager &SM, Preprocessor *PP, - Preprocessor *ModuleExpanderPP) override { - Inserter.registerPreprocessor(PP); + IncludeInserterCheckBase( + StringRef CheckName, ClangTidyContext *Context, + IncludeSorter::IncludeStyle Style = IncludeSorter::IS_Google) + : ClangTidyCheck(CheckName, Context) { + Context->registerIncludeInserter(Style); } void registerMatchers(ast_matchers::MatchFinder *Finder) override { @@ -46,13 +42,11 @@ auto Diag = diag(Result.Nodes.getNodeAs("stmt")->getBeginLoc(), "foo, bar"); for (StringRef Header : headersToInclude()) { - Diag << Inserter.createMainFileIncludeInsertion(Header); + Diag << createMainFileIncludeInsertion(Header); } } virtual std::vector headersToInclude() const = 0; - - utils::IncludeInserter Inserter; }; class NonSystemHeaderInserterCheck : public IncludeInserterCheckBase { @@ -118,7 +112,7 @@ ObjCEarlyInAlphabetHeaderInserterCheck(StringRef CheckName, ClangTidyContext *Context) : IncludeInserterCheckBase(CheckName, Context, - utils::IncludeSorter::IS_Google_ObjC) {} + IncludeSorter::IS_Google_ObjC) {} std::vector headersToInclude() const override { return {"a/header.h"}; @@ -130,7 +124,7 @@ ObjCCategoryHeaderInserterCheck(StringRef CheckName, ClangTidyContext *Context) : IncludeInserterCheckBase(CheckName, Context, - utils::IncludeSorter::IS_Google_ObjC) {} + IncludeSorter::IS_Google_ObjC) {} std::vector headersToInclude() const override { return {"top_level_test_header+foo.h"}; @@ -142,7 +136,7 @@ ObjCGeneratedHeaderInserterCheck(StringRef CheckName, ClangTidyContext *Context) : IncludeInserterCheckBase(CheckName, Context, - utils::IncludeSorter::IS_Google_ObjC) {} + IncludeSorter::IS_Google_ObjC) {} std::vector headersToInclude() const override { return {"clang_tidy/tests/generated_file.proto.h"}; diff --git a/clang-tools-extra/unittests/clang-tidy/TransformerClangTidyCheckTest.cpp b/clang-tools-extra/unittests/clang-tidy/TransformerClangTidyCheckTest.cpp --- a/clang-tools-extra/unittests/clang-tidy/TransformerClangTidyCheckTest.cpp +++ b/clang-tools-extra/unittests/clang-tidy/TransformerClangTidyCheckTest.cpp @@ -256,38 +256,6 @@ : TransformerClangTidyCheck(rule(), Name, Context) {} }; -TEST(TransformerClangTidyCheckTest, AddIncludeObeysSortStyleLocalOption) { - std::string Input = R"cc(#include "input.h" -int h(int x) { return 3; })cc"; - - std::string TreatsAsLibraryHeader = R"cc(#include "input.h" - -#include "bar.h" -int h(int x) { return 5; })cc"; - - std::string TreatsAsNormalHeader = R"cc(#include "bar.h" -#include "input.h" -int h(int x) { return 5; })cc"; - - ClangTidyOptions Options; - std::map PathsToContent = {{"input.h", "\n"}}; - Options.CheckOptions["test-check-0.IncludeStyle"] = "llvm"; - EXPECT_EQ(TreatsAsLibraryHeader, test::runCheckOnCode( - Input, nullptr, "inputTest.cpp", None, - Options, PathsToContent)); - EXPECT_EQ(TreatsAsNormalHeader, test::runCheckOnCode( - Input, nullptr, "input_test.cpp", None, - Options, PathsToContent)); - - Options.CheckOptions["test-check-0.IncludeStyle"] = "google"; - EXPECT_EQ(TreatsAsNormalHeader, - test::runCheckOnCode( - Input, nullptr, "inputTest.cc", None, Options, PathsToContent)); - EXPECT_EQ(TreatsAsLibraryHeader, test::runCheckOnCode( - Input, nullptr, "input_test.cc", None, - Options, PathsToContent)); -} - TEST(TransformerClangTidyCheckTest, AddIncludeObeysSortStyleGlobalOption) { std::string Input = R"cc(#include "input.h" int h(int x) { return 3; })cc";