1d07c840eSDaniel Jasper //===--- ClangTidyModule.h - clang-tidy -------------------------*- C++ -*-===// 2d07c840eSDaniel Jasper // 32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6d07c840eSDaniel Jasper // 7d07c840eSDaniel Jasper //===----------------------------------------------------------------------===// 8d07c840eSDaniel Jasper 966580554SAlexander Kornienko #ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_CLANGTIDYMODULE_H 1066580554SAlexander Kornienko #define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_CLANGTIDYMODULE_H 11d07c840eSDaniel Jasper 12860aefd0SNathan James #include "ClangTidyOptions.h" 13860aefd0SNathan James #include "llvm/ADT/StringMap.h" 14d07c840eSDaniel Jasper #include "llvm/ADT/StringRef.h" 15d3fdcf89SAlexander Kornienko #include <functional> 165338ffcfSDmitri Gribenko #include <memory> 17d07c840eSDaniel Jasper 184718da50SCarlos Galvez namespace clang::tidy { 19d07c840eSDaniel Jasper 20860aefd0SNathan James class ClangTidyCheck; 21860aefd0SNathan James class ClangTidyContext; 22860aefd0SNathan James 23282dc72cSDmitri Gribenko /// A collection of \c ClangTidyCheckFactory instances. 24d07c840eSDaniel Jasper /// 25d3fdcf89SAlexander Kornienko /// All clang-tidy modules register their check factories with an instance of 26d3fdcf89SAlexander Kornienko /// this object. 27d3fdcf89SAlexander Kornienko class ClangTidyCheckFactories { 28d07c840eSDaniel Jasper public: 295338ffcfSDmitri Gribenko using CheckFactory = std::function<std::unique_ptr<ClangTidyCheck>( 30860aefd0SNathan James llvm::StringRef Name, ClangTidyContext *Context)>; 316e0cbc89SAlexander Kornienko 32282dc72cSDmitri Gribenko /// Registers check \p Factory with name \p Name. 33d3fdcf89SAlexander Kornienko /// 34d3fdcf89SAlexander Kornienko /// For all checks that have default constructors, use \c registerCheck. 35860aefd0SNathan James void registerCheckFactory(llvm::StringRef Name, CheckFactory Factory); 36d07c840eSDaniel Jasper 37282dc72cSDmitri Gribenko /// Registers the \c CheckType with the name \p Name. 38d3fdcf89SAlexander Kornienko /// 39d3fdcf89SAlexander Kornienko /// This method should be used for all \c ClangTidyChecks that don't require 40d3fdcf89SAlexander Kornienko /// constructor parameters. 41d07c840eSDaniel Jasper /// 42d07c840eSDaniel Jasper /// For example, if have a clang-tidy check like: 43d07c840eSDaniel Jasper /// \code 44d07c840eSDaniel Jasper /// class MyTidyCheck : public ClangTidyCheck { 45a3dbe841SCraig Topper /// void registerMatchers(ast_matchers::MatchFinder *Finder) override { 46cb9272feSAlexander Kornienko /// .. 47cb9272feSAlexander Kornienko /// } 48d07c840eSDaniel Jasper /// }; 49d07c840eSDaniel Jasper /// \endcode 50d07c840eSDaniel Jasper /// you can register it with: 51d07c840eSDaniel Jasper /// \code 52d07c840eSDaniel Jasper /// class MyModule : public ClangTidyModule { 53d3fdcf89SAlexander Kornienko /// void addCheckFactories(ClangTidyCheckFactories &Factories) override { 54d3fdcf89SAlexander Kornienko /// Factories.registerCheck<MyTidyCheck>("myproject-my-check"); 55d07c840eSDaniel Jasper /// } 56d07c840eSDaniel Jasper /// }; 57d07c840eSDaniel Jasper /// \endcode registerCheck(llvm::StringRef CheckName)58860aefd0SNathan James template <typename CheckType> void registerCheck(llvm::StringRef CheckName) { 596e0cbc89SAlexander Kornienko registerCheckFactory(CheckName, 60860aefd0SNathan James [](llvm::StringRef Name, ClangTidyContext *Context) { 615338ffcfSDmitri Gribenko return std::make_unique<CheckType>(Name, Context); 626e0cbc89SAlexander Kornienko }); 63d3fdcf89SAlexander Kornienko } 64d07c840eSDaniel Jasper 65bb7a9dcdSDmitri Gribenko /// Create instances of checks that are enabled. 66bb7a9dcdSDmitri Gribenko std::vector<std::unique_ptr<ClangTidyCheck>> 67b616811dSNathan James createChecks(ClangTidyContext *Context) const; 68d3fdcf89SAlexander Kornienko 69dd87acebSNathan James /// Create instances of checks that are enabled for the current Language. 70dd87acebSNathan James std::vector<std::unique_ptr<ClangTidyCheck>> 71b616811dSNathan James createChecksForLanguage(ClangTidyContext *Context) const; 72dd87acebSNathan James 73*87c41137SPiotr Zegar using FactoryMap = llvm::StringMap<CheckFactory>; begin()74d3fdcf89SAlexander Kornienko FactoryMap::const_iterator begin() const { return Factories.begin(); } end()75d3fdcf89SAlexander Kornienko FactoryMap::const_iterator end() const { return Factories.end(); } empty()76d3fdcf89SAlexander Kornienko bool empty() const { return Factories.empty(); } 77d3fdcf89SAlexander Kornienko 78d3fdcf89SAlexander Kornienko private: 79d3fdcf89SAlexander Kornienko FactoryMap Factories; 80d3fdcf89SAlexander Kornienko }; 81d07c840eSDaniel Jasper 82282dc72cSDmitri Gribenko /// A clang-tidy module groups a number of \c ClangTidyChecks and gives 83d07c840eSDaniel Jasper /// them a prefixed name. 84d07c840eSDaniel Jasper class ClangTidyModule { 85d07c840eSDaniel Jasper public: ~ClangTidyModule()86e04a3da0SDavid Blaikie virtual ~ClangTidyModule() {} 87d07c840eSDaniel Jasper 88282dc72cSDmitri Gribenko /// Implement this function in order to register all \c CheckFactories 89d07c840eSDaniel Jasper /// belonging to this module. 90d07c840eSDaniel Jasper virtual void addCheckFactories(ClangTidyCheckFactories &CheckFactories) = 0; 911efc4255SAlexander Kornienko 92282dc72cSDmitri Gribenko /// Gets default options for checks defined in this module. 931efc4255SAlexander Kornienko virtual ClangTidyOptions getModuleOptions(); 94d07c840eSDaniel Jasper }; 95d07c840eSDaniel Jasper 964718da50SCarlos Galvez } // namespace clang::tidy 97d07c840eSDaniel Jasper 9866580554SAlexander Kornienko #endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_CLANGTIDYMODULE_H 99