|  | //===--- ClangTidyModule.h - clang-tidy -------------------------*- C++ -*-===// | 
|  | // | 
|  | //                     The LLVM Compiler Infrastructure | 
|  | // | 
|  | // This file is distributed under the University of Illinois Open Source | 
|  | // License. See LICENSE.TXT for details. | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  |  | 
|  | #ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_CLANGTIDYMODULE_H | 
|  | #define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_CLANGTIDYMODULE_H | 
|  |  | 
|  | #include "ClangTidy.h" | 
|  | #include "llvm/ADT/StringRef.h" | 
|  | #include <functional> | 
|  | #include <map> | 
|  | #include <string> | 
|  | #include <utility> | 
|  |  | 
|  | namespace clang { | 
|  | namespace tidy { | 
|  |  | 
|  | /// \brief A collection of \c ClangTidyCheckFactory instances. | 
|  | /// | 
|  | /// All clang-tidy modules register their check factories with an instance of | 
|  | /// this object. | 
|  | class ClangTidyCheckFactories { | 
|  | public: | 
|  | typedef std::function<ClangTidyCheck *(StringRef Name, | 
|  | ClangTidyContext *Context)> | 
|  | CheckFactory; | 
|  |  | 
|  | /// \brief Registers check \p Factory with name \p Name. | 
|  | /// | 
|  | /// For all checks that have default constructors, use \c registerCheck. | 
|  | void registerCheckFactory(StringRef Name, CheckFactory Factory); | 
|  |  | 
|  | /// \brief 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<MyTidyCheck>("myproject-my-check"); | 
|  | ///   } | 
|  | /// }; | 
|  | /// \endcode | 
|  | template <typename CheckType> void registerCheck(StringRef CheckName) { | 
|  | registerCheckFactory(CheckName, | 
|  | [](StringRef Name, ClangTidyContext *Context) { | 
|  | return new CheckType(Name, Context); | 
|  | }); | 
|  | } | 
|  |  | 
|  | /// \brief Create instances of all checks matching \p CheckRegexString and | 
|  | /// store them in \p Checks. | 
|  | /// | 
|  | /// The caller takes ownership of the return \c ClangTidyChecks. | 
|  | void createChecks(ClangTidyContext *Context, | 
|  | std::vector<std::unique_ptr<ClangTidyCheck>> &Checks); | 
|  |  | 
|  | typedef std::map<std::string, CheckFactory> 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; | 
|  | }; | 
|  |  | 
|  | /// \brief A clang-tidy module groups a number of \c ClangTidyChecks and gives | 
|  | /// them a prefixed name. | 
|  | class ClangTidyModule { | 
|  | public: | 
|  | virtual ~ClangTidyModule() {} | 
|  |  | 
|  | /// \brief Implement this function in order to register all \c CheckFactories | 
|  | /// belonging to this module. | 
|  | virtual void addCheckFactories(ClangTidyCheckFactories &CheckFactories) = 0; | 
|  |  | 
|  | /// \brief 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 |