xref: /llvm-project/clang-tools-extra/clang-tidy/ClangTidyModule.h (revision 87c4113708b88ef20d3cac96e2fd43e5c3eabf91)
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