CXCursor.cpp revision 46f92523918fd4ac4df5489265c7f85c1b28baea
1a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul//===- CXCursor.cpp - Routines for manipulating CXCursors -----------------===// 2afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg// 3afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg// The LLVM Compiler Infrastructure 4afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg// 5a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul// This file is distributed under the University of Illinois Open Source 6afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg// License. See LICENSE.TXT for details. 7a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul// 8afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg//===----------------------------------------------------------------------===// 9afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg// 10afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg// This file defines routines for manipulating CXCursors. It should be the 11afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg// only file that has internal knowledge of the encoding of the data in 12afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg// CXCursor. 13afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg// 14afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg//===----------------------------------------------------------------------===// 15afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 16afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "CXTranslationUnit.h" 17afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "CXCursor.h" 18afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "CXString.h" 19afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "CXType.h" 20afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "clang-c/Index.h" 21afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "clang/AST/Decl.h" 22afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "clang/AST/DeclCXX.h" 23afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "clang/AST/DeclObjC.h" 24afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "clang/AST/DeclTemplate.h" 25afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "clang/AST/Expr.h" 26afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "clang/AST/ExprCXX.h" 27afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "clang/AST/ExprObjC.h" 28e23e2759fc67973c0d2e3318f79837f88f8bad0dBrian Paul#include "clang/Frontend/ASTUnit.h" 29e23e2759fc67973c0d2e3318f79837f88f8bad0dBrian Paul#include "llvm/Support/ErrorHandling.h" 30afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 31afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgusing namespace clang; 32afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgusing namespace cxcursor; 33afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 34afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgCXCursor cxcursor::MakeCXCursorInvalid(CXCursorKind K, CXTranslationUnit TU) { 35afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg assert(K >= CXCursor_FirstInvalid && K <= CXCursor_LastInvalid); 3608f0374bfaccc41a497f18a6535fa0d13277abdeBrian Paul CXCursor C = { K, 0, { 0, 0, TU } }; 3708f0374bfaccc41a497f18a6535fa0d13277abdeBrian Paul return C; 3808f0374bfaccc41a497f18a6535fa0d13277abdeBrian Paul} 39afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 40afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic CXCursorKind GetCursorKind(const Attr *A) { 41afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg assert(A && "Invalid arguments!"); 42afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg switch (A->getKind()) { 43afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg default: break; 44afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case attr::IBAction: return CXCursor_IBActionAttr; 45afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case attr::IBOutlet: return CXCursor_IBOutletAttr; 46afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case attr::IBOutletCollection: return CXCursor_IBOutletCollectionAttr; 472743def830bc1dc3bedb302f13db3d65dc4705d7Brian Paul case attr::Final: return CXCursor_CXXFinalAttr; 4808f0374bfaccc41a497f18a6535fa0d13277abdeBrian Paul case attr::Override: return CXCursor_CXXOverrideAttr; 49afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case attr::Annotate: return CXCursor_AnnotateAttr; 50afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case attr::AsmLabel: return CXCursor_AsmLabelAttr; 512743def830bc1dc3bedb302f13db3d65dc4705d7Brian Paul } 52ae773f612c0b9262e9cf9fb63423a44d2125ce46Brian Paul 53ae773f612c0b9262e9cf9fb63423a44d2125ce46Brian Paul return CXCursor_UnexposedAttr; 54ae773f612c0b9262e9cf9fb63423a44d2125ce46Brian Paul} 55ae773f612c0b9262e9cf9fb63423a44d2125ce46Brian Paul 56ae773f612c0b9262e9cf9fb63423a44d2125ce46Brian PaulCXCursor cxcursor::MakeCXCursor(const Attr *A, Decl *Parent, 57ae773f612c0b9262e9cf9fb63423a44d2125ce46Brian Paul CXTranslationUnit TU) { 58ae773f612c0b9262e9cf9fb63423a44d2125ce46Brian Paul assert(A && Parent && TU && "Invalid arguments!"); 59ae773f612c0b9262e9cf9fb63423a44d2125ce46Brian Paul CXCursor C = { GetCursorKind(A), 0, { Parent, (void*)A, TU } }; 60afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return C; 61afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 62ae773f612c0b9262e9cf9fb63423a44d2125ce46Brian Paul 63ae773f612c0b9262e9cf9fb63423a44d2125ce46Brian PaulCXCursor cxcursor::MakeCXCursor(Decl *D, CXTranslationUnit TU, 648da58f31846bd119070af78fac340a3e5da4f056Brian Paul SourceRange RegionOfInterest, 65afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg bool FirstInDeclGroup) { 662743def830bc1dc3bedb302f13db3d65dc4705d7Brian Paul assert(D && TU && "Invalid arguments!"); 676799ecb6753f2ec5b1b66c9e8c447bc82035f94cTed Jump 68afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg CXCursorKind K = getCursorKindForDecl(D); 69afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 7008f0374bfaccc41a497f18a6535fa0d13277abdeBrian Paul if (K == CXCursor_ObjCClassMethodDecl || 7108f0374bfaccc41a497f18a6535fa0d13277abdeBrian Paul K == CXCursor_ObjCInstanceMethodDecl) { 72afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg int SelectorIdIndex = -1; 7308f0374bfaccc41a497f18a6535fa0d13277abdeBrian Paul // Check if cursor points to a selector id. 7408f0374bfaccc41a497f18a6535fa0d13277abdeBrian Paul if (RegionOfInterest.isValid() && 7508f0374bfaccc41a497f18a6535fa0d13277abdeBrian Paul RegionOfInterest.getBegin() == RegionOfInterest.getEnd()) { 7608f0374bfaccc41a497f18a6535fa0d13277abdeBrian Paul SmallVector<SourceLocation, 16> SelLocs; 77afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg cast<ObjCMethodDecl>(D)->getSelectorLocs(SelLocs); 78afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg SmallVector<SourceLocation, 16>::iterator 7908f0374bfaccc41a497f18a6535fa0d13277abdeBrian Paul I=std::find(SelLocs.begin(), SelLocs.end(),RegionOfInterest.getBegin()); 8008f0374bfaccc41a497f18a6535fa0d13277abdeBrian Paul if (I != SelLocs.end()) 81afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg SelectorIdIndex = I - SelLocs.begin(); 82afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 83afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg CXCursor C = { K, SelectorIdIndex, 84afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg { D, (void*)(intptr_t) (FirstInDeclGroup ? 1 : 0), TU }}; 85afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return C; 86afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 87a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul 882f911cdf17e98e8ba7f0f7559f3a21708d366769Brian Paul CXCursor C = { K, 0, { D, (void*)(intptr_t) (FirstInDeclGroup ? 1 : 0), TU }}; 89afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return C; 90fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul} 91afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 92afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgCXCursor cxcursor::MakeCXCursor(Stmt *S, Decl *Parent, CXTranslationUnit TU, 93fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul SourceRange RegionOfInterest) { 94afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg assert(S && TU && "Invalid arguments!"); 95afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg CXCursorKind K = CXCursor_NotImplemented; 96fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 97fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul switch (S->getStmtClass()) { 98fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::NoStmtClass: 99fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 100fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 101fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::CaseStmtClass: 102fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul K = CXCursor_CaseStmt; 103fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 104fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 105fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::DefaultStmtClass: 106fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul K = CXCursor_DefaultStmt; 107fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 108fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 109fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::IfStmtClass: 110fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul K = CXCursor_IfStmt; 111fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 112fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 113fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::SwitchStmtClass: 114afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg K = CXCursor_SwitchStmt; 115fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 116fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 117fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::WhileStmtClass: 118fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul K = CXCursor_WhileStmt; 119fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 120fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 121afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case Stmt::DoStmtClass: 122afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg K = CXCursor_DoStmt; 123fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 124fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 125fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::ForStmtClass: 126fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul K = CXCursor_ForStmt; 127fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 128fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 129fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::GotoStmtClass: 130fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul K = CXCursor_GotoStmt; 131fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 132fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 133fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::IndirectGotoStmtClass: 134fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul K = CXCursor_IndirectGotoStmt; 135fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 136fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 137fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::ContinueStmtClass: 138fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul K = CXCursor_ContinueStmt; 139fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 140fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 141fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::BreakStmtClass: 142fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul K = CXCursor_BreakStmt; 143fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 144fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 145fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::ReturnStmtClass: 146fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul K = CXCursor_ReturnStmt; 147fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 148fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 149fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::GCCAsmStmtClass: 150fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul K = CXCursor_GCCAsmStmt; 151fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 152fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 153fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::MSAsmStmtClass: 154fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul K = CXCursor_MSAsmStmt; 155fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 156fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 157fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::ObjCAtTryStmtClass: 158fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul K = CXCursor_ObjCAtTryStmt; 159fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 160fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 161fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::ObjCAtCatchStmtClass: 162fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul K = CXCursor_ObjCAtCatchStmt; 163fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 164fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 165fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::ObjCAtFinallyStmtClass: 166fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul K = CXCursor_ObjCAtFinallyStmt; 167fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 168fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 169fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::ObjCAtThrowStmtClass: 170fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul K = CXCursor_ObjCAtThrowStmt; 171fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 172fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 173fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::ObjCAtSynchronizedStmtClass: 174fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul K = CXCursor_ObjCAtSynchronizedStmt; 175fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 176fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 177fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::ObjCAutoreleasePoolStmtClass: 178fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul K = CXCursor_ObjCAutoreleasePoolStmt; 179fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 180fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 181fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::ObjCForCollectionStmtClass: 182fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul K = CXCursor_ObjCForCollectionStmt; 183fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 184fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 185fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::CXXCatchStmtClass: 186fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul K = CXCursor_CXXCatchStmt; 187fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 188fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 189fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::CXXTryStmtClass: 190fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul K = CXCursor_CXXTryStmt; 191fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 192fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 193fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::CXXForRangeStmtClass: 194fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul K = CXCursor_CXXForRangeStmt; 195fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 196fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 197fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::SEHTryStmtClass: 198fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul K = CXCursor_SEHTryStmt; 199fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 200fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 201fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::SEHExceptStmtClass: 202fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul K = CXCursor_SEHExceptStmt; 203fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 204fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 205fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::SEHFinallyStmtClass: 206fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul K = CXCursor_SEHFinallyStmt; 207fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 208fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 209fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::ArrayTypeTraitExprClass: 210fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::AsTypeExprClass: 211fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::AtomicExprClass: 212fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::BinaryConditionalOperatorClass: 213fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::BinaryTypeTraitExprClass: 214fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::TypeTraitExprClass: 215fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::CXXBindTemporaryExprClass: 216fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::CXXDefaultArgExprClass: 217fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::CXXScalarValueInitExprClass: 218fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::CXXUuidofExprClass: 219fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::ChooseExprClass: 220fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::DesignatedInitExprClass: 221fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::ExprWithCleanupsClass: 222fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::ExpressionTraitExprClass: 223fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::ExtVectorElementExprClass: 224fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::ImplicitCastExprClass: 225fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::ImplicitValueInitExprClass: 226fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::MaterializeTemporaryExprClass: 227fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::ObjCIndirectCopyRestoreExprClass: 228fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::OffsetOfExprClass: 229fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::ParenListExprClass: 230fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::PredefinedExprClass: 231fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::ShuffleVectorExprClass: 232fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::UnaryExprOrTypeTraitExprClass: 233fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::UnaryTypeTraitExprClass: 234fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::VAArgExprClass: 235fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::ObjCArrayLiteralClass: 236fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::ObjCDictionaryLiteralClass: 237fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::ObjCBoxedExprClass: 238fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::ObjCSubscriptRefExprClass: 239fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul K = CXCursor_UnexposedExpr; 240fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 241fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 242fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::OpaqueValueExprClass: 243fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul if (Expr *Src = cast<OpaqueValueExpr>(S)->getSourceExpr()) 244fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul return MakeCXCursor(Src, Parent, TU, RegionOfInterest); 245fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul K = CXCursor_UnexposedExpr; 2460056c5e40d7c5702420f314fa4f68159e5a64cd6Brian Paul break; 247fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 248fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::PseudoObjectExprClass: 249fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul return MakeCXCursor(cast<PseudoObjectExpr>(S)->getSyntacticForm(), 2500056c5e40d7c5702420f314fa4f68159e5a64cd6Brian Paul Parent, TU, RegionOfInterest); 251fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 252fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::CompoundStmtClass: 253fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul K = CXCursor_CompoundStmt; 254fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 255fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 256fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::NullStmtClass: 257fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul K = CXCursor_NullStmt; 258fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 259fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 260fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::LabelStmtClass: 261fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul K = CXCursor_LabelStmt; 262fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 263fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 264fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::AttributedStmtClass: 265fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul K = CXCursor_UnexposedStmt; 266fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 267fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 268fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::DeclStmtClass: 269fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul K = CXCursor_DeclStmt; 270fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 271fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 272fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::IntegerLiteralClass: 273fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul K = CXCursor_IntegerLiteral; 274fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 275fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 276fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::FloatingLiteralClass: 277fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul K = CXCursor_FloatingLiteral; 278fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 279fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 280fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::ImaginaryLiteralClass: 281fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul K = CXCursor_ImaginaryLiteral; 282fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 283fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 284fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::StringLiteralClass: 285fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul K = CXCursor_StringLiteral; 286fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 287fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 288fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::CharacterLiteralClass: 289fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul K = CXCursor_CharacterLiteral; 290fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 291fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 292fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::ParenExprClass: 293fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul K = CXCursor_ParenExpr; 294fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 295fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 296fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::UnaryOperatorClass: 297fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul K = CXCursor_UnaryOperator; 298fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 299fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 300fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::CXXNoexceptExprClass: 301fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul K = CXCursor_UnaryExpr; 302fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 303fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 304fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::ArraySubscriptExprClass: 305fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul K = CXCursor_ArraySubscriptExpr; 306fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 307fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 308fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::BinaryOperatorClass: 309fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul K = CXCursor_BinaryOperator; 310fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 311fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 312fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::CompoundAssignOperatorClass: 313fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul K = CXCursor_CompoundAssignOperator; 314fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 315fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 316fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::ConditionalOperatorClass: 317fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul K = CXCursor_ConditionalOperator; 318fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 319fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 320fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::CStyleCastExprClass: 321fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul K = CXCursor_CStyleCastExpr; 322fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 323fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 324fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::CompoundLiteralExprClass: 325fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul K = CXCursor_CompoundLiteralExpr; 326fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 327fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 328fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::InitListExprClass: 329fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul K = CXCursor_InitListExpr; 330fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 331fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 332fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::AddrLabelExprClass: 333df4fd765d5244cc09f18f6b0371909e7bf13be87Brian Paul K = CXCursor_AddrLabelExpr; 334df4fd765d5244cc09f18f6b0371909e7bf13be87Brian Paul break; 335fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 336fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::StmtExprClass: 337fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul K = CXCursor_StmtExpr; 338fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 339fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 340fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::GenericSelectionExprClass: 341fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul K = CXCursor_GenericSelectionExpr; 342fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 343fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 344fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::GNUNullExprClass: 345fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul K = CXCursor_GNUNullExpr; 346fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 347fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 348fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::CXXStaticCastExprClass: 349fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul K = CXCursor_CXXStaticCastExpr; 350fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 351fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 352fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::CXXDynamicCastExprClass: 353fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul K = CXCursor_CXXDynamicCastExpr; 354fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 355fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 356fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::CXXReinterpretCastExprClass: 357fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul K = CXCursor_CXXReinterpretCastExpr; 358fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 359fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 360fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::CXXConstCastExprClass: 361fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul K = CXCursor_CXXConstCastExpr; 362fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 363fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 364fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::CXXFunctionalCastExprClass: 365fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul K = CXCursor_CXXFunctionalCastExpr; 366fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 367fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 368fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::CXXTypeidExprClass: 369fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul K = CXCursor_CXXTypeidExpr; 370fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 371fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 372fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::CXXBoolLiteralExprClass: 373fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul K = CXCursor_CXXBoolLiteralExpr; 374fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 375fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 376fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::CXXNullPtrLiteralExprClass: 377fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul K = CXCursor_CXXNullPtrLiteralExpr; 378fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 379fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 380fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::CXXThisExprClass: 381fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul K = CXCursor_CXXThisExpr; 382fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 383fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 384fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::CXXThrowExprClass: 385fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul K = CXCursor_CXXThrowExpr; 386fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 387fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 388fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::CXXNewExprClass: 389fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul K = CXCursor_CXXNewExpr; 390fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 391fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 392fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::CXXDeleteExprClass: 393fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul K = CXCursor_CXXDeleteExpr; 394fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 395fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 396fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::ObjCStringLiteralClass: 397fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul K = CXCursor_ObjCStringLiteral; 398fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 399fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 400fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::ObjCEncodeExprClass: 401fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul K = CXCursor_ObjCEncodeExpr; 402fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 403fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 404fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::ObjCSelectorExprClass: 405fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul K = CXCursor_ObjCSelectorExpr; 406fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 407fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 408fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::ObjCProtocolExprClass: 409fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul K = CXCursor_ObjCProtocolExpr; 410fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 411fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 412fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::ObjCBoolLiteralExprClass: 413fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul K = CXCursor_ObjCBoolLiteralExpr; 414fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 415fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 416fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::ObjCBridgedCastExprClass: 417fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul K = CXCursor_ObjCBridgedCastExpr; 418fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 419fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 420fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::BlockExprClass: 421fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul K = CXCursor_BlockExpr; 422fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 423fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 424fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::PackExpansionExprClass: 425fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul K = CXCursor_PackExpansionExpr; 426fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 427fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 428fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::SizeOfPackExprClass: 429fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul K = CXCursor_SizeOfPackExpr; 430fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 431fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 432fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::DeclRefExprClass: 433fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::DependentScopeDeclRefExprClass: 434fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::SubstNonTypeTemplateParmExprClass: 435fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::SubstNonTypeTemplateParmPackExprClass: 436fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::FunctionParmPackExprClass: 437fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::UnresolvedLookupExprClass: 438fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul K = CXCursor_DeclRefExpr; 439fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 440fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 441fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::CXXDependentScopeMemberExprClass: 442fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::CXXPseudoDestructorExprClass: 443fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::MemberExprClass: 444fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::ObjCIsaExprClass: 445fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::ObjCIvarRefExprClass: 446fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::ObjCPropertyRefExprClass: 447fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::UnresolvedMemberExprClass: 448fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul K = CXCursor_MemberRefExpr; 449fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 450fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 451fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::CallExprClass: 452fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::CXXOperatorCallExprClass: 453fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::CXXMemberCallExprClass: 454fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::CUDAKernelCallExprClass: 455fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::CXXConstructExprClass: 456fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::CXXTemporaryObjectExprClass: 457fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::CXXUnresolvedConstructExprClass: 458fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::UserDefinedLiteralClass: 459fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul K = CXCursor_CallExpr; 460fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 461fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 462fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::LambdaExprClass: 463fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul K = CXCursor_LambdaExpr; 464fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 465fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 466fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::ObjCMessageExprClass: { 467fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul K = CXCursor_ObjCMessageExpr; 468fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul int SelectorIdIndex = -1; 469fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul // Check if cursor points to a selector id. 470fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul if (RegionOfInterest.isValid() && 471fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul RegionOfInterest.getBegin() == RegionOfInterest.getEnd()) { 472fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul SmallVector<SourceLocation, 16> SelLocs; 473fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul cast<ObjCMessageExpr>(S)->getSelectorLocs(SelLocs); 474fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul SmallVector<SourceLocation, 16>::iterator 475fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul I=std::find(SelLocs.begin(), SelLocs.end(),RegionOfInterest.getBegin()); 476fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul if (I != SelLocs.end()) 477fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul SelectorIdIndex = I - SelLocs.begin(); 478fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 479fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul CXCursor C = { K, 0, { Parent, S, TU } }; 480fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul return getSelectorIdentifierCursor(SelectorIdIndex, C); 481fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 482fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 483fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul case Stmt::MSDependentExistsStmtClass: 484fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul K = CXCursor_UnexposedStmt; 485fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul break; 486fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 487fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 488fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul CXCursor C = { K, 0, { Parent, S, TU } }; 489fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul return C; 490fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul} 491fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 492fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian PaulCXCursor cxcursor::MakeCursorObjCSuperClassRef(ObjCInterfaceDecl *Super, 493fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul SourceLocation Loc, 494fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul CXTranslationUnit TU) { 495fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul assert(Super && TU && "Invalid arguments!"); 496fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul void *RawLoc = reinterpret_cast<void *>(Loc.getRawEncoding()); 497fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul CXCursor C = { CXCursor_ObjCSuperClassRef, 0, { Super, RawLoc, TU } }; 498fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul return C; 499fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul} 500fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 501fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulstd::pair<ObjCInterfaceDecl *, SourceLocation> 502fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulcxcursor::getCursorObjCSuperClassRef(CXCursor C) { 503fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul assert(C.kind == CXCursor_ObjCSuperClassRef); 504fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul return std::make_pair(static_cast<ObjCInterfaceDecl *>(C.data[0]), 505fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul SourceLocation::getFromRawEncoding( 506fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul reinterpret_cast<uintptr_t>(C.data[1]))); 507fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul} 508fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 509fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian PaulCXCursor cxcursor::MakeCursorObjCProtocolRef(const ObjCProtocolDecl *Proto, 510fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul SourceLocation Loc, 511fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul CXTranslationUnit TU) { 512fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul assert(Proto && TU && "Invalid arguments!"); 513fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul void *RawLoc = reinterpret_cast<void *>(Loc.getRawEncoding()); 514fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul CXCursor C = { CXCursor_ObjCProtocolRef, 0, { (void*)Proto, RawLoc, TU } }; 515fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul return C; 516fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul} 517fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 518fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulstd::pair<ObjCProtocolDecl *, SourceLocation> 519fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulcxcursor::getCursorObjCProtocolRef(CXCursor C) { 520fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul assert(C.kind == CXCursor_ObjCProtocolRef); 521fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul return std::make_pair(static_cast<ObjCProtocolDecl *>(C.data[0]), 522fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul SourceLocation::getFromRawEncoding( 523fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul reinterpret_cast<uintptr_t>(C.data[1]))); 524fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul} 525fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 526fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian PaulCXCursor cxcursor::MakeCursorObjCClassRef(const ObjCInterfaceDecl *Class, 527fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul SourceLocation Loc, 528fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul CXTranslationUnit TU) { 529fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul // 'Class' can be null for invalid code. 530fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul if (!Class) 531fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul return MakeCXCursorInvalid(CXCursor_InvalidCode); 532fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul assert(TU && "Invalid arguments!"); 533fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul void *RawLoc = reinterpret_cast<void *>(Loc.getRawEncoding()); 534fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul CXCursor C = { CXCursor_ObjCClassRef, 0, { (void*)Class, RawLoc, TU } }; 535fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul return C; 536fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul} 537fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 538fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulstd::pair<ObjCInterfaceDecl *, SourceLocation> 539fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulcxcursor::getCursorObjCClassRef(CXCursor C) { 540fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul assert(C.kind == CXCursor_ObjCClassRef); 541fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul return std::make_pair(static_cast<ObjCInterfaceDecl *>(C.data[0]), 542fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul SourceLocation::getFromRawEncoding( 543fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul reinterpret_cast<uintptr_t>(C.data[1]))); 544fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul} 545fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 546fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian PaulCXCursor cxcursor::MakeCursorTypeRef(const TypeDecl *Type, SourceLocation Loc, 547fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul CXTranslationUnit TU) { 548fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul assert(Type && TU && "Invalid arguments!"); 549fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul void *RawLoc = reinterpret_cast<void *>(Loc.getRawEncoding()); 550fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul CXCursor C = { CXCursor_TypeRef, 0, { (void*)Type, RawLoc, TU } }; 551fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul return C; 552fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul} 553fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 554fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulstd::pair<TypeDecl *, SourceLocation> 555fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulcxcursor::getCursorTypeRef(CXCursor C) { 556fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul assert(C.kind == CXCursor_TypeRef); 557fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul return std::make_pair(static_cast<TypeDecl *>(C.data[0]), 558fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul SourceLocation::getFromRawEncoding( 559fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul reinterpret_cast<uintptr_t>(C.data[1]))); 560fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul} 561fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 562fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian PaulCXCursor cxcursor::MakeCursorTemplateRef(const TemplateDecl *Template, 563fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul SourceLocation Loc, 564fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul CXTranslationUnit TU) { 565fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul assert(Template && TU && "Invalid arguments!"); 566fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul void *RawLoc = reinterpret_cast<void *>(Loc.getRawEncoding()); 567fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul CXCursor C = { CXCursor_TemplateRef, 0, { (void*)Template, RawLoc, TU } }; 568fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul return C; 569fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul} 570fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 571fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulstd::pair<TemplateDecl *, SourceLocation> 572fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulcxcursor::getCursorTemplateRef(CXCursor C) { 573fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul assert(C.kind == CXCursor_TemplateRef); 574fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul return std::make_pair(static_cast<TemplateDecl *>(C.data[0]), 575fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul SourceLocation::getFromRawEncoding( 576fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul reinterpret_cast<uintptr_t>(C.data[1]))); 577fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul} 578fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 579fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian PaulCXCursor cxcursor::MakeCursorNamespaceRef(const NamedDecl *NS, 580fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul SourceLocation Loc, 581fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul CXTranslationUnit TU) { 582fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 583fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul assert(NS && (isa<NamespaceDecl>(NS) || isa<NamespaceAliasDecl>(NS)) && TU && 584fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul "Invalid arguments!"); 585fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul void *RawLoc = reinterpret_cast<void *>(Loc.getRawEncoding()); 586fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul CXCursor C = { CXCursor_NamespaceRef, 0, { (void*)NS, RawLoc, TU } }; 587fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul return C; 588fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul} 589fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 590fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulstd::pair<NamedDecl *, SourceLocation> 591fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulcxcursor::getCursorNamespaceRef(CXCursor C) { 592fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul assert(C.kind == CXCursor_NamespaceRef); 593fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul return std::make_pair(static_cast<NamedDecl *>(C.data[0]), 594fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul SourceLocation::getFromRawEncoding( 595fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul reinterpret_cast<uintptr_t>(C.data[1]))); 596fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul} 597fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 598fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian PaulCXCursor cxcursor::MakeCursorVariableRef(const VarDecl *Var, SourceLocation Loc, 599fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul CXTranslationUnit TU) { 600fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 601fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul assert(Var && TU && "Invalid arguments!"); 602fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul void *RawLoc = reinterpret_cast<void *>(Loc.getRawEncoding()); 603fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul CXCursor C = { CXCursor_VariableRef, 0, { (void*)Var, RawLoc, TU } }; 604fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul return C; 605fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul} 606fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 607fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulstd::pair<VarDecl *, SourceLocation> 608fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulcxcursor::getCursorVariableRef(CXCursor C) { 609fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul assert(C.kind == CXCursor_VariableRef); 610fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul return std::make_pair(static_cast<VarDecl *>(C.data[0]), 611fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul SourceLocation::getFromRawEncoding( 612fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul reinterpret_cast<uintptr_t>(C.data[1]))); 613fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul} 614fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 615fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian PaulCXCursor cxcursor::MakeCursorMemberRef(const FieldDecl *Field, SourceLocation Loc, 616fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul CXTranslationUnit TU) { 617fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 618fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul assert(Field && TU && "Invalid arguments!"); 619fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul void *RawLoc = reinterpret_cast<void *>(Loc.getRawEncoding()); 620fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul CXCursor C = { CXCursor_MemberRef, 0, { (void*)Field, RawLoc, TU } }; 621fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul return C; 622fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul} 623fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 624fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulstd::pair<FieldDecl *, SourceLocation> 625fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulcxcursor::getCursorMemberRef(CXCursor C) { 626fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul assert(C.kind == CXCursor_MemberRef); 627fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul return std::make_pair(static_cast<FieldDecl *>(C.data[0]), 628fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul SourceLocation::getFromRawEncoding( 629fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul reinterpret_cast<uintptr_t>(C.data[1]))); 630fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul} 631fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 632fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian PaulCXCursor cxcursor::MakeCursorCXXBaseSpecifier(const CXXBaseSpecifier *B, 633fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul CXTranslationUnit TU){ 634fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul CXCursor C = { CXCursor_CXXBaseSpecifier, 0, { (void*)B, 0, TU } }; 635fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul return C; 636fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul} 637fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 638fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian PaulCXXBaseSpecifier *cxcursor::getCursorCXXBaseSpecifier(CXCursor C) { 639fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul assert(C.kind == CXCursor_CXXBaseSpecifier); 640fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul return static_cast<CXXBaseSpecifier*>(C.data[0]); 641a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul} 642a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul 643a8b07a539b42b04111f48aa145bc3b2633fd5387Brian PaulCXCursor cxcursor::MakePreprocessingDirectiveCursor(SourceRange Range, 644a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul CXTranslationUnit TU) { 645a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul CXCursor C = { CXCursor_PreprocessingDirective, 0, 646a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul { reinterpret_cast<void *>(Range.getBegin().getRawEncoding()), 647a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul reinterpret_cast<void *>(Range.getEnd().getRawEncoding()), 648a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul TU } 649a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul }; 650a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul return C; 651a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul} 652a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul 653a8b07a539b42b04111f48aa145bc3b2633fd5387Brian PaulSourceRange cxcursor::getCursorPreprocessingDirective(CXCursor C) { 654a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul assert(C.kind == CXCursor_PreprocessingDirective); 655a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul SourceRange Range = SourceRange(SourceLocation::getFromRawEncoding( 656a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul reinterpret_cast<uintptr_t> (C.data[0])), 657a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul SourceLocation::getFromRawEncoding( 658a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul reinterpret_cast<uintptr_t> (C.data[1]))); 659a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul ASTUnit *TU = getCursorASTUnit(C); 660a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul return TU->mapRangeFromPreamble(Range); 661a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul} 662a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul 663a8b07a539b42b04111f48aa145bc3b2633fd5387Brian PaulCXCursor cxcursor::MakeMacroDefinitionCursor(MacroDefinition *MI, 664a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul CXTranslationUnit TU) { 665a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul CXCursor C = { CXCursor_MacroDefinition, 0, { MI, 0, TU } }; 666a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul return C; 667a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul} 668a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul 669a8b07a539b42b04111f48aa145bc3b2633fd5387Brian PaulMacroDefinition *cxcursor::getCursorMacroDefinition(CXCursor C) { 670a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul assert(C.kind == CXCursor_MacroDefinition); 671a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul return static_cast<MacroDefinition *>(C.data[0]); 672a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul} 673a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul 674a8b07a539b42b04111f48aa145bc3b2633fd5387Brian PaulCXCursor cxcursor::MakeMacroExpansionCursor(MacroExpansion *MI, 675a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul CXTranslationUnit TU) { 676a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul CXCursor C = { CXCursor_MacroExpansion, 0, { MI, 0, TU } }; 677a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul return C; 678a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul} 679a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul 680a8b07a539b42b04111f48aa145bc3b2633fd5387Brian PaulCXCursor cxcursor::MakeMacroExpansionCursor(MacroDefinition *MI, 681fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul SourceLocation Loc, 682fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul CXTranslationUnit TU) { 683fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul assert(Loc.isValid()); 684fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul CXCursor C = { CXCursor_MacroExpansion, 0, { MI, Loc.getPtrEncoding(), TU } }; 685fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul return C; 686fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul} 687fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 688fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulconst IdentifierInfo *cxcursor::MacroExpansionCursor::getName() const { 689fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul if (isPseudo()) 690fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul return getAsMacroDefinition()->getName(); 691fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul return getAsMacroExpansion()->getName(); 692fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul} 693fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian PaulMacroDefinition *cxcursor::MacroExpansionCursor::getDefinition() const { 694fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul if (isPseudo()) 695fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul return getAsMacroDefinition(); 696fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul return getAsMacroExpansion()->getDefinition(); 697fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul} 698fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian PaulSourceRange cxcursor::MacroExpansionCursor::getSourceRange() const { 699fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul if (isPseudo()) 700fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul return getPseudoLoc(); 701fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul return getAsMacroExpansion()->getSourceRange(); 702fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul} 703fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 704fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian PaulCXCursor cxcursor::MakeInclusionDirectiveCursor(InclusionDirective *ID, 705fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul CXTranslationUnit TU) { 706fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul CXCursor C = { CXCursor_InclusionDirective, 0, { ID, 0, TU } }; 707fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul return C; 708fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul} 709fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 710fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian PaulInclusionDirective *cxcursor::getCursorInclusionDirective(CXCursor C) { 711fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul assert(C.kind == CXCursor_InclusionDirective); 712fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul return static_cast<InclusionDirective *>(C.data[0]); 713fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul} 714fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 715fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian PaulCXCursor cxcursor::MakeCursorLabelRef(LabelStmt *Label, SourceLocation Loc, 716fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul CXTranslationUnit TU) { 717fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 718fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul assert(Label && TU && "Invalid arguments!"); 719fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul void *RawLoc = reinterpret_cast<void *>(Loc.getRawEncoding()); 720fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul CXCursor C = { CXCursor_LabelRef, 0, { Label, RawLoc, TU } }; 721a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul return C; 722a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul} 723a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul 724a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paulstd::pair<LabelStmt*, SourceLocation> 725afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgcxcursor::getCursorLabelRef(CXCursor C) { 726fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul assert(C.kind == CXCursor_LabelRef); 727fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul return std::make_pair(static_cast<LabelStmt *>(C.data[0]), 728fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul SourceLocation::getFromRawEncoding( 729fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul reinterpret_cast<uintptr_t>(C.data[1]))); 730fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul} 731fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 732fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian PaulCXCursor cxcursor::MakeCursorOverloadedDeclRef(OverloadExpr *E, 733fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul CXTranslationUnit TU) { 734fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul assert(E && TU && "Invalid arguments!"); 735fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul OverloadedDeclRefStorage Storage(E); 736fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul void *RawLoc = reinterpret_cast<void *>(E->getNameLoc().getRawEncoding()); 737fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul CXCursor C = { 738fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul CXCursor_OverloadedDeclRef, 0, 739fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul { Storage.getOpaqueValue(), RawLoc, TU } 740fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul }; 741fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul return C; 742fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul} 743fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 744fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian PaulCXCursor cxcursor::MakeCursorOverloadedDeclRef(Decl *D, 745fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul SourceLocation Loc, 746fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul CXTranslationUnit TU) { 747fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul assert(D && TU && "Invalid arguments!"); 748fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul void *RawLoc = reinterpret_cast<void *>(Loc.getRawEncoding()); 749fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul OverloadedDeclRefStorage Storage(D); 750fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul CXCursor C = { 751fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul CXCursor_OverloadedDeclRef, 0, 752fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul { Storage.getOpaqueValue(), RawLoc, TU } 7533db088f7d792021c8ed628a776355fc315a479a9Brian Paul }; 7543db088f7d792021c8ed628a776355fc315a479a9Brian Paul return C; 7553db088f7d792021c8ed628a776355fc315a479a9Brian Paul} 7563db088f7d792021c8ed628a776355fc315a479a9Brian Paul 7573db088f7d792021c8ed628a776355fc315a479a9Brian PaulCXCursor cxcursor::MakeCursorOverloadedDeclRef(TemplateName Name, 7583db088f7d792021c8ed628a776355fc315a479a9Brian Paul SourceLocation Loc, 759a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul CXTranslationUnit TU) { 760a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul assert(Name.getAsOverloadedTemplate() && TU && "Invalid arguments!"); 761a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul void *RawLoc = reinterpret_cast<void *>(Loc.getRawEncoding()); 762a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul OverloadedDeclRefStorage Storage(Name.getAsOverloadedTemplate()); 763a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul CXCursor C = { 764a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul CXCursor_OverloadedDeclRef, 0, 765a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul { Storage.getOpaqueValue(), RawLoc, TU } 766a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul }; 767a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul return C; 768a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul} 7693db088f7d792021c8ed628a776355fc315a479a9Brian Paul 770fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulstd::pair<cxcursor::OverloadedDeclRefStorage, SourceLocation> 771afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgcxcursor::getCursorOverloadedDeclRef(CXCursor C) { 772a13df148df3b663fe5ccd9a2dce1925a9cf84093Brian Paul assert(C.kind == CXCursor_OverloadedDeclRef); 773afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return std::make_pair(OverloadedDeclRefStorage::getFromOpaqueValue(C.data[0]), 774fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul SourceLocation::getFromRawEncoding( 775fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul reinterpret_cast<uintptr_t>(C.data[1]))); 776fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul} 777fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 778fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian PaulDecl *cxcursor::getCursorDecl(CXCursor Cursor) { 779fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul return (Decl *)Cursor.data[0]; 780fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul} 781fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 782fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian PaulExpr *cxcursor::getCursorExpr(CXCursor Cursor) { 783fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul return dyn_cast_or_null<Expr>(getCursorStmt(Cursor)); 784fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul} 785fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 786fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian PaulStmt *cxcursor::getCursorStmt(CXCursor Cursor) { 787fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul if (Cursor.kind == CXCursor_ObjCSuperClassRef || 788fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul Cursor.kind == CXCursor_ObjCProtocolRef || 789fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul Cursor.kind == CXCursor_ObjCClassRef) 790fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul return 0; 791fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 792fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul return (Stmt *)Cursor.data[1]; 793fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul} 794fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 795fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian PaulAttr *cxcursor::getCursorAttr(CXCursor Cursor) { 796fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul return (Attr *)Cursor.data[1]; 797fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul} 798fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 799fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian PaulDecl *cxcursor::getCursorParentDecl(CXCursor Cursor) { 800fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul return (Decl *)Cursor.data[0]; 801fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul} 802fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 803fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian PaulASTContext &cxcursor::getCursorContext(CXCursor Cursor) { 804fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul return getCursorASTUnit(Cursor)->getASTContext(); 805fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul} 806fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 807fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian PaulASTUnit *cxcursor::getCursorASTUnit(CXCursor Cursor) { 808fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul CXTranslationUnit TU = getCursorTU(Cursor); 809fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul if (!TU) 810fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul return 0; 811fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul return static_cast<ASTUnit *>(TU->TUData); 812fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul} 813fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 814fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian PaulCXTranslationUnit cxcursor::getCursorTU(CXCursor Cursor) { 815fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul return static_cast<CXTranslationUnit>(Cursor.data[2]); 816fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul} 817fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 818fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulvoid cxcursor::getOverriddenCursors(CXCursor cursor, 819fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul SmallVectorImpl<CXCursor> &overridden) { 820fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul assert(clang_isDeclaration(cursor.kind)); 821fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul const NamedDecl *D = dyn_cast_or_null<NamedDecl>(getCursorDecl(cursor)); 822fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul if (!D) 823fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul return; 824fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 825fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul CXTranslationUnit TU = getCursorTU(cursor); 826fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul SmallVector<const NamedDecl *, 8> OverDecls; 827fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul D->getASTContext().getOverriddenMethods(D, OverDecls); 828fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 829fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul for (SmallVector<const NamedDecl *, 8>::iterator 830fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul I = OverDecls.begin(), E = OverDecls.end(); I != E; ++I) { 831fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul overridden.push_back(MakeCXCursor(const_cast<NamedDecl*>(*I), TU)); 832fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 833fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul} 834fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 835fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulstd::pair<int, SourceLocation> 836fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulcxcursor::getSelectorIdentifierIndexAndLoc(CXCursor cursor) { 837fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul if (cursor.kind == CXCursor_ObjCMessageExpr) { 838fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul if (cursor.xdata != -1) 839fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul return std::make_pair(cursor.xdata, 840fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul cast<ObjCMessageExpr>(getCursorExpr(cursor)) 841fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul ->getSelectorLoc(cursor.xdata)); 842fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } else if (cursor.kind == CXCursor_ObjCClassMethodDecl || 843fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul cursor.kind == CXCursor_ObjCInstanceMethodDecl) { 844fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul if (cursor.xdata != -1) 845fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul return std::make_pair(cursor.xdata, 846fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul cast<ObjCMethodDecl>(getCursorDecl(cursor)) 847fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul ->getSelectorLoc(cursor.xdata)); 848fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul } 849a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul 850a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul return std::make_pair(-1, SourceLocation()); 851a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul} 852a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul 853a8b07a539b42b04111f48aa145bc3b2633fd5387Brian PaulCXCursor cxcursor::getSelectorIdentifierCursor(int SelIdx, CXCursor cursor) { 854a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul CXCursor newCursor = cursor; 855a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul 856a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul if (cursor.kind == CXCursor_ObjCMessageExpr) { 857a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul if (SelIdx == -1 || 858a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul unsigned(SelIdx) >= cast<ObjCMessageExpr>(getCursorExpr(cursor)) 859a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul ->getNumSelectorLocs()) 860a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul newCursor.xdata = -1; 861a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul else 862a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul newCursor.xdata = SelIdx; 863a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul } else if (cursor.kind == CXCursor_ObjCClassMethodDecl || 864a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul cursor.kind == CXCursor_ObjCInstanceMethodDecl) { 865a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul if (SelIdx == -1 || 866a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul unsigned(SelIdx) >= cast<ObjCMethodDecl>(getCursorDecl(cursor)) 867a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul ->getNumSelectorLocs()) 868a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul newCursor.xdata = -1; 869a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul else 870a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul newCursor.xdata = SelIdx; 871a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul } 872a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul 873a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul return newCursor; 874a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul} 875a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul 876a8b07a539b42b04111f48aa145bc3b2633fd5387Brian PaulCXCursor cxcursor::getTypeRefCursor(CXCursor cursor) { 877a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul if (cursor.kind != CXCursor_CallExpr) 878a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul return cursor; 879a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul 880a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul if (cursor.xdata == 0) 881a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul return cursor; 882a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul 883a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul Expr *E = getCursorExpr(cursor); 884a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul TypeSourceInfo *Type = 0; 885a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul if (CXXUnresolvedConstructExpr * 886a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul UnCtor = dyn_cast<CXXUnresolvedConstructExpr>(E)) { 887a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul Type = UnCtor->getTypeSourceInfo(); 888a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul } else if (CXXTemporaryObjectExpr *Tmp = dyn_cast<CXXTemporaryObjectExpr>(E)){ 889a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul Type = Tmp->getTypeSourceInfo(); 890a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul } 891a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul 892a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul if (!Type) 893a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul return cursor; 894a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul 895a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul CXTranslationUnit TU = getCursorTU(cursor); 896a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul QualType Ty = Type->getType(); 897a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul TypeLoc TL = Type->getTypeLoc(); 898a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul SourceLocation Loc = TL.getBeginLoc(); 899a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul 900a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul if (const ElaboratedType *ElabT = Ty->getAs<ElaboratedType>()) { 901a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul Ty = ElabT->getNamedType(); 902a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul ElaboratedTypeLoc ElabTL = cast<ElaboratedTypeLoc>(TL); 903a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul Loc = ElabTL.getNamedTypeLoc().getBeginLoc(); 904a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul } 905a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul 906a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul if (const TypedefType *Typedef = Ty->getAs<TypedefType>()) 907a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul return MakeCursorTypeRef(Typedef->getDecl(), Loc, TU); 908a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul if (const TagType *Tag = Ty->getAs<TagType>()) 909a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul return MakeCursorTypeRef(Tag->getDecl(), Loc, TU); 910a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul if (const TemplateTypeParmType *TemplP = Ty->getAs<TemplateTypeParmType>()) 911a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul return MakeCursorTypeRef(TemplP->getDecl(), Loc, TU); 912a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul 913a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul return cursor; 914a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul} 915a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul 916a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paulbool cxcursor::operator==(CXCursor X, CXCursor Y) { 917a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul return X.kind == Y.kind && X.data[0] == Y.data[0] && X.data[1] == Y.data[1] && 918a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul X.data[2] == Y.data[2]; 919a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul} 920a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul 921a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul// FIXME: Remove once we can model DeclGroups and their appropriate ranges 922a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul// properly in the ASTs. 923a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paulbool cxcursor::isFirstInDeclGroup(CXCursor C) { 924a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul assert(clang_isDeclaration(C.kind)); 925a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul return ((uintptr_t) (C.data[1])) != 0; 926a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul} 927a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul 928a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul//===----------------------------------------------------------------------===// 929a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul// libclang CXCursor APIs 930a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul//===----------------------------------------------------------------------===// 931a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul 932a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paulextern "C" { 933a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul 934a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paulint clang_Cursor_isNull(CXCursor cursor) { 935a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul return clang_equalCursors(cursor, clang_getNullCursor()); 936a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul} 937a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul 938a8b07a539b42b04111f48aa145bc3b2633fd5387Brian PaulCXTranslationUnit clang_Cursor_getTranslationUnit(CXCursor cursor) { 939a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul return getCursorTU(cursor); 940a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul} 941a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul 942a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paulint clang_Cursor_getNumArguments(CXCursor C) { 943a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul if (clang_isDeclaration(C.kind)) { 944a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul Decl *D = cxcursor::getCursorDecl(C); 945a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul if (const ObjCMethodDecl *MD = dyn_cast_or_null<ObjCMethodDecl>(D)) 946a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul return MD->param_size(); 947a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul if (const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D)) 948a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul return FD->param_size(); 949a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul } 950a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul 951a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul return -1; 952a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul} 953a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul 954a8b07a539b42b04111f48aa145bc3b2633fd5387Brian PaulCXCursor clang_Cursor_getArgument(CXCursor C, unsigned i) { 955a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul if (clang_isDeclaration(C.kind)) { 956a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul Decl *D = cxcursor::getCursorDecl(C); 957afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (ObjCMethodDecl *MD = dyn_cast_or_null<ObjCMethodDecl>(D)) { 958afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (i < MD->param_size()) 959afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return cxcursor::MakeCXCursor(MD->param_begin()[i], 960afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg cxcursor::getCursorTU(C)); 961afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } else if (FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D)) { 962afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (i < FD->param_size()) 963afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return cxcursor::MakeCXCursor(FD->param_begin()[i], 964afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg cxcursor::getCursorTU(C)); 965afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 966afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 967afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 968afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return clang_getNullCursor(); 969afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 970afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 971a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul} // end: extern "C" 972afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 973afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg//===----------------------------------------------------------------------===// 974afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg// CXCursorSet. 975afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg//===----------------------------------------------------------------------===// 976afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 977a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paultypedef llvm::DenseMap<CXCursor, unsigned> CXCursorSet_Impl; 978afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 979afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic inline CXCursorSet packCXCursorSet(CXCursorSet_Impl *setImpl) { 980afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return (CXCursorSet) setImpl; 981afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 982afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic inline CXCursorSet_Impl *unpackCXCursorSet(CXCursorSet set) { 983afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return (CXCursorSet_Impl*) set; 984afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 985afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgnamespace llvm { 986afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgtemplate<> struct DenseMapInfo<CXCursor> { 987afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgpublic: 988afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg static inline CXCursor getEmptyKey() { 989afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return MakeCXCursorInvalid(CXCursor_InvalidFile); 990afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 991afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg static inline CXCursor getTombstoneKey() { 992afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return MakeCXCursorInvalid(CXCursor_NoDeclFound); 993afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 994afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg static inline unsigned getHashValue(const CXCursor &cursor) { 995afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return llvm::DenseMapInfo<std::pair<void*,void*> > 996afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ::getHashValue(std::make_pair(cursor.data[0], cursor.data[1])); 997afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 998afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg static inline bool isEqual(const CXCursor &x, const CXCursor &y) { 999afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return x.kind == y.kind && 1000afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg x.data[0] == y.data[0] && 1001afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg x.data[1] == y.data[1]; 1002afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1003afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}; 1004afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1005afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1006afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgextern "C" { 1007a8b07a539b42b04111f48aa145bc3b2633fd5387Brian PaulCXCursorSet clang_createCXCursorSet() { 1008afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return packCXCursorSet(new CXCursorSet_Impl()); 1009afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1010afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1011afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgvoid clang_disposeCXCursorSet(CXCursorSet set) { 1012afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg delete unpackCXCursorSet(set); 1013afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1014afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1015afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgunsigned clang_CXCursorSet_contains(CXCursorSet set, CXCursor cursor) { 1016afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg CXCursorSet_Impl *setImpl = unpackCXCursorSet(set); 1017afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (!setImpl) 1018afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return 0; 1019afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return setImpl->find(cursor) == setImpl->end(); 1020afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1021afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1022afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgunsigned clang_CXCursorSet_insert(CXCursorSet set, CXCursor cursor) { 1023afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg // Do not insert invalid cursors into the set. 1024afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (cursor.kind >= CXCursor_FirstInvalid && 1025afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg cursor.kind <= CXCursor_LastInvalid) 1026afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return 1; 1027afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1028afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg CXCursorSet_Impl *setImpl = unpackCXCursorSet(set); 1029afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (!setImpl) 1030afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return 1; 1031afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg unsigned &entry = (*setImpl)[cursor]; 1032afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg unsigned flag = entry == 0 ? 1 : 0; 1033afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg entry = 1; 1034afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return flag; 1035afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1036afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1037afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgCXCompletionString clang_getCursorCompletionString(CXCursor cursor) { 1038afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg enum CXCursorKind kind = clang_getCursorKind(cursor); 1039afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (clang_isDeclaration(kind)) { 1040afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg Decl *decl = getCursorDecl(cursor); 1041afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (NamedDecl *namedDecl = dyn_cast_or_null<NamedDecl>(decl)) { 1042afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ASTUnit *unit = getCursorASTUnit(cursor); 1043afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg CodeCompletionResult Result(namedDecl); 1044afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg CodeCompletionString *String 1045afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg = Result.CreateCodeCompletionString(unit->getASTContext(), 1046afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg unit->getPreprocessor(), 1047afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg unit->getCodeCompletionTUInfo().getAllocator(), 1048afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg unit->getCodeCompletionTUInfo(), 1049afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg true); 1050afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return String; 1051afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1052afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1053afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else if (kind == CXCursor_MacroDefinition) { 1054afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg MacroDefinition *definition = getCursorMacroDefinition(cursor); 1055afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg const IdentifierInfo *MacroInfo = definition->getName(); 1056afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ASTUnit *unit = getCursorASTUnit(cursor); 1057afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg CodeCompletionResult Result(const_cast<IdentifierInfo *>(MacroInfo)); 1058afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg CodeCompletionString *String 1059afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg = Result.CreateCodeCompletionString(unit->getASTContext(), 1060afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg unit->getPreprocessor(), 1061afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg unit->getCodeCompletionTUInfo().getAllocator(), 1062afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg unit->getCodeCompletionTUInfo(), 1063afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg false); 1064afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return String; 1065afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1066afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return NULL; 1067afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1068afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} // end: extern C. 1069afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1070afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgnamespace { 1071afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg struct OverridenCursorsPool { 1072afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg typedef llvm::SmallVector<CXCursor, 2> CursorVec; 1073afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg std::vector<CursorVec*> AllCursors; 1074afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg std::vector<CursorVec*> AvailableCursors; 1075afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1076afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ~OverridenCursorsPool() { 1077afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (std::vector<CursorVec*>::iterator I = AllCursors.begin(), 1078afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg E = AllCursors.end(); I != E; ++I) { 1079a8b07a539b42b04111f48aa145bc3b2633fd5387Brian Paul delete *I; 1080afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1081afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1082afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg }; 1083afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1084afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1085afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgvoid *cxcursor::createOverridenCXCursorsPool() { 1086afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return new OverridenCursorsPool(); 1087afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1088afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1089afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgvoid cxcursor::disposeOverridenCXCursorsPool(void *pool) { 1090afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg delete static_cast<OverridenCursorsPool*>(pool); 1091afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1092afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1093afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgextern "C" { 1094afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgvoid clang_getOverriddenCursors(CXCursor cursor, 1095afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg CXCursor **overridden, 1096afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg unsigned *num_overridden) { 1097afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (overridden) 1098afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *overridden = 0; 1099afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (num_overridden) 1100afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *num_overridden = 0; 1101afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1102afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg CXTranslationUnit TU = cxcursor::getCursorTU(cursor); 1103afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1104afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (!overridden || !num_overridden || !TU) 1105afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 1106afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1107afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (!clang_isDeclaration(cursor.kind)) 1108afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 1109afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1110afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg OverridenCursorsPool &pool = 1111afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *static_cast<OverridenCursorsPool*>(TU->OverridenCursorsPool); 1112afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1113afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg OverridenCursorsPool::CursorVec *Vec = 0; 1114afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1115afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (!pool.AvailableCursors.empty()) { 1116afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg Vec = pool.AvailableCursors.back(); 1117afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg pool.AvailableCursors.pop_back(); 1118afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1119afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 1120afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg Vec = new OverridenCursorsPool::CursorVec(); 1121afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg pool.AllCursors.push_back(Vec); 1122afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1123afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1124afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg // Clear out the vector, but don't free the memory contents. This 1125afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg // reduces malloc() traffic. 1126afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg Vec->clear(); 1127afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1128afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg // Use the first entry to contain a back reference to the vector. 1129afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg // This is a complete hack. 1130afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg CXCursor backRefCursor = MakeCXCursorInvalid(CXCursor_InvalidFile, TU); 1131afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg backRefCursor.data[0] = Vec; 1132afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg assert(cxcursor::getCursorTU(backRefCursor) == TU); 1133afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg Vec->push_back(backRefCursor); 1134afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1135afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg // Get the overriden cursors. 1136afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg cxcursor::getOverriddenCursors(cursor, *Vec); 1137afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1138afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg // Did we get any overriden cursors? If not, return Vec to the pool 1139afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg // of available cursor vectors. 1140afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (Vec->size() == 1) { 1141afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg pool.AvailableCursors.push_back(Vec); 1142afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 1143afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1144afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1145afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg // Now tell the caller about the overriden cursors. 1146afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg assert(Vec->size() > 1); 1147afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *overridden = &((*Vec)[1]); 1148afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *num_overridden = Vec->size() - 1; 1149afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1150afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1151afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgvoid clang_disposeOverriddenCursors(CXCursor *overridden) { 1152afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (!overridden) 1153afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 1154afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1155afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg // Use pointer arithmetic to get back the first faux entry 1156afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg // which has a back-reference to the TU and the vector. 1157afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg --overridden; 1158afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg OverridenCursorsPool::CursorVec *Vec = 1159afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg static_cast<OverridenCursorsPool::CursorVec*>(overridden->data[0]); 1160afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg CXTranslationUnit TU = getCursorTU(*overridden); 1161afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1162afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg assert(Vec && TU); 1163afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1164afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg OverridenCursorsPool &pool = 1165afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *static_cast<OverridenCursorsPool*>(TU->OverridenCursorsPool); 1166afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1167afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg pool.AvailableCursors.push_back(Vec); 1168afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1169afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1170afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgint clang_Cursor_isDynamicCall(CXCursor C) { 1171afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg const Expr *E = 0; 1172afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (clang_isExpression(C.kind)) 1173afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg E = getCursorExpr(C); 1174afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (!E) 1175afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return 0; 1176afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1177afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (const ObjCMessageExpr *MsgE = dyn_cast<ObjCMessageExpr>(E)) 1178afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return MsgE->getReceiverKind() == ObjCMessageExpr::Instance; 1179afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1180afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg const MemberExpr *ME = 0; 1181afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (isa<MemberExpr>(E)) 1182afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ME = cast<MemberExpr>(E); 1183afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else if (const CallExpr *CE = dyn_cast<CallExpr>(E)) 1184afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ME = dyn_cast_or_null<MemberExpr>(CE->getCallee()); 1185afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1186afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (ME) { 1187afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (const CXXMethodDecl * 1188afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg MD = dyn_cast_or_null<CXXMethodDecl>(ME->getMemberDecl())) 1189afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return MD->isVirtual() && !ME->hasQualifier(); 1190afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1191afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1192afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return 0; 1193afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1194afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1195afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgCXType clang_Cursor_getReceiverType(CXCursor C) { 1196afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg CXTranslationUnit TU = cxcursor::getCursorTU(C); 1197afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg const Expr *E = 0; 1198afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (clang_isExpression(C.kind)) 1199afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg E = getCursorExpr(C); 1200afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1201afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (const ObjCMessageExpr *MsgE = dyn_cast_or_null<ObjCMessageExpr>(E)) 1202afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return cxtype::MakeCXType(MsgE->getReceiverType(), TU); 1203afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1204afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return cxtype::MakeCXType(QualType(), TU); 1205afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1206afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1207afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} // end: extern "C" 1208afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg