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 17namespace clang { 18 19class Module; 20 21//===----------------------------------------------------------------------===// 22// Custom Consumer Actions 23//===----------------------------------------------------------------------===// 24 25class InitOnlyAction : public FrontendAction { 26 virtual void ExecuteAction(); 27 28 virtual ASTConsumer *CreateASTConsumer(CompilerInstance &CI, 29 StringRef InFile); 30 31public: 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 41class ASTPrintAction : public ASTFrontendAction { 42protected: 43 virtual ASTConsumer *CreateASTConsumer(CompilerInstance &CI, 44 StringRef InFile); 45}; 46 47class ASTDumpAction : public ASTFrontendAction { 48protected: 49 virtual ASTConsumer *CreateASTConsumer(CompilerInstance &CI, 50 StringRef InFile); 51}; 52 53class ASTDeclListAction : public ASTFrontendAction { 54protected: 55 virtual ASTConsumer *CreateASTConsumer(CompilerInstance &CI, 56 StringRef InFile); 57}; 58 59class ASTDumpXMLAction : public ASTFrontendAction { 60protected: 61 virtual ASTConsumer *CreateASTConsumer(CompilerInstance &CI, 62 StringRef InFile); 63}; 64 65class ASTViewAction : public ASTFrontendAction { 66protected: 67 virtual ASTConsumer *CreateASTConsumer(CompilerInstance &CI, 68 StringRef InFile); 69}; 70 71class DeclContextPrintAction : public ASTFrontendAction { 72protected: 73 virtual ASTConsumer *CreateASTConsumer(CompilerInstance &CI, 74 StringRef InFile); 75}; 76 77class GeneratePCHAction : public ASTFrontendAction { 78protected: 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 88public: 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 100class GenerateModuleAction : public ASTFrontendAction { 101 clang::Module *Module; 102 103protected: 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 113public: 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 127class SyntaxOnlyAction : public ASTFrontendAction { 128protected: 129 virtual ASTConsumer *CreateASTConsumer(CompilerInstance &CI, 130 StringRef InFile); 131 132public: 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 */ 144class 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 151protected: 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 161public: 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 172class PrintPreambleAction : public FrontendAction { 173protected: 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 186class DumpRawTokensAction : public PreprocessorFrontendAction { 187protected: 188 void ExecuteAction(); 189}; 190 191class DumpTokensAction : public PreprocessorFrontendAction { 192protected: 193 void ExecuteAction(); 194}; 195 196class GeneratePTHAction : public PreprocessorFrontendAction { 197protected: 198 void ExecuteAction(); 199}; 200 201class PreprocessOnlyAction : public PreprocessorFrontendAction { 202protected: 203 void ExecuteAction(); 204}; 205 206class PrintPreprocessedAction : public PreprocessorFrontendAction { 207protected: 208 void ExecuteAction(); 209 210 virtual bool hasPCHSupport() const { return true; } 211}; 212 213} // end namespace clang 214 215#endif 216