Home | History | Annotate | Download | only in Frontend
      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