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