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