1 //===-- FrontendActions.h - Useful Frontend Actions -------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #ifndef LLVM_CLANG_FRONTEND_FRONTENDACTIONS_H 11 #define LLVM_CLANG_FRONTEND_FRONTENDACTIONS_H 12 13 #include "clang/Frontend/FrontendAction.h" 14 #include <string> 15 #include <vector> 16 17 namespace clang { 18 19 class Module; 20 21 //===----------------------------------------------------------------------===// 22 // Custom Consumer Actions 23 //===----------------------------------------------------------------------===// 24 25 class InitOnlyAction : public FrontendAction { 26 virtual void ExecuteAction(); 27 28 virtual ASTConsumer *CreateASTConsumer(CompilerInstance &CI, 29 StringRef InFile); 30 31 public: 32 // Don't claim to only use the preprocessor, we want to follow the AST path, 33 // but do nothing. 34 virtual bool usesPreprocessorOnly() const { return false; } 35 }; 36 37 //===----------------------------------------------------------------------===// 38 // AST Consumer Actions 39 //===----------------------------------------------------------------------===// 40 41 class ASTPrintAction : public ASTFrontendAction { 42 protected: 43 virtual ASTConsumer *CreateASTConsumer(CompilerInstance &CI, 44 StringRef InFile); 45 }; 46 47 class ASTDumpAction : public ASTFrontendAction { 48 protected: 49 virtual ASTConsumer *CreateASTConsumer(CompilerInstance &CI, 50 StringRef InFile); 51 }; 52 53 class ASTDeclListAction : public ASTFrontendAction { 54 protected: 55 virtual ASTConsumer *CreateASTConsumer(CompilerInstance &CI, 56 StringRef InFile); 57 }; 58 59 class ASTDumpXMLAction : public ASTFrontendAction { 60 protected: 61 virtual ASTConsumer *CreateASTConsumer(CompilerInstance &CI, 62 StringRef InFile); 63 }; 64 65 class ASTViewAction : public ASTFrontendAction { 66 protected: 67 virtual ASTConsumer *CreateASTConsumer(CompilerInstance &CI, 68 StringRef InFile); 69 }; 70 71 class DeclContextPrintAction : public ASTFrontendAction { 72 protected: 73 virtual ASTConsumer *CreateASTConsumer(CompilerInstance &CI, 74 StringRef InFile); 75 }; 76 77 class GeneratePCHAction : public ASTFrontendAction { 78 protected: 79 virtual ASTConsumer *CreateASTConsumer(CompilerInstance &CI, 80 StringRef InFile); 81 82 virtual TranslationUnitKind getTranslationUnitKind() { 83 return TU_Prefix; 84 } 85 86 virtual bool hasASTFileSupport() const { return false; } 87 88 public: 89 /// \brief Compute the AST consumer arguments that will be used to 90 /// create the PCHGenerator instance returned by CreateASTConsumer. 91 /// 92 /// \returns true if an error occurred, false otherwise. 93 static bool ComputeASTConsumerArguments(CompilerInstance &CI, 94 StringRef InFile, 95 std::string &Sysroot, 96 std::string &OutputFile, 97 raw_ostream *&OS); 98 }; 99 100 class GenerateModuleAction : public ASTFrontendAction { 101 clang::Module *Module; 102 103 protected: 104 virtual ASTConsumer *CreateASTConsumer(CompilerInstance &CI, 105 StringRef InFile); 106 107 virtual TranslationUnitKind getTranslationUnitKind() { 108 return TU_Module; 109 } 110 111 virtual bool hasASTFileSupport() const { return false; } 112 113 public: 114 virtual bool BeginSourceFileAction(CompilerInstance &CI, StringRef Filename); 115 116 /// \brief Compute the AST consumer arguments that will be used to 117 /// create the PCHGenerator instance returned by CreateASTConsumer. 118 /// 119 /// \returns true if an error occurred, false otherwise. 120 static bool ComputeASTConsumerArguments(CompilerInstance &CI, 121 StringRef InFile, 122 std::string &Sysroot, 123 std::string &OutputFile, 124 raw_ostream *&OS); 125 }; 126 127 class SyntaxOnlyAction : public ASTFrontendAction { 128 protected: 129 virtual ASTConsumer *CreateASTConsumer(CompilerInstance &CI, 130 StringRef InFile); 131 132 public: 133 virtual bool hasCodeCompletionSupport() const { return true; } 134 }; 135 136 /** 137 * \brief Frontend action adaptor that merges ASTs together. 138 * 139 * This action takes an existing AST file and "merges" it into the AST 140 * context, producing a merged context. This action is an action 141 * adaptor, which forwards most of its calls to another action that 142 * will consume the merged context. 143 */ 144 class ASTMergeAction : public FrontendAction { 145 /// \brief The action that the merge action adapts. 146 FrontendAction *AdaptedAction; 147 148 /// \brief The set of AST files to merge. 149 std::vector<std::string> ASTFiles; 150 151 protected: 152 virtual ASTConsumer *CreateASTConsumer(CompilerInstance &CI, 153 StringRef InFile); 154 155 virtual bool BeginSourceFileAction(CompilerInstance &CI, 156 StringRef Filename); 157 158 virtual void ExecuteAction(); 159 virtual void EndSourceFileAction(); 160 161 public: 162 ASTMergeAction(FrontendAction *AdaptedAction, ArrayRef<std::string> ASTFiles); 163 virtual ~ASTMergeAction(); 164 165 virtual bool usesPreprocessorOnly() const; 166 virtual TranslationUnitKind getTranslationUnitKind(); 167 virtual bool hasPCHSupport() const; 168 virtual bool hasASTFileSupport() const; 169 virtual bool hasCodeCompletionSupport() const; 170 }; 171 172 class PrintPreambleAction : public FrontendAction { 173 protected: 174 void ExecuteAction(); 175 virtual ASTConsumer *CreateASTConsumer(CompilerInstance &, StringRef) { 176 return 0; 177 } 178 179 virtual bool usesPreprocessorOnly() const { return true; } 180 }; 181 182 //===----------------------------------------------------------------------===// 183 // Preprocessor Actions 184 //===----------------------------------------------------------------------===// 185 186 class DumpRawTokensAction : public PreprocessorFrontendAction { 187 protected: 188 void ExecuteAction(); 189 }; 190 191 class DumpTokensAction : public PreprocessorFrontendAction { 192 protected: 193 void ExecuteAction(); 194 }; 195 196 class GeneratePTHAction : public PreprocessorFrontendAction { 197 protected: 198 void ExecuteAction(); 199 }; 200 201 class PreprocessOnlyAction : public PreprocessorFrontendAction { 202 protected: 203 void ExecuteAction(); 204 }; 205 206 class PrintPreprocessedAction : public PreprocessorFrontendAction { 207 protected: 208 void ExecuteAction(); 209 210 virtual bool hasPCHSupport() const { return true; } 211 }; 212 213 } // end namespace clang 214 215 #endif 216