1 #ifndef INCLUDED_CLANGMETATOOL_META_TOOL_H 2 #define INCLUDED_CLANGMETATOOL_META_TOOL_H 10 #include <clang/AST/ASTConsumer.h> 11 #include <clang/ASTMatchers/ASTMatchFinder.h> 12 #include <clang/Frontend/CompilerInstance.h> 13 #include <clang/Frontend/FrontendAction.h> 14 #include <clang/Tooling/Core/Replacement.h> 15 #include <llvm/ADT/StringRef.h> 22 template <
typename... Ts>
using void_t = void;
24 template <
typename T,
typename =
void>
25 struct has_typedef_ArgTypes : std::false_type {};
28 struct has_typedef_ArgTypes<T, void_t<typename T::ArgTypes>> : std::true_type {
48 template <
class WrappedTool>
class MetaTool :
public clang::ASTFrontendAction {
50 static constexpr
bool providesArgTypes =
51 has_typedef_ArgTypes<WrappedTool>::value;
57 typedef typename std::conditional_t<providesArgTypes, WrappedTool,
61 std::map<std::string, clang::tooling::Replacements> &replacementsMap;
62 clang::ast_matchers::MatchFinder f;
68 WrappedTool *create_tool(clang::CompilerInstance &ci, A args) {
69 return new WrappedTool(&ci, &f, args);
71 WrappedTool *create_tool(clang::CompilerInstance &ci,
72 typename NoArgs::ArgTypes &args) {
73 return new WrappedTool(&ci, &f);
77 MetaTool(std::map<std::string, clang::tooling::Replacements> &replacementsMap,
79 : replacementsMap(replacementsMap), tool(NULL), args(args) {}
81 MetaTool(std::map<std::string, clang::tooling::Replacements> &replacementsMap)
82 : replacementsMap(replacementsMap), tool(NULL) {}
95 tool = create_tool(ci, args);
100 tool->postProcessing(replacementsMap);
103 virtual std::unique_ptr<clang::ASTConsumer>
105 llvm::StringRef file)
override {
106 return f.newASTConsumer();