1 //===--- ClangTidyModule.h - clang-tidy -------------------------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_CLANGTIDYMODULE_H 10 #define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_CLANGTIDYMODULE_H 11 12 #include "ClangTidyOptions.h" 13 #include "llvm/ADT/StringMap.h" 14 #include "llvm/ADT/StringRef.h" 15 #include <functional> 16 #include <memory> 17 18 namespace clang::tidy { 19 20 class ClangTidyCheck; 21 class ClangTidyContext; 22 23 /// A collection of \c ClangTidyCheckFactory instances. 24 /// 25 /// All clang-tidy modules register their check factories with an instance of 26 /// this object. 27 class ClangTidyCheckFactories { 28 public: 29 using CheckFactory = std::function<std::unique_ptr<ClangTidyCheck>( 30 llvm::StringRef Name, ClangTidyContext *Context)>; 31 32 /// Registers check \p Factory with name \p Name. 33 /// 34 /// For all checks that have default constructors, use \c registerCheck. 35 void registerCheckFactory(llvm::StringRef Name, CheckFactory Factory); 36 37 /// Registers the \c CheckType with the name \p Name. 38 /// 39 /// This method should be used for all \c ClangTidyChecks that don't require 40 /// constructor parameters. 41 /// 42 /// For example, if have a clang-tidy check like: 43 /// \code 44 /// class MyTidyCheck : public ClangTidyCheck { 45 /// void registerMatchers(ast_matchers::MatchFinder *Finder) override { 46 /// .. 47 /// } 48 /// }; 49 /// \endcode 50 /// you can register it with: 51 /// \code 52 /// class MyModule : public ClangTidyModule { 53 /// void addCheckFactories(ClangTidyCheckFactories &Factories) override { 54 /// Factories.registerCheck<MyTidyCheck>("myproject-my-check"); 55 /// } 56 /// }; 57 /// \endcode registerCheck(llvm::StringRef CheckName)58 template <typename CheckType> void registerCheck(llvm::StringRef CheckName) { 59 registerCheckFactory(CheckName, 60 [](llvm::StringRef Name, ClangTidyContext *Context) { 61 return std::make_unique<CheckType>(Name, Context); 62 }); 63 } 64 65 /// Create instances of checks that are enabled. 66 std::vector<std::unique_ptr<ClangTidyCheck>> 67 createChecks(ClangTidyContext *Context) const; 68 69 /// Create instances of checks that are enabled for the current Language. 70 std::vector<std::unique_ptr<ClangTidyCheck>> 71 createChecksForLanguage(ClangTidyContext *Context) const; 72 73 using FactoryMap = llvm::StringMap<CheckFactory>; begin()74 FactoryMap::const_iterator begin() const { return Factories.begin(); } end()75 FactoryMap::const_iterator end() const { return Factories.end(); } empty()76 bool empty() const { return Factories.empty(); } 77 78 private: 79 FactoryMap Factories; 80 }; 81 82 /// A clang-tidy module groups a number of \c ClangTidyChecks and gives 83 /// them a prefixed name. 84 class ClangTidyModule { 85 public: ~ClangTidyModule()86 virtual ~ClangTidyModule() {} 87 88 /// Implement this function in order to register all \c CheckFactories 89 /// belonging to this module. 90 virtual void addCheckFactories(ClangTidyCheckFactories &CheckFactories) = 0; 91 92 /// Gets default options for checks defined in this module. 93 virtual ClangTidyOptions getModuleOptions(); 94 }; 95 96 } // namespace clang::tidy 97 98 #endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_CLANGTIDYMODULE_H 99