PPCallbacks.h revision b5b38adbe29cd82711595bd184d6123125bd9a9b
157e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard//===--- PPCallbacks.h - Callbacks for Preprocessor actions -----*- C++ -*-===//
257e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard//
357e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard//                     The LLVM Compiler Infrastructure
457e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard//
557e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard// This file is distributed under the University of Illinois Open Source
657e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard// License. See LICENSE.TXT for details.
757e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard//
857e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard//===----------------------------------------------------------------------===//
957e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard//
1057e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard//  This file defines the PPCallbacks interface.
1157e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard//
1257e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard//===----------------------------------------------------------------------===//
1357e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard
1457e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard#ifndef LLVM_CLANG_LEX_PPCALLBACKS_H
1557e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard#define LLVM_CLANG_LEX_PPCALLBACKS_H
1657e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard
1757e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard#include "clang/Lex/DirectoryLookup.h"
1857e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard#include "clang/Basic/SourceLocation.h"
1957e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard#include "llvm/ADT/StringRef.h"
2036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include <string>
2157e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard
2236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesnamespace clang {
2357e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard  class SourceLocation;
2457e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard  class Token;
2536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  class IdentifierInfo;
2657e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard  class MacroInfo;
2757e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard
28dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines/// PPCallbacks - This interface provides a way to observe the actions of the
29dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines/// preprocessor as it does its thing.  Clients can define their hooks here to
3057e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard/// implement preprocessor level tools.
3157e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellardclass PPCallbacks {
3257e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellardpublic:
3357e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard  virtual ~PPCallbacks();
3457e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard
3557e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard  enum FileChangeReason {
3657e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard    EnterFile, ExitFile, SystemHeaderPragma, RenameFile
3757e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard  };
3857e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard
3936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// FileChanged - This callback is invoked whenever a source file is
4057e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard  /// entered or exited.  The SourceLocation indicates the new location, and
4157e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard  /// EnteringFile indicates whether this is because we are entering a new
4257e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard  /// #include'd file (when true) or whether we're exiting one because we ran
4357e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard  /// off the end (when false).
4457e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard  virtual void FileChanged(SourceLocation Loc, FileChangeReason Reason,
4557e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard                           SrcMgr::CharacteristicKind FileType) {
4657e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard  }
4757e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard
4857e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard  /// FileSkipped - This callback is invoked whenever a source file is
49dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// skipped as the result of header guard optimization.  ParentFile
5057e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard  /// is the file that #includes the skipped file.  FilenameTok is the
5157e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard  /// token in ParentFile that indicates the skipped file.
5257e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard  virtual void FileSkipped(const FileEntry &ParentFile,
5357e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard                           const Token &FilenameTok,
5457e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard                           SrcMgr::CharacteristicKind FileType) {
5557e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard  }
5657e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard
5757e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard  /// \brief This callback is invoked whenever an inclusion directive of
5857e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard  /// any kind (\c #include, \c #import, etc.) has been processed, regardless
59dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// of whether the inclusion will actually result in an inclusion.
6057e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard  ///
61dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// \param HashLoc The location of the '#' that starts the inclusion
6257e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard  /// directive.
6357e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard  ///
6457e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard  /// \param IncludeTok The token that indicates the kind of inclusion
6557e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard  /// directive, e.g., 'include' or 'import'.
6657e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard  ///
6757e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard  /// \param FileName The name of the file being included, as written in the
6857e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard  /// source code.
69dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  ///
7057e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard  /// \param IsAngled Whether the file name was enclosed in angle brackets;
7157e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard  /// otherwise, it was enclosed in quotes.
7257e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard  ///
7357e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard  /// \param File The actual file that may be included by this inclusion
7457e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard  /// directive.
75dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  ///
7636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// \param EndLoc The location of the last token within the inclusion
77dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// directive.
78dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  virtual void InclusionDirective(SourceLocation HashLoc,
7957e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard                                  const Token &IncludeTok,
8057e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard                                  llvm::StringRef FileName,
8157e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard                                  bool IsAngled,
8257e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard                                  const FileEntry *File,
8357e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard                                  SourceLocation EndLoc) {
8457e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard  }
8557e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard
8657e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard  /// EndOfMainFile - This callback is invoked when the end of the main file is
8757e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard  /// reach, no subsequent callbacks will be made.
8857e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard  virtual void EndOfMainFile() {
8957e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard  }
9057e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard
9157e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard  /// Ident - This callback is invoked when a #ident or #sccs directive is read.
9257e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard  /// \param Loc The location of the directive.
9357e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard  /// \param str The text of the directive.
9457e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard  ///
9536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  virtual void Ident(SourceLocation Loc, const std::string &str) {
9636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
9736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
9836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// PragmaComment - This callback is invoked when a #pragma comment directive
9936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// is read.
10036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  ///
10136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  virtual void PragmaComment(SourceLocation Loc, const IdentifierInfo *Kind,
10236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                             const std::string &Str) {
10336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
10436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
10536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// PragmaMessage - This callback is invoked when a #pragma message directive
10636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// is read.
10736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// \param Loc The location of the message directive.
10836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// \param str The text of the message directive.
10936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  ///
11036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  virtual void PragmaMessage(SourceLocation Loc, llvm::StringRef Str) {
11136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
11236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
11336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// MacroExpands - This is called by
114dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// Preprocessor::HandleMacroExpandedIdentifier when a macro invocation is
115dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// found.
116dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  virtual void MacroExpands(const Token &Id, const MacroInfo* MI) {
117dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  }
118dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
11936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// MacroDefined - This hook is called whenever a macro definition is seen.
12036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  virtual void MacroDefined(const IdentifierInfo *II, const MacroInfo *MI) {
12136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
12236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
12336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// MacroUndefined - This hook is called whenever a macro #undef is seen.
124  /// MI is released immediately following this callback.
125  virtual void MacroUndefined(SourceLocation Loc, const IdentifierInfo *II,
126                              const MacroInfo *MI) {
127  }
128
129  /// If -- This hook is called whenever an #if is seen.
130  /// \param Range The SourceRange of the expression being tested.
131  // FIXME: better to pass in a list (or tree!) of Tokens.
132  virtual void If(SourceRange Range) {
133  }
134
135  /// Elif -- This hook is called whenever an #elif is seen.
136  /// \param Range The SourceRange of the expression being tested.
137  // FIXME: better to pass in a list (or tree!) of Tokens.
138  virtual void Elif(SourceRange Range) {
139  }
140
141  /// Ifdef -- This hook is called whenever an #ifdef is seen.
142  /// \param Loc The location of the token being tested.
143  /// \param II Information on the token being tested.
144  virtual void Ifdef(SourceLocation Loc, const IdentifierInfo* II) {
145  }
146
147  /// Ifndef -- This hook is called whenever an #ifndef is seen.
148  /// \param Loc The location of the token being tested.
149  /// \param II Information on the token being tested.
150  virtual void Ifndef(SourceLocation Loc, const IdentifierInfo* II) {
151  }
152
153  /// Else -- This hook is called whenever an #else is seen.
154  virtual void Else() {
155  }
156
157  /// Endif -- This hook is called whenever an #endif is seen.
158  virtual void Endif() {
159  }
160};
161
162/// PPChainedCallbacks - Simple wrapper class for chaining callbacks.
163class PPChainedCallbacks : public PPCallbacks {
164  PPCallbacks *First, *Second;
165
166public:
167  PPChainedCallbacks(PPCallbacks *_First, PPCallbacks *_Second)
168    : First(_First), Second(_Second) {}
169  ~PPChainedCallbacks() {
170    delete Second;
171    delete First;
172  }
173
174  virtual void FileChanged(SourceLocation Loc, FileChangeReason Reason,
175                           SrcMgr::CharacteristicKind FileType) {
176    First->FileChanged(Loc, Reason, FileType);
177    Second->FileChanged(Loc, Reason, FileType);
178  }
179
180  virtual void FileSkipped(const FileEntry &ParentFile,
181                           const Token &FilenameTok,
182                           SrcMgr::CharacteristicKind FileType) {
183    First->FileSkipped(ParentFile, FilenameTok, FileType);
184    Second->FileSkipped(ParentFile, FilenameTok, FileType);
185  }
186
187  virtual void EndOfMainFile() {
188    First->EndOfMainFile();
189    Second->EndOfMainFile();
190  }
191
192  virtual void Ident(SourceLocation Loc, const std::string &str) {
193    First->Ident(Loc, str);
194    Second->Ident(Loc, str);
195  }
196
197  virtual void PragmaComment(SourceLocation Loc, const IdentifierInfo *Kind,
198                             const std::string &Str) {
199    First->PragmaComment(Loc, Kind, Str);
200    Second->PragmaComment(Loc, Kind, Str);
201  }
202
203  virtual void PragmaMessage(SourceLocation Loc, llvm::StringRef Str) {
204    First->PragmaMessage(Loc, Str);
205    Second->PragmaMessage(Loc, Str);
206  }
207
208  virtual void MacroExpands(const Token &Id, const MacroInfo* MI) {
209    First->MacroExpands(Id, MI);
210    Second->MacroExpands(Id, MI);
211  }
212
213  virtual void MacroDefined(const IdentifierInfo *II, const MacroInfo *MI) {
214    First->MacroDefined(II, MI);
215    Second->MacroDefined(II, MI);
216  }
217
218  virtual void MacroUndefined(SourceLocation Loc, const IdentifierInfo *II,
219                              const MacroInfo *MI) {
220    First->MacroUndefined(Loc, II, MI);
221    Second->MacroUndefined(Loc, II, MI);
222  }
223
224  /// If -- This hook is called whenever an #if is seen.
225  virtual void If(SourceRange Range) {
226    First->If(Range);
227    Second->If(Range);
228  }
229
230  /// Elif -- This hook is called whenever an #if is seen.
231  virtual void Elif(SourceRange Range) {
232    First->Elif(Range);
233    Second->Elif(Range);
234  }
235
236  /// Ifdef -- This hook is called whenever an #ifdef is seen.
237  virtual void Ifdef(SourceLocation Loc, const IdentifierInfo* II) {
238    First->Ifdef(Loc, II);
239    Second->Ifdef(Loc, II);
240  }
241
242  /// Ifndef -- This hook is called whenever an #ifndef is seen.
243  virtual void Ifndef(SourceLocation Loc, const IdentifierInfo* II) {
244    First->Ifndef(Loc, II);
245    Second->Ifndef(Loc, II);
246  }
247
248  /// Else -- This hook is called whenever an #else is seen.
249  virtual void Else() {
250    First->Else();
251    Second->Else();
252  }
253
254  /// Endif -- This hook is called whenever an #endif is seen.
255  virtual void Endif() {
256    First->Endif();
257    Second->Endif();
258  }
259};
260
261}  // end namespace clang
262
263#endif
264