116c440a377b7ec8b722a2e2c7c864f75c95bd305Ted Kremenek//===- CXCursor.h - Routines for manipulating CXCursors -------------------===//
216c440a377b7ec8b722a2e2c7c864f75c95bd305Ted Kremenek//
316c440a377b7ec8b722a2e2c7c864f75c95bd305Ted Kremenek//                     The LLVM Compiler Infrastructure
416c440a377b7ec8b722a2e2c7c864f75c95bd305Ted Kremenek//
516c440a377b7ec8b722a2e2c7c864f75c95bd305Ted Kremenek// This file is distributed under the University of Illinois Open Source
616c440a377b7ec8b722a2e2c7c864f75c95bd305Ted Kremenek// License. See LICENSE.TXT for details.
716c440a377b7ec8b722a2e2c7c864f75c95bd305Ted Kremenek//
816c440a377b7ec8b722a2e2c7c864f75c95bd305Ted Kremenek//===----------------------------------------------------------------------===//
916c440a377b7ec8b722a2e2c7c864f75c95bd305Ted Kremenek//
1016c440a377b7ec8b722a2e2c7c864f75c95bd305Ted Kremenek// This file defines routines for manipulating CXCursors.
1116c440a377b7ec8b722a2e2c7c864f75c95bd305Ted Kremenek//
1216c440a377b7ec8b722a2e2c7c864f75c95bd305Ted Kremenek//===----------------------------------------------------------------------===//
1316c440a377b7ec8b722a2e2c7c864f75c95bd305Ted Kremenek
1416c440a377b7ec8b722a2e2c7c864f75c95bd305Ted Kremenek#ifndef LLVM_CLANG_CXCURSOR_H
152cd10b071eb07e82931a0bb43e7fa5b2ce06ef02Ted Kremenek#define LLVM_CLANG_CXCURSOR_H
1616c440a377b7ec8b722a2e2c7c864f75c95bd305Ted Kremenek
1716c440a377b7ec8b722a2e2c7c864f75c95bd305Ted Kremenek#include "clang-c/Index.h"
182e331b938b38057e333fab0ba841130ea8467794Douglas Gregor#include "clang/Basic/SourceLocation.h"
191f60d9ea523fc321d811fe880ba9a1ec74fa8f9bDouglas Gregor#include "llvm/ADT/PointerUnion.h"
202e331b938b38057e333fab0ba841130ea8467794Douglas Gregor#include <utility>
2116c440a377b7ec8b722a2e2c7c864f75c95bd305Ted Kremenek
2216c440a377b7ec8b722a2e2c7c864f75c95bd305Ted Kremeneknamespace clang {
2316c440a377b7ec8b722a2e2c7c864f75c95bd305Ted Kremenek
24f46034af49435a4d1a0085a4738343122aeb6521Douglas Gregorclass ASTContext;
25b2cd48756119f4d8d2a865b4b3e0e8efd02e26a0Douglas Gregorclass ASTUnit;
26e77f443dbca8cdc23e5aa94a2653367e4a7cbe47Ted Kremenekclass Attr;
273064ef9e604d19a0cfd0d8e3ed3055bfd83f88fdTed Kremenekclass CXXBaseSpecifier;
2816c440a377b7ec8b722a2e2c7c864f75c95bd305Ted Kremenekclass Decl;
29283cae37b03047c14ef918503bc46b08405c3b69Douglas Gregorclass Expr;
30a67e03fdf1ae8a1f92463a307d0b6281f1161f40Douglas Gregorclass FieldDecl;
31ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregorclass InclusionDirective;
3236897b05ca2886e287f01802614bc10cbadcec22Douglas Gregorclass LabelStmt;
33572feb2a190b5e8b04fb06c4ac50ee0f61e93ff0Douglas Gregorclass MacroDefinition;
349e5bb85ac899eeab7c21b5ff9030c3da6ff4837bChandler Carruthclass MacroExpansion;
35283cae37b03047c14ef918503bc46b08405c3b69Douglas Gregorclass NamedDecl;
362e331b938b38057e333fab0ba841130ea8467794Douglas Gregorclass ObjCInterfaceDecl;
3778db0cdd49ec24034a5b2a4210fcda03a0919a81Douglas Gregorclass ObjCProtocolDecl;
381f60d9ea523fc321d811fe880ba9a1ec74fa8f9bDouglas Gregorclass OverloadedTemplateStorage;
391f60d9ea523fc321d811fe880ba9a1ec74fa8f9bDouglas Gregorclass OverloadExpr;
4016c440a377b7ec8b722a2e2c7c864f75c95bd305Ted Kremenekclass Stmt;
410b36e614aa19df72885d5e0de996f7fbb9874ec3Douglas Gregorclass TemplateDecl;
421f60d9ea523fc321d811fe880ba9a1ec74fa8f9bDouglas Gregorclass TemplateName;
437d0d40e58807f73e06ff5eb637a48e9f978b0e2aDouglas Gregorclass TypeDecl;
44011d8b93b7cfa8492b8a9c909a850d6577e08dcaDouglas Gregorclass VarDecl;
451f60d9ea523fc321d811fe880ba9a1ec74fa8f9bDouglas Gregor
4616c440a377b7ec8b722a2e2c7c864f75c95bd305Ted Kremeneknamespace cxcursor {
47671436e9e2794c56f3c2e62739d225571493af37Argyrios Kyrtzidis
48671436e9e2794c56f3c2e62739d225571493af37Argyrios KyrtzidisCXCursor getCursor(CXTranslationUnit, SourceLocation);
4916c440a377b7ec8b722a2e2c7c864f75c95bd305Ted Kremenek
50a60ed47da13393796d8552b9fdca12abbb3eea42Ted KremenekCXCursor MakeCXCursor(const clang::Attr *A, clang::Decl *Parent,
51a60ed47da13393796d8552b9fdca12abbb3eea42Ted Kremenek                      CXTranslationUnit TU);
52a60ed47da13393796d8552b9fdca12abbb3eea42Ted KremenekCXCursor MakeCXCursor(clang::Decl *D, CXTranslationUnit TU,
53aed123ec3cc37e457fe20a6158fdadf8849ad916Argyrios Kyrtzidis                      SourceRange RegionOfInterest = SourceRange(),
54007a7c9d8dcdb2e9cd94b6075108bfc4c90e6ccdTed Kremenek                      bool FirstInDeclGroup = true);
55a60ed47da13393796d8552b9fdca12abbb3eea42Ted KremenekCXCursor MakeCXCursor(clang::Stmt *S, clang::Decl *Parent,
56aed123ec3cc37e457fe20a6158fdadf8849ad916Argyrios Kyrtzidis                      CXTranslationUnit TU,
57aed123ec3cc37e457fe20a6158fdadf8849ad916Argyrios Kyrtzidis                      SourceRange RegionOfInterest = SourceRange());
58e77f443dbca8cdc23e5aa94a2653367e4a7cbe47Ted KremenekCXCursor MakeCXCursorInvalid(CXCursorKind K);
5916c440a377b7ec8b722a2e2c7c864f75c95bd305Ted Kremenek
602e331b938b38057e333fab0ba841130ea8467794Douglas Gregor/// \brief Create an Objective-C superclass reference at the given location.
612e331b938b38057e333fab0ba841130ea8467794Douglas GregorCXCursor MakeCursorObjCSuperClassRef(ObjCInterfaceDecl *Super,
62b2cd48756119f4d8d2a865b4b3e0e8efd02e26a0Douglas Gregor                                     SourceLocation Loc,
63a60ed47da13393796d8552b9fdca12abbb3eea42Ted Kremenek                                     CXTranslationUnit TU);
642e331b938b38057e333fab0ba841130ea8467794Douglas Gregor
652e331b938b38057e333fab0ba841130ea8467794Douglas Gregor/// \brief Unpack an ObjCSuperClassRef cursor into the interface it references
662e331b938b38057e333fab0ba841130ea8467794Douglas Gregor/// and optionally the location where the reference occurred.
672e331b938b38057e333fab0ba841130ea8467794Douglas Gregorstd::pair<ObjCInterfaceDecl *, SourceLocation>
6878db0cdd49ec24034a5b2a4210fcda03a0919a81Douglas Gregor  getCursorObjCSuperClassRef(CXCursor C);
6978db0cdd49ec24034a5b2a4210fcda03a0919a81Douglas Gregor
7078db0cdd49ec24034a5b2a4210fcda03a0919a81Douglas Gregor/// \brief Create an Objective-C protocol reference at the given location.
714e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios KyrtzidisCXCursor MakeCursorObjCProtocolRef(const ObjCProtocolDecl *Proto,
724e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                                   SourceLocation Loc,
73a60ed47da13393796d8552b9fdca12abbb3eea42Ted Kremenek                                   CXTranslationUnit TU);
7478db0cdd49ec24034a5b2a4210fcda03a0919a81Douglas Gregor
7578db0cdd49ec24034a5b2a4210fcda03a0919a81Douglas Gregor/// \brief Unpack an ObjCProtocolRef cursor into the protocol it references
7678db0cdd49ec24034a5b2a4210fcda03a0919a81Douglas Gregor/// and optionally the location where the reference occurred.
7778db0cdd49ec24034a5b2a4210fcda03a0919a81Douglas Gregorstd::pair<ObjCProtocolDecl *, SourceLocation>
7878db0cdd49ec24034a5b2a4210fcda03a0919a81Douglas Gregor  getCursorObjCProtocolRef(CXCursor C);
792e331b938b38057e333fab0ba841130ea8467794Douglas Gregor
801adb082a709f7b588f03672999294e061234b2cfDouglas Gregor/// \brief Create an Objective-C class reference at the given location.
814e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios KyrtzidisCXCursor MakeCursorObjCClassRef(const ObjCInterfaceDecl *Class,
824e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                                SourceLocation Loc,
83a60ed47da13393796d8552b9fdca12abbb3eea42Ted Kremenek                                CXTranslationUnit TU);
841adb082a709f7b588f03672999294e061234b2cfDouglas Gregor
851adb082a709f7b588f03672999294e061234b2cfDouglas Gregor/// \brief Unpack an ObjCClassRef cursor into the class it references
861adb082a709f7b588f03672999294e061234b2cfDouglas Gregor/// and optionally the location where the reference occurred.
871adb082a709f7b588f03672999294e061234b2cfDouglas Gregorstd::pair<ObjCInterfaceDecl *, SourceLocation>
881adb082a709f7b588f03672999294e061234b2cfDouglas Gregor  getCursorObjCClassRef(CXCursor C);
891adb082a709f7b588f03672999294e061234b2cfDouglas Gregor
907d0d40e58807f73e06ff5eb637a48e9f978b0e2aDouglas Gregor/// \brief Create a type reference at the given location.
914e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios KyrtzidisCXCursor MakeCursorTypeRef(const TypeDecl *Type, SourceLocation Loc,
92a60ed47da13393796d8552b9fdca12abbb3eea42Ted Kremenek                           CXTranslationUnit TU);
930b36e614aa19df72885d5e0de996f7fbb9874ec3Douglas Gregor
947d0d40e58807f73e06ff5eb637a48e9f978b0e2aDouglas Gregor/// \brief Unpack a TypeRef cursor into the class it references
957d0d40e58807f73e06ff5eb637a48e9f978b0e2aDouglas Gregor/// and optionally the location where the reference occurred.
967d0d40e58807f73e06ff5eb637a48e9f978b0e2aDouglas Gregorstd::pair<TypeDecl *, SourceLocation> getCursorTypeRef(CXCursor C);
977d0d40e58807f73e06ff5eb637a48e9f978b0e2aDouglas Gregor
980b36e614aa19df72885d5e0de996f7fbb9874ec3Douglas Gregor/// \brief Create a reference to a template at the given location.
99b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios KyrtzidisCXCursor MakeCursorTemplateRef(const TemplateDecl *Template, SourceLocation Loc,
100a60ed47da13393796d8552b9fdca12abbb3eea42Ted Kremenek                               CXTranslationUnit TU);
1010b36e614aa19df72885d5e0de996f7fbb9874ec3Douglas Gregor
1020b36e614aa19df72885d5e0de996f7fbb9874ec3Douglas Gregor/// \brief Unpack a TemplateRef cursor into the template it references and
1030b36e614aa19df72885d5e0de996f7fbb9874ec3Douglas Gregor/// the location where the reference occurred.
1040b36e614aa19df72885d5e0de996f7fbb9874ec3Douglas Gregorstd::pair<TemplateDecl *, SourceLocation> getCursorTemplateRef(CXCursor C);
1056931900f43cea558c6974075256c07728dbfecc6Douglas Gregor
1066931900f43cea558c6974075256c07728dbfecc6Douglas Gregor/// \brief Create a reference to a namespace or namespace alias at the given
1076931900f43cea558c6974075256c07728dbfecc6Douglas Gregor/// location.
108b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios KyrtzidisCXCursor MakeCursorNamespaceRef(const NamedDecl *NS, SourceLocation Loc,
109a60ed47da13393796d8552b9fdca12abbb3eea42Ted Kremenek                                CXTranslationUnit TU);
1106931900f43cea558c6974075256c07728dbfecc6Douglas Gregor
1116931900f43cea558c6974075256c07728dbfecc6Douglas Gregor/// \brief Unpack a NamespaceRef cursor into the namespace or namespace alias
1126931900f43cea558c6974075256c07728dbfecc6Douglas Gregor/// it references and the location where the reference occurred.
1136931900f43cea558c6974075256c07728dbfecc6Douglas Gregorstd::pair<NamedDecl *, SourceLocation> getCursorNamespaceRef(CXCursor C);
1146931900f43cea558c6974075256c07728dbfecc6Douglas Gregor
115011d8b93b7cfa8492b8a9c909a850d6577e08dcaDouglas Gregor/// \brief Create a reference to a variable at the given location.
116011d8b93b7cfa8492b8a9c909a850d6577e08dcaDouglas GregorCXCursor MakeCursorVariableRef(const VarDecl *Var, SourceLocation Loc,
117011d8b93b7cfa8492b8a9c909a850d6577e08dcaDouglas Gregor                               CXTranslationUnit TU);
118011d8b93b7cfa8492b8a9c909a850d6577e08dcaDouglas Gregor
119011d8b93b7cfa8492b8a9c909a850d6577e08dcaDouglas Gregor/// \brief Unpack a VariableRef cursor into the variable it references and the
120011d8b93b7cfa8492b8a9c909a850d6577e08dcaDouglas Gregor/// location where the where the reference occurred.
121011d8b93b7cfa8492b8a9c909a850d6577e08dcaDouglas Gregorstd::pair<VarDecl *, SourceLocation> getCursorVariableRef(CXCursor C);
122011d8b93b7cfa8492b8a9c909a850d6577e08dcaDouglas Gregor
123a67e03fdf1ae8a1f92463a307d0b6281f1161f40Douglas Gregor/// \brief Create a reference to a field at the given location.
124b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios KyrtzidisCXCursor MakeCursorMemberRef(const FieldDecl *Field, SourceLocation Loc,
125a60ed47da13393796d8552b9fdca12abbb3eea42Ted Kremenek                             CXTranslationUnit TU);
126a67e03fdf1ae8a1f92463a307d0b6281f1161f40Douglas Gregor
127a67e03fdf1ae8a1f92463a307d0b6281f1161f40Douglas Gregor/// \brief Unpack a MemberRef cursor into the field it references and the
128a67e03fdf1ae8a1f92463a307d0b6281f1161f40Douglas Gregor/// location where the reference occurred.
129a67e03fdf1ae8a1f92463a307d0b6281f1161f40Douglas Gregorstd::pair<FieldDecl *, SourceLocation> getCursorMemberRef(CXCursor C);
130a67e03fdf1ae8a1f92463a307d0b6281f1161f40Douglas Gregor
1313064ef9e604d19a0cfd0d8e3ed3055bfd83f88fdTed Kremenek/// \brief Create a CXX base specifier cursor.
1322957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios KyrtzidisCXCursor MakeCursorCXXBaseSpecifier(const CXXBaseSpecifier *B,
133a60ed47da13393796d8552b9fdca12abbb3eea42Ted Kremenek                                    CXTranslationUnit TU);
1343064ef9e604d19a0cfd0d8e3ed3055bfd83f88fdTed Kremenek
1353064ef9e604d19a0cfd0d8e3ed3055bfd83f88fdTed Kremenek/// \brief Unpack a CXXBaseSpecifier cursor into a CXXBaseSpecifier.
1363064ef9e604d19a0cfd0d8e3ed3055bfd83f88fdTed KremenekCXXBaseSpecifier *getCursorCXXBaseSpecifier(CXCursor C);
1373064ef9e604d19a0cfd0d8e3ed3055bfd83f88fdTed Kremenek
1389f1e3ff3b3095967e2b92b57a53524e2d6bb141cDouglas Gregor/// \brief Create a preprocessing directive cursor.
139a60ed47da13393796d8552b9fdca12abbb3eea42Ted KremenekCXCursor MakePreprocessingDirectiveCursor(SourceRange Range,
140a60ed47da13393796d8552b9fdca12abbb3eea42Ted Kremenek                                          CXTranslationUnit TU);
1419f1e3ff3b3095967e2b92b57a53524e2d6bb141cDouglas Gregor
1429f1e3ff3b3095967e2b92b57a53524e2d6bb141cDouglas Gregor/// \brief Unpack a given preprocessing directive to retrieve its source range.
1439f1e3ff3b3095967e2b92b57a53524e2d6bb141cDouglas GregorSourceRange getCursorPreprocessingDirective(CXCursor C);
1444807231938d8aff28de09f78f301f9ba5845e5e4Douglas Gregor
145572feb2a190b5e8b04fb06c4ac50ee0f61e93ff0Douglas Gregor/// \brief Create a macro definition cursor.
146a60ed47da13393796d8552b9fdca12abbb3eea42Ted KremenekCXCursor MakeMacroDefinitionCursor(MacroDefinition *, CXTranslationUnit TU);
147572feb2a190b5e8b04fb06c4ac50ee0f61e93ff0Douglas Gregor
148572feb2a190b5e8b04fb06c4ac50ee0f61e93ff0Douglas Gregor/// \brief Unpack a given macro definition cursor to retrieve its
149572feb2a190b5e8b04fb06c4ac50ee0f61e93ff0Douglas Gregor/// source range.
150572feb2a190b5e8b04fb06c4ac50ee0f61e93ff0Douglas GregorMacroDefinition *getCursorMacroDefinition(CXCursor C);
151572feb2a190b5e8b04fb06c4ac50ee0f61e93ff0Douglas Gregor
1529e5bb85ac899eeab7c21b5ff9030c3da6ff4837bChandler Carruth/// \brief Create a macro expansion cursor.
1539e5bb85ac899eeab7c21b5ff9030c3da6ff4837bChandler CarruthCXCursor MakeMacroExpansionCursor(MacroExpansion *,
1549e5bb85ac899eeab7c21b5ff9030c3da6ff4837bChandler Carruth                                  CXTranslationUnit TU);
1554807231938d8aff28de09f78f301f9ba5845e5e4Douglas Gregor
1569e5bb85ac899eeab7c21b5ff9030c3da6ff4837bChandler Carruth/// \brief Unpack a given macro expansion cursor to retrieve its
1574807231938d8aff28de09f78f301f9ba5845e5e4Douglas Gregor/// source range.
1589e5bb85ac899eeab7c21b5ff9030c3da6ff4837bChandler CarruthMacroExpansion *getCursorMacroExpansion(CXCursor C);
1594807231938d8aff28de09f78f301f9ba5845e5e4Douglas Gregor
160ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor/// \brief Create an inclusion directive cursor.
161a60ed47da13393796d8552b9fdca12abbb3eea42Ted KremenekCXCursor MakeInclusionDirectiveCursor(InclusionDirective *,
162a60ed47da13393796d8552b9fdca12abbb3eea42Ted Kremenek                                      CXTranslationUnit TU);
163ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor
164ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor/// \brief Unpack a given inclusion directive cursor to retrieve its
165ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor/// source range.
166ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas GregorInclusionDirective *getCursorInclusionDirective(CXCursor C);
167ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor
16836897b05ca2886e287f01802614bc10cbadcec22Douglas Gregor/// \brief Create a label reference at the given location.
169a60ed47da13393796d8552b9fdca12abbb3eea42Ted KremenekCXCursor MakeCursorLabelRef(LabelStmt *Label, SourceLocation Loc,
170a60ed47da13393796d8552b9fdca12abbb3eea42Ted Kremenek                            CXTranslationUnit TU);
17136897b05ca2886e287f01802614bc10cbadcec22Douglas Gregor
17236897b05ca2886e287f01802614bc10cbadcec22Douglas Gregor/// \brief Unpack a label reference into the label statement it refers to and
17336897b05ca2886e287f01802614bc10cbadcec22Douglas Gregor/// the location of the reference.
17436897b05ca2886e287f01802614bc10cbadcec22Douglas Gregorstd::pair<LabelStmt *, SourceLocation> getCursorLabelRef(CXCursor C);
1751f60d9ea523fc321d811fe880ba9a1ec74fa8f9bDouglas Gregor
1761f60d9ea523fc321d811fe880ba9a1ec74fa8f9bDouglas Gregor/// \brief Create a overloaded declaration reference cursor for an expression.
177a60ed47da13393796d8552b9fdca12abbb3eea42Ted KremenekCXCursor MakeCursorOverloadedDeclRef(OverloadExpr *E, CXTranslationUnit TU);
1781f60d9ea523fc321d811fe880ba9a1ec74fa8f9bDouglas Gregor
1791f60d9ea523fc321d811fe880ba9a1ec74fa8f9bDouglas Gregor/// \brief Create a overloaded declaration reference cursor for a declaration.
1801f60d9ea523fc321d811fe880ba9a1ec74fa8f9bDouglas GregorCXCursor MakeCursorOverloadedDeclRef(Decl *D, SourceLocation Location,
181a60ed47da13393796d8552b9fdca12abbb3eea42Ted Kremenek                                     CXTranslationUnit TU);
1821f60d9ea523fc321d811fe880ba9a1ec74fa8f9bDouglas Gregor
1831f60d9ea523fc321d811fe880ba9a1ec74fa8f9bDouglas Gregor/// \brief Create a overloaded declaration reference cursor for a template name.
1841f60d9ea523fc321d811fe880ba9a1ec74fa8f9bDouglas GregorCXCursor MakeCursorOverloadedDeclRef(TemplateName Template,
185a60ed47da13393796d8552b9fdca12abbb3eea42Ted Kremenek                                     SourceLocation Location,
186a60ed47da13393796d8552b9fdca12abbb3eea42Ted Kremenek                                     CXTranslationUnit TU);
1871f60d9ea523fc321d811fe880ba9a1ec74fa8f9bDouglas Gregor
1881f60d9ea523fc321d811fe880ba9a1ec74fa8f9bDouglas Gregor/// \brief Internal storage for an overloaded declaration reference cursor;
1891f60d9ea523fc321d811fe880ba9a1ec74fa8f9bDouglas Gregortypedef llvm::PointerUnion3<OverloadExpr *, Decl *,
1901f60d9ea523fc321d811fe880ba9a1ec74fa8f9bDouglas Gregor                            OverloadedTemplateStorage *>
1911f60d9ea523fc321d811fe880ba9a1ec74fa8f9bDouglas Gregor  OverloadedDeclRefStorage;
1921f60d9ea523fc321d811fe880ba9a1ec74fa8f9bDouglas Gregor
1931f60d9ea523fc321d811fe880ba9a1ec74fa8f9bDouglas Gregor/// \brief Unpack an overloaded declaration reference into an expression,
1941f60d9ea523fc321d811fe880ba9a1ec74fa8f9bDouglas Gregor/// declaration, or template name along with the source location.
1951f60d9ea523fc321d811fe880ba9a1ec74fa8f9bDouglas Gregorstd::pair<OverloadedDeclRefStorage, SourceLocation>
1961f60d9ea523fc321d811fe880ba9a1ec74fa8f9bDouglas Gregor  getCursorOverloadedDeclRef(CXCursor C);
19736897b05ca2886e287f01802614bc10cbadcec22Douglas Gregor
198283cae37b03047c14ef918503bc46b08405c3b69Douglas GregorDecl *getCursorDecl(CXCursor Cursor);
199283cae37b03047c14ef918503bc46b08405c3b69Douglas GregorExpr *getCursorExpr(CXCursor Cursor);
200283cae37b03047c14ef918503bc46b08405c3b69Douglas GregorStmt *getCursorStmt(CXCursor Cursor);
20195f33555a6d51b6537a9ed3968c3d1c2e4991b51Ted KremenekAttr *getCursorAttr(CXCursor Cursor);
2028ccac3de1335f1cfd7cea56ba1cefcf0b724ce3fArgyrios KyrtzidisDecl *getCursorParentDecl(CXCursor Cursor);
20395f33555a6d51b6537a9ed3968c3d1c2e4991b51Ted Kremenek
204f46034af49435a4d1a0085a4738343122aeb6521Douglas GregorASTContext &getCursorContext(CXCursor Cursor);
205b2cd48756119f4d8d2a865b4b3e0e8efd02e26a0Douglas GregorASTUnit *getCursorASTUnit(CXCursor Cursor);
206a60ed47da13393796d8552b9fdca12abbb3eea42Ted KremenekCXTranslationUnit getCursorTU(CXCursor Cursor);
207b11be041e4f05519a2eabf6a99429ba6110f1ca9Argyrios Kyrtzidis
208b11be041e4f05519a2eabf6a99429ba6110f1ca9Argyrios Kyrtzidisvoid getOverriddenCursors(CXCursor cursor,
209b11be041e4f05519a2eabf6a99429ba6110f1ca9Argyrios Kyrtzidis                          SmallVectorImpl<CXCursor> &overridden);
210b11be041e4f05519a2eabf6a99429ba6110f1ca9Argyrios Kyrtzidis
211aed123ec3cc37e457fe20a6158fdadf8849ad916Argyrios Kyrtzidis/// \brief Returns a index/location pair for a selector identifier if the cursor
212aed123ec3cc37e457fe20a6158fdadf8849ad916Argyrios Kyrtzidis/// points to one.
213aed123ec3cc37e457fe20a6158fdadf8849ad916Argyrios Kyrtzidisstd::pair<int, SourceLocation> getSelectorIdentifierIndexAndLoc(CXCursor);
214aed123ec3cc37e457fe20a6158fdadf8849ad916Argyrios Kyrtzidisstatic inline int getSelectorIdentifierIndex(CXCursor cursor) {
215aed123ec3cc37e457fe20a6158fdadf8849ad916Argyrios Kyrtzidis  return getSelectorIdentifierIndexAndLoc(cursor).first;
216aed123ec3cc37e457fe20a6158fdadf8849ad916Argyrios Kyrtzidis}
217aed123ec3cc37e457fe20a6158fdadf8849ad916Argyrios Kyrtzidisstatic inline SourceLocation getSelectorIdentifierLoc(CXCursor cursor) {
218aed123ec3cc37e457fe20a6158fdadf8849ad916Argyrios Kyrtzidis  return getSelectorIdentifierIndexAndLoc(cursor).second;
219aed123ec3cc37e457fe20a6158fdadf8849ad916Argyrios Kyrtzidis}
220aed123ec3cc37e457fe20a6158fdadf8849ad916Argyrios Kyrtzidis
221aed123ec3cc37e457fe20a6158fdadf8849ad916Argyrios KyrtzidisCXCursor getSelectorIdentifierCursor(int SelIdx, CXCursor cursor);
222aed123ec3cc37e457fe20a6158fdadf8849ad916Argyrios Kyrtzidis
223aed123ec3cc37e457fe20a6158fdadf8849ad916Argyrios Kyrtzidisstatic inline CXCursor getTypeRefedCallExprCursor(CXCursor cursor) {
224aed123ec3cc37e457fe20a6158fdadf8849ad916Argyrios Kyrtzidis  CXCursor newCursor = cursor;
225aed123ec3cc37e457fe20a6158fdadf8849ad916Argyrios Kyrtzidis  if (cursor.kind == CXCursor_CallExpr)
226aed123ec3cc37e457fe20a6158fdadf8849ad916Argyrios Kyrtzidis    newCursor.xdata = 1;
227aed123ec3cc37e457fe20a6158fdadf8849ad916Argyrios Kyrtzidis  return newCursor;
228aed123ec3cc37e457fe20a6158fdadf8849ad916Argyrios Kyrtzidis}
229aed123ec3cc37e457fe20a6158fdadf8849ad916Argyrios Kyrtzidis
230aed123ec3cc37e457fe20a6158fdadf8849ad916Argyrios KyrtzidisCXCursor getTypeRefCursor(CXCursor cursor);
231aed123ec3cc37e457fe20a6158fdadf8849ad916Argyrios Kyrtzidis
232b6a4ac41353476ed771d02ae6a96c2663625ffcdArgyrios Kyrtzidis/// \brief Generate a USR for \arg D and put it in \arg Buf.
233b6a4ac41353476ed771d02ae6a96c2663625ffcdArgyrios Kyrtzidis/// \returns true if no USR was computed or the result should be ignored,
234b6a4ac41353476ed771d02ae6a96c2663625ffcdArgyrios Kyrtzidis/// false otherwise.
2354e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisbool getDeclCursorUSR(const Decl *D, SmallVectorImpl<char> &Buf);
236b6a4ac41353476ed771d02ae6a96c2663625ffcdArgyrios Kyrtzidis
237283cae37b03047c14ef918503bc46b08405c3b69Douglas Gregorbool operator==(CXCursor X, CXCursor Y);
238283cae37b03047c14ef918503bc46b08405c3b69Douglas Gregor
239283cae37b03047c14ef918503bc46b08405c3b69Douglas Gregorinline bool operator!=(CXCursor X, CXCursor Y) {
240283cae37b03047c14ef918503bc46b08405c3b69Douglas Gregor  return !(X == Y);
241283cae37b03047c14ef918503bc46b08405c3b69Douglas Gregor}
242283cae37b03047c14ef918503bc46b08405c3b69Douglas Gregor
243007a7c9d8dcdb2e9cd94b6075108bfc4c90e6ccdTed Kremenek/// \brief Return true if the cursor represents a declaration that is the
244007a7c9d8dcdb2e9cd94b6075108bfc4c90e6ccdTed Kremenek/// first in a declaration group.
245007a7c9d8dcdb2e9cd94b6075108bfc4c90e6ccdTed Kremenekbool isFirstInDeclGroup(CXCursor C);
246007a7c9d8dcdb2e9cd94b6075108bfc4c90e6ccdTed Kremenek
24716c440a377b7ec8b722a2e2c7c864f75c95bd305Ted Kremenek}} // end namespace: clang::cxcursor
24816c440a377b7ec8b722a2e2c7c864f75c95bd305Ted Kremenek
24916c440a377b7ec8b722a2e2c7c864f75c95bd305Ted Kremenek#endif
250