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