12#include "clang/Frontend/CompilerInstance.h"
13#include "clang/Frontend/FrontendPluginRegistry.h"
14#include "clang/Frontend/MultiplexConsumer.h"
21class ClangTidyPluginAction :
public PluginASTAction {
25 class WrapConsumer :
public MultiplexConsumer {
26 std::unique_ptr<ClangTidyContext> Context;
27 std::unique_ptr<DiagnosticsEngine> DiagEngine;
30 WrapConsumer(std::unique_ptr<ClangTidyContext> Context,
31 std::unique_ptr<DiagnosticsEngine> DiagEngine,
32 std::vector<std::unique_ptr<ASTConsumer>> Consumer)
33 : MultiplexConsumer(std::move(Consumer)), Context(std::move(Context)),
34 DiagEngine(std::move(DiagEngine)) {}
38 std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &Compiler,
39 StringRef File)
override {
42 new ClangTidyDiagnosticConsumer(*Context, &Compiler.getDiagnostics());
43 auto DiagOpts = std::make_unique<DiagnosticOptions>();
44 auto DiagEngine = std::make_unique<DiagnosticsEngine>(
45 DiagnosticIDs::create(), *DiagOpts, DiagConsumer);
46 Context->setDiagnosticsEngine(std::move(DiagOpts), DiagEngine.get());
49 ClangTidyASTConsumerFactory Factory(*Context);
50 std::vector<std::unique_ptr<ASTConsumer>> Vec;
51 Vec.push_back(Factory.createASTConsumer(Compiler, File));
53 return std::make_unique<WrapConsumer>(
54 std::move(Context), std::move(DiagEngine), std::move(Vec));
57 bool ParseArgs(
const CompilerInstance &,
58 const std::vector<std::string> &Args)
override {
59 const ClangTidyGlobalOptions GlobalOptions;
60 const ClangTidyOptions DefaultOptions;
61 ClangTidyOptions OverrideOptions;
65 for (
const StringRef Arg : Args)
66 if (Arg.starts_with(
"-checks="))
67 OverrideOptions.
Checks = std::string(Arg.substr(strlen(
"-checks=")));
69 auto Options = std::make_unique<FileOptionsProvider>(
70 GlobalOptions, DefaultOptions, OverrideOptions);
71 Context = std::make_unique<ClangTidyContext>(std::move(Options));
76 std::unique_ptr<ClangTidyContext> Context;
87static clang::FrontendPluginRegistry::Add<clang::tidy::ClangTidyPluginAction>
88 X(
"clang-tidy",
"clang-tidy");
volatile int ClangTidyPluginAnchorSource
static clang::FrontendPluginRegistry::Add< clang::tidy::ClangTidyPluginAction > X("clang-tidy", "clang-tidy")
std::optional< std::string > Checks
Checks filter.