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