15f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===--- PPCallbacks.h - Callbacks for Preprocessor actions -----*- C++ -*-===// 25f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 35f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// The LLVM Compiler Infrastructure 45f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 50bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// This file is distributed under the University of Illinois Open Source 60bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// License. See LICENSE.TXT for details. 75f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 85f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 927289b1b8f249bd5bea46b215b5f2e72bbe1c6d4James Dennett/// 1027289b1b8f249bd5bea46b215b5f2e72bbe1c6d4James Dennett/// \file 1127289b1b8f249bd5bea46b215b5f2e72bbe1c6d4James Dennett/// \brief Defines the PPCallbacks interface. 1227289b1b8f249bd5bea46b215b5f2e72bbe1c6d4James Dennett/// 135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#ifndef LLVM_CLANG_LEX_PPCALLBACKS_H 165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#define LLVM_CLANG_LEX_PPCALLBACKS_H 175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1830a2e16f6c27f888dd11eba6bbbae1e980078fcbChandler Carruth#include "clang/Basic/DiagnosticIDs.h" 1930a2e16f6c27f888dd11eba6bbbae1e980078fcbChandler Carruth#include "clang/Basic/SourceLocation.h" 205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/Lex/DirectoryLookup.h" 21f8afcffe6a0213760b64c211812b1750e1e1e967Argyrios Kyrtzidis#include "clang/Lex/ModuleLoader.h" 220189fd61ec72d86e008aa5615be80581f84cf703Enea Zaffanella#include "clang/Lex/Pragma.h" 23abfe094ce71c42656dcb84a3bdc3e79cb3c16fc3Chris Lattner#include "llvm/ADT/StringRef.h" 245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include <string> 255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencernamespace clang { 275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer class SourceLocation; 287633ab80454147ab4892b8de5fd16582a1f221e8Douglas Gregor class Token; 29a9d9145741ef77db45890911674705b81605b10bChris Lattner class IdentifierInfo; 30c515978bd3a703aa733f846a0094ffa84d149074Argyrios Kyrtzidis class MacroDirective; 31dd08a0c178329ec16cb9e494e6880f3991708b93Argyrios Kyrtzidis class MacroArgs; 321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3327289b1b8f249bd5bea46b215b5f2e72bbe1c6d4James Dennett/// \brief This interface provides a way to observe the actions of the 3427289b1b8f249bd5bea46b215b5f2e72bbe1c6d4James Dennett/// preprocessor as it does its thing. 3527289b1b8f249bd5bea46b215b5f2e72bbe1c6d4James Dennett/// 3627289b1b8f249bd5bea46b215b5f2e72bbe1c6d4James Dennett/// Clients can define their hooks here to implement preprocessor level tools. 375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass PPCallbacks { 385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic: 395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer virtual ~PPCallbacks(); 401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer enum FileChangeReason { 425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer EnterFile, ExitFile, SystemHeaderPragma, RenameFile 435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer }; 441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4527289b1b8f249bd5bea46b215b5f2e72bbe1c6d4James Dennett /// \brief Callback invoked whenever a source file is entered or exited. 46c892c5fa92db137ff68d95afb13fe969d17f4fb2Argyrios Kyrtzidis /// 4727289b1b8f249bd5bea46b215b5f2e72bbe1c6d4James Dennett /// \param Loc Indicates the new location. 4827289b1b8f249bd5bea46b215b5f2e72bbe1c6d4James Dennett /// \param PrevFID the file that was exited if \p Reason is ExitFile. 495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer virtual void FileChanged(SourceLocation Loc, FileChangeReason Reason, 50c892c5fa92db137ff68d95afb13fe969d17f4fb2Argyrios Kyrtzidis SrcMgr::CharacteristicKind FileType, 51c892c5fa92db137ff68d95afb13fe969d17f4fb2Argyrios Kyrtzidis FileID PrevFID = FileID()) { 525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5427289b1b8f249bd5bea46b215b5f2e72bbe1c6d4James Dennett /// \brief Callback invoked whenever a source file is skipped as the result 5527289b1b8f249bd5bea46b215b5f2e72bbe1c6d4James Dennett /// of header guard optimization. 5627289b1b8f249bd5bea46b215b5f2e72bbe1c6d4James Dennett /// 5727289b1b8f249bd5bea46b215b5f2e72bbe1c6d4James Dennett /// \param ParentFile The file that \#included the skipped file. 5827289b1b8f249bd5bea46b215b5f2e72bbe1c6d4James Dennett /// 5927289b1b8f249bd5bea46b215b5f2e72bbe1c6d4James Dennett /// \param FilenameTok The token in ParentFile that indicates the 6027289b1b8f249bd5bea46b215b5f2e72bbe1c6d4James Dennett /// skipped file. 616fbe3ebeaef08665a37423f8425314c90b8b5bcfChris Lattner virtual void FileSkipped(const FileEntry &ParentFile, 626fbe3ebeaef08665a37423f8425314c90b8b5bcfChris Lattner const Token &FilenameTok, 636fbe3ebeaef08665a37423f8425314c90b8b5bcfChris Lattner SrcMgr::CharacteristicKind FileType) { 646fbe3ebeaef08665a37423f8425314c90b8b5bcfChris Lattner } 65dbd8209b33e6c9f151e4913a9c095d64a95439c4Daniel Dunbar 6627289b1b8f249bd5bea46b215b5f2e72bbe1c6d4James Dennett /// \brief Callback invoked whenever an inclusion directive results in a 6727289b1b8f249bd5bea46b215b5f2e72bbe1c6d4James Dennett /// file-not-found error. 681c2e9332fa69727425a3a2b912e36e2ab62083f8Douglas Gregor /// 691c2e9332fa69727425a3a2b912e36e2ab62083f8Douglas Gregor /// \param FileName The name of the file being included, as written in the 701c2e9332fa69727425a3a2b912e36e2ab62083f8Douglas Gregor /// source code. 711c2e9332fa69727425a3a2b912e36e2ab62083f8Douglas Gregor /// 721c2e9332fa69727425a3a2b912e36e2ab62083f8Douglas Gregor /// \param RecoveryPath If this client indicates that it can recover from 731c2e9332fa69727425a3a2b912e36e2ab62083f8Douglas Gregor /// this missing file, the client should set this as an additional header 741c2e9332fa69727425a3a2b912e36e2ab62083f8Douglas Gregor /// search patch. 751c2e9332fa69727425a3a2b912e36e2ab62083f8Douglas Gregor /// 761c2e9332fa69727425a3a2b912e36e2ab62083f8Douglas Gregor /// \returns true to indicate that the preprocessor should attempt to recover 771c2e9332fa69727425a3a2b912e36e2ab62083f8Douglas Gregor /// by adding \p RecoveryPath as a header search path. 781c2e9332fa69727425a3a2b912e36e2ab62083f8Douglas Gregor virtual bool FileNotFound(StringRef FileName, 791c2e9332fa69727425a3a2b912e36e2ab62083f8Douglas Gregor SmallVectorImpl<char> &RecoveryPath) { 801c2e9332fa69727425a3a2b912e36e2ab62083f8Douglas Gregor return false; 811c2e9332fa69727425a3a2b912e36e2ab62083f8Douglas Gregor } 821c2e9332fa69727425a3a2b912e36e2ab62083f8Douglas Gregor 8327289b1b8f249bd5bea46b215b5f2e72bbe1c6d4James Dennett /// \brief Callback invoked whenever an inclusion directive of 84809d1be9820039b4cf6efa48246a0d70ffa13394James Dennett /// any kind (\c \#include, \c \#import, etc.) has been processed, regardless 85ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor /// of whether the inclusion will actually result in an inclusion. 86ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor /// 87ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor /// \param HashLoc The location of the '#' that starts the inclusion 88ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor /// directive. 89ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor /// 90ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor /// \param IncludeTok The token that indicates the kind of inclusion 91ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor /// directive, e.g., 'include' or 'import'. 92ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor /// 93ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor /// \param FileName The name of the file being included, as written in the 94ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor /// source code. 95ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor /// 96ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor /// \param IsAngled Whether the file name was enclosed in angle brackets; 97ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor /// otherwise, it was enclosed in quotes. 98ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor /// 99da313592441db36cf4b06be97c4bcc238ee6fa9cArgyrios Kyrtzidis /// \param FilenameRange The character range of the quotes or angle brackets 100da313592441db36cf4b06be97c4bcc238ee6fa9cArgyrios Kyrtzidis /// for the written file name. 101da313592441db36cf4b06be97c4bcc238ee6fa9cArgyrios Kyrtzidis /// 102ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor /// \param File The actual file that may be included by this inclusion 103ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor /// directive. 104ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor /// 1057412494982c8b50c90961302c3a718633b2c3ab7Manuel Klimek /// \param SearchPath Contains the search path which was used to find the file 1067412494982c8b50c90961302c3a718633b2c3ab7Manuel Klimek /// in the file system. If the file was found via an absolute include path, 1077412494982c8b50c90961302c3a718633b2c3ab7Manuel Klimek /// SearchPath will be empty. For framework includes, the SearchPath and 1087412494982c8b50c90961302c3a718633b2c3ab7Manuel Klimek /// RelativePath will be split up. For example, if an include of "Some/Some.h" 1097412494982c8b50c90961302c3a718633b2c3ab7Manuel Klimek /// is found via the framework path 1107412494982c8b50c90961302c3a718633b2c3ab7Manuel Klimek /// "path/to/Frameworks/Some.framework/Headers/Some.h", SearchPath will be 1117412494982c8b50c90961302c3a718633b2c3ab7Manuel Klimek /// "path/to/Frameworks/Some.framework/Headers" and RelativePath will be 1127412494982c8b50c90961302c3a718633b2c3ab7Manuel Klimek /// "Some.h". 1137412494982c8b50c90961302c3a718633b2c3ab7Manuel Klimek /// 1147412494982c8b50c90961302c3a718633b2c3ab7Manuel Klimek /// \param RelativePath The path relative to SearchPath, at which the include 1157412494982c8b50c90961302c3a718633b2c3ab7Manuel Klimek /// file was found. This is equal to FileName except for framework includes. 116f8afcffe6a0213760b64c211812b1750e1e1e967Argyrios Kyrtzidis /// 117f8afcffe6a0213760b64c211812b1750e1e1e967Argyrios Kyrtzidis /// \param Imported The module, whenever an inclusion directive was 118f8afcffe6a0213760b64c211812b1750e1e1e967Argyrios Kyrtzidis /// automatically turned into a module import or null otherwise. 119f8afcffe6a0213760b64c211812b1750e1e1e967Argyrios Kyrtzidis /// 120ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor virtual void InclusionDirective(SourceLocation HashLoc, 121ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor const Token &IncludeTok, 122686775deca8b8685eb90801495880e3abdd844c2Chris Lattner StringRef FileName, 123ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor bool IsAngled, 124da313592441db36cf4b06be97c4bcc238ee6fa9cArgyrios Kyrtzidis CharSourceRange FilenameRange, 125ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor const FileEntry *File, 126686775deca8b8685eb90801495880e3abdd844c2Chris Lattner StringRef SearchPath, 127f8afcffe6a0213760b64c211812b1750e1e1e967Argyrios Kyrtzidis StringRef RelativePath, 128f8afcffe6a0213760b64c211812b1750e1e1e967Argyrios Kyrtzidis const Module *Imported) { 129f8afcffe6a0213760b64c211812b1750e1e1e967Argyrios Kyrtzidis } 130f8afcffe6a0213760b64c211812b1750e1e1e967Argyrios Kyrtzidis 131f8afcffe6a0213760b64c211812b1750e1e1e967Argyrios Kyrtzidis /// \brief Callback invoked whenever there was an explicit module-import 132f8afcffe6a0213760b64c211812b1750e1e1e967Argyrios Kyrtzidis /// syntax. 133f8afcffe6a0213760b64c211812b1750e1e1e967Argyrios Kyrtzidis /// 134f8afcffe6a0213760b64c211812b1750e1e1e967Argyrios Kyrtzidis /// \param ImportLoc The location of import directive token. 135f8afcffe6a0213760b64c211812b1750e1e1e967Argyrios Kyrtzidis /// 136f8afcffe6a0213760b64c211812b1750e1e1e967Argyrios Kyrtzidis /// \param Path The identifiers (and their locations) of the module 137f8afcffe6a0213760b64c211812b1750e1e1e967Argyrios Kyrtzidis /// "path", e.g., "std.vector" would be split into "std" and "vector". 138f8afcffe6a0213760b64c211812b1750e1e1e967Argyrios Kyrtzidis /// 139f8afcffe6a0213760b64c211812b1750e1e1e967Argyrios Kyrtzidis /// \param Imported The imported module; can be null if importing failed. 140f8afcffe6a0213760b64c211812b1750e1e1e967Argyrios Kyrtzidis /// 141f8afcffe6a0213760b64c211812b1750e1e1e967Argyrios Kyrtzidis virtual void moduleImport(SourceLocation ImportLoc, 142f8afcffe6a0213760b64c211812b1750e1e1e967Argyrios Kyrtzidis ModuleIdPath Path, 143f8afcffe6a0213760b64c211812b1750e1e1e967Argyrios Kyrtzidis const Module *Imported) { 144ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor } 14508985b91e5a87e7731ba24c675f2dc9f9cb645d4Craig Silverstein 14627289b1b8f249bd5bea46b215b5f2e72bbe1c6d4James Dennett /// \brief Callback invoked when the end of the main file is reached. 14727289b1b8f249bd5bea46b215b5f2e72bbe1c6d4James Dennett /// 14827289b1b8f249bd5bea46b215b5f2e72bbe1c6d4James Dennett /// No subsequent callbacks will be made. 149dbd8209b33e6c9f151e4913a9c095d64a95439c4Daniel Dunbar virtual void EndOfMainFile() { 150dbd8209b33e6c9f151e4913a9c095d64a95439c4Daniel Dunbar } 151dbd8209b33e6c9f151e4913a9c095d64a95439c4Daniel Dunbar 15227289b1b8f249bd5bea46b215b5f2e72bbe1c6d4James Dennett /// \brief Callback invoked when a \#ident or \#sccs directive is read. 15308985b91e5a87e7731ba24c675f2dc9f9cb645d4Craig Silverstein /// \param Loc The location of the directive. 15408985b91e5a87e7731ba24c675f2dc9f9cb645d4Craig Silverstein /// \param str The text of the directive. 1555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// 1565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer virtual void Ident(SourceLocation Loc, const std::string &str) { 1575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 1581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1590189fd61ec72d86e008aa5615be80581f84cf703Enea Zaffanella /// \brief Callback invoked when start reading any pragma directive. 1600189fd61ec72d86e008aa5615be80581f84cf703Enea Zaffanella virtual void PragmaDirective(SourceLocation Loc, 1610189fd61ec72d86e008aa5615be80581f84cf703Enea Zaffanella PragmaIntroducerKind Introducer) { 1620189fd61ec72d86e008aa5615be80581f84cf703Enea Zaffanella } 1630189fd61ec72d86e008aa5615be80581f84cf703Enea Zaffanella 16427289b1b8f249bd5bea46b215b5f2e72bbe1c6d4James Dennett /// \brief Callback invoked when a \#pragma comment directive is read. 1651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump virtual void PragmaComment(SourceLocation Loc, const IdentifierInfo *Kind, 166a9d9145741ef77db45890911674705b81605b10bChris Lattner const std::string &Str) { 167a9d9145741ef77db45890911674705b81605b10bChris Lattner } 1681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 169a7ff62f9443efa3b13a28a1e566d4625b15b8553Aaron Ballman /// \brief Callback invoked when a \#pragma detect_mismatch directive is 170a7ff62f9443efa3b13a28a1e566d4625b15b8553Aaron Ballman /// read. 171a7ff62f9443efa3b13a28a1e566d4625b15b8553Aaron Ballman virtual void PragmaDetectMismatch(SourceLocation Loc, 172a7ff62f9443efa3b13a28a1e566d4625b15b8553Aaron Ballman const std::string &Name, 173a7ff62f9443efa3b13a28a1e566d4625b15b8553Aaron Ballman const std::string &Value) { 174a7ff62f9443efa3b13a28a1e566d4625b15b8553Aaron Ballman } 175a7ff62f9443efa3b13a28a1e566d4625b15b8553Aaron Ballman 17685192c7fe187d5486e12dbc6960af28f16a558a0Tareq A. Siraj /// \brief Callback invoked when a \#pragma clang __debug directive is read. 17785192c7fe187d5486e12dbc6960af28f16a558a0Tareq A. Siraj /// \param Loc The location of the debug directive. 17885192c7fe187d5486e12dbc6960af28f16a558a0Tareq A. Siraj /// \param DebugType The identifier following __debug. 17985192c7fe187d5486e12dbc6960af28f16a558a0Tareq A. Siraj virtual void PragmaDebug(SourceLocation Loc, StringRef DebugType) { 18085192c7fe187d5486e12dbc6960af28f16a558a0Tareq A. Siraj } 18185192c7fe187d5486e12dbc6960af28f16a558a0Tareq A. Siraj 182076eea20b80024fc63bbd71fb019375983680ea6Andy Gibbs /// \brief Determines the kind of \#pragma invoking a call to PragmaMessage. 183076eea20b80024fc63bbd71fb019375983680ea6Andy Gibbs enum PragmaMessageKind { 184076eea20b80024fc63bbd71fb019375983680ea6Andy Gibbs /// \brief \#pragma message has been invoked. 185076eea20b80024fc63bbd71fb019375983680ea6Andy Gibbs PMK_Message, 186076eea20b80024fc63bbd71fb019375983680ea6Andy Gibbs 187076eea20b80024fc63bbd71fb019375983680ea6Andy Gibbs /// \brief \#pragma GCC warning has been invoked. 188076eea20b80024fc63bbd71fb019375983680ea6Andy Gibbs PMK_Warning, 189076eea20b80024fc63bbd71fb019375983680ea6Andy Gibbs 190076eea20b80024fc63bbd71fb019375983680ea6Andy Gibbs /// \brief \#pragma GCC error has been invoked. 191076eea20b80024fc63bbd71fb019375983680ea6Andy Gibbs PMK_Error 192076eea20b80024fc63bbd71fb019375983680ea6Andy Gibbs }; 193076eea20b80024fc63bbd71fb019375983680ea6Andy Gibbs 19427289b1b8f249bd5bea46b215b5f2e72bbe1c6d4James Dennett /// \brief Callback invoked when a \#pragma message directive is read. 19508985b91e5a87e7731ba24c675f2dc9f9cb645d4Craig Silverstein /// \param Loc The location of the message directive. 196076eea20b80024fc63bbd71fb019375983680ea6Andy Gibbs /// \param Namespace The namespace of the message directive. 197076eea20b80024fc63bbd71fb019375983680ea6Andy Gibbs /// \param Kind The type of the message directive. 198efce31f51d6e7e31e125f96c20f6cdab3ead0a47James Dennett /// \param Str The text of the message directive. 199076eea20b80024fc63bbd71fb019375983680ea6Andy Gibbs virtual void PragmaMessage(SourceLocation Loc, StringRef Namespace, 200076eea20b80024fc63bbd71fb019375983680ea6Andy Gibbs PragmaMessageKind Kind, StringRef Str) { 201abfe094ce71c42656dcb84a3bdc3e79cb3c16fc3Chris Lattner } 202abfe094ce71c42656dcb84a3bdc3e79cb3c16fc3Chris Lattner 20327289b1b8f249bd5bea46b215b5f2e72bbe1c6d4James Dennett /// \brief Callback invoked when a \#pragma gcc dianostic push directive 20427289b1b8f249bd5bea46b215b5f2e72bbe1c6d4James Dennett /// is read. 205c09ce1224dedc470fce9747e5936ff83cc6762ebDouglas Gregor virtual void PragmaDiagnosticPush(SourceLocation Loc, 206686775deca8b8685eb90801495880e3abdd844c2Chris Lattner StringRef Namespace) { 207c09ce1224dedc470fce9747e5936ff83cc6762ebDouglas Gregor } 208c09ce1224dedc470fce9747e5936ff83cc6762ebDouglas Gregor 20927289b1b8f249bd5bea46b215b5f2e72bbe1c6d4James Dennett /// \brief Callback invoked when a \#pragma gcc dianostic pop directive 21027289b1b8f249bd5bea46b215b5f2e72bbe1c6d4James Dennett /// is read. 211c09ce1224dedc470fce9747e5936ff83cc6762ebDouglas Gregor virtual void PragmaDiagnosticPop(SourceLocation Loc, 212686775deca8b8685eb90801495880e3abdd844c2Chris Lattner StringRef Namespace) { 213c09ce1224dedc470fce9747e5936ff83cc6762ebDouglas Gregor } 214c09ce1224dedc470fce9747e5936ff83cc6762ebDouglas Gregor 21527289b1b8f249bd5bea46b215b5f2e72bbe1c6d4James Dennett /// \brief Callback invoked when a \#pragma gcc dianostic directive is read. 216686775deca8b8685eb90801495880e3abdd844c2Chris Lattner virtual void PragmaDiagnostic(SourceLocation Loc, StringRef Namespace, 217c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines diag::Severity mapping, StringRef Str) {} 218c09ce1224dedc470fce9747e5936ff83cc6762ebDouglas Gregor 219a0950e83cae5df77c00d02d7f77a166979cd2b8bPekka Jaaskelainen /// \brief Called when an OpenCL extension is either disabled or 220a0950e83cae5df77c00d02d7f77a166979cd2b8bPekka Jaaskelainen /// enabled with a pragma. 221a0950e83cae5df77c00d02d7f77a166979cd2b8bPekka Jaaskelainen virtual void PragmaOpenCLExtension(SourceLocation NameLoc, 222a0950e83cae5df77c00d02d7f77a166979cd2b8bPekka Jaaskelainen const IdentifierInfo *Name, 223a0950e83cae5df77c00d02d7f77a166979cd2b8bPekka Jaaskelainen SourceLocation StateLoc, unsigned State) { 224a0950e83cae5df77c00d02d7f77a166979cd2b8bPekka Jaaskelainen } 225a0950e83cae5df77c00d02d7f77a166979cd2b8bPekka Jaaskelainen 2262ee042dee9f7693665e28463955401905474a284Reid Kleckner /// \brief Callback invoked when a \#pragma warning directive is read. 2272ee042dee9f7693665e28463955401905474a284Reid Kleckner virtual void PragmaWarning(SourceLocation Loc, StringRef WarningSpec, 2282ee042dee9f7693665e28463955401905474a284Reid Kleckner ArrayRef<int> Ids) { 2292ee042dee9f7693665e28463955401905474a284Reid Kleckner } 2302ee042dee9f7693665e28463955401905474a284Reid Kleckner 2312ee042dee9f7693665e28463955401905474a284Reid Kleckner /// \brief Callback invoked when a \#pragma warning(push) directive is read. 2322ee042dee9f7693665e28463955401905474a284Reid Kleckner virtual void PragmaWarningPush(SourceLocation Loc, int Level) { 2332ee042dee9f7693665e28463955401905474a284Reid Kleckner } 2342ee042dee9f7693665e28463955401905474a284Reid Kleckner 2352ee042dee9f7693665e28463955401905474a284Reid Kleckner /// \brief Callback invoked when a \#pragma warning(pop) directive is read. 2362ee042dee9f7693665e28463955401905474a284Reid Kleckner virtual void PragmaWarningPop(SourceLocation Loc) { 2372ee042dee9f7693665e28463955401905474a284Reid Kleckner } 2382ee042dee9f7693665e28463955401905474a284Reid Kleckner 23927289b1b8f249bd5bea46b215b5f2e72bbe1c6d4James Dennett /// \brief Called by Preprocessor::HandleMacroExpandedIdentifier when a 24027289b1b8f249bd5bea46b215b5f2e72bbe1c6d4James Dennett /// macro invocation is found. 241c515978bd3a703aa733f846a0094ffa84d149074Argyrios Kyrtzidis virtual void MacroExpands(const Token &MacroNameTok, const MacroDirective *MD, 242dd08a0c178329ec16cb9e494e6880f3991708b93Argyrios Kyrtzidis SourceRange Range, const MacroArgs *Args) { 243ba9eee326434ba62b180271d3cc2999d94ee0de4Chris Lattner } 2441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 24527289b1b8f249bd5bea46b215b5f2e72bbe1c6d4James Dennett /// \brief Hook called whenever a macro definition is seen. 246c515978bd3a703aa733f846a0094ffa84d149074Argyrios Kyrtzidis virtual void MacroDefined(const Token &MacroNameTok, 247c515978bd3a703aa733f846a0094ffa84d149074Argyrios Kyrtzidis const MacroDirective *MD) { 248f4a72b07747cd6ae1a9f6974e148ae504c879349Chris Lattner } 24941c17473e3ece9e60d97c5d9397866b7730cf7eeChris Lattner 25027289b1b8f249bd5bea46b215b5f2e72bbe1c6d4James Dennett /// \brief Hook called whenever a macro \#undef is seen. 25127289b1b8f249bd5bea46b215b5f2e72bbe1c6d4James Dennett /// 252c515978bd3a703aa733f846a0094ffa84d149074Argyrios Kyrtzidis /// MD is released immediately following this callback. 253c515978bd3a703aa733f846a0094ffa84d149074Argyrios Kyrtzidis virtual void MacroUndefined(const Token &MacroNameTok, 254c515978bd3a703aa733f846a0094ffa84d149074Argyrios Kyrtzidis const MacroDirective *MD) { 25541c17473e3ece9e60d97c5d9397866b7730cf7eeChris Lattner } 2566b4ff04dd22e7159887ea6c1bb8b1c01fc9c70a9Argyrios Kyrtzidis 257efce31f51d6e7e31e125f96c20f6cdab3ead0a47James Dennett /// \brief Hook called whenever the 'defined' operator is seen. 258c515978bd3a703aa733f846a0094ffa84d149074Argyrios Kyrtzidis /// \param MD The MacroDirective if the name was a macro, null otherwise. 2596fb63ab0c74bb777772a3c3ecec09799e275599aJohn Thompson virtual void Defined(const Token &MacroNameTok, const MacroDirective *MD, 2606fb63ab0c74bb777772a3c3ecec09799e275599aJohn Thompson SourceRange Range) { 2613d5f955855cab5a831cc6b9339dc77a7d46f1a30Douglas Gregor } 2623d5f955855cab5a831cc6b9339dc77a7d46f1a30Douglas Gregor 26327289b1b8f249bd5bea46b215b5f2e72bbe1c6d4James Dennett /// \brief Hook called when a source range is skipped. 2646b4ff04dd22e7159887ea6c1bb8b1c01fc9c70a9Argyrios Kyrtzidis /// \param Range The SourceRange that was skipped. The range begins at the 26527289b1b8f249bd5bea46b215b5f2e72bbe1c6d4James Dennett /// \#if/\#else directive and ends after the \#endif/\#else directive. 2666b4ff04dd22e7159887ea6c1bb8b1c01fc9c70a9Argyrios Kyrtzidis virtual void SourceRangeSkipped(SourceRange Range) { 2676b4ff04dd22e7159887ea6c1bb8b1c01fc9c70a9Argyrios Kyrtzidis } 26808985b91e5a87e7731ba24c675f2dc9f9cb645d4Craig Silverstein 269651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines enum ConditionValueKind { 270651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines CVK_NotEvaluated, CVK_False, CVK_True 271651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines }; 272651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 27327289b1b8f249bd5bea46b215b5f2e72bbe1c6d4James Dennett /// \brief Hook called whenever an \#if is seen. 2743ebdd8548f97dc5b77172122ab7d6b65de8d4609Argyrios Kyrtzidis /// \param Loc the source location of the directive. 2753ebdd8548f97dc5b77172122ab7d6b65de8d4609Argyrios Kyrtzidis /// \param ConditionRange The SourceRange of the expression being tested. 2766a04b5e8c4f15c724b8b89a9c0ea702586ad1852John Thompson /// \param ConditionValue The evaluated value of the condition. 27727289b1b8f249bd5bea46b215b5f2e72bbe1c6d4James Dennett /// 27808985b91e5a87e7731ba24c675f2dc9f9cb645d4Craig Silverstein // FIXME: better to pass in a list (or tree!) of Tokens. 2796a04b5e8c4f15c724b8b89a9c0ea702586ad1852John Thompson virtual void If(SourceLocation Loc, SourceRange ConditionRange, 280651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ConditionValueKind ConditionValue) { 28108985b91e5a87e7731ba24c675f2dc9f9cb645d4Craig Silverstein } 28208985b91e5a87e7731ba24c675f2dc9f9cb645d4Craig Silverstein 28327289b1b8f249bd5bea46b215b5f2e72bbe1c6d4James Dennett /// \brief Hook called whenever an \#elif is seen. 2843ebdd8548f97dc5b77172122ab7d6b65de8d4609Argyrios Kyrtzidis /// \param Loc the source location of the directive. 2853ebdd8548f97dc5b77172122ab7d6b65de8d4609Argyrios Kyrtzidis /// \param ConditionRange The SourceRange of the expression being tested. 2866a04b5e8c4f15c724b8b89a9c0ea702586ad1852John Thompson /// \param ConditionValue The evaluated value of the condition. 28727289b1b8f249bd5bea46b215b5f2e72bbe1c6d4James Dennett /// \param IfLoc the source location of the \#if/\#ifdef/\#ifndef directive. 28808985b91e5a87e7731ba24c675f2dc9f9cb645d4Craig Silverstein // FIXME: better to pass in a list (or tree!) of Tokens. 289bb660666883de8b32999c1e5fbe3c32e2cafbdf6Argyrios Kyrtzidis virtual void Elif(SourceLocation Loc, SourceRange ConditionRange, 290651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ConditionValueKind ConditionValue, SourceLocation IfLoc) { 29108985b91e5a87e7731ba24c675f2dc9f9cb645d4Craig Silverstein } 29208985b91e5a87e7731ba24c675f2dc9f9cb645d4Craig Silverstein 29327289b1b8f249bd5bea46b215b5f2e72bbe1c6d4James Dennett /// \brief Hook called whenever an \#ifdef is seen. 2943ebdd8548f97dc5b77172122ab7d6b65de8d4609Argyrios Kyrtzidis /// \param Loc the source location of the directive. 295efce31f51d6e7e31e125f96c20f6cdab3ead0a47James Dennett /// \param MacroNameTok Information on the token being tested. 296c515978bd3a703aa733f846a0094ffa84d149074Argyrios Kyrtzidis /// \param MD The MacroDirective if the name was a macro, null otherwise. 29761c1c8ee3fa1bd1f4866d246c72af854be834634Argyrios Kyrtzidis virtual void Ifdef(SourceLocation Loc, const Token &MacroNameTok, 298c515978bd3a703aa733f846a0094ffa84d149074Argyrios Kyrtzidis const MacroDirective *MD) { 29908985b91e5a87e7731ba24c675f2dc9f9cb645d4Craig Silverstein } 30008985b91e5a87e7731ba24c675f2dc9f9cb645d4Craig Silverstein 30127289b1b8f249bd5bea46b215b5f2e72bbe1c6d4James Dennett /// \brief Hook called whenever an \#ifndef is seen. 3023ebdd8548f97dc5b77172122ab7d6b65de8d4609Argyrios Kyrtzidis /// \param Loc the source location of the directive. 303efce31f51d6e7e31e125f96c20f6cdab3ead0a47James Dennett /// \param MacroNameTok Information on the token being tested. 304c515978bd3a703aa733f846a0094ffa84d149074Argyrios Kyrtzidis /// \param MD The MacroDirective if the name was a macro, null otherwise. 30561c1c8ee3fa1bd1f4866d246c72af854be834634Argyrios Kyrtzidis virtual void Ifndef(SourceLocation Loc, const Token &MacroNameTok, 306c515978bd3a703aa733f846a0094ffa84d149074Argyrios Kyrtzidis const MacroDirective *MD) { 30708985b91e5a87e7731ba24c675f2dc9f9cb645d4Craig Silverstein } 30808985b91e5a87e7731ba24c675f2dc9f9cb645d4Craig Silverstein 30927289b1b8f249bd5bea46b215b5f2e72bbe1c6d4James Dennett /// \brief Hook called whenever an \#else is seen. 3103ebdd8548f97dc5b77172122ab7d6b65de8d4609Argyrios Kyrtzidis /// \param Loc the source location of the directive. 31127289b1b8f249bd5bea46b215b5f2e72bbe1c6d4James Dennett /// \param IfLoc the source location of the \#if/\#ifdef/\#ifndef directive. 312bb660666883de8b32999c1e5fbe3c32e2cafbdf6Argyrios Kyrtzidis virtual void Else(SourceLocation Loc, SourceLocation IfLoc) { 31308985b91e5a87e7731ba24c675f2dc9f9cb645d4Craig Silverstein } 31408985b91e5a87e7731ba24c675f2dc9f9cb645d4Craig Silverstein 31527289b1b8f249bd5bea46b215b5f2e72bbe1c6d4James Dennett /// \brief Hook called whenever an \#endif is seen. 3163ebdd8548f97dc5b77172122ab7d6b65de8d4609Argyrios Kyrtzidis /// \param Loc the source location of the directive. 31727289b1b8f249bd5bea46b215b5f2e72bbe1c6d4James Dennett /// \param IfLoc the source location of the \#if/\#ifdef/\#ifndef directive. 318bb660666883de8b32999c1e5fbe3c32e2cafbdf6Argyrios Kyrtzidis virtual void Endif(SourceLocation Loc, SourceLocation IfLoc) { 31908985b91e5a87e7731ba24c675f2dc9f9cb645d4Craig Silverstein } 3205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}; 3215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 32227289b1b8f249bd5bea46b215b5f2e72bbe1c6d4James Dennett/// \brief Simple wrapper class for chaining callbacks. 323e5393fb93eb879d9ebbef102ae9311fa77e023ccDaniel Dunbarclass PPChainedCallbacks : public PPCallbacks { 32499ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie virtual void anchor(); 325176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines std::unique_ptr<PPCallbacks> First, Second; 326e5393fb93eb879d9ebbef102ae9311fa77e023ccDaniel Dunbar 3271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumppublic: 328176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines PPChainedCallbacks(std::unique_ptr<PPCallbacks> _First, 329176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines std::unique_ptr<PPCallbacks> _Second) 330176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines : First(std::move(_First)), Second(std::move(_Second)) {} 331e5393fb93eb879d9ebbef102ae9311fa77e023ccDaniel Dunbar 332651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void FileChanged(SourceLocation Loc, FileChangeReason Reason, 333651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines SrcMgr::CharacteristicKind FileType, 334651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines FileID PrevFID) override { 335c892c5fa92db137ff68d95afb13fe969d17f4fb2Argyrios Kyrtzidis First->FileChanged(Loc, Reason, FileType, PrevFID); 336c892c5fa92db137ff68d95afb13fe969d17f4fb2Argyrios Kyrtzidis Second->FileChanged(Loc, Reason, FileType, PrevFID); 337e5393fb93eb879d9ebbef102ae9311fa77e023ccDaniel Dunbar } 3381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 339651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void FileSkipped(const FileEntry &ParentFile, 340651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const Token &FilenameTok, 341651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines SrcMgr::CharacteristicKind FileType) override { 3426fbe3ebeaef08665a37423f8425314c90b8b5bcfChris Lattner First->FileSkipped(ParentFile, FilenameTok, FileType); 3436fbe3ebeaef08665a37423f8425314c90b8b5bcfChris Lattner Second->FileSkipped(ParentFile, FilenameTok, FileType); 3446fbe3ebeaef08665a37423f8425314c90b8b5bcfChris Lattner } 3456fbe3ebeaef08665a37423f8425314c90b8b5bcfChris Lattner 346651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool FileNotFound(StringRef FileName, 347651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines SmallVectorImpl<char> &RecoveryPath) override { 3481c2e9332fa69727425a3a2b912e36e2ab62083f8Douglas Gregor return First->FileNotFound(FileName, RecoveryPath) || 3491c2e9332fa69727425a3a2b912e36e2ab62083f8Douglas Gregor Second->FileNotFound(FileName, RecoveryPath); 3501c2e9332fa69727425a3a2b912e36e2ab62083f8Douglas Gregor } 3511c2e9332fa69727425a3a2b912e36e2ab62083f8Douglas Gregor 352651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void InclusionDirective(SourceLocation HashLoc, const Token &IncludeTok, 353651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines StringRef FileName, bool IsAngled, 354651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines CharSourceRange FilenameRange, const FileEntry *File, 355651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines StringRef SearchPath, StringRef RelativePath, 356651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const Module *Imported) override { 357da313592441db36cf4b06be97c4bcc238ee6fa9cArgyrios Kyrtzidis First->InclusionDirective(HashLoc, IncludeTok, FileName, IsAngled, 358f8afcffe6a0213760b64c211812b1750e1e1e967Argyrios Kyrtzidis FilenameRange, File, SearchPath, RelativePath, 359f8afcffe6a0213760b64c211812b1750e1e1e967Argyrios Kyrtzidis Imported); 360da313592441db36cf4b06be97c4bcc238ee6fa9cArgyrios Kyrtzidis Second->InclusionDirective(HashLoc, IncludeTok, FileName, IsAngled, 361f8afcffe6a0213760b64c211812b1750e1e1e967Argyrios Kyrtzidis FilenameRange, File, SearchPath, RelativePath, 362f8afcffe6a0213760b64c211812b1750e1e1e967Argyrios Kyrtzidis Imported); 363f8afcffe6a0213760b64c211812b1750e1e1e967Argyrios Kyrtzidis } 364f8afcffe6a0213760b64c211812b1750e1e1e967Argyrios Kyrtzidis 365651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void moduleImport(SourceLocation ImportLoc, ModuleIdPath Path, 366651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const Module *Imported) override { 367f8afcffe6a0213760b64c211812b1750e1e1e967Argyrios Kyrtzidis First->moduleImport(ImportLoc, Path, Imported); 368f8afcffe6a0213760b64c211812b1750e1e1e967Argyrios Kyrtzidis Second->moduleImport(ImportLoc, Path, Imported); 3699c97ca091200311229ce3cb070f0ed8846687edaDouglas Gregor } 3709c97ca091200311229ce3cb070f0ed8846687edaDouglas Gregor 371651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void EndOfMainFile() override { 372dbd8209b33e6c9f151e4913a9c095d64a95439c4Daniel Dunbar First->EndOfMainFile(); 373dbd8209b33e6c9f151e4913a9c095d64a95439c4Daniel Dunbar Second->EndOfMainFile(); 374dbd8209b33e6c9f151e4913a9c095d64a95439c4Daniel Dunbar } 375dbd8209b33e6c9f151e4913a9c095d64a95439c4Daniel Dunbar 376651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void Ident(SourceLocation Loc, const std::string &str) override { 377e5393fb93eb879d9ebbef102ae9311fa77e023ccDaniel Dunbar First->Ident(Loc, str); 378e5393fb93eb879d9ebbef102ae9311fa77e023ccDaniel Dunbar Second->Ident(Loc, str); 379e5393fb93eb879d9ebbef102ae9311fa77e023ccDaniel Dunbar } 3801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 381651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void PragmaComment(SourceLocation Loc, const IdentifierInfo *Kind, 382651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const std::string &Str) override { 383e5393fb93eb879d9ebbef102ae9311fa77e023ccDaniel Dunbar First->PragmaComment(Loc, Kind, Str); 384e5393fb93eb879d9ebbef102ae9311fa77e023ccDaniel Dunbar Second->PragmaComment(Loc, Kind, Str); 385e5393fb93eb879d9ebbef102ae9311fa77e023ccDaniel Dunbar } 3861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 387651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void PragmaDetectMismatch(SourceLocation Loc, const std::string &Name, 388651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const std::string &Value) override { 389a7ff62f9443efa3b13a28a1e566d4625b15b8553Aaron Ballman First->PragmaDetectMismatch(Loc, Name, Value); 390a7ff62f9443efa3b13a28a1e566d4625b15b8553Aaron Ballman Second->PragmaDetectMismatch(Loc, Name, Value); 391a7ff62f9443efa3b13a28a1e566d4625b15b8553Aaron Ballman } 392a7ff62f9443efa3b13a28a1e566d4625b15b8553Aaron Ballman 393651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void PragmaMessage(SourceLocation Loc, StringRef Namespace, 394651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines PragmaMessageKind Kind, StringRef Str) override { 395076eea20b80024fc63bbd71fb019375983680ea6Andy Gibbs First->PragmaMessage(Loc, Namespace, Kind, Str); 396076eea20b80024fc63bbd71fb019375983680ea6Andy Gibbs Second->PragmaMessage(Loc, Namespace, Kind, Str); 397abfe094ce71c42656dcb84a3bdc3e79cb3c16fc3Chris Lattner } 398abfe094ce71c42656dcb84a3bdc3e79cb3c16fc3Chris Lattner 399651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void PragmaDiagnosticPush(SourceLocation Loc, StringRef Namespace) override { 400c09ce1224dedc470fce9747e5936ff83cc6762ebDouglas Gregor First->PragmaDiagnosticPush(Loc, Namespace); 401c09ce1224dedc470fce9747e5936ff83cc6762ebDouglas Gregor Second->PragmaDiagnosticPush(Loc, Namespace); 402c09ce1224dedc470fce9747e5936ff83cc6762ebDouglas Gregor } 403c09ce1224dedc470fce9747e5936ff83cc6762ebDouglas Gregor 404651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void PragmaDiagnosticPop(SourceLocation Loc, StringRef Namespace) override { 405c09ce1224dedc470fce9747e5936ff83cc6762ebDouglas Gregor First->PragmaDiagnosticPop(Loc, Namespace); 406c09ce1224dedc470fce9747e5936ff83cc6762ebDouglas Gregor Second->PragmaDiagnosticPop(Loc, Namespace); 407c09ce1224dedc470fce9747e5936ff83cc6762ebDouglas Gregor } 408c09ce1224dedc470fce9747e5936ff83cc6762ebDouglas Gregor 409651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void PragmaDiagnostic(SourceLocation Loc, StringRef Namespace, 410c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines diag::Severity mapping, StringRef Str) override { 411c09ce1224dedc470fce9747e5936ff83cc6762ebDouglas Gregor First->PragmaDiagnostic(Loc, Namespace, mapping, Str); 412c09ce1224dedc470fce9747e5936ff83cc6762ebDouglas Gregor Second->PragmaDiagnostic(Loc, Namespace, mapping, Str); 413c09ce1224dedc470fce9747e5936ff83cc6762ebDouglas Gregor } 414c09ce1224dedc470fce9747e5936ff83cc6762ebDouglas Gregor 415651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void PragmaOpenCLExtension(SourceLocation NameLoc, const IdentifierInfo *Name, 416651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines SourceLocation StateLoc, unsigned State) override { 417a0950e83cae5df77c00d02d7f77a166979cd2b8bPekka Jaaskelainen First->PragmaOpenCLExtension(NameLoc, Name, StateLoc, State); 418a0950e83cae5df77c00d02d7f77a166979cd2b8bPekka Jaaskelainen Second->PragmaOpenCLExtension(NameLoc, Name, StateLoc, State); 419a0950e83cae5df77c00d02d7f77a166979cd2b8bPekka Jaaskelainen } 420a0950e83cae5df77c00d02d7f77a166979cd2b8bPekka Jaaskelainen 421651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void PragmaWarning(SourceLocation Loc, StringRef WarningSpec, 422651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ArrayRef<int> Ids) override { 4232ee042dee9f7693665e28463955401905474a284Reid Kleckner First->PragmaWarning(Loc, WarningSpec, Ids); 4242ee042dee9f7693665e28463955401905474a284Reid Kleckner Second->PragmaWarning(Loc, WarningSpec, Ids); 4252ee042dee9f7693665e28463955401905474a284Reid Kleckner } 4262ee042dee9f7693665e28463955401905474a284Reid Kleckner 427651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void PragmaWarningPush(SourceLocation Loc, int Level) override { 4282ee042dee9f7693665e28463955401905474a284Reid Kleckner First->PragmaWarningPush(Loc, Level); 4292ee042dee9f7693665e28463955401905474a284Reid Kleckner Second->PragmaWarningPush(Loc, Level); 4302ee042dee9f7693665e28463955401905474a284Reid Kleckner } 4312ee042dee9f7693665e28463955401905474a284Reid Kleckner 432651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void PragmaWarningPop(SourceLocation Loc) override { 4332ee042dee9f7693665e28463955401905474a284Reid Kleckner First->PragmaWarningPop(Loc); 4342ee042dee9f7693665e28463955401905474a284Reid Kleckner Second->PragmaWarningPop(Loc); 4352ee042dee9f7693665e28463955401905474a284Reid Kleckner } 4362ee042dee9f7693665e28463955401905474a284Reid Kleckner 437651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void MacroExpands(const Token &MacroNameTok, const MacroDirective *MD, 438651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines SourceRange Range, const MacroArgs *Args) override { 439dd08a0c178329ec16cb9e494e6880f3991708b93Argyrios Kyrtzidis First->MacroExpands(MacroNameTok, MD, Range, Args); 440dd08a0c178329ec16cb9e494e6880f3991708b93Argyrios Kyrtzidis Second->MacroExpands(MacroNameTok, MD, Range, Args); 441e5393fb93eb879d9ebbef102ae9311fa77e023ccDaniel Dunbar } 4421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 443651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void MacroDefined(const Token &MacroNameTok, const MacroDirective *MD) override { 444c515978bd3a703aa733f846a0094ffa84d149074Argyrios Kyrtzidis First->MacroDefined(MacroNameTok, MD); 445c515978bd3a703aa733f846a0094ffa84d149074Argyrios Kyrtzidis Second->MacroDefined(MacroNameTok, MD); 446e5393fb93eb879d9ebbef102ae9311fa77e023ccDaniel Dunbar } 447e5393fb93eb879d9ebbef102ae9311fa77e023ccDaniel Dunbar 448651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void MacroUndefined(const Token &MacroNameTok, 449651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const MacroDirective *MD) override { 450c515978bd3a703aa733f846a0094ffa84d149074Argyrios Kyrtzidis First->MacroUndefined(MacroNameTok, MD); 451c515978bd3a703aa733f846a0094ffa84d149074Argyrios Kyrtzidis Second->MacroUndefined(MacroNameTok, MD); 452e5393fb93eb879d9ebbef102ae9311fa77e023ccDaniel Dunbar } 45308985b91e5a87e7731ba24c675f2dc9f9cb645d4Craig Silverstein 454651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void Defined(const Token &MacroNameTok, const MacroDirective *MD, 455651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines SourceRange Range) override { 4566fb63ab0c74bb777772a3c3ecec09799e275599aJohn Thompson First->Defined(MacroNameTok, MD, Range); 4576fb63ab0c74bb777772a3c3ecec09799e275599aJohn Thompson Second->Defined(MacroNameTok, MD, Range); 4583d5f955855cab5a831cc6b9339dc77a7d46f1a30Douglas Gregor } 4593d5f955855cab5a831cc6b9339dc77a7d46f1a30Douglas Gregor 460651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void SourceRangeSkipped(SourceRange Range) override { 4616b4ff04dd22e7159887ea6c1bb8b1c01fc9c70a9Argyrios Kyrtzidis First->SourceRangeSkipped(Range); 4626b4ff04dd22e7159887ea6c1bb8b1c01fc9c70a9Argyrios Kyrtzidis Second->SourceRangeSkipped(Range); 4636b4ff04dd22e7159887ea6c1bb8b1c01fc9c70a9Argyrios Kyrtzidis } 4646b4ff04dd22e7159887ea6c1bb8b1c01fc9c70a9Argyrios Kyrtzidis 46527289b1b8f249bd5bea46b215b5f2e72bbe1c6d4James Dennett /// \brief Hook called whenever an \#if is seen. 466651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void If(SourceLocation Loc, SourceRange ConditionRange, 467651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ConditionValueKind ConditionValue) override { 4686a04b5e8c4f15c724b8b89a9c0ea702586ad1852John Thompson First->If(Loc, ConditionRange, ConditionValue); 4696a04b5e8c4f15c724b8b89a9c0ea702586ad1852John Thompson Second->If(Loc, ConditionRange, ConditionValue); 47008985b91e5a87e7731ba24c675f2dc9f9cb645d4Craig Silverstein } 47108985b91e5a87e7731ba24c675f2dc9f9cb645d4Craig Silverstein 4726a04b5e8c4f15c724b8b89a9c0ea702586ad1852John Thompson /// \brief Hook called whenever an \#elif is seen. 473651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void Elif(SourceLocation Loc, SourceRange ConditionRange, 474651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ConditionValueKind ConditionValue, SourceLocation IfLoc) override { 4756a04b5e8c4f15c724b8b89a9c0ea702586ad1852John Thompson First->Elif(Loc, ConditionRange, ConditionValue, IfLoc); 4766a04b5e8c4f15c724b8b89a9c0ea702586ad1852John Thompson Second->Elif(Loc, ConditionRange, ConditionValue, IfLoc); 47708985b91e5a87e7731ba24c675f2dc9f9cb645d4Craig Silverstein } 47808985b91e5a87e7731ba24c675f2dc9f9cb645d4Craig Silverstein 47927289b1b8f249bd5bea46b215b5f2e72bbe1c6d4James Dennett /// \brief Hook called whenever an \#ifdef is seen. 480651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void Ifdef(SourceLocation Loc, const Token &MacroNameTok, 481651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const MacroDirective *MD) override { 482c515978bd3a703aa733f846a0094ffa84d149074Argyrios Kyrtzidis First->Ifdef(Loc, MacroNameTok, MD); 483c515978bd3a703aa733f846a0094ffa84d149074Argyrios Kyrtzidis Second->Ifdef(Loc, MacroNameTok, MD); 48408985b91e5a87e7731ba24c675f2dc9f9cb645d4Craig Silverstein } 48508985b91e5a87e7731ba24c675f2dc9f9cb645d4Craig Silverstein 48627289b1b8f249bd5bea46b215b5f2e72bbe1c6d4James Dennett /// \brief Hook called whenever an \#ifndef is seen. 487651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void Ifndef(SourceLocation Loc, const Token &MacroNameTok, 488651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const MacroDirective *MD) override { 489c515978bd3a703aa733f846a0094ffa84d149074Argyrios Kyrtzidis First->Ifndef(Loc, MacroNameTok, MD); 490c515978bd3a703aa733f846a0094ffa84d149074Argyrios Kyrtzidis Second->Ifndef(Loc, MacroNameTok, MD); 49108985b91e5a87e7731ba24c675f2dc9f9cb645d4Craig Silverstein } 49208985b91e5a87e7731ba24c675f2dc9f9cb645d4Craig Silverstein 49327289b1b8f249bd5bea46b215b5f2e72bbe1c6d4James Dennett /// \brief Hook called whenever an \#else is seen. 494651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void Else(SourceLocation Loc, SourceLocation IfLoc) override { 495bb660666883de8b32999c1e5fbe3c32e2cafbdf6Argyrios Kyrtzidis First->Else(Loc, IfLoc); 496bb660666883de8b32999c1e5fbe3c32e2cafbdf6Argyrios Kyrtzidis Second->Else(Loc, IfLoc); 49708985b91e5a87e7731ba24c675f2dc9f9cb645d4Craig Silverstein } 49808985b91e5a87e7731ba24c675f2dc9f9cb645d4Craig Silverstein 49927289b1b8f249bd5bea46b215b5f2e72bbe1c6d4James Dennett /// \brief Hook called whenever an \#endif is seen. 500651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void Endif(SourceLocation Loc, SourceLocation IfLoc) override { 501bb660666883de8b32999c1e5fbe3c32e2cafbdf6Argyrios Kyrtzidis First->Endif(Loc, IfLoc); 502bb660666883de8b32999c1e5fbe3c32e2cafbdf6Argyrios Kyrtzidis Second->Endif(Loc, IfLoc); 50308985b91e5a87e7731ba24c675f2dc9f9cb645d4Craig Silverstein } 504e5393fb93eb879d9ebbef102ae9311fa77e023ccDaniel Dunbar}; 505e5393fb93eb879d9ebbef102ae9311fa77e023ccDaniel Dunbar 5065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} // end namespace clang 5075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 5085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#endif 509