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 @@ -9,8 +9,7 @@ #ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_ABSEIL_STRINGFINDSTARTSWITHCHECK_H #define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_ABSEIL_STRINGFINDSTARTSWITHCHECK_H -#include "../ClangTidyCheck.h" -#include "../utils/IncludeInserter.h" +#include "../utils/IncluderClangTidyCheck.h" #include "clang/ASTMatchers/ASTMatchFinder.h" #include @@ -24,19 +23,16 @@ // Find string.find(...) == 0 comparisons and suggest replacing with StartsWith. // FIXME(niko): Add similar check for EndsWith // FIXME(niko): Add equivalent modernize checks for C++20's std::starts_With -class StringFindStartswithCheck : public ClangTidyCheck { +class StringFindStartswithCheck : public IncluderClangTidyCheck { public: - using ClangTidyCheck::ClangTidyCheck; + using IncluderClangTidyCheck::IncluderClangTidyCheck; 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 @@ -23,11 +23,9 @@ StringFindStartswithCheck::StringFindStartswithCheck(StringRef Name, ClangTidyContext *Context) - : ClangTidyCheck(Name, Context), + : IncluderClangTidyCheck(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")) {} @@ -124,21 +122,15 @@ // Create a preprocessor #include FixIt hint (createIncludeInsertion checks // whether this already exists). - Diagnostic << IncludeInserter.createIncludeInsertion( - Source.getFileID(ComparisonExpr->getBeginLoc()), - AbseilStringsMatchHeader); -} - -void StringFindStartswithCheck::registerPPCallbacks( - const SourceManager &SM, Preprocessor *PP, Preprocessor *ModuleExpanderPP) { - IncludeInserter.registerPreprocessor(PP); + Diagnostic << createIncludeInsertion(ComparisonExpr->getBeginLoc(), + AbseilStringsMatchHeader); } void StringFindStartswithCheck::storeOptions( ClangTidyOptions::OptionMap &Opts) { + IncluderClangTidyCheck::storeOptions(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 @@ -9,8 +9,7 @@ #ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_BUGPRONE_IMPLICITWIDENINGOFMULTIPLICATIONRESULTCHECK_H #define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_BUGPRONE_IMPLICITWIDENINGOFMULTIPLICATIONRESULTCHECK_H -#include "../ClangTidyCheck.h" -#include "../utils/IncludeInserter.h" +#include "../utils/IncluderClangTidyCheck.h" namespace clang { namespace tidy { @@ -20,7 +19,7 @@ /// /// For the user-facing documentation see: /// http://clang.llvm.org/extra/clang-tidy/checks/bugprone-implicit-widening-of-multiplication-result.html -class ImplicitWideningOfMultiplicationResultCheck : public ClangTidyCheck { +class ImplicitWideningOfMultiplicationResultCheck : public IncluderClangTidyCheck { const ast_matchers::MatchFinder::MatchResult *Result; bool ShouldUseCXXStaticCast; bool ShouldUseCXXHeader; @@ -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 @@ -38,33 +38,25 @@ ImplicitWideningOfMultiplicationResultCheck:: ImplicitWideningOfMultiplicationResultCheck(StringRef Name, ClangTidyContext *Context) - : ClangTidyCheck(Name, Context), + : IncluderClangTidyCheck(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)) {} void ImplicitWideningOfMultiplicationResultCheck::storeOptions( ClangTidyOptions::OptionMap &Opts) { + IncluderClangTidyCheck::storeOptions(Opts); 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(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 @@ -9,8 +9,7 @@ #ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_CPPCOREGUIDELINES_INITVARIABLESCHECK_H #define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_CPPCOREGUIDELINES_INITVARIABLESCHECK_H -#include "../ClangTidyCheck.h" -#include "../utils/IncludeInserter.h" +#include "../utils/IncluderClangTidyCheck.h" #include "../utils/OptionsUtils.h" namespace clang { @@ -21,17 +20,14 @@ /// /// For the user-facing documentation see: /// http://clang.llvm.org/extra/clang-tidy/checks/cppcoreguidelines-init-variables.html -class InitVariablesCheck : public ClangTidyCheck { +class InitVariablesCheck : public IncluderClangTidyCheck { 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 @@ -25,13 +25,11 @@ InitVariablesCheck::InitVariablesCheck(StringRef Name, ClangTidyContext *Context) - : ClangTidyCheck(Name, Context), - IncludeInserter(Options.getLocalOrGlobal("IncludeStyle", - utils::IncludeSorter::IS_LLVM)), + : IncluderClangTidyCheck(Name, Context), MathHeader(Options.get("MathHeader", "")) {} void InitVariablesCheck::storeOptions(ClangTidyOptions::OptionMap &Opts) { - Options.store(Opts, "IncludeStyle", IncludeInserter.getStyle()); + IncluderClangTidyCheck::storeOptions(Opts); Options.store(Opts, "MathHeader", MathHeader); } @@ -48,16 +46,8 @@ 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; - const SourceManager &Source = Context.getSourceManager(); // We want to warn about cases where the type name // comes from a macro like this: @@ -104,10 +94,9 @@ MatchedDecl->getLocation().getLocWithOffset( MatchedDecl->getName().size()), *InitializationString); - if (AddMathInclude) { - Diagnostic << IncludeInserter.createIncludeInsertion( - Source.getFileID(MatchedDecl->getBeginLoc()), MathHeader); - } + if (AddMathInclude) + Diagnostic << createIncludeInsertion(MatchedDecl->getBeginLoc(), + MathHeader); } } } // namespace cppcoreguidelines 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 @@ -9,8 +9,7 @@ #ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_CPPCOREGUIDELINES_PRO_BOUNDS_CONSTANT_ARRAY_INDEX_H #define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_CPPCOREGUIDELINES_PRO_BOUNDS_CONSTANT_ARRAY_INDEX_H -#include "../ClangTidyCheck.h" -#include "../utils/IncludeInserter.h" +#include "../utils/IncluderClangTidyCheck.h" namespace clang { namespace tidy { @@ -21,20 +20,18 @@ /// /// For the user-facing documentation see: /// 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; - +class ProBoundsConstantArrayIndexCheck : public IncluderClangTidyCheck { 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; + +private: + const std::string GslHeader; }; } // namespace cppcoreguidelines 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,13 @@ ProBoundsConstantArrayIndexCheck::ProBoundsConstantArrayIndexCheck( StringRef Name, ClangTidyContext *Context) - : ClangTidyCheck(Name, Context), GslHeader(Options.get("GslHeader", "")), - Inserter(Options.getLocalOrGlobal("IncludeStyle", - utils::IncludeSorter::IS_LLVM)) {} + : IncluderClangTidyCheck(Name, Context), + GslHeader(Options.get("GslHeader", "")) {} void ProBoundsConstantArrayIndexCheck::storeOptions( ClangTidyOptions::OptionMap &Opts) { + IncluderClangTidyCheck::storeOptions(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 +79,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 @@ -9,8 +9,7 @@ #ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MISC_UNIQUEPTRRESETRELEASECHECK_H #define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MISC_UNIQUEPTRRESETRELEASECHECK_H -#include "../ClangTidyCheck.h" -#include "../utils/IncludeInserter.h" +#include "../utils/IncluderClangTidyCheck.h" namespace clang { namespace tidy { @@ -27,7 +26,7 @@ /// /// If `y` is already rvalue, `std::move()` is not added. `x` and `y` can also /// be `std::unique_ptr*`. -class UniqueptrResetReleaseCheck : public ClangTidyCheck { +class UniqueptrResetReleaseCheck : public IncluderClangTidyCheck { public: UniqueptrResetReleaseCheck(StringRef Name, ClangTidyContext *Context); @@ -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,19 +18,7 @@ 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); -} + : IncluderClangTidyCheck(Name, Context) {} void UniqueptrResetReleaseCheck::registerMatchers(MatchFinder *Finder) { Finder->addMatcher( @@ -143,9 +131,7 @@ ResetCall->getEndLoc()), TrailingText); if (NeedsUtilityInclude) - D << Inserter.createIncludeInsertion( - Result.SourceManager->getFileID(ResetMember->getBeginLoc()), - ""); + D << createIncludeInsertion(ResetMember->getBeginLoc(), ""); } } // namespace misc } // namespace tidy 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 @@ -9,15 +9,14 @@ #ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MODERNIZE_LOOP_CONVERT_H #define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MODERNIZE_LOOP_CONVERT_H -#include "../ClangTidyCheck.h" -#include "../utils/IncludeInserter.h" +#include "../utils/IncluderClangTidyCheck.h" #include "LoopConvertUtils.h" namespace clang { namespace tidy { namespace modernize { -class LoopConvertCheck : public ClangTidyCheck { +class LoopConvertCheck : public IncluderClangTidyCheck { public: LoopConvertCheck(StringRef Name, ClangTidyContext *Context); bool isLanguageVersionSupported(const LangOptions &LangOpts) const override { @@ -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 @@ -458,16 +458,13 @@ DerefByValue(false), NeedsReverseCall(false) {} LoopConvertCheck::LoopConvertCheck(StringRef Name, ClangTidyContext *Context) - : ClangTidyCheck(Name, Context), TUInfo(new TUTrackingInfo), + : IncluderClangTidyCheck(Name, Context), TUInfo(new TUTrackingInfo), 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", "")) { - if (ReverseFunction.empty() && !ReverseHeader.empty()) { configurationDiag( "modernize-loop-convert: 'MakeReverseRangeHeader' is set but " @@ -482,21 +479,15 @@ } void LoopConvertCheck::storeOptions(ClangTidyOptions::OptionMap &Opts) { + IncluderClangTidyCheck::storeOptions(Opts); 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,9 +662,8 @@ CharSourceRange::getTokenRange(ParenRange), Range)); if (Descriptor.NeedsReverseCall && !getReverseHeader().empty()) { - if (Optional Insertion = Inserter.createIncludeInsertion( - Context->getSourceManager().getFileID(Loop->getBeginLoc()), - getReverseHeader())) + if (Optional Insertion = + createIncludeInsertion(Loop->getBeginLoc(), getReverseHeader())) FixIts.push_back(*Insertion); } diag(Loop->getForLoc(), "use range-based for loop instead") << FixIts; @@ -691,7 +681,7 @@ } else { // For CXXOperatorCallExpr such as vector_ptr->size() we want the class // object vector_ptr, but for vector[2] we need the whole expression. - if (const auto* E = dyn_cast(ContainerExpr)) + if (const auto *E = dyn_cast(ContainerExpr)) if (E->getOperator() != OO_Subscript) ContainerExpr = E->getArg(0); ContainerString = 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 @@ -9,8 +9,7 @@ #ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MODERNIZE_MAKE_SMART_PTR_H #define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MODERNIZE_MAKE_SMART_PTR_H -#include "../ClangTidyCheck.h" -#include "../utils/IncludeInserter.h" +#include "../utils/IncluderClangTidyCheck.h" #include "clang/ASTMatchers/ASTMatchFinder.h" #include "clang/ASTMatchers/ASTMatchersInternal.h" #include "llvm/ADT/StringRef.h" @@ -21,13 +20,11 @@ namespace modernize { /// Base class for MakeSharedCheck and MakeUniqueCheck. -class MakeSmartPtrCheck : public ClangTidyCheck { +class MakeSmartPtrCheck : public IncluderClangTidyCheck { public: 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 +43,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 @@ -42,9 +42,7 @@ MakeSmartPtrCheck::MakeSmartPtrCheck(StringRef Name, ClangTidyContext *Context, StringRef MakeSmartPtrFunctionName) - : ClangTidyCheck(Name, Context), - Inserter(Options.getLocalOrGlobal("IncludeStyle", - utils::IncludeSorter::IS_LLVM)), + : IncluderClangTidyCheck(Name, Context), MakeSmartPtrFunctionHeader( Options.get("MakeSmartPtrFunctionHeader", "")), MakeSmartPtrFunctionName( @@ -54,7 +52,7 @@ Options.get("IgnoreDefaultInitialization", true)) {} void MakeSmartPtrCheck::storeOptions(ClangTidyOptions::OptionMap &Opts) { - Options.store(Opts, "IncludeStyle", Inserter.getStyle()); + IncluderClangTidyCheck::storeOptions(Opts); Options.store(Opts, "MakeSmartPtrFunctionHeader", MakeSmartPtrFunctionHeader); Options.store(Opts, "MakeSmartPtrFunction", MakeSmartPtrFunctionName); Options.store(Opts, "IgnoreMacros", IgnoreMacros); @@ -67,12 +65,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 +427,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/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 @@ -9,8 +9,7 @@ #ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MODERNIZE_PASS_BY_VALUE_H #define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MODERNIZE_PASS_BY_VALUE_H -#include "../ClangTidyCheck.h" -#include "../utils/IncludeInserter.h" +#include "../utils/IncluderClangTidyCheck.h" #include @@ -18,20 +17,17 @@ namespace tidy { namespace modernize { -class PassByValueCheck : public ClangTidyCheck { +class PassByValueCheck : public IncluderClangTidyCheck { public: PassByValueCheck(StringRef Name, ClangTidyContext *Context); bool isLanguageVersionSupported(const LangOptions &LangOpts) const override { 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 @@ -188,13 +188,11 @@ } PassByValueCheck::PassByValueCheck(StringRef Name, ClangTidyContext *Context) - : ClangTidyCheck(Name, Context), - Inserter(Options.getLocalOrGlobal("IncludeStyle", - utils::IncludeSorter::IS_LLVM)), + : IncluderClangTidyCheck(Name, Context), ValuesOnly(Options.get("ValuesOnly", false)) {} void PassByValueCheck::storeOptions(ClangTidyOptions::OptionMap &Opts) { - Options.store(Opts, "IncludeStyle", Inserter.getStyle()); + IncluderClangTidyCheck::storeOptions(Opts); Options.store(Opts, "ValuesOnly", ValuesOnly); } @@ -233,12 +231,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,9 +290,7 @@ Diag << FixItHint::CreateInsertion(Initializer->getRParenLoc(), ")") << FixItHint::CreateInsertion( Initializer->getLParenLoc().getLocWithOffset(1), "std::move(") - << Inserter.createIncludeInsertion( - Result.SourceManager->getFileID(Initializer->getSourceLocation()), - ""); + << createIncludeInsertion(Initializer->getSourceLocation(), ""); } } // namespace modernize 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 @@ -9,8 +9,7 @@ #ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MODERNIZE_REPLACE_AUTO_PTR_H #define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MODERNIZE_REPLACE_AUTO_PTR_H -#include "../ClangTidyCheck.h" -#include "../utils/IncludeInserter.h" +#include "../utils/IncluderClangTidyCheck.h" namespace clang { namespace tidy { @@ -40,20 +39,14 @@ /// std::unique_ptr i, j; /// i = std::move(j); /// \endcode -class ReplaceAutoPtrCheck : public ClangTidyCheck { +class ReplaceAutoPtrCheck : public IncluderClangTidyCheck { public: ReplaceAutoPtrCheck(StringRef Name, ClangTidyContext *Context); 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,13 +39,7 @@ 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()); -} + : IncluderClangTidyCheck(Name, Context) {} void ReplaceAutoPtrCheck::registerMatchers(MatchFinder *Finder) { auto AutoPtrDecl = recordDecl(hasName("auto_ptr"), isInStdNamespace()); @@ -94,12 +88,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 +101,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 @@ -9,8 +9,7 @@ #ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MODERNIZE_REPLACE_RANDOM_SHUFFLE_H #define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MODERNIZE_REPLACE_RANDOM_SHUFFLE_H -#include "../ClangTidyCheck.h" -#include "../utils/IncludeInserter.h" +#include "../utils/IncluderClangTidyCheck.h" namespace clang { namespace tidy { @@ -21,20 +20,14 @@ /// /// For the user-facing documentation see: /// http://clang.llvm.org/extra/clang-tidy/checks/modernize-replace-random-shuffle.html -class ReplaceRandomShuffleCheck : public ClangTidyCheck { +class ReplaceRandomShuffleCheck : public IncluderClangTidyCheck { 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,10 +22,7 @@ ReplaceRandomShuffleCheck::ReplaceRandomShuffleCheck(StringRef Name, ClangTidyContext *Context) - : ClangTidyCheck(Name, Context), - IncludeInserter(Options.getLocalOrGlobal("IncludeStyle", - utils::IncludeSorter::IS_LLVM)) { -} + : IncluderClangTidyCheck(Name, Context) {} void ReplaceRandomShuffleCheck::registerMatchers(MatchFinder *Finder) { const auto Begin = hasArgument(0, expr()); @@ -43,16 +40,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 +77,7 @@ Diag << FixItHint::CreateRemoval(MatchedDecl->getSourceRange()); Diag << FixItHint::CreateInsertion(MatchedDecl->getBeginLoc(), NewName); - Diag << IncludeInserter.createIncludeInsertion( - Result.Context->getSourceManager().getFileID( - MatchedCallExpr->getBeginLoc()), - ""); + Diag << createIncludeInsertion(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 @@ -9,8 +9,7 @@ #ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_PERFORMANCE_TYPE_PROMOTION_IN_MATH_FN_H #define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_PERFORMANCE_TYPE_PROMOTION_IN_MATH_FN_H -#include "../ClangTidyCheck.h" -#include "../utils/IncludeInserter.h" +#include "../utils/IncluderClangTidyCheck.h" namespace clang { namespace tidy { @@ -25,18 +24,12 @@ /// /// For the user-facing documentation see: /// http://clang.llvm.org/extra/clang-tidy/checks/performance-type-promotion-in-math-fn.html -class TypePromotionInMathFnCheck : public ClangTidyCheck { +class TypePromotionInMathFnCheck : public IncluderClangTidyCheck { 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,20 +30,7 @@ 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()); -} + : IncluderClangTidyCheck(Name, Context) {} void TypePromotionInMathFnCheck::registerMatchers(MatchFinder *Finder) { constexpr BuiltinType::Kind IntTy = BuiltinType::Int; @@ -190,9 +177,7 @@ // , because the functions we're suggesting moving away from are all // declared in . if (FnInCmath) - Diag << IncludeInserter.createIncludeInsertion( - Result.Context->getSourceManager().getFileID(Call->getBeginLoc()), - ""); + Diag << createIncludeInsertion(Call->getBeginLoc(), ""); } } // namespace performance 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 @@ -9,8 +9,7 @@ #ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_PERFORMANCE_UNNECESSARY_VALUE_PARAM_H #define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_PERFORMANCE_UNNECESSARY_VALUE_PARAM_H -#include "../ClangTidyCheck.h" -#include "../utils/IncludeInserter.h" +#include "../utils/IncluderClangTidyCheck.h" #include "clang/Analysis/Analyses/ExprMutationAnalyzer.h" namespace clang { @@ -22,7 +21,7 @@ /// /// For the user-facing documentation see: /// http://clang.llvm.org/extra/clang-tidy/checks/performance-unnecessary-value-param.html -class UnnecessaryValueParamCheck : public ClangTidyCheck { +class UnnecessaryValueParamCheck : public IncluderClangTidyCheck { public: UnnecessaryValueParamCheck(StringRef Name, ClangTidyContext *Context); bool isLanguageVersionSupported(const LangOptions &LangOpts) const override { @@ -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 @@ -67,9 +67,7 @@ UnnecessaryValueParamCheck::UnnecessaryValueParamCheck( StringRef Name, ClangTidyContext *Context) - : ClangTidyCheck(Name, Context), - Inserter(Options.getLocalOrGlobal("IncludeStyle", - utils::IncludeSorter::IS_LLVM)), + : IncluderClangTidyCheck(Name, Context), AllowedTypes( utils::options::parseStringList(Options.get("AllowedTypes", ""))) {} @@ -168,14 +166,9 @@ } } -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()); + IncluderClangTidyCheck::storeOptions(Opts); Options.store(Opts, "AllowedTypes", utils::options::serializeStringList(AllowedTypes)); } @@ -199,8 +192,7 @@ Context.getLangOpts()); Diag << FixItHint::CreateInsertion(CopyArgument.getBeginLoc(), "std::move(") << FixItHint::CreateInsertion(EndLoc, ")") - << Inserter.createIncludeInsertion( - SM.getFileID(CopyArgument.getBeginLoc()), ""); + << createIncludeInsertion(CopyArgument.getBeginLoc(), ""); } } // namespace performance 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 @@ -14,6 +14,7 @@ HeaderGuard.cpp IncludeInserter.cpp IncludeSorter.cpp + IncluderClangTidyCheck.cpp LexerUtils.cpp NamespaceAliaser.cpp OptionsUtils.cpp diff --git a/clang-tools-extra/clang-tidy/utils/IncluderClangTidyCheck.h b/clang-tools-extra/clang-tidy/utils/IncluderClangTidyCheck.h new file mode 100644 --- /dev/null +++ b/clang-tools-extra/clang-tidy/utils/IncluderClangTidyCheck.h @@ -0,0 +1,45 @@ +//===--- IncluderClangTidyCheck.h - clang-tidy -------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_INCLUDERCLANGTIDYCHECK_H +#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_INCLUDERCLANGTIDYCHECK_H + +#include "IncludeInserter.h" +#include "../ClangTidyCheck.h" + +namespace clang { +namespace tidy { + +/// Base class for clang-tidy checks that want to insert include directives. +class IncluderClangTidyCheck : public ClangTidyCheck { +public: + IncluderClangTidyCheck(StringRef CheckName, ClangTidyContext *Context); + ~IncluderClangTidyCheck() override = default; + + /// Derived classes that override this function should call this method from + /// the overridden method. + void registerPPCallbacks(const SourceManager &SM, Preprocessor *PP, + Preprocessor *ModuleExpanderPP) override; + + /// Derived classes that override this function should call this method from + /// the overridden method. + void storeOptions(ClangTidyOptions::OptionMap &Opts) override; + + Optional createIncludeInsertion(FileID FileID, StringRef Header); + Optional createIncludeInsertion(SourceLocation Loc, StringRef Header); + Optional createMainFileIncludeInsertion(StringRef Header); + +private: + utils::IncludeInserter IncludeInserter; + const SourceManager *SourceMgr = nullptr; +}; + +} // namespace tidy +} // namespace clang + +#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_INCLUDERCLANGTIDYCHECK_H diff --git a/clang-tools-extra/clang-tidy/utils/IncluderClangTidyCheck.cpp b/clang-tools-extra/clang-tidy/utils/IncluderClangTidyCheck.cpp new file mode 100644 --- /dev/null +++ b/clang-tools-extra/clang-tidy/utils/IncluderClangTidyCheck.cpp @@ -0,0 +1,53 @@ +//===--- IncluderClangTidyCheck.cpp - clang-tidy +//---------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "IncluderClangTidyCheck.h" +#include "../utils/OptionsUtils.h" + +using namespace clang::ast_matchers; + +namespace clang { +namespace tidy { + +IncluderClangTidyCheck::IncluderClangTidyCheck(StringRef CheckName, + ClangTidyContext *Context) + : ClangTidyCheck(CheckName, Context), + IncludeInserter(Options.getLocalOrGlobal("IncludeStyle", + utils::IncludeSorter::IS_LLVM)) { +} + +void IncluderClangTidyCheck::registerPPCallbacks( + const SourceManager &SM, Preprocessor *PP, Preprocessor *ModuleExpanderPP) { + this->SourceMgr = &SM; + IncludeInserter.registerPreprocessor(PP); +} + +void IncluderClangTidyCheck::storeOptions(ClangTidyOptions::OptionMap &Opts) { + Options.store(Opts, "IncludeStyle", IncludeInserter.getStyle()); +} + +Optional +IncluderClangTidyCheck::createIncludeInsertion(FileID FileID, + StringRef Header) { + return IncludeInserter.createIncludeInsertion(FileID, Header); +} + +Optional +IncluderClangTidyCheck::createIncludeInsertion(SourceLocation Loc, + StringRef Header) { + return createIncludeInsertion(SourceMgr->getFileID(Loc), Header); +} + +Optional +IncluderClangTidyCheck::createMainFileIncludeInsertion(StringRef Header) { + return IncludeInserter.createMainFileIncludeInsertion(Header); +} + +} // namespace tidy +} // namespace clang 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 @@ -9,8 +9,7 @@ #ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_TRANSFORMER_CLANG_TIDY_CHECK_H #define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_TRANSFORMER_CLANG_TIDY_CHECK_H -#include "../ClangTidyCheck.h" -#include "IncludeInserter.h" +#include "IncluderClangTidyCheck.h" #include "IncludeSorter.h" #include "clang/ASTMatchers/ASTMatchFinder.h" #include "clang/Tooling/Transformer/Transformer.h" @@ -36,7 +35,7 @@ // 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 { +class TransformerClangTidyCheck : public IncluderClangTidyCheck { public: TransformerClangTidyCheck(StringRef Name, ClangTidyContext *Context); @@ -58,15 +57,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 +71,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,9 +29,7 @@ TransformerClangTidyCheck::TransformerClangTidyCheck(StringRef Name, ClangTidyContext *Context) - : ClangTidyCheck(Name, Context), - Inserter( - Options.getLocalOrGlobal("IncludeStyle", IncludeSorter::IS_LLVM)) {} + : IncluderClangTidyCheck(Name, Context) {} // This constructor cannot dispatch to the simpler one (below), because, in // order to get meaningful results from `getLangOpts` and `Options`, we need the @@ -60,11 +58,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 +97,11 @@ Diag << FixItHint::CreateReplacement(T.Range, T.Replacement); break; case transformer::EditKind::AddInclude: - Diag << Inserter.createIncludeInsertion( - Result.SourceManager->getFileID(T.Range.getBegin()), T.Replacement); + Diag << createIncludeInsertion(T.Range.getBegin(), T.Replacement); break; } } -void TransformerClangTidyCheck::storeOptions( - ClangTidyOptions::OptionMap &Opts) { - Options.store(Opts, "IncludeStyle", Inserter.getStyle()); -} - } // namespace utils } // namespace tidy } // namespace clang