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