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