13ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar//===- CXCursor.h - Routines for manipulating CXCursors -------------------===// 23ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar// 33ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar// The LLVM Compiler Infrastructure 43ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar// 53ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar// This file is distributed under the University of Illinois Open Source 63ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar// License. See LICENSE.TXT for details. 73ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar// 83ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar//===----------------------------------------------------------------------===// 93ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar// 101eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar// This file defines routines for manipulating CXCursors. 111eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar// 123ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar//===----------------------------------------------------------------------===// 133ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar 143ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar#ifndef LLVM_CLANG_CXCURSOR_H 152dec85b21822f950bf6035640c496ad835e11728Chad Rosier#define LLVM_CLANG_CXCURSOR_H 162dec85b21822f950bf6035640c496ad835e11728Chad Rosier 173ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar#include "clang-c/Index.h" 183ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar#include "clang/Basic/SourceLocation.h" 192c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar#include "llvm/ADT/PointerUnion.h" 202dec85b21822f950bf6035640c496ad835e11728Chad Rosier#include <utility> 212dec85b21822f950bf6035640c496ad835e11728Chad Rosier 22af20afb761a2426cd715fb8db36b90092e0bb6efDaniel Dunbarnamespace clang { 23af20afb761a2426cd715fb8db36b90092e0bb6efDaniel Dunbar 242dec85b21822f950bf6035640c496ad835e11728Chad Rosierclass ASTContext; 252c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbarclass ASTUnit; 267f9fc3f7ce076645cb6aefc99c64d9446caf13d6Chris Lattnerclass Attr; 27510d73200ec48496a2b10703385fe99b51e31fa5Daniel Dunbarclass CXXBaseSpecifier; 288a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindolaclass Decl; 293ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbarclass Expr; 308a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindolaclass FieldDecl; 31fbfd180495e7800975c6d9bdc6d24e706ef70e34Michael J. Spencerclass InclusionDirective; 328f25c79e59d88df41c5a3cabba1c58035d384a6eDaniel Dunbarclass LabelStmt; 338a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindolaclass MacroDefinition; 348f25c79e59d88df41c5a3cabba1c58035d384a6eDaniel Dunbarclass MacroExpansion; 350de9a7beb107a4306d05cf3589f10c3e01cfcee2Daniel Dunbarclass NamedDecl; 3630bc7e8e560941f730fd94109e81ac600767b0abChris Lattnerclass ObjCInterfaceDecl; 374ad4b3ebbe5769143389dccfcfadb666a4ba5940Daniel Dunbarclass ObjCProtocolDecl; 3803013fa9a0bf1ef4b907f5fec006c8f4000fdd21Michael J. Spencerclass OverloadedTemplateStorage; 3903013fa9a0bf1ef4b907f5fec006c8f4000fdd21Michael J. Spencerclass OverloadExpr; 4003013fa9a0bf1ef4b907f5fec006c8f4000fdd21Michael J. Spencerclass Stmt; 4103013fa9a0bf1ef4b907f5fec006c8f4000fdd21Michael J. Spencerclass TemplateDecl; 42a6b4045dc462c03cd1e7cb9c3ec9dbfdb9c6ad62Evan Chengclass TemplateName; 43a6b4045dc462c03cd1e7cb9c3ec9dbfdb9c6ad62Evan Chengclass TypeDecl; 443a321e23f66128dbb986343927456ff6702af617Michael J. Spencerclass VarDecl; 4543d013d7060e77f0d15faa9cff820c343ba5629aDouglas Gregorclass IdentifierInfo; 464ad4b3ebbe5769143389dccfcfadb666a4ba5940Daniel Dunbar 471b3bb6efc59a21f794b534078f9ae7e95393f510Daniel Dunbarnamespace cxcursor { 483ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar 49aeed3da83c112d0649c30493c059314d85d99080Benjamin KramerCXCursor getCursor(CXTranslationUnit, SourceLocation); 500f4c59c3beae302b5a3ecea13f2e257bdaad3188Rafael Espindola 510f4c59c3beae302b5a3ecea13f2e257bdaad3188Rafael EspindolaCXCursor MakeCXCursor(const clang::Attr *A, const clang::Decl *Parent, 520f4c59c3beae302b5a3ecea13f2e257bdaad3188Rafael Espindola CXTranslationUnit TU); 53734932c7dc77a16b15d466588e10d76bcd6d13c7Daniel DunbarCXCursor MakeCXCursor(const clang::Decl *D, CXTranslationUnit TU, 54734932c7dc77a16b15d466588e10d76bcd6d13c7Daniel Dunbar SourceRange RegionOfInterest = SourceRange(), 55734932c7dc77a16b15d466588e10d76bcd6d13c7Daniel Dunbar bool FirstInDeclGroup = true); 56734932c7dc77a16b15d466588e10d76bcd6d13c7Daniel DunbarCXCursor MakeCXCursor(const clang::Stmt *S, const clang::Decl *Parent, 57734932c7dc77a16b15d466588e10d76bcd6d13c7Daniel Dunbar CXTranslationUnit TU, 58734932c7dc77a16b15d466588e10d76bcd6d13c7Daniel Dunbar SourceRange RegionOfInterest = SourceRange()); 59237a31bf663c8c3783bd71dc7cfbdd0425a8ba69Daniel DunbarCXCursor MakeCXCursorInvalid(CXCursorKind K, CXTranslationUnit TU = nullptr); 605f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner 61ec9587d5bed6149f6df8b57192bb787c62aedb1bDaniel Dunbar/// \brief Create an Objective-C superclass reference at the given location. 62ec9587d5bed6149f6df8b57192bb787c62aedb1bDaniel DunbarCXCursor MakeCursorObjCSuperClassRef(ObjCInterfaceDecl *Super, 63ec9587d5bed6149f6df8b57192bb787c62aedb1bDaniel Dunbar SourceLocation Loc, 64ec9587d5bed6149f6df8b57192bb787c62aedb1bDaniel Dunbar CXTranslationUnit TU); 65ec9587d5bed6149f6df8b57192bb787c62aedb1bDaniel Dunbar 66ec9587d5bed6149f6df8b57192bb787c62aedb1bDaniel Dunbar/// \brief Unpack an ObjCSuperClassRef cursor into the interface it references 67ec9587d5bed6149f6df8b57192bb787c62aedb1bDaniel Dunbar/// and optionally the location where the reference occurred. 68ec9587d5bed6149f6df8b57192bb787c62aedb1bDaniel Dunbarstd::pair<const ObjCInterfaceDecl *, SourceLocation> 69ec9587d5bed6149f6df8b57192bb787c62aedb1bDaniel Dunbar getCursorObjCSuperClassRef(CXCursor C); 70e3d6023cbf99a24609f52adb0af1fa1c6dafefd7Daniel Dunbar 71e3d6023cbf99a24609f52adb0af1fa1c6dafefd7Daniel Dunbar/// \brief Create an Objective-C protocol reference at the given location. 72ec9587d5bed6149f6df8b57192bb787c62aedb1bDaniel DunbarCXCursor MakeCursorObjCProtocolRef(const ObjCProtocolDecl *Proto, 73ec9587d5bed6149f6df8b57192bb787c62aedb1bDaniel Dunbar SourceLocation Loc, 74ec9587d5bed6149f6df8b57192bb787c62aedb1bDaniel Dunbar CXTranslationUnit TU); 75ec9587d5bed6149f6df8b57192bb787c62aedb1bDaniel Dunbar 760de9a7beb107a4306d05cf3589f10c3e01cfcee2Daniel Dunbar/// \brief Unpack an ObjCProtocolRef cursor into the protocol it references 770de9a7beb107a4306d05cf3589f10c3e01cfcee2Daniel Dunbar/// and optionally the location where the reference occurred. 78ec9587d5bed6149f6df8b57192bb787c62aedb1bDaniel Dunbarstd::pair<const ObjCProtocolDecl *, SourceLocation> 79ec9587d5bed6149f6df8b57192bb787c62aedb1bDaniel Dunbar getCursorObjCProtocolRef(CXCursor C); 80ec9587d5bed6149f6df8b57192bb787c62aedb1bDaniel Dunbar 81ec9587d5bed6149f6df8b57192bb787c62aedb1bDaniel Dunbar/// \brief Create an Objective-C class reference at the given location. 82ec9587d5bed6149f6df8b57192bb787c62aedb1bDaniel DunbarCXCursor MakeCursorObjCClassRef(const ObjCInterfaceDecl *Class, 83ec9587d5bed6149f6df8b57192bb787c62aedb1bDaniel Dunbar SourceLocation Loc, 84ec9587d5bed6149f6df8b57192bb787c62aedb1bDaniel Dunbar CXTranslationUnit TU); 85ec9587d5bed6149f6df8b57192bb787c62aedb1bDaniel Dunbar 86e3d6023cbf99a24609f52adb0af1fa1c6dafefd7Daniel Dunbar/// \brief Unpack an ObjCClassRef cursor into the class it references 87e3d6023cbf99a24609f52adb0af1fa1c6dafefd7Daniel Dunbar/// and optionally the location where the reference occurred. 88e3d6023cbf99a24609f52adb0af1fa1c6dafefd7Daniel Dunbarstd::pair<const ObjCInterfaceDecl *, SourceLocation> 89e3d6023cbf99a24609f52adb0af1fa1c6dafefd7Daniel Dunbar getCursorObjCClassRef(CXCursor C); 90e3d6023cbf99a24609f52adb0af1fa1c6dafefd7Daniel Dunbar 915f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner/// \brief Create a type reference at the given location. 925f9e272e632e951b1efe824cd16acb4d96077930Chris LattnerCXCursor MakeCursorTypeRef(const TypeDecl *Type, SourceLocation Loc, 935f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner CXTranslationUnit TU); 9430bc7e8e560941f730fd94109e81ac600767b0abChris Lattner 95ec9587d5bed6149f6df8b57192bb787c62aedb1bDaniel Dunbar/// \brief Unpack a TypeRef cursor into the class it references 96ec9587d5bed6149f6df8b57192bb787c62aedb1bDaniel Dunbar/// and optionally the location where the reference occurred. 97237a31bf663c8c3783bd71dc7cfbdd0425a8ba69Daniel Dunbarstd::pair<const TypeDecl *, SourceLocation> getCursorTypeRef(CXCursor C); 98237a31bf663c8c3783bd71dc7cfbdd0425a8ba69Daniel Dunbar 990de9a7beb107a4306d05cf3589f10c3e01cfcee2Daniel Dunbar/// \brief Create a reference to a template at the given location. 100237a31bf663c8c3783bd71dc7cfbdd0425a8ba69Daniel DunbarCXCursor MakeCursorTemplateRef(const TemplateDecl *Template, SourceLocation Loc, 101237a31bf663c8c3783bd71dc7cfbdd0425a8ba69Daniel Dunbar CXTranslationUnit TU); 102237a31bf663c8c3783bd71dc7cfbdd0425a8ba69Daniel Dunbar 103237a31bf663c8c3783bd71dc7cfbdd0425a8ba69Daniel Dunbar/// \brief Unpack a TemplateRef cursor into the template it references and 1040de9a7beb107a4306d05cf3589f10c3e01cfcee2Daniel Dunbar/// the location where the reference occurred. 105237a31bf663c8c3783bd71dc7cfbdd0425a8ba69Daniel Dunbarstd::pair<const TemplateDecl *, SourceLocation> 106237a31bf663c8c3783bd71dc7cfbdd0425a8ba69Daniel Dunbar getCursorTemplateRef(CXCursor C); 1070de9a7beb107a4306d05cf3589f10c3e01cfcee2Daniel Dunbar 1085f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner/// \brief Create a reference to a namespace or namespace alias at the given 1095f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner/// location. 1105f9e272e632e951b1efe824cd16acb4d96077930Chris LattnerCXCursor MakeCursorNamespaceRef(const NamedDecl *NS, SourceLocation Loc, 1110de9a7beb107a4306d05cf3589f10c3e01cfcee2Daniel Dunbar CXTranslationUnit TU); 1120de9a7beb107a4306d05cf3589f10c3e01cfcee2Daniel Dunbar 1130de9a7beb107a4306d05cf3589f10c3e01cfcee2Daniel Dunbar/// \brief Unpack a NamespaceRef cursor into the namespace or namespace alias 1140de9a7beb107a4306d05cf3589f10c3e01cfcee2Daniel Dunbar/// it references and the location where the reference occurred. 1150de9a7beb107a4306d05cf3589f10c3e01cfcee2Daniel Dunbarstd::pair<const NamedDecl *, SourceLocation> getCursorNamespaceRef(CXCursor C); 1160de9a7beb107a4306d05cf3589f10c3e01cfcee2Daniel Dunbar 1170de9a7beb107a4306d05cf3589f10c3e01cfcee2Daniel Dunbar/// \brief Create a reference to a variable at the given location. 1180de9a7beb107a4306d05cf3589f10c3e01cfcee2Daniel DunbarCXCursor MakeCursorVariableRef(const VarDecl *Var, SourceLocation Loc, 1190de9a7beb107a4306d05cf3589f10c3e01cfcee2Daniel Dunbar CXTranslationUnit TU); 1200de9a7beb107a4306d05cf3589f10c3e01cfcee2Daniel Dunbar 121237a31bf663c8c3783bd71dc7cfbdd0425a8ba69Daniel Dunbar/// \brief Unpack a VariableRef cursor into the variable it references and the 122237a31bf663c8c3783bd71dc7cfbdd0425a8ba69Daniel Dunbar/// location where the where the reference occurred. 123237a31bf663c8c3783bd71dc7cfbdd0425a8ba69Daniel Dunbarstd::pair<const VarDecl *, SourceLocation> getCursorVariableRef(CXCursor C); 124237a31bf663c8c3783bd71dc7cfbdd0425a8ba69Daniel Dunbar 125237a31bf663c8c3783bd71dc7cfbdd0425a8ba69Daniel Dunbar/// \brief Create a reference to a field at the given location. 126237a31bf663c8c3783bd71dc7cfbdd0425a8ba69Daniel DunbarCXCursor MakeCursorMemberRef(const FieldDecl *Field, SourceLocation Loc, 127237a31bf663c8c3783bd71dc7cfbdd0425a8ba69Daniel Dunbar CXTranslationUnit TU); 128237a31bf663c8c3783bd71dc7cfbdd0425a8ba69Daniel Dunbar 129237a31bf663c8c3783bd71dc7cfbdd0425a8ba69Daniel Dunbar/// \brief Unpack a MemberRef cursor into the field it references and the 130237a31bf663c8c3783bd71dc7cfbdd0425a8ba69Daniel Dunbar/// location where the reference occurred. 131237a31bf663c8c3783bd71dc7cfbdd0425a8ba69Daniel Dunbarstd::pair<const FieldDecl *, SourceLocation> getCursorMemberRef(CXCursor C); 132237a31bf663c8c3783bd71dc7cfbdd0425a8ba69Daniel Dunbar 133237a31bf663c8c3783bd71dc7cfbdd0425a8ba69Daniel Dunbar/// \brief Create a CXX base specifier cursor. 134237a31bf663c8c3783bd71dc7cfbdd0425a8ba69Daniel DunbarCXCursor MakeCursorCXXBaseSpecifier(const CXXBaseSpecifier *B, 135237a31bf663c8c3783bd71dc7cfbdd0425a8ba69Daniel Dunbar CXTranslationUnit TU); 136237a31bf663c8c3783bd71dc7cfbdd0425a8ba69Daniel Dunbar 137237a31bf663c8c3783bd71dc7cfbdd0425a8ba69Daniel Dunbar/// \brief Unpack a CXXBaseSpecifier cursor into a CXXBaseSpecifier. 138237a31bf663c8c3783bd71dc7cfbdd0425a8ba69Daniel Dunbarconst CXXBaseSpecifier *getCursorCXXBaseSpecifier(CXCursor C); 139237a31bf663c8c3783bd71dc7cfbdd0425a8ba69Daniel Dunbar 140237a31bf663c8c3783bd71dc7cfbdd0425a8ba69Daniel Dunbar/// \brief Create a preprocessing directive cursor. 141237a31bf663c8c3783bd71dc7cfbdd0425a8ba69Daniel DunbarCXCursor MakePreprocessingDirectiveCursor(SourceRange Range, 142237a31bf663c8c3783bd71dc7cfbdd0425a8ba69Daniel Dunbar CXTranslationUnit TU); 143237a31bf663c8c3783bd71dc7cfbdd0425a8ba69Daniel Dunbar 144237a31bf663c8c3783bd71dc7cfbdd0425a8ba69Daniel Dunbar/// \brief Unpack a given preprocessing directive to retrieve its source range. 145237a31bf663c8c3783bd71dc7cfbdd0425a8ba69Daniel DunbarSourceRange getCursorPreprocessingDirective(CXCursor C); 146237a31bf663c8c3783bd71dc7cfbdd0425a8ba69Daniel Dunbar 147237a31bf663c8c3783bd71dc7cfbdd0425a8ba69Daniel Dunbar/// \brief Create a macro definition cursor. 148237a31bf663c8c3783bd71dc7cfbdd0425a8ba69Daniel DunbarCXCursor MakeMacroDefinitionCursor(const MacroDefinition *, 149237a31bf663c8c3783bd71dc7cfbdd0425a8ba69Daniel Dunbar CXTranslationUnit TU); 1500de9a7beb107a4306d05cf3589f10c3e01cfcee2Daniel Dunbar 151237a31bf663c8c3783bd71dc7cfbdd0425a8ba69Daniel Dunbar/// \brief Unpack a given macro definition cursor to retrieve its 152237a31bf663c8c3783bd71dc7cfbdd0425a8ba69Daniel Dunbar/// source range. 153237a31bf663c8c3783bd71dc7cfbdd0425a8ba69Daniel Dunbarconst MacroDefinition *getCursorMacroDefinition(CXCursor C); 154ec9587d5bed6149f6df8b57192bb787c62aedb1bDaniel Dunbar 155ec9587d5bed6149f6df8b57192bb787c62aedb1bDaniel Dunbar/// \brief Create a macro expansion cursor. 156ec9587d5bed6149f6df8b57192bb787c62aedb1bDaniel DunbarCXCursor MakeMacroExpansionCursor(MacroExpansion *, 157ec9587d5bed6149f6df8b57192bb787c62aedb1bDaniel Dunbar CXTranslationUnit TU); 1585f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner 15930bc7e8e560941f730fd94109e81ac600767b0abChris Lattner/// \brief Create a "pseudo" macro expansion cursor, using a macro definition 16030bc7e8e560941f730fd94109e81ac600767b0abChris Lattner/// and a source location. 1615f9e272e632e951b1efe824cd16acb4d96077930Chris LattnerCXCursor MakeMacroExpansionCursor(MacroDefinition *, SourceLocation Loc, 162237a31bf663c8c3783bd71dc7cfbdd0425a8ba69Daniel Dunbar CXTranslationUnit TU); 163e3d6023cbf99a24609f52adb0af1fa1c6dafefd7Daniel Dunbar 164e3d6023cbf99a24609f52adb0af1fa1c6dafefd7Daniel Dunbar/// \brief Wraps a macro expansion cursor and provides a common interface 165e3d6023cbf99a24609f52adb0af1fa1c6dafefd7Daniel Dunbar/// for a normal macro expansion cursor or a "pseudo" one. 166e3d6023cbf99a24609f52adb0af1fa1c6dafefd7Daniel Dunbar/// 167e3d6023cbf99a24609f52adb0af1fa1c6dafefd7Daniel Dunbar/// "Pseudo" macro expansion cursors (essentially a macro definition along with 168e3d6023cbf99a24609f52adb0af1fa1c6dafefd7Daniel Dunbar/// a source location) are created in special cases, for example they can be 169ec9587d5bed6149f6df8b57192bb787c62aedb1bDaniel Dunbar/// created for identifiers inside macro definitions, if these identifiers are 170ec9587d5bed6149f6df8b57192bb787c62aedb1bDaniel Dunbar/// macro names. 171ec9587d5bed6149f6df8b57192bb787c62aedb1bDaniel Dunbarclass MacroExpansionCursor { 172ec9587d5bed6149f6df8b57192bb787c62aedb1bDaniel Dunbar CXCursor C; 173ec9587d5bed6149f6df8b57192bb787c62aedb1bDaniel Dunbar 174ec9587d5bed6149f6df8b57192bb787c62aedb1bDaniel Dunbar bool isPseudo() const { 175ec9587d5bed6149f6df8b57192bb787c62aedb1bDaniel Dunbar return C.data[1] != nullptr; 176ec9587d5bed6149f6df8b57192bb787c62aedb1bDaniel Dunbar } 177ec9587d5bed6149f6df8b57192bb787c62aedb1bDaniel Dunbar const MacroDefinition *getAsMacroDefinition() const { 178e3d6023cbf99a24609f52adb0af1fa1c6dafefd7Daniel Dunbar assert(isPseudo()); 179ec9587d5bed6149f6df8b57192bb787c62aedb1bDaniel Dunbar return static_cast<const MacroDefinition *>(C.data[0]); 180ec9587d5bed6149f6df8b57192bb787c62aedb1bDaniel Dunbar } 181ec9587d5bed6149f6df8b57192bb787c62aedb1bDaniel Dunbar const MacroExpansion *getAsMacroExpansion() const { 182ec9587d5bed6149f6df8b57192bb787c62aedb1bDaniel Dunbar assert(!isPseudo()); 183ec9587d5bed6149f6df8b57192bb787c62aedb1bDaniel Dunbar return static_cast<const MacroExpansion *>(C.data[0]); 184ec9587d5bed6149f6df8b57192bb787c62aedb1bDaniel Dunbar } 185c88aa79a6bdfd445df800006f723f83f39934e98Daniel Dunbar SourceLocation getPseudoLoc() const { 186545c28117c64e78521b8b402caa060ba0b58a530Daniel Dunbar assert(isPseudo()); 18741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar return SourceLocation::getFromPtrEncoding(C.data[1]); 18841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar } 189217acbfa3524d5805fda7900b26c1e779443588dDaniel Dunbar 1908a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindolapublic: 1915f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner MacroExpansionCursor(CXCursor C) : C(C) { 1928a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola assert(C.kind == CXCursor_MacroExpansion); 1938a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola } 1941e4c01b79273b9cd4e9e9ecfd3422df3900b8356Dylan Noblesmith 1954eeebc464e1f968d9968a4786c82558f18ac2ed8Michael J. Spencer const IdentifierInfo *getName() const; 1968a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola const MacroDefinition *getDefinition() const; 1978a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola SourceRange getSourceRange() const; 1988a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola}; 1998a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola 2008a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola/// \brief Unpack a given macro expansion cursor to retrieve its info. 2018a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindolastatic inline MacroExpansionCursor getCursorMacroExpansion(CXCursor C) { 2028a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola return C; 2038a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola} 2048a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola 2058a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola/// \brief Create an inclusion directive cursor. 2068a1af325b424c3cf62a6164a43466b473ec5a666Rafael EspindolaCXCursor MakeInclusionDirectiveCursor(InclusionDirective *, 2078a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola CXTranslationUnit TU); 2088a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola 2098a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola/// \brief Unpack a given inclusion directive cursor to retrieve its 2108a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola/// source range. 2118a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindolaconst InclusionDirective *getCursorInclusionDirective(CXCursor C); 2128a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola 2138a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola/// \brief Create a label reference at the given location. 2148a1af325b424c3cf62a6164a43466b473ec5a666Rafael EspindolaCXCursor MakeCursorLabelRef(LabelStmt *Label, SourceLocation Loc, 2158a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola CXTranslationUnit TU); 2168a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola 2178a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola/// \brief Unpack a label reference into the label statement it refers to and 2188a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola/// the location of the reference. 2198a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindolastd::pair<const LabelStmt *, SourceLocation> getCursorLabelRef(CXCursor C); 2208a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola 2218a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola/// \brief Create a overloaded declaration reference cursor for an expression. 2228a1af325b424c3cf62a6164a43466b473ec5a666Rafael EspindolaCXCursor MakeCursorOverloadedDeclRef(const OverloadExpr *E, 2238a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola CXTranslationUnit TU); 2248a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola 2258a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola/// \brief Create a overloaded declaration reference cursor for a declaration. 2268a1af325b424c3cf62a6164a43466b473ec5a666Rafael EspindolaCXCursor MakeCursorOverloadedDeclRef(const Decl *D, SourceLocation Location, 2278a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola CXTranslationUnit TU); 2288a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola 2298a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola/// \brief Create a overloaded declaration reference cursor for a template name. 2308a1af325b424c3cf62a6164a43466b473ec5a666Rafael EspindolaCXCursor MakeCursorOverloadedDeclRef(TemplateName Template, 2318a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola SourceLocation Location, 2328a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola CXTranslationUnit TU); 2338a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola 2348a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola/// \brief Internal storage for an overloaded declaration reference cursor; 2358a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindolatypedef llvm::PointerUnion3<const OverloadExpr *, const Decl *, 2368a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola OverloadedTemplateStorage *> 2378a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola OverloadedDeclRefStorage; 2388a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola 2398a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola/// \brief Unpack an overloaded declaration reference into an expression, 2408a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola/// declaration, or template name along with the source location. 2418a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindolastd::pair<OverloadedDeclRefStorage, SourceLocation> 2428a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola getCursorOverloadedDeclRef(CXCursor C); 2438a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola 2448a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindolaconst Decl *getCursorDecl(CXCursor Cursor); 2458a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindolaconst Expr *getCursorExpr(CXCursor Cursor); 2468a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindolaconst Stmt *getCursorStmt(CXCursor Cursor); 2478a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindolaconst Attr *getCursorAttr(CXCursor Cursor); 2488a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindolaconst Decl *getCursorParentDecl(CXCursor Cursor); 2495f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner 2508a1af325b424c3cf62a6164a43466b473ec5a666Rafael EspindolaASTContext &getCursorContext(CXCursor Cursor); 2518a1af325b424c3cf62a6164a43466b473ec5a666Rafael EspindolaASTUnit *getCursorASTUnit(CXCursor Cursor); 2528a1af325b424c3cf62a6164a43466b473ec5a666Rafael EspindolaCXTranslationUnit getCursorTU(CXCursor Cursor); 2538a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola 2548a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindolavoid getOverriddenCursors(CXCursor cursor, 2558a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola SmallVectorImpl<CXCursor> &overridden); 2568a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola 2578a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola/// \brief Create an opaque pool used for fast generation of overriden 2588a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola/// CXCursor arrays. 2598a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindolavoid *createOverridenCXCursorsPool(); 2608a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola 2618a1af325b424c3cf62a6164a43466b473ec5a666Rafael Espindola/// \brief Dispose of the overriden CXCursors pool. 2625f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnervoid disposeOverridenCXCursorsPool(void *pool); 2630ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenberger 2640ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenberger/// \brief Returns a index/location pair for a selector identifier if the cursor 2650ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenberger/// points to one. 2660ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenbergerstd::pair<int, SourceLocation> getSelectorIdentifierIndexAndLoc(CXCursor); 2670ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenbergerstatic inline int getSelectorIdentifierIndex(CXCursor cursor) { 2680ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenberger return getSelectorIdentifierIndexAndLoc(cursor).first; 2690ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenberger} 2700ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenbergerstatic inline SourceLocation getSelectorIdentifierLoc(CXCursor cursor) { 2710ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenberger return getSelectorIdentifierIndexAndLoc(cursor).second; 2720ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenberger} 2730ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenberger 2740ce89c6b36004b2def9e7606c7d4678885314d5fJoerg SonnenbergerCXCursor getSelectorIdentifierCursor(int SelIdx, CXCursor cursor); 2750ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenberger 2760ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenbergerstatic inline CXCursor getTypeRefedCallExprCursor(CXCursor cursor) { 2770ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenberger CXCursor newCursor = cursor; 2780ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenberger if (cursor.kind == CXCursor_CallExpr) 2799ec60dfe771ff28a84889dced6f8fd3748d3d55eSebastian Pop newCursor.xdata = 1; 2800ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenberger return newCursor; 2810ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenberger} 2820ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenberger 2830ce89c6b36004b2def9e7606c7d4678885314d5fJoerg SonnenbergerCXCursor getTypeRefCursor(CXCursor cursor); 2840ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenberger 2850ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenberger/// \brief Generate a USR for \arg D and put it in \arg Buf. 2860ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenberger/// \returns true if no USR was computed or the result should be ignored, 2870ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenberger/// false otherwise. 2880ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenbergerbool getDeclCursorUSR(const Decl *D, SmallVectorImpl<char> &Buf); 2890ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenberger 2900ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenbergerbool operator==(CXCursor X, CXCursor Y); 2910ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenberger 2920ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenbergerinline bool operator!=(CXCursor X, CXCursor Y) { 2930ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenberger return !(X == Y); 2940ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenberger} 2950ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenberger 2960ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenberger/// \brief Return true if the cursor represents a declaration that is the 2975f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner/// first in a declaration group. 2985f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerbool isFirstInDeclGroup(CXCursor C); 2990ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenberger 3000ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenberger}} // end namespace: clang::cxcursor 3010ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenberger 3020ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenberger#endif 3030ce89c6b36004b2def9e7606c7d4678885314d5fJoerg Sonnenberger