//===--- ClangTidyModule.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_CLANGTIDYMODULE_H #define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_CLANGTIDYMODULE_H #include "ClangTidyOptions.h" #include "llvm/ADT/StringMap.h" #include "llvm/ADT/StringRef.h" #include #include namespace clang { namespace tidy { class ClangTidyCheck; class ClangTidyContext; /// A collection of \c ClangTidyCheckFactory instances. /// /// All clang-tidy modules register their check factories with an instance of /// this object. class ClangTidyCheckFactories { public: using CheckFactory = std::function( llvm::StringRef Name, ClangTidyContext *Context)>; /// Registers check \p Factory with name \p Name. /// /// For all checks that have default constructors, use \c registerCheck. void registerCheckFactory(llvm::StringRef Name, CheckFactory Factory); /// Registers the \c CheckType with the name \p Name. /// /// This method should be used for all \c ClangTidyChecks that don't require /// constructor parameters. /// /// For example, if have a clang-tidy check like: /// \code /// class MyTidyCheck : public ClangTidyCheck { /// void registerMatchers(ast_matchers::MatchFinder *Finder) override { /// .. /// } /// }; /// \endcode /// you can register it with: /// \code /// class MyModule : public ClangTidyModule { /// void addCheckFactories(ClangTidyCheckFactories &Factories) override { /// Factories.registerCheck("myproject-my-check"); /// } /// }; /// \endcode template void registerCheck(llvm::StringRef CheckName) { registerCheckFactory(CheckName, [](llvm::StringRef Name, ClangTidyContext *Context) { return std::make_unique(Name, Context); }); } /// Create instances of checks that are enabled. std::vector> createChecks(ClangTidyContext *Context); typedef llvm::StringMap FactoryMap; FactoryMap::const_iterator begin() const { return Factories.begin(); } FactoryMap::const_iterator end() const { return Factories.end(); } bool empty() const { return Factories.empty(); } private: FactoryMap Factories; }; /// A clang-tidy module groups a number of \c ClangTidyChecks and gives /// them a prefixed name. class ClangTidyModule { public: virtual ~ClangTidyModule() {} /// Implement this function in order to register all \c CheckFactories /// belonging to this module. virtual void addCheckFactories(ClangTidyCheckFactories &CheckFactories) = 0; /// Gets default options for checks defined in this module. virtual ClangTidyOptions getModuleOptions(); }; } // end namespace tidy } // end namespace clang #endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_CLANGTIDYMODULE_H