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