xref: /llvm-project/clang/examples/PluginsOrder/PluginsOrder.cpp (revision fe66433fe119819a033827610f7eae4cdd8b1470)
1*fe66433fSArthur Eubanks //===- PluginsOrder.cpp ---------------------------------------------------===//
2*fe66433fSArthur Eubanks //
3*fe66433fSArthur Eubanks // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*fe66433fSArthur Eubanks // See https://llvm.org/LICENSE.txt for license information.
5*fe66433fSArthur Eubanks // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*fe66433fSArthur Eubanks //
7*fe66433fSArthur Eubanks //===----------------------------------------------------------------------===//
8*fe66433fSArthur Eubanks 
9*fe66433fSArthur Eubanks #include "clang/AST/AST.h"
10*fe66433fSArthur Eubanks #include "clang/AST/ASTConsumer.h"
11*fe66433fSArthur Eubanks #include "clang/Frontend/FrontendPluginRegistry.h"
12*fe66433fSArthur Eubanks using namespace clang;
13*fe66433fSArthur Eubanks 
14*fe66433fSArthur Eubanks namespace {
15*fe66433fSArthur Eubanks 
16*fe66433fSArthur Eubanks class AlwaysBeforeConsumer : public ASTConsumer {
17*fe66433fSArthur Eubanks public:
HandleTranslationUnit(ASTContext &)18*fe66433fSArthur Eubanks   void HandleTranslationUnit(ASTContext &) override {
19*fe66433fSArthur Eubanks     llvm::errs() << "always-before\n";
20*fe66433fSArthur Eubanks   }
21*fe66433fSArthur Eubanks };
22*fe66433fSArthur Eubanks 
23*fe66433fSArthur Eubanks class AlwaysBeforeAction : public PluginASTAction {
24*fe66433fSArthur Eubanks public:
CreateASTConsumer(CompilerInstance & CI,llvm::StringRef)25*fe66433fSArthur Eubanks   std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI,
26*fe66433fSArthur Eubanks                                                  llvm::StringRef) override {
27*fe66433fSArthur Eubanks     return std::make_unique<AlwaysBeforeConsumer>();
28*fe66433fSArthur Eubanks   }
29*fe66433fSArthur Eubanks 
ParseArgs(const CompilerInstance & CI,const std::vector<std::string> & args)30*fe66433fSArthur Eubanks   bool ParseArgs(const CompilerInstance &CI,
31*fe66433fSArthur Eubanks                  const std::vector<std::string> &args) override {
32*fe66433fSArthur Eubanks     return true;
33*fe66433fSArthur Eubanks   }
34*fe66433fSArthur Eubanks 
getActionType()35*fe66433fSArthur Eubanks   PluginASTAction::ActionType getActionType() override {
36*fe66433fSArthur Eubanks     return AddBeforeMainAction;
37*fe66433fSArthur Eubanks   }
38*fe66433fSArthur Eubanks };
39*fe66433fSArthur Eubanks 
40*fe66433fSArthur Eubanks class AlwaysAfterConsumer : public ASTConsumer {
41*fe66433fSArthur Eubanks public:
HandleTranslationUnit(ASTContext &)42*fe66433fSArthur Eubanks   void HandleTranslationUnit(ASTContext &) override {
43*fe66433fSArthur Eubanks     llvm::errs() << "always-after\n";
44*fe66433fSArthur Eubanks   }
45*fe66433fSArthur Eubanks };
46*fe66433fSArthur Eubanks 
47*fe66433fSArthur Eubanks class AlwaysAfterAction : public PluginASTAction {
48*fe66433fSArthur Eubanks public:
CreateASTConsumer(CompilerInstance & CI,llvm::StringRef)49*fe66433fSArthur Eubanks   std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI,
50*fe66433fSArthur Eubanks                                                  llvm::StringRef) override {
51*fe66433fSArthur Eubanks     return std::make_unique<AlwaysAfterConsumer>();
52*fe66433fSArthur Eubanks   }
53*fe66433fSArthur Eubanks 
ParseArgs(const CompilerInstance & CI,const std::vector<std::string> & args)54*fe66433fSArthur Eubanks   bool ParseArgs(const CompilerInstance &CI,
55*fe66433fSArthur Eubanks                  const std::vector<std::string> &args) override {
56*fe66433fSArthur Eubanks     return true;
57*fe66433fSArthur Eubanks   }
58*fe66433fSArthur Eubanks 
getActionType()59*fe66433fSArthur Eubanks   PluginASTAction::ActionType getActionType() override {
60*fe66433fSArthur Eubanks     return AddAfterMainAction;
61*fe66433fSArthur Eubanks   }
62*fe66433fSArthur Eubanks };
63*fe66433fSArthur Eubanks 
64*fe66433fSArthur Eubanks class CmdAfterConsumer : public ASTConsumer {
65*fe66433fSArthur Eubanks public:
HandleTranslationUnit(ASTContext &)66*fe66433fSArthur Eubanks   void HandleTranslationUnit(ASTContext &) override {
67*fe66433fSArthur Eubanks     llvm::errs() << "cmd-after\n";
68*fe66433fSArthur Eubanks   }
69*fe66433fSArthur Eubanks };
70*fe66433fSArthur Eubanks 
71*fe66433fSArthur Eubanks class CmdAfterAction : public PluginASTAction {
72*fe66433fSArthur Eubanks public:
CreateASTConsumer(CompilerInstance & CI,llvm::StringRef)73*fe66433fSArthur Eubanks   std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI,
74*fe66433fSArthur Eubanks                                                  llvm::StringRef) override {
75*fe66433fSArthur Eubanks     return std::make_unique<CmdAfterConsumer>();
76*fe66433fSArthur Eubanks   }
77*fe66433fSArthur Eubanks 
ParseArgs(const CompilerInstance & CI,const std::vector<std::string> & args)78*fe66433fSArthur Eubanks   bool ParseArgs(const CompilerInstance &CI,
79*fe66433fSArthur Eubanks                  const std::vector<std::string> &args) override {
80*fe66433fSArthur Eubanks     return true;
81*fe66433fSArthur Eubanks   }
82*fe66433fSArthur Eubanks 
getActionType()83*fe66433fSArthur Eubanks   PluginASTAction::ActionType getActionType() override {
84*fe66433fSArthur Eubanks     return CmdlineAfterMainAction;
85*fe66433fSArthur Eubanks   }
86*fe66433fSArthur Eubanks };
87*fe66433fSArthur Eubanks 
88*fe66433fSArthur Eubanks class CmdBeforeConsumer : public ASTConsumer {
89*fe66433fSArthur Eubanks public:
HandleTranslationUnit(ASTContext &)90*fe66433fSArthur Eubanks   void HandleTranslationUnit(ASTContext &) override {
91*fe66433fSArthur Eubanks     llvm::errs() << "cmd-before\n";
92*fe66433fSArthur Eubanks   }
93*fe66433fSArthur Eubanks };
94*fe66433fSArthur Eubanks 
95*fe66433fSArthur Eubanks class CmdBeforeAction : public PluginASTAction {
96*fe66433fSArthur Eubanks public:
CreateASTConsumer(CompilerInstance & CI,llvm::StringRef)97*fe66433fSArthur Eubanks   std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI,
98*fe66433fSArthur Eubanks                                                  llvm::StringRef) override {
99*fe66433fSArthur Eubanks     return std::make_unique<CmdBeforeConsumer>();
100*fe66433fSArthur Eubanks   }
101*fe66433fSArthur Eubanks 
ParseArgs(const CompilerInstance & CI,const std::vector<std::string> & args)102*fe66433fSArthur Eubanks   bool ParseArgs(const CompilerInstance &CI,
103*fe66433fSArthur Eubanks                  const std::vector<std::string> &args) override {
104*fe66433fSArthur Eubanks     return true;
105*fe66433fSArthur Eubanks   }
106*fe66433fSArthur Eubanks 
getActionType()107*fe66433fSArthur Eubanks   PluginASTAction::ActionType getActionType() override {
108*fe66433fSArthur Eubanks     return CmdlineBeforeMainAction;
109*fe66433fSArthur Eubanks   }
110*fe66433fSArthur Eubanks };
111*fe66433fSArthur Eubanks 
112*fe66433fSArthur Eubanks } // namespace
113*fe66433fSArthur Eubanks 
114*fe66433fSArthur Eubanks static FrontendPluginRegistry::Add<CmdBeforeAction> X1("cmd-before", "");
115*fe66433fSArthur Eubanks static FrontendPluginRegistry::Add<CmdAfterAction> X2("cmd-after", "");
116*fe66433fSArthur Eubanks static FrontendPluginRegistry::Add<AlwaysBeforeAction> X3("always-before", "");
117*fe66433fSArthur Eubanks static FrontendPluginRegistry::Add<AlwaysAfterAction> X4("always-after", "");
118