CXCursor.cpp revision e4a990f34904eb572c8d6aa1deef19465214359c
124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown//===- CXCursor.cpp - Routines for manipulating CXCursors -----------------===//
224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown//
324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown//                     The LLVM Compiler Infrastructure
424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown//
524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown// This file is distributed under the University of Illinois Open Source
624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown// License. See LICENSE.TXT for details.
724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown//
824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown//===----------------------------------------------------------------------===//
924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown//
1024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown// This file defines routines for manipulating CXCursors. It should be the
1124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown// only file that has internal knowledge of the encoding of the data in
1224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown// CXCursor.
1324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown//
1424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown//===----------------------------------------------------------------------===//
1524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
1624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown#include "CXTranslationUnit.h"
1724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown#include "CXCursor.h"
1824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown#include "CXType.h"
1924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown#include "CXString.h"
2085d539daa11f9f7bd61ecb8ebb4d43536c02a736RoboErik#include "clang/Frontend/ASTUnit.h"
2185d539daa11f9f7bd61ecb8ebb4d43536c02a736RoboErik#include "clang/AST/Decl.h"
225c9469e010106467791b47b0fa83efda84491a21RoboErik#include "clang/AST/DeclCXX.h"
2324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown#include "clang/AST/DeclObjC.h"
2424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown#include "clang/AST/DeclTemplate.h"
2524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown#include "clang/AST/Expr.h"
2624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown#include "clang/AST/ExprCXX.h"
2724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown#include "clang/AST/ExprObjC.h"
28e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik#include "clang-c/Index.h"
29e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik#include "llvm/Support/ErrorHandling.h"
30e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik
3124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brownusing namespace clang;
3224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brownusing namespace cxcursor;
33e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik
34e49860b0f76d8336c1d41831ed370b0ff94278efRoboErikCXCursor cxcursor::MakeCXCursorInvalid(CXCursorKind K, CXTranslationUnit TU) {
3524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  assert(K >= CXCursor_FirstInvalid && K <= CXCursor_LastInvalid);
36e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik  CXCursor C = { K, 0, { 0, 0, TU } };
37ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik  return C;
3824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown}
3924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
4024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brownstatic CXCursorKind GetCursorKind(const Attr *A) {
4124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  assert(A && "Invalid arguments!");
42e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik  switch (A->getKind()) {
43e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik    default: break;
4424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    case attr::IBAction: return CXCursor_IBActionAttr;
45e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik    case attr::IBOutlet: return CXCursor_IBOutletAttr;
46ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik    case attr::IBOutletCollection: return CXCursor_IBOutletCollectionAttr;
47ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik    case attr::Final: return CXCursor_CXXFinalAttr;
48ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik    case attr::Override: return CXCursor_CXXOverrideAttr;
4924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    case attr::Annotate: return CXCursor_AnnotateAttr;
5024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    case attr::AsmLabel: return CXCursor_AsmLabelAttr;
5124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  }
5224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
5324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  return CXCursor_UnexposedAttr;
5424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown}
5524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
5624fa6c0dd42df057729e1a258388183f94da7f82Jeff BrownCXCursor cxcursor::MakeCXCursor(const Attr *A, Decl *Parent,
5724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown                                CXTranslationUnit TU) {
5824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  assert(A && Parent && TU && "Invalid arguments!");
5924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  CXCursor C = { GetCursorKind(A), 0, { Parent, (void*)A, TU } };
6024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  return C;
6124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown}
6224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
638af0092e2d7409e79779af396d63ca4146f1fb21RoboErikCXCursor cxcursor::MakeCXCursor(Decl *D, CXTranslationUnit TU,
6424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown                                SourceRange RegionOfInterest,
6524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown                                bool FirstInDeclGroup) {
6624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  assert(D && TU && "Invalid arguments!");
6724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
685c9469e010106467791b47b0fa83efda84491a21RoboErik  CXCursorKind K = getCursorKindForDecl(D);
695c9469e010106467791b47b0fa83efda84491a21RoboErik
7024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  if (K == CXCursor_ObjCClassMethodDecl ||
718af0092e2d7409e79779af396d63ca4146f1fb21RoboErik      K == CXCursor_ObjCInstanceMethodDecl) {
728af0092e2d7409e79779af396d63ca4146f1fb21RoboErik    int SelectorIdIndex = -1;
738af0092e2d7409e79779af396d63ca4146f1fb21RoboErik    // Check if cursor points to a selector id.
7424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    if (RegionOfInterest.isValid() &&
7524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        RegionOfInterest.getBegin() == RegionOfInterest.getEnd()) {
7624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown      SmallVector<SourceLocation, 16> SelLocs;
77ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik      cast<ObjCMethodDecl>(D)->getSelectorLocs(SelLocs);
785c9469e010106467791b47b0fa83efda84491a21RoboErik      SmallVector<SourceLocation, 16>::iterator
795c9469e010106467791b47b0fa83efda84491a21RoboErik        I=std::find(SelLocs.begin(), SelLocs.end(),RegionOfInterest.getBegin());
8024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown      if (I != SelLocs.end())
8124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        SelectorIdIndex = I - SelLocs.begin();
8224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    }
8324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    CXCursor C = { K, SelectorIdIndex,
8424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown                   { D, (void*)(intptr_t) (FirstInDeclGroup ? 1 : 0), TU }};
8524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    return C;
8624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  }
8724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
8824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  CXCursor C = { K, 0, { D, (void*)(intptr_t) (FirstInDeclGroup ? 1 : 0), TU }};
898af0092e2d7409e79779af396d63ca4146f1fb21RoboErik  return C;
9024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown}
9124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
9224fa6c0dd42df057729e1a258388183f94da7f82Jeff BrownCXCursor cxcursor::MakeCXCursor(Stmt *S, Decl *Parent, CXTranslationUnit TU,
9324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown                                SourceRange RegionOfInterest) {
9424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  assert(S && TU && "Invalid arguments!");
9524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  CXCursorKind K = CXCursor_NotImplemented;
9624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
9724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  switch (S->getStmtClass()) {
985c9469e010106467791b47b0fa83efda84491a21RoboErik  case Stmt::NoStmtClass:
995c9469e010106467791b47b0fa83efda84491a21RoboErik    break;
1005c9469e010106467791b47b0fa83efda84491a21RoboErik
1015c9469e010106467791b47b0fa83efda84491a21RoboErik  case Stmt::CaseStmtClass:
1025c9469e010106467791b47b0fa83efda84491a21RoboErik    K = CXCursor_CaseStmt;
1035c9469e010106467791b47b0fa83efda84491a21RoboErik    break;
1045c9469e010106467791b47b0fa83efda84491a21RoboErik
10524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  case Stmt::DefaultStmtClass:
1065c9469e010106467791b47b0fa83efda84491a21RoboErik    K = CXCursor_DefaultStmt;
1075c9469e010106467791b47b0fa83efda84491a21RoboErik    break;
10824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
10924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  case Stmt::IfStmtClass:
11024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    K = CXCursor_IfStmt;
11124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    break;
11224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
11324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  case Stmt::SwitchStmtClass:
11424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    K = CXCursor_SwitchStmt;
11524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    break;
11624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
1175c9469e010106467791b47b0fa83efda84491a21RoboErik  case Stmt::WhileStmtClass:
11824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    K = CXCursor_WhileStmt;
119e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik    break;
12024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
121ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik  case Stmt::DoStmtClass:
12224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    K = CXCursor_DoStmt;
12324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    break;
124ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik
125bbcdf78e350d58ecd6baa75e282d4908d3129fe2RoboErik  case Stmt::ForStmtClass:
126ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik    K = CXCursor_ForStmt;
127bbcdf78e350d58ecd6baa75e282d4908d3129fe2RoboErik    break;
128bbcdf78e350d58ecd6baa75e282d4908d3129fe2RoboErik
12924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  case Stmt::GotoStmtClass:
13024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    K = CXCursor_GotoStmt;
13124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    break;
13224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
13324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  case Stmt::IndirectGotoStmtClass:
13424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    K = CXCursor_IndirectGotoStmt;
13524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    break;
1368af0092e2d7409e79779af396d63ca4146f1fb21RoboErik
1378af0092e2d7409e79779af396d63ca4146f1fb21RoboErik  case Stmt::ContinueStmtClass:
13824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    K = CXCursor_ContinueStmt;
13924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    break;
14024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
1418af0092e2d7409e79779af396d63ca4146f1fb21RoboErik  case Stmt::BreakStmtClass:
1428af0092e2d7409e79779af396d63ca4146f1fb21RoboErik    K = CXCursor_BreakStmt;
1438af0092e2d7409e79779af396d63ca4146f1fb21RoboErik    break;
14424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
14524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  case Stmt::ReturnStmtClass:
14624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    K = CXCursor_ReturnStmt;
14724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    break;
1488af0092e2d7409e79779af396d63ca4146f1fb21RoboErik
1498af0092e2d7409e79779af396d63ca4146f1fb21RoboErik  case Stmt::GCCAsmStmtClass:
15024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    K = CXCursor_GCCAsmStmt;
15124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    break;
15224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
153ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik  case Stmt::MSAsmStmtClass:
154ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik    K = CXCursor_MSAsmStmt;
155ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik    break;
156ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik
157ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik  case Stmt::ObjCAtTryStmtClass:
158ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik    K = CXCursor_ObjCAtTryStmt;
159ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik    break;
160ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik
161ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik  case Stmt::ObjCAtCatchStmtClass:
162ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik    K = CXCursor_ObjCAtCatchStmt;
163ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik    break;
164ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik
165ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik  case Stmt::ObjCAtFinallyStmtClass:
166ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik    K = CXCursor_ObjCAtFinallyStmt;
167ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik    break;
168ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik
169ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik  case Stmt::ObjCAtThrowStmtClass:
1705c9469e010106467791b47b0fa83efda84491a21RoboErik    K = CXCursor_ObjCAtThrowStmt;
1715c9469e010106467791b47b0fa83efda84491a21RoboErik    break;
1725c9469e010106467791b47b0fa83efda84491a21RoboErik
1735c9469e010106467791b47b0fa83efda84491a21RoboErik  case Stmt::ObjCAtSynchronizedStmtClass:
174ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik    K = CXCursor_ObjCAtSynchronizedStmt;
175ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik    break;
176ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik
177ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik  case Stmt::ObjCAutoreleasePoolStmtClass:
178ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik    K = CXCursor_ObjCAutoreleasePoolStmt;
179ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik    break;
180ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik
181ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik  case Stmt::ObjCForCollectionStmtClass:
18224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    K = CXCursor_ObjCForCollectionStmt;
18324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    break;
18424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
18524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  case Stmt::CXXCatchStmtClass:
18624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    K = CXCursor_CXXCatchStmt;
18724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    break;
18824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
18924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  case Stmt::CXXTryStmtClass:
19024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    K = CXCursor_CXXTryStmt;
19124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    break;
19224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
19324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  case Stmt::CXXForRangeStmtClass:
19424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    K = CXCursor_CXXForRangeStmt;
19524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    break;
19624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
19724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  case Stmt::SEHTryStmtClass:
19824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    K = CXCursor_SEHTryStmt;
19924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    break;
20024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
20124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  case Stmt::SEHExceptStmtClass:
20224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    K = CXCursor_SEHExceptStmt;
20324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    break;
20424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
20524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  case Stmt::SEHFinallyStmtClass:
20624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    K = CXCursor_SEHFinallyStmt;
20724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    break;
20824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
20924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  case Stmt::ArrayTypeTraitExprClass:
210e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik  case Stmt::AsTypeExprClass:
211e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik  case Stmt::AtomicExprClass:
212e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik  case Stmt::BinaryConditionalOperatorClass:
213e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik  case Stmt::BinaryTypeTraitExprClass:
214e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik  case Stmt::TypeTraitExprClass:
21524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  case Stmt::CXXBindTemporaryExprClass:
21624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  case Stmt::CXXDefaultArgExprClass:
21724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  case Stmt::CXXScalarValueInitExprClass:
21824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  case Stmt::CXXUuidofExprClass:
21924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  case Stmt::ChooseExprClass:
22024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  case Stmt::DesignatedInitExprClass:
22124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  case Stmt::ExprWithCleanupsClass:
22224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  case Stmt::ExpressionTraitExprClass:
22324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  case Stmt::ExtVectorElementExprClass:
22424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  case Stmt::ImplicitCastExprClass:
22524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  case Stmt::ImplicitValueInitExprClass:
22624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  case Stmt::MaterializeTemporaryExprClass:
22724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  case Stmt::ObjCIndirectCopyRestoreExprClass:
22824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  case Stmt::OffsetOfExprClass:
22924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  case Stmt::ParenListExprClass:
23024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  case Stmt::PredefinedExprClass:
231ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik  case Stmt::ShuffleVectorExprClass:
232ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik  case Stmt::UnaryExprOrTypeTraitExprClass:
233ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik  case Stmt::UnaryTypeTraitExprClass:
234ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik  case Stmt::VAArgExprClass:
235ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik  case Stmt::ObjCArrayLiteralClass:
23624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  case Stmt::ObjCDictionaryLiteralClass:
23724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  case Stmt::ObjCBoxedExprClass:
23824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  case Stmt::ObjCSubscriptRefExprClass:
23924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    K = CXCursor_UnexposedExpr;
24024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    break;
2415c9469e010106467791b47b0fa83efda84491a21RoboErik
2425c9469e010106467791b47b0fa83efda84491a21RoboErik  case Stmt::OpaqueValueExprClass:
2435c9469e010106467791b47b0fa83efda84491a21RoboErik    if (Expr *Src = cast<OpaqueValueExpr>(S)->getSourceExpr())
24424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown      return MakeCXCursor(Src, Parent, TU, RegionOfInterest);
24524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    K = CXCursor_UnexposedExpr;
24624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    break;
24724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
24824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  case Stmt::PseudoObjectExprClass:
24924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    return MakeCXCursor(cast<PseudoObjectExpr>(S)->getSyntacticForm(),
25024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown                        Parent, TU, RegionOfInterest);
25124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
25224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  case Stmt::CompoundStmtClass:
25324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    K = CXCursor_CompoundStmt;
25424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    break;
25524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
25624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  case Stmt::NullStmtClass:
25724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    K = CXCursor_NullStmt;
25824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    break;
25924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
26024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  case Stmt::LabelStmtClass:
26124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    K = CXCursor_LabelStmt;
26224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    break;
26324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
26424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  case Stmt::AttributedStmtClass:
26524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    K = CXCursor_UnexposedStmt;
26624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    break;
26724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
26824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  case Stmt::DeclStmtClass:
26924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    K = CXCursor_DeclStmt;
27024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    break;
27124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
27224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  case Stmt::IntegerLiteralClass:
27324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    K = CXCursor_IntegerLiteral;
27424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    break;
27524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
27624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  case Stmt::FloatingLiteralClass:
27724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    K = CXCursor_FloatingLiteral;
27824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    break;
27924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
28024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  case Stmt::ImaginaryLiteralClass:
281e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik    K = CXCursor_ImaginaryLiteral;
282e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik    break;
283e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik
284e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik  case Stmt::StringLiteralClass:
285e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik    K = CXCursor_StringLiteral;
286e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik    break;
287e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik
288e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik  case Stmt::CharacterLiteralClass:
28924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    K = CXCursor_CharacterLiteral;
290e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik    break;
29124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
29224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  case Stmt::ParenExprClass:
29324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    K = CXCursor_ParenExpr;
29424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    break;
29524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
29624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  case Stmt::UnaryOperatorClass:
29724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    K = CXCursor_UnaryOperator;
298ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik    break;
299ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik
300ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik  case Stmt::CXXNoexceptExprClass:
301ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik    K = CXCursor_UnaryExpr;
302ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik    break;
303ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik
304ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik  case Stmt::ArraySubscriptExprClass:
305ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik    K = CXCursor_ArraySubscriptExpr;
306ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik    break;
307ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik
30824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  case Stmt::BinaryOperatorClass:
30924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    K = CXCursor_BinaryOperator;
31024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    break;
31124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
31224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  case Stmt::CompoundAssignOperatorClass:
31324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    K = CXCursor_CompoundAssignOperator;
31424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    break;
31524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
31624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  case Stmt::ConditionalOperatorClass:
31724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    K = CXCursor_ConditionalOperator;
31824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    break;
31924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
32024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  case Stmt::CStyleCastExprClass:
32124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    K = CXCursor_CStyleCastExpr;
32224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    break;
32324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
32424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  case Stmt::CompoundLiteralExprClass:
32524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    K = CXCursor_CompoundLiteralExpr;
32624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    break;
327ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik
328ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik  case Stmt::InitListExprClass:
329ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik    K = CXCursor_InitListExpr;
330ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik    break;
331ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik
332ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik  case Stmt::AddrLabelExprClass:
333ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik    K = CXCursor_AddrLabelExpr;
33485d539daa11f9f7bd61ecb8ebb4d43536c02a736RoboErik    break;
335ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik
33685d539daa11f9f7bd61ecb8ebb4d43536c02a736RoboErik  case Stmt::StmtExprClass:
337ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik    K = CXCursor_StmtExpr;
338ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik    break;
339ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik
340ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik  case Stmt::GenericSelectionExprClass:
341ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik    K = CXCursor_GenericSelectionExpr;
342ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik    break;
343ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik
344ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik  case Stmt::GNUNullExprClass:
345ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik    K = CXCursor_GNUNullExpr;
346ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik    break;
347ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik
348ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik  case Stmt::CXXStaticCastExprClass:
349ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik    K = CXCursor_CXXStaticCastExpr;
350ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik    break;
351ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik
352ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik  case Stmt::CXXDynamicCastExprClass:
353ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik    K = CXCursor_CXXDynamicCastExpr;
354ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik    break;
355ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik
356ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik  case Stmt::CXXReinterpretCastExprClass:
357ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik    K = CXCursor_CXXReinterpretCastExpr;
358ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik    break;
359ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik
360ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik  case Stmt::CXXConstCastExprClass:
361ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik    K = CXCursor_CXXConstCastExpr;
362ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik    break;
363ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik
364ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik  case Stmt::CXXFunctionalCastExprClass:
365ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik    K = CXCursor_CXXFunctionalCastExpr;
366ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik    break;
367ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik
368ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik  case Stmt::CXXTypeidExprClass:
369ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik    K = CXCursor_CXXTypeidExpr;
370ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik    break;
371ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik
372ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik  case Stmt::CXXBoolLiteralExprClass:
373ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik    K = CXCursor_CXXBoolLiteralExpr;
374ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik    break;
375ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik
376ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik  case Stmt::CXXNullPtrLiteralExprClass:
377ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik    K = CXCursor_CXXNullPtrLiteralExpr;
378ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik    break;
37985d539daa11f9f7bd61ecb8ebb4d43536c02a736RoboErik
38085d539daa11f9f7bd61ecb8ebb4d43536c02a736RoboErik  case Stmt::CXXThisExprClass:
38185d539daa11f9f7bd61ecb8ebb4d43536c02a736RoboErik    K = CXCursor_CXXThisExpr;
38285d539daa11f9f7bd61ecb8ebb4d43536c02a736RoboErik    break;
38385d539daa11f9f7bd61ecb8ebb4d43536c02a736RoboErik
38424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  case Stmt::CXXThrowExprClass:
38524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    K = CXCursor_CXXThrowExpr;
38624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    break;
38724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
38824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  case Stmt::CXXNewExprClass:
38985d539daa11f9f7bd61ecb8ebb4d43536c02a736RoboErik    K = CXCursor_CXXNewExpr;
39024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    break;
39124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
39224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  case Stmt::CXXDeleteExprClass:
39324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    K = CXCursor_CXXDeleteExpr;
39424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    break;
39524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
3965c9469e010106467791b47b0fa83efda84491a21RoboErik  case Stmt::ObjCStringLiteralClass:
3975c9469e010106467791b47b0fa83efda84491a21RoboErik    K = CXCursor_ObjCStringLiteral;
3985c9469e010106467791b47b0fa83efda84491a21RoboErik    break;
3995c9469e010106467791b47b0fa83efda84491a21RoboErik
4005c9469e010106467791b47b0fa83efda84491a21RoboErik  case Stmt::ObjCEncodeExprClass:
4015c9469e010106467791b47b0fa83efda84491a21RoboErik    K = CXCursor_ObjCEncodeExpr;
4025c9469e010106467791b47b0fa83efda84491a21RoboErik    break;
4035c9469e010106467791b47b0fa83efda84491a21RoboErik
4045c9469e010106467791b47b0fa83efda84491a21RoboErik  case Stmt::ObjCSelectorExprClass:
4055c9469e010106467791b47b0fa83efda84491a21RoboErik    K = CXCursor_ObjCSelectorExpr;
4065c9469e010106467791b47b0fa83efda84491a21RoboErik    break;
4075c9469e010106467791b47b0fa83efda84491a21RoboErik
4085c9469e010106467791b47b0fa83efda84491a21RoboErik  case Stmt::ObjCProtocolExprClass:
4095c9469e010106467791b47b0fa83efda84491a21RoboErik    K = CXCursor_ObjCProtocolExpr;
4105c9469e010106467791b47b0fa83efda84491a21RoboErik    break;
4115c9469e010106467791b47b0fa83efda84491a21RoboErik
4125c9469e010106467791b47b0fa83efda84491a21RoboErik  case Stmt::ObjCBoolLiteralExprClass:
4135c9469e010106467791b47b0fa83efda84491a21RoboErik    K = CXCursor_ObjCBoolLiteralExpr;
4145c9469e010106467791b47b0fa83efda84491a21RoboErik    break;
4155c9469e010106467791b47b0fa83efda84491a21RoboErik
4165c9469e010106467791b47b0fa83efda84491a21RoboErik  case Stmt::ObjCBridgedCastExprClass:
4175c9469e010106467791b47b0fa83efda84491a21RoboErik    K = CXCursor_ObjCBridgedCastExpr;
4185c9469e010106467791b47b0fa83efda84491a21RoboErik    break;
4195c9469e010106467791b47b0fa83efda84491a21RoboErik
4205c9469e010106467791b47b0fa83efda84491a21RoboErik  case Stmt::BlockExprClass:
4215c9469e010106467791b47b0fa83efda84491a21RoboErik    K = CXCursor_BlockExpr;
4225c9469e010106467791b47b0fa83efda84491a21RoboErik    break;
4235c9469e010106467791b47b0fa83efda84491a21RoboErik
4245c9469e010106467791b47b0fa83efda84491a21RoboErik  case Stmt::PackExpansionExprClass:
4255c9469e010106467791b47b0fa83efda84491a21RoboErik    K = CXCursor_PackExpansionExpr;
4265c9469e010106467791b47b0fa83efda84491a21RoboErik    break;
4275c9469e010106467791b47b0fa83efda84491a21RoboErik
4285c9469e010106467791b47b0fa83efda84491a21RoboErik  case Stmt::SizeOfPackExprClass:
4295c9469e010106467791b47b0fa83efda84491a21RoboErik    K = CXCursor_SizeOfPackExpr;
4305c9469e010106467791b47b0fa83efda84491a21RoboErik    break;
4315c9469e010106467791b47b0fa83efda84491a21RoboErik
4325c9469e010106467791b47b0fa83efda84491a21RoboErik  case Stmt::DeclRefExprClass:
4335c9469e010106467791b47b0fa83efda84491a21RoboErik  case Stmt::DependentScopeDeclRefExprClass:
4345c9469e010106467791b47b0fa83efda84491a21RoboErik  case Stmt::SubstNonTypeTemplateParmExprClass:
4355c9469e010106467791b47b0fa83efda84491a21RoboErik  case Stmt::SubstNonTypeTemplateParmPackExprClass:
4365c9469e010106467791b47b0fa83efda84491a21RoboErik  case Stmt::FunctionParmPackExprClass:
437bbcdf78e350d58ecd6baa75e282d4908d3129fe2RoboErik  case Stmt::UnresolvedLookupExprClass:
438bbcdf78e350d58ecd6baa75e282d4908d3129fe2RoboErik    K = CXCursor_DeclRefExpr;
439bbcdf78e350d58ecd6baa75e282d4908d3129fe2RoboErik    break;
440bbcdf78e350d58ecd6baa75e282d4908d3129fe2RoboErik
441bbcdf78e350d58ecd6baa75e282d4908d3129fe2RoboErik  case Stmt::CXXDependentScopeMemberExprClass:
442bbcdf78e350d58ecd6baa75e282d4908d3129fe2RoboErik  case Stmt::CXXPseudoDestructorExprClass:
443ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik  case Stmt::MemberExprClass:
444ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik  case Stmt::ObjCIsaExprClass:
445bbcdf78e350d58ecd6baa75e282d4908d3129fe2RoboErik  case Stmt::ObjCIvarRefExprClass:
446bbcdf78e350d58ecd6baa75e282d4908d3129fe2RoboErik  case Stmt::ObjCPropertyRefExprClass:
447bbcdf78e350d58ecd6baa75e282d4908d3129fe2RoboErik  case Stmt::UnresolvedMemberExprClass:
4488af0092e2d7409e79779af396d63ca4146f1fb21RoboErik    K = CXCursor_MemberRefExpr;
4498af0092e2d7409e79779af396d63ca4146f1fb21RoboErik    break;
45024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
45124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  case Stmt::CallExprClass:
45224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  case Stmt::CXXOperatorCallExprClass:
45324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  case Stmt::CXXMemberCallExprClass:
45424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  case Stmt::CUDAKernelCallExprClass:
45524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  case Stmt::CXXConstructExprClass:
45624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  case Stmt::CXXTemporaryObjectExprClass:
45724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  case Stmt::CXXUnresolvedConstructExprClass:
45824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  case Stmt::UserDefinedLiteralClass:
45924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    K = CXCursor_CallExpr;
46024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    break;
46124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
46224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  case Stmt::LambdaExprClass:
46324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    K = CXCursor_LambdaExpr;
46424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    break;
46524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
46624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  case Stmt::ObjCMessageExprClass: {
46724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    K = CXCursor_ObjCMessageExpr;
46824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    int SelectorIdIndex = -1;
46924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    // Check if cursor points to a selector id.
47024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    if (RegionOfInterest.isValid() &&
471b530c89bba371d2d575f10480b2e90914b0d3f3fGabriel Peal        RegionOfInterest.getBegin() == RegionOfInterest.getEnd()) {
47224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown      SmallVector<SourceLocation, 16> SelLocs;
47324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown      cast<ObjCMessageExpr>(S)->getSelectorLocs(SelLocs);
4748af0092e2d7409e79779af396d63ca4146f1fb21RoboErik      SmallVector<SourceLocation, 16>::iterator
4758af0092e2d7409e79779af396d63ca4146f1fb21RoboErik        I=std::find(SelLocs.begin(), SelLocs.end(),RegionOfInterest.getBegin());
4768af0092e2d7409e79779af396d63ca4146f1fb21RoboErik      if (I != SelLocs.end())
4778af0092e2d7409e79779af396d63ca4146f1fb21RoboErik        SelectorIdIndex = I - SelLocs.begin();
4788af0092e2d7409e79779af396d63ca4146f1fb21RoboErik    }
4798af0092e2d7409e79779af396d63ca4146f1fb21RoboErik    CXCursor C = { K, 0, { Parent, S, TU } };
4808af0092e2d7409e79779af396d63ca4146f1fb21RoboErik    return getSelectorIdentifierCursor(SelectorIdIndex, C);
4818af0092e2d7409e79779af396d63ca4146f1fb21RoboErik  }
48224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
48324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  case Stmt::MSDependentExistsStmtClass:
48424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    K = CXCursor_UnexposedStmt;
48524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    break;
48624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  }
48724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
48824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  CXCursor C = { K, 0, { Parent, S, TU } };
48924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  return C;
49024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown}
491e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik
492e49860b0f76d8336c1d41831ed370b0ff94278efRoboErikCXCursor cxcursor::MakeCursorObjCSuperClassRef(ObjCInterfaceDecl *Super,
493e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik                                               SourceLocation Loc,
494e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik                                               CXTranslationUnit TU) {
495e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik  assert(Super && TU && "Invalid arguments!");
496e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik  void *RawLoc = reinterpret_cast<void *>(Loc.getRawEncoding());
497e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik  CXCursor C = { CXCursor_ObjCSuperClassRef, 0, { Super, RawLoc, TU } };
498e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik  return C;
499e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik}
500e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik
501e49860b0f76d8336c1d41831ed370b0ff94278efRoboErikstd::pair<ObjCInterfaceDecl *, SourceLocation>
502e49860b0f76d8336c1d41831ed370b0ff94278efRoboErikcxcursor::getCursorObjCSuperClassRef(CXCursor C) {
503e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik  assert(C.kind == CXCursor_ObjCSuperClassRef);
504e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik  return std::make_pair(static_cast<ObjCInterfaceDecl *>(C.data[0]),
505e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik           SourceLocation::getFromRawEncoding(
506e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik                                      reinterpret_cast<uintptr_t>(C.data[1])));
507e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik}
508e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik
509e49860b0f76d8336c1d41831ed370b0ff94278efRoboErikCXCursor cxcursor::MakeCursorObjCProtocolRef(const ObjCProtocolDecl *Proto,
510e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik                                             SourceLocation Loc,
511e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik                                             CXTranslationUnit TU) {
512e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik  assert(Proto && TU && "Invalid arguments!");
513e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik  void *RawLoc = reinterpret_cast<void *>(Loc.getRawEncoding());
51424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  CXCursor C = { CXCursor_ObjCProtocolRef, 0, { (void*)Proto, RawLoc, TU } };
51524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  return C;
51624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown}
51724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
51824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brownstd::pair<ObjCProtocolDecl *, SourceLocation>
51924fa6c0dd42df057729e1a258388183f94da7f82Jeff Browncxcursor::getCursorObjCProtocolRef(CXCursor C) {
52024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  assert(C.kind == CXCursor_ObjCProtocolRef);
52124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  return std::make_pair(static_cast<ObjCProtocolDecl *>(C.data[0]),
52224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown           SourceLocation::getFromRawEncoding(
52324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown                                      reinterpret_cast<uintptr_t>(C.data[1])));
52424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown}
52524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
52624fa6c0dd42df057729e1a258388183f94da7f82Jeff BrownCXCursor cxcursor::MakeCursorObjCClassRef(const ObjCInterfaceDecl *Class,
52724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown                                          SourceLocation Loc,
52824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown                                          CXTranslationUnit TU) {
52924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  // 'Class' can be null for invalid code.
53024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  if (!Class)
53124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    return MakeCXCursorInvalid(CXCursor_InvalidCode);
53224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  assert(TU && "Invalid arguments!");
53324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  void *RawLoc = reinterpret_cast<void *>(Loc.getRawEncoding());
53424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  CXCursor C = { CXCursor_ObjCClassRef, 0, { (void*)Class, RawLoc, TU } };
53524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  return C;
53624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown}
53724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
53824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brownstd::pair<ObjCInterfaceDecl *, SourceLocation>
53924fa6c0dd42df057729e1a258388183f94da7f82Jeff Browncxcursor::getCursorObjCClassRef(CXCursor C) {
54024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  assert(C.kind == CXCursor_ObjCClassRef);
54124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  return std::make_pair(static_cast<ObjCInterfaceDecl *>(C.data[0]),
54224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown           SourceLocation::getFromRawEncoding(
54324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown                                      reinterpret_cast<uintptr_t>(C.data[1])));
54424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown}
54524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
54624fa6c0dd42df057729e1a258388183f94da7f82Jeff BrownCXCursor cxcursor::MakeCursorTypeRef(const TypeDecl *Type, SourceLocation Loc,
54724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown                                     CXTranslationUnit TU) {
54824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  assert(Type && TU && "Invalid arguments!");
54924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  void *RawLoc = reinterpret_cast<void *>(Loc.getRawEncoding());
55024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  CXCursor C = { CXCursor_TypeRef, 0, { (void*)Type, RawLoc, TU } };
55124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  return C;
55224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown}
55324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
55424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brownstd::pair<TypeDecl *, SourceLocation>
55524fa6c0dd42df057729e1a258388183f94da7f82Jeff Browncxcursor::getCursorTypeRef(CXCursor C) {
55624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  assert(C.kind == CXCursor_TypeRef);
55724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  return std::make_pair(static_cast<TypeDecl *>(C.data[0]),
55824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown           SourceLocation::getFromRawEncoding(
55924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown                                      reinterpret_cast<uintptr_t>(C.data[1])));
56024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown}
56124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
56224fa6c0dd42df057729e1a258388183f94da7f82Jeff BrownCXCursor cxcursor::MakeCursorTemplateRef(const TemplateDecl *Template,
56324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown                                         SourceLocation Loc,
56424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown                                         CXTranslationUnit TU) {
565e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik  assert(Template && TU && "Invalid arguments!");
566e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik  void *RawLoc = reinterpret_cast<void *>(Loc.getRawEncoding());
567e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik  CXCursor C = { CXCursor_TemplateRef, 0, { (void*)Template, RawLoc, TU } };
568e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik  return C;
569e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik}
570e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik
571e49860b0f76d8336c1d41831ed370b0ff94278efRoboErikstd::pair<TemplateDecl *, SourceLocation>
572e49860b0f76d8336c1d41831ed370b0ff94278efRoboErikcxcursor::getCursorTemplateRef(CXCursor C) {
573e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik  assert(C.kind == CXCursor_TemplateRef);
574e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik  return std::make_pair(static_cast<TemplateDecl *>(C.data[0]),
575e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik                        SourceLocation::getFromRawEncoding(
576e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik                                       reinterpret_cast<uintptr_t>(C.data[1])));
5778af0092e2d7409e79779af396d63ca4146f1fb21RoboErik}
5788af0092e2d7409e79779af396d63ca4146f1fb21RoboErik
5798af0092e2d7409e79779af396d63ca4146f1fb21RoboErikCXCursor cxcursor::MakeCursorNamespaceRef(const NamedDecl *NS,
5808af0092e2d7409e79779af396d63ca4146f1fb21RoboErik                                          SourceLocation Loc,
5818af0092e2d7409e79779af396d63ca4146f1fb21RoboErik                                          CXTranslationUnit TU) {
5828af0092e2d7409e79779af396d63ca4146f1fb21RoboErik
5838af0092e2d7409e79779af396d63ca4146f1fb21RoboErik  assert(NS && (isa<NamespaceDecl>(NS) || isa<NamespaceAliasDecl>(NS)) && TU &&
5848af0092e2d7409e79779af396d63ca4146f1fb21RoboErik         "Invalid arguments!");
5858af0092e2d7409e79779af396d63ca4146f1fb21RoboErik  void *RawLoc = reinterpret_cast<void *>(Loc.getRawEncoding());
5868af0092e2d7409e79779af396d63ca4146f1fb21RoboErik  CXCursor C = { CXCursor_NamespaceRef, 0, { (void*)NS, RawLoc, TU } };
5878af0092e2d7409e79779af396d63ca4146f1fb21RoboErik  return C;
5888af0092e2d7409e79779af396d63ca4146f1fb21RoboErik}
58924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
59024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brownstd::pair<NamedDecl *, SourceLocation>
5918af0092e2d7409e79779af396d63ca4146f1fb21RoboErikcxcursor::getCursorNamespaceRef(CXCursor C) {
59224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  assert(C.kind == CXCursor_NamespaceRef);
59324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  return std::make_pair(static_cast<NamedDecl *>(C.data[0]),
59424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown                        SourceLocation::getFromRawEncoding(
595e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik                                       reinterpret_cast<uintptr_t>(C.data[1])));
596e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik}
597e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik
598e49860b0f76d8336c1d41831ed370b0ff94278efRoboErikCXCursor cxcursor::MakeCursorVariableRef(const VarDecl *Var, SourceLocation Loc,
599e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik                                         CXTranslationUnit TU) {
600e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik
601e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik  assert(Var && TU && "Invalid arguments!");
602e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik  void *RawLoc = reinterpret_cast<void *>(Loc.getRawEncoding());
603e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik  CXCursor C = { CXCursor_VariableRef, 0, { (void*)Var, RawLoc, TU } };
604e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik  return C;
605e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik}
606e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik
607e49860b0f76d8336c1d41831ed370b0ff94278efRoboErikstd::pair<VarDecl *, SourceLocation>
608e49860b0f76d8336c1d41831ed370b0ff94278efRoboErikcxcursor::getCursorVariableRef(CXCursor C) {
609e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik  assert(C.kind == CXCursor_VariableRef);
61024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  return std::make_pair(static_cast<VarDecl *>(C.data[0]),
6118af0092e2d7409e79779af396d63ca4146f1fb21RoboErik                        SourceLocation::getFromRawEncoding(
61224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown                          reinterpret_cast<uintptr_t>(C.data[1])));
61324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown}
61424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
61524fa6c0dd42df057729e1a258388183f94da7f82Jeff BrownCXCursor cxcursor::MakeCursorMemberRef(const FieldDecl *Field, SourceLocation Loc,
6168af0092e2d7409e79779af396d63ca4146f1fb21RoboErik                                       CXTranslationUnit TU) {
61724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
61824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  assert(Field && TU && "Invalid arguments!");
61924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  void *RawLoc = reinterpret_cast<void *>(Loc.getRawEncoding());
62024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  CXCursor C = { CXCursor_MemberRef, 0, { (void*)Field, RawLoc, TU } };
6218af0092e2d7409e79779af396d63ca4146f1fb21RoboErik  return C;
62224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown}
62324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
62424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brownstd::pair<FieldDecl *, SourceLocation>
62524fa6c0dd42df057729e1a258388183f94da7f82Jeff Browncxcursor::getCursorMemberRef(CXCursor C) {
6268af0092e2d7409e79779af396d63ca4146f1fb21RoboErik  assert(C.kind == CXCursor_MemberRef);
62724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  return std::make_pair(static_cast<FieldDecl *>(C.data[0]),
62824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown                        SourceLocation::getFromRawEncoding(
62924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown                                       reinterpret_cast<uintptr_t>(C.data[1])));
63024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown}
6318af0092e2d7409e79779af396d63ca4146f1fb21RoboErik
63224fa6c0dd42df057729e1a258388183f94da7f82Jeff BrownCXCursor cxcursor::MakeCursorCXXBaseSpecifier(const CXXBaseSpecifier *B,
63324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown                                              CXTranslationUnit TU){
63424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  CXCursor C = { CXCursor_CXXBaseSpecifier, 0, { (void*)B, 0, TU } };
63524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  return C;
6368af0092e2d7409e79779af396d63ca4146f1fb21RoboErik}
63724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
63824fa6c0dd42df057729e1a258388183f94da7f82Jeff BrownCXXBaseSpecifier *cxcursor::getCursorCXXBaseSpecifier(CXCursor C) {
63924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  assert(C.kind == CXCursor_CXXBaseSpecifier);
64024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  return static_cast<CXXBaseSpecifier*>(C.data[0]);
6418af0092e2d7409e79779af396d63ca4146f1fb21RoboErik}
64224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
64324fa6c0dd42df057729e1a258388183f94da7f82Jeff BrownCXCursor cxcursor::MakePreprocessingDirectiveCursor(SourceRange Range,
64424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown                                                    CXTranslationUnit TU) {
64524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  CXCursor C = { CXCursor_PreprocessingDirective, 0,
6468af0092e2d7409e79779af396d63ca4146f1fb21RoboErik                 { reinterpret_cast<void *>(Range.getBegin().getRawEncoding()),
64724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown                   reinterpret_cast<void *>(Range.getEnd().getRawEncoding()),
648e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik                   TU }
649e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik               };
650e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik  return C;
651e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik}
652e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik
65324fa6c0dd42df057729e1a258388183f94da7f82Jeff BrownSourceRange cxcursor::getCursorPreprocessingDirective(CXCursor C) {
65424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  assert(C.kind == CXCursor_PreprocessingDirective);
65524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  SourceRange Range = SourceRange(SourceLocation::getFromRawEncoding(
65624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown                                      reinterpret_cast<uintptr_t> (C.data[0])),
65724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown                     SourceLocation::getFromRawEncoding(
65824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown                                      reinterpret_cast<uintptr_t> (C.data[1])));
65924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  ASTUnit *TU = getCursorASTUnit(C);
66024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  return TU->mapRangeFromPreamble(Range);
66124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown}
662e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik
66324fa6c0dd42df057729e1a258388183f94da7f82Jeff BrownCXCursor cxcursor::MakeMacroDefinitionCursor(MacroDefinition *MI,
664e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik                                             CXTranslationUnit TU) {
66524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  CXCursor C = { CXCursor_MacroDefinition, 0, { MI, 0, TU } };
66624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  return C;
66724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown}
668ae70d8d953ef632acb9f176609a1f75bd948d101RoboErik
669ae70d8d953ef632acb9f176609a1f75bd948d101RoboErikMacroDefinition *cxcursor::getCursorMacroDefinition(CXCursor C) {
670ae70d8d953ef632acb9f176609a1f75bd948d101RoboErik  assert(C.kind == CXCursor_MacroDefinition);
671ae70d8d953ef632acb9f176609a1f75bd948d101RoboErik  return static_cast<MacroDefinition *>(C.data[0]);
672ae70d8d953ef632acb9f176609a1f75bd948d101RoboErik}
673ae70d8d953ef632acb9f176609a1f75bd948d101RoboErik
674ae70d8d953ef632acb9f176609a1f75bd948d101RoboErikCXCursor cxcursor::MakeMacroExpansionCursor(MacroExpansion *MI,
675ae70d8d953ef632acb9f176609a1f75bd948d101RoboErik                                            CXTranslationUnit TU) {
676ae70d8d953ef632acb9f176609a1f75bd948d101RoboErik  CXCursor C = { CXCursor_MacroExpansion, 0, { MI, 0, TU } };
677ae70d8d953ef632acb9f176609a1f75bd948d101RoboErik  return C;
678ae70d8d953ef632acb9f176609a1f75bd948d101RoboErik}
6794e3b8470fa30cba04e2fb6b95516cff8f3e1e499RoboErik
680ae70d8d953ef632acb9f176609a1f75bd948d101RoboErikMacroExpansion *cxcursor::getCursorMacroExpansion(CXCursor C) {
681ae70d8d953ef632acb9f176609a1f75bd948d101RoboErik  assert(C.kind == CXCursor_MacroExpansion);
682ae70d8d953ef632acb9f176609a1f75bd948d101RoboErik  return static_cast<MacroExpansion *>(C.data[0]);
683e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik}
684ae70d8d953ef632acb9f176609a1f75bd948d101RoboErik
685ae70d8d953ef632acb9f176609a1f75bd948d101RoboErikCXCursor cxcursor::MakeInclusionDirectiveCursor(InclusionDirective *ID,
68624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown                                                CXTranslationUnit TU) {
68724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  CXCursor C = { CXCursor_InclusionDirective, 0, { ID, 0, TU } };
688e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik  return C;
68924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown}
69024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
69124fa6c0dd42df057729e1a258388183f94da7f82Jeff BrownInclusionDirective *cxcursor::getCursorInclusionDirective(CXCursor C) {
69224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  assert(C.kind == CXCursor_InclusionDirective);
693e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik  return static_cast<InclusionDirective *>(C.data[0]);
694e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik}
695e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik
696e49860b0f76d8336c1d41831ed370b0ff94278efRoboErikCXCursor cxcursor::MakeCursorLabelRef(LabelStmt *Label, SourceLocation Loc,
697e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik                                      CXTranslationUnit TU) {
69824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
69924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  assert(Label && TU && "Invalid arguments!");
70024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  void *RawLoc = reinterpret_cast<void *>(Loc.getRawEncoding());
7018ea3b7e9bae080d5ab65a150e952c87db70cc3a3Jeff Brown  CXCursor C = { CXCursor_LabelRef, 0, { Label, RawLoc, TU } };
70224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  return C;
70324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown}
70424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
70524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brownstd::pair<LabelStmt*, SourceLocation>
7068ea3b7e9bae080d5ab65a150e952c87db70cc3a3Jeff Browncxcursor::getCursorLabelRef(CXCursor C) {
70724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  assert(C.kind == CXCursor_LabelRef);
70824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  return std::make_pair(static_cast<LabelStmt *>(C.data[0]),
70924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown                        SourceLocation::getFromRawEncoding(
71024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown                                       reinterpret_cast<uintptr_t>(C.data[1])));
71124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown}
71224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
71324fa6c0dd42df057729e1a258388183f94da7f82Jeff BrownCXCursor cxcursor::MakeCursorOverloadedDeclRef(OverloadExpr *E,
71424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown                                               CXTranslationUnit TU) {
71524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  assert(E && TU && "Invalid arguments!");
71624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  OverloadedDeclRefStorage Storage(E);
717e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik  void *RawLoc = reinterpret_cast<void *>(E->getNameLoc().getRawEncoding());
718e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik  CXCursor C = {
719e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik                 CXCursor_OverloadedDeclRef, 0,
720e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik                 { Storage.getOpaqueValue(), RawLoc, TU }
721e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik               };
722e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik  return C;
723e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik}
72424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
72524fa6c0dd42df057729e1a258388183f94da7f82Jeff BrownCXCursor cxcursor::MakeCursorOverloadedDeclRef(Decl *D,
72624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown                                               SourceLocation Loc,
72724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown                                               CXTranslationUnit TU) {
72824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  assert(D && TU && "Invalid arguments!");
72924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  void *RawLoc = reinterpret_cast<void *>(Loc.getRawEncoding());
73024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  OverloadedDeclRefStorage Storage(D);
73124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  CXCursor C = {
73224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    CXCursor_OverloadedDeclRef, 0,
733ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik    { Storage.getOpaqueValue(), RawLoc, TU }
734ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik  };
735ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik  return C;
736ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik}
737ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik
738ceb8bf5e5cce7a37736981e626c4be416378767bRoboErikCXCursor cxcursor::MakeCursorOverloadedDeclRef(TemplateName Name,
739ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik                                               SourceLocation Loc,
740ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik                                               CXTranslationUnit TU) {
741ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik  assert(Name.getAsOverloadedTemplate() && TU && "Invalid arguments!");
742ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik  void *RawLoc = reinterpret_cast<void *>(Loc.getRawEncoding());
743ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik  OverloadedDeclRefStorage Storage(Name.getAsOverloadedTemplate());
744ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik  CXCursor C = {
745ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik    CXCursor_OverloadedDeclRef, 0,
746ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik    { Storage.getOpaqueValue(), RawLoc, TU }
747ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik  };
748ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik  return C;
749ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik}
750ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik
751ceb8bf5e5cce7a37736981e626c4be416378767bRoboErikstd::pair<cxcursor::OverloadedDeclRefStorage, SourceLocation>
752ceb8bf5e5cce7a37736981e626c4be416378767bRoboErikcxcursor::getCursorOverloadedDeclRef(CXCursor C) {
753ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik  assert(C.kind == CXCursor_OverloadedDeclRef);
754ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik  return std::make_pair(OverloadedDeclRefStorage::getFromOpaqueValue(C.data[0]),
755ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik                        SourceLocation::getFromRawEncoding(
756ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik                                       reinterpret_cast<uintptr_t>(C.data[1])));
757ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik}
758ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik
759ceb8bf5e5cce7a37736981e626c4be416378767bRoboErikDecl *cxcursor::getCursorDecl(CXCursor Cursor) {
760ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik  return (Decl *)Cursor.data[0];
761ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik}
762ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik
763ceb8bf5e5cce7a37736981e626c4be416378767bRoboErikExpr *cxcursor::getCursorExpr(CXCursor Cursor) {
764ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik  return dyn_cast_or_null<Expr>(getCursorStmt(Cursor));
765ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik}
766ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik
767ceb8bf5e5cce7a37736981e626c4be416378767bRoboErikStmt *cxcursor::getCursorStmt(CXCursor Cursor) {
768ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik  if (Cursor.kind == CXCursor_ObjCSuperClassRef ||
769ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik      Cursor.kind == CXCursor_ObjCProtocolRef ||
770ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik      Cursor.kind == CXCursor_ObjCClassRef)
771ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik    return 0;
772ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik
773ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik  return (Stmt *)Cursor.data[1];
774ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik}
775ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik
776ceb8bf5e5cce7a37736981e626c4be416378767bRoboErikAttr *cxcursor::getCursorAttr(CXCursor Cursor) {
777ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik  return (Attr *)Cursor.data[1];
778ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik}
779ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik
780ceb8bf5e5cce7a37736981e626c4be416378767bRoboErikDecl *cxcursor::getCursorParentDecl(CXCursor Cursor) {
781ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik  return (Decl *)Cursor.data[0];
782ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik}
783ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik
784ceb8bf5e5cce7a37736981e626c4be416378767bRoboErikASTContext &cxcursor::getCursorContext(CXCursor Cursor) {
785ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik  return getCursorASTUnit(Cursor)->getASTContext();
786ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik}
787ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik
788ceb8bf5e5cce7a37736981e626c4be416378767bRoboErikASTUnit *cxcursor::getCursorASTUnit(CXCursor Cursor) {
789ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik  CXTranslationUnit TU = static_cast<CXTranslationUnit>(Cursor.data[2]);
790ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik  if (!TU)
791ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik    return 0;
792ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik  return static_cast<ASTUnit *>(TU->TUData);
793ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik}
794ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik
795ceb8bf5e5cce7a37736981e626c4be416378767bRoboErikCXTranslationUnit cxcursor::getCursorTU(CXCursor Cursor) {
796ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik  return static_cast<CXTranslationUnit>(Cursor.data[2]);
797ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik}
798ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik
799ceb8bf5e5cce7a37736981e626c4be416378767bRoboErikvoid cxcursor::getOverriddenCursors(CXCursor cursor,
800ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik                                    SmallVectorImpl<CXCursor> &overridden) {
801ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik  assert(clang_isDeclaration(cursor.kind));
802ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik  const NamedDecl *D = dyn_cast_or_null<NamedDecl>(getCursorDecl(cursor));
803ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik  if (!D)
804ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik    return;
805ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik
806ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik  CXTranslationUnit TU = getCursorTU(cursor);
807ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik  SmallVector<const NamedDecl *, 8> OverDecls;
808ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik  D->getASTContext().getOverriddenMethods(D, OverDecls);
809ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik
810ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik  for (SmallVector<const NamedDecl *, 8>::iterator
811ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik         I = OverDecls.begin(), E = OverDecls.end(); I != E; ++I) {
812ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik    overridden.push_back(MakeCXCursor(const_cast<NamedDecl*>(*I), TU));
813ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik  }
814ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik}
815ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik
816ceb8bf5e5cce7a37736981e626c4be416378767bRoboErikstd::pair<int, SourceLocation>
817ceb8bf5e5cce7a37736981e626c4be416378767bRoboErikcxcursor::getSelectorIdentifierIndexAndLoc(CXCursor cursor) {
818ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik  if (cursor.kind == CXCursor_ObjCMessageExpr) {
819ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik    if (cursor.xdata != -1)
820ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik      return std::make_pair(cursor.xdata,
821ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik                            cast<ObjCMessageExpr>(getCursorExpr(cursor))
822ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik                                                ->getSelectorLoc(cursor.xdata));
823b6362d072f329a3207aa709ac6b79a4aa3c4d522Ying Wang  } else if (cursor.kind == CXCursor_ObjCClassMethodDecl ||
824ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik             cursor.kind == CXCursor_ObjCInstanceMethodDecl) {
825ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik    if (cursor.xdata != -1)
826ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik      return std::make_pair(cursor.xdata,
827ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik                            cast<ObjCMethodDecl>(getCursorDecl(cursor))
828ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik                                                ->getSelectorLoc(cursor.xdata));
829ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik  }
830ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik
831ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik  return std::make_pair(-1, SourceLocation());
832ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik}
833ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik
834ceb8bf5e5cce7a37736981e626c4be416378767bRoboErikCXCursor cxcursor::getSelectorIdentifierCursor(int SelIdx, CXCursor cursor) {
835ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik  CXCursor newCursor = cursor;
836ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik
837ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik  if (cursor.kind == CXCursor_ObjCMessageExpr) {
838ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik    if (SelIdx == -1 ||
839ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik        unsigned(SelIdx) >= cast<ObjCMessageExpr>(getCursorExpr(cursor))
840ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik                                                         ->getNumSelectorLocs())
841ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik      newCursor.xdata = -1;
842ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik    else
843ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik      newCursor.xdata = SelIdx;
844ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik  } else if (cursor.kind == CXCursor_ObjCClassMethodDecl ||
845ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik             cursor.kind == CXCursor_ObjCInstanceMethodDecl) {
846ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik    if (SelIdx == -1 ||
847ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik        unsigned(SelIdx) >= cast<ObjCMethodDecl>(getCursorDecl(cursor))
848ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik                                                         ->getNumSelectorLocs())
849ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik      newCursor.xdata = -1;
850ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik    else
851ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik      newCursor.xdata = SelIdx;
852ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik  }
853ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik
854ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik  return newCursor;
855ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik}
856ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik
857e49860b0f76d8336c1d41831ed370b0ff94278efRoboErikCXCursor cxcursor::getTypeRefCursor(CXCursor cursor) {
858e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik  if (cursor.kind != CXCursor_CallExpr)
859e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik    return cursor;
860e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik
861e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik  if (cursor.xdata == 0)
862e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik    return cursor;
863e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik
864e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik  Expr *E = getCursorExpr(cursor);
865e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik  TypeSourceInfo *Type = 0;
866e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik  if (CXXUnresolvedConstructExpr *
867e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik        UnCtor = dyn_cast<CXXUnresolvedConstructExpr>(E)) {
868e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik    Type = UnCtor->getTypeSourceInfo();
869e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik  } else if (CXXTemporaryObjectExpr *Tmp = dyn_cast<CXXTemporaryObjectExpr>(E)){
870e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik    Type = Tmp->getTypeSourceInfo();
871e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik  }
872e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik
873e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik  if (!Type)
874e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik    return cursor;
875e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik
876e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik  CXTranslationUnit TU = getCursorTU(cursor);
877e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik  QualType Ty = Type->getType();
878e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik  TypeLoc TL = Type->getTypeLoc();
879e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik  SourceLocation Loc = TL.getBeginLoc();
880e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik
881e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik  if (const ElaboratedType *ElabT = Ty->getAs<ElaboratedType>()) {
882e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik    Ty = ElabT->getNamedType();
883e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik    ElaboratedTypeLoc ElabTL = cast<ElaboratedTypeLoc>(TL);
884e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik    Loc = ElabTL.getNamedTypeLoc().getBeginLoc();
885e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik  }
886e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik
887e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik  if (const TypedefType *Typedef = Ty->getAs<TypedefType>())
888e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik    return MakeCursorTypeRef(Typedef->getDecl(), Loc, TU);
889e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik  if (const TagType *Tag = Ty->getAs<TagType>())
890e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik    return MakeCursorTypeRef(Tag->getDecl(), Loc, TU);
891e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik  if (const TemplateTypeParmType *TemplP = Ty->getAs<TemplateTypeParmType>())
892e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik    return MakeCursorTypeRef(TemplP->getDecl(), Loc, TU);
893e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik
894e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik  return cursor;
895e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik}
896e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik
8975c9469e010106467791b47b0fa83efda84491a21RoboErikbool cxcursor::operator==(CXCursor X, CXCursor Y) {
8985c9469e010106467791b47b0fa83efda84491a21RoboErik  return X.kind == Y.kind && X.data[0] == Y.data[0] && X.data[1] == Y.data[1] &&
8995c9469e010106467791b47b0fa83efda84491a21RoboErik         X.data[2] == Y.data[2];
9005c9469e010106467791b47b0fa83efda84491a21RoboErik}
90124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
9028af0092e2d7409e79779af396d63ca4146f1fb21RoboErik// FIXME: Remove once we can model DeclGroups and their appropriate ranges
90324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown// properly in the ASTs.
90424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brownbool cxcursor::isFirstInDeclGroup(CXCursor C) {
90524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  assert(clang_isDeclaration(C.kind));
90624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  return ((uintptr_t) (C.data[1])) != 0;
90724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown}
90824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
90924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown//===----------------------------------------------------------------------===//
91024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown// libclang CXCursor APIs
91124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown//===----------------------------------------------------------------------===//
91224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
91385d539daa11f9f7bd61ecb8ebb4d43536c02a736RoboErikextern "C" {
91485d539daa11f9f7bd61ecb8ebb4d43536c02a736RoboErik
915ceb8bf5e5cce7a37736981e626c4be416378767bRoboErikint clang_Cursor_isNull(CXCursor cursor) {
916ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik  return clang_equalCursors(cursor, clang_getNullCursor());
917ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik}
918ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik
919ceb8bf5e5cce7a37736981e626c4be416378767bRoboErikCXTranslationUnit clang_Cursor_getTranslationUnit(CXCursor cursor) {
920ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik  return getCursorTU(cursor);
921ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik}
922ceb8bf5e5cce7a37736981e626c4be416378767bRoboErik
92324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brownint clang_Cursor_getNumArguments(CXCursor C) {
9245c9469e010106467791b47b0fa83efda84491a21RoboErik  if (clang_isDeclaration(C.kind)) {
9255c9469e010106467791b47b0fa83efda84491a21RoboErik    Decl *D = cxcursor::getCursorDecl(C);
92624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    if (const ObjCMethodDecl *MD = dyn_cast_or_null<ObjCMethodDecl>(D))
92724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown      return MD->param_size();
92824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    if (const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D))
92924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown      return FD->param_size();
9305c9469e010106467791b47b0fa83efda84491a21RoboErik  }
9315c9469e010106467791b47b0fa83efda84491a21RoboErik
9325c9469e010106467791b47b0fa83efda84491a21RoboErik  return -1;
9335c9469e010106467791b47b0fa83efda84491a21RoboErik}
934e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik
935e49860b0f76d8336c1d41831ed370b0ff94278efRoboErikCXCursor clang_Cursor_getArgument(CXCursor C, unsigned i) {
936e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik  if (clang_isDeclaration(C.kind)) {
937e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik    Decl *D = cxcursor::getCursorDecl(C);
938e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik    if (ObjCMethodDecl *MD = dyn_cast_or_null<ObjCMethodDecl>(D)) {
939e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik      if (i < MD->param_size())
9405c9469e010106467791b47b0fa83efda84491a21RoboErik        return cxcursor::MakeCXCursor(MD->param_begin()[i],
941e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik                                      cxcursor::getCursorTU(C));
942e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik    } else if (FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D)) {
943e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik      if (i < FD->param_size())
944e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik        return cxcursor::MakeCXCursor(FD->param_begin()[i],
945e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik                                      cxcursor::getCursorTU(C));
9465c9469e010106467791b47b0fa83efda84491a21RoboErik    }
9475c9469e010106467791b47b0fa83efda84491a21RoboErik  }
9485c9469e010106467791b47b0fa83efda84491a21RoboErik
9495c9469e010106467791b47b0fa83efda84491a21RoboErik  return clang_getNullCursor();
9505c9469e010106467791b47b0fa83efda84491a21RoboErik}
9515c9469e010106467791b47b0fa83efda84491a21RoboErik
9525c9469e010106467791b47b0fa83efda84491a21RoboErik} // end: extern "C"
9535c9469e010106467791b47b0fa83efda84491a21RoboErik
9545c9469e010106467791b47b0fa83efda84491a21RoboErik//===----------------------------------------------------------------------===//
955e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik// CXCursorSet.
956e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik//===----------------------------------------------------------------------===//
957e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik
958e49860b0f76d8336c1d41831ed370b0ff94278efRoboEriktypedef llvm::DenseMap<CXCursor, unsigned> CXCursorSet_Impl;
959e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik
960e49860b0f76d8336c1d41831ed370b0ff94278efRoboErikstatic inline CXCursorSet packCXCursorSet(CXCursorSet_Impl *setImpl) {
961e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik  return (CXCursorSet) setImpl;
962e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik}
963e49860b0f76d8336c1d41831ed370b0ff94278efRoboErikstatic inline CXCursorSet_Impl *unpackCXCursorSet(CXCursorSet set) {
9645c9469e010106467791b47b0fa83efda84491a21RoboErik  return (CXCursorSet_Impl*) set;
9651c91ca160d4a8f4f3cf3cf2a8672e0ccd16d88d4RoboErik}
9661c91ca160d4a8f4f3cf3cf2a8672e0ccd16d88d4RoboEriknamespace llvm {
9671c91ca160d4a8f4f3cf3cf2a8672e0ccd16d88d4RoboEriktemplate<> struct DenseMapInfo<CXCursor> {
9681c91ca160d4a8f4f3cf3cf2a8672e0ccd16d88d4RoboErikpublic:
9691c91ca160d4a8f4f3cf3cf2a8672e0ccd16d88d4RoboErik  static inline CXCursor getEmptyKey() {
9701c91ca160d4a8f4f3cf3cf2a8672e0ccd16d88d4RoboErik    return MakeCXCursorInvalid(CXCursor_InvalidFile);
9711c91ca160d4a8f4f3cf3cf2a8672e0ccd16d88d4RoboErik  }
9721c91ca160d4a8f4f3cf3cf2a8672e0ccd16d88d4RoboErik  static inline CXCursor getTombstoneKey() {
9731c91ca160d4a8f4f3cf3cf2a8672e0ccd16d88d4RoboErik    return MakeCXCursorInvalid(CXCursor_NoDeclFound);
9741c91ca160d4a8f4f3cf3cf2a8672e0ccd16d88d4RoboErik  }
9751c91ca160d4a8f4f3cf3cf2a8672e0ccd16d88d4RoboErik  static inline unsigned getHashValue(const CXCursor &cursor) {
9761c91ca160d4a8f4f3cf3cf2a8672e0ccd16d88d4RoboErik    return llvm::DenseMapInfo<std::pair<void*,void*> >
9771c91ca160d4a8f4f3cf3cf2a8672e0ccd16d88d4RoboErik      ::getHashValue(std::make_pair(cursor.data[0], cursor.data[1]));
9781c91ca160d4a8f4f3cf3cf2a8672e0ccd16d88d4RoboErik  }
979e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik  static inline bool isEqual(const CXCursor &x, const CXCursor &y) {
9805c9469e010106467791b47b0fa83efda84491a21RoboErik    return x.kind == y.kind &&
9815c9469e010106467791b47b0fa83efda84491a21RoboErik           x.data[0] == y.data[0] &&
9825c9469e010106467791b47b0fa83efda84491a21RoboErik           x.data[1] == y.data[1];
9835c9469e010106467791b47b0fa83efda84491a21RoboErik  }
9845c9469e010106467791b47b0fa83efda84491a21RoboErik};
9855c9469e010106467791b47b0fa83efda84491a21RoboErik}
9865c9469e010106467791b47b0fa83efda84491a21RoboErik
9875c9469e010106467791b47b0fa83efda84491a21RoboErikextern "C" {
9885c9469e010106467791b47b0fa83efda84491a21RoboErikCXCursorSet clang_createCXCursorSet() {
9895c9469e010106467791b47b0fa83efda84491a21RoboErik  return packCXCursorSet(new CXCursorSet_Impl());
9905c9469e010106467791b47b0fa83efda84491a21RoboErik}
9915c9469e010106467791b47b0fa83efda84491a21RoboErik
9925c9469e010106467791b47b0fa83efda84491a21RoboErikvoid clang_disposeCXCursorSet(CXCursorSet set) {
9935c9469e010106467791b47b0fa83efda84491a21RoboErik  delete unpackCXCursorSet(set);
9945c9469e010106467791b47b0fa83efda84491a21RoboErik}
995e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik
996e49860b0f76d8336c1d41831ed370b0ff94278efRoboErikunsigned clang_CXCursorSet_contains(CXCursorSet set, CXCursor cursor) {
997e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik  CXCursorSet_Impl *setImpl = unpackCXCursorSet(set);
9985c9469e010106467791b47b0fa83efda84491a21RoboErik  if (!setImpl)
9995c9469e010106467791b47b0fa83efda84491a21RoboErik    return 0;
1000e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik  return setImpl->find(cursor) == setImpl->end();
1001e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik}
1002e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik
1003e49860b0f76d8336c1d41831ed370b0ff94278efRoboErikunsigned clang_CXCursorSet_insert(CXCursorSet set, CXCursor cursor) {
1004e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik  // Do not insert invalid cursors into the set.
1005e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik  if (cursor.kind >= CXCursor_FirstInvalid &&
1006e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik      cursor.kind <= CXCursor_LastInvalid)
10075c9469e010106467791b47b0fa83efda84491a21RoboErik    return 1;
10085c9469e010106467791b47b0fa83efda84491a21RoboErik
10095c9469e010106467791b47b0fa83efda84491a21RoboErik  CXCursorSet_Impl *setImpl = unpackCXCursorSet(set);
10105c9469e010106467791b47b0fa83efda84491a21RoboErik  if (!setImpl)
10115c9469e010106467791b47b0fa83efda84491a21RoboErik    return 1;
10125c9469e010106467791b47b0fa83efda84491a21RoboErik  unsigned &entry = (*setImpl)[cursor];
10135c9469e010106467791b47b0fa83efda84491a21RoboErik  unsigned flag = entry == 0 ? 1 : 0;
101424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  entry = 1;
10155c9469e010106467791b47b0fa83efda84491a21RoboErik  return flag;
10165c9469e010106467791b47b0fa83efda84491a21RoboErik}
10175c9469e010106467791b47b0fa83efda84491a21RoboErik
10185c9469e010106467791b47b0fa83efda84491a21RoboErikCXCompletionString clang_getCursorCompletionString(CXCursor cursor) {
10195c9469e010106467791b47b0fa83efda84491a21RoboErik  enum CXCursorKind kind = clang_getCursorKind(cursor);
10205c9469e010106467791b47b0fa83efda84491a21RoboErik  if (clang_isDeclaration(kind)) {
10215c9469e010106467791b47b0fa83efda84491a21RoboErik    Decl *decl = getCursorDecl(cursor);
10225c9469e010106467791b47b0fa83efda84491a21RoboErik    if (NamedDecl *namedDecl = dyn_cast_or_null<NamedDecl>(decl)) {
10235c9469e010106467791b47b0fa83efda84491a21RoboErik      ASTUnit *unit = getCursorASTUnit(cursor);
10245c9469e010106467791b47b0fa83efda84491a21RoboErik      CodeCompletionResult Result(namedDecl);
10255c9469e010106467791b47b0fa83efda84491a21RoboErik      CodeCompletionString *String
10265c9469e010106467791b47b0fa83efda84491a21RoboErik        = Result.CreateCodeCompletionString(unit->getASTContext(),
10275c9469e010106467791b47b0fa83efda84491a21RoboErik                                            unit->getPreprocessor(),
10285c9469e010106467791b47b0fa83efda84491a21RoboErik                                 unit->getCodeCompletionTUInfo().getAllocator(),
10295c9469e010106467791b47b0fa83efda84491a21RoboErik                                 unit->getCodeCompletionTUInfo(),
10305c9469e010106467791b47b0fa83efda84491a21RoboErik                                 true);
10315c9469e010106467791b47b0fa83efda84491a21RoboErik      return String;
10325c9469e010106467791b47b0fa83efda84491a21RoboErik    }
10335c9469e010106467791b47b0fa83efda84491a21RoboErik  }
10345c9469e010106467791b47b0fa83efda84491a21RoboErik  else if (kind == CXCursor_MacroDefinition) {
10355c9469e010106467791b47b0fa83efda84491a21RoboErik    MacroDefinition *definition = getCursorMacroDefinition(cursor);
10365c9469e010106467791b47b0fa83efda84491a21RoboErik    const IdentifierInfo *MacroInfo = definition->getName();
10375c9469e010106467791b47b0fa83efda84491a21RoboErik    ASTUnit *unit = getCursorASTUnit(cursor);
10385c9469e010106467791b47b0fa83efda84491a21RoboErik    CodeCompletionResult Result(const_cast<IdentifierInfo *>(MacroInfo));
10395c9469e010106467791b47b0fa83efda84491a21RoboErik    CodeCompletionString *String
10405c9469e010106467791b47b0fa83efda84491a21RoboErik      = Result.CreateCodeCompletionString(unit->getASTContext(),
10415c9469e010106467791b47b0fa83efda84491a21RoboErik                                          unit->getPreprocessor(),
10425c9469e010106467791b47b0fa83efda84491a21RoboErik                                 unit->getCodeCompletionTUInfo().getAllocator(),
10435c9469e010106467791b47b0fa83efda84491a21RoboErik                                 unit->getCodeCompletionTUInfo(),
10445c9469e010106467791b47b0fa83efda84491a21RoboErik                                 false);
10455c9469e010106467791b47b0fa83efda84491a21RoboErik    return String;
10465c9469e010106467791b47b0fa83efda84491a21RoboErik  }
10475c9469e010106467791b47b0fa83efda84491a21RoboErik  return NULL;
10485c9469e010106467791b47b0fa83efda84491a21RoboErik}
10495c9469e010106467791b47b0fa83efda84491a21RoboErik} // end: extern C.
10505c9469e010106467791b47b0fa83efda84491a21RoboErik
10515c9469e010106467791b47b0fa83efda84491a21RoboEriknamespace {
10525c9469e010106467791b47b0fa83efda84491a21RoboErik  struct OverridenCursorsPool {
10535c9469e010106467791b47b0fa83efda84491a21RoboErik    typedef llvm::SmallVector<CXCursor, 2> CursorVec;
10545c9469e010106467791b47b0fa83efda84491a21RoboErik    std::vector<CursorVec*> AllCursors;
10555c9469e010106467791b47b0fa83efda84491a21RoboErik    std::vector<CursorVec*> AvailableCursors;
10565c9469e010106467791b47b0fa83efda84491a21RoboErik
10575c9469e010106467791b47b0fa83efda84491a21RoboErik    ~OverridenCursorsPool() {
10585c9469e010106467791b47b0fa83efda84491a21RoboErik      for (std::vector<CursorVec*>::iterator I = AllCursors.begin(),
10595c9469e010106467791b47b0fa83efda84491a21RoboErik           E = AllCursors.end(); I != E; ++I) {
10605c9469e010106467791b47b0fa83efda84491a21RoboErik        delete *I;
10615c9469e010106467791b47b0fa83efda84491a21RoboErik      }
10625c9469e010106467791b47b0fa83efda84491a21RoboErik    }
10635c9469e010106467791b47b0fa83efda84491a21RoboErik  };
10645c9469e010106467791b47b0fa83efda84491a21RoboErik}
10655c9469e010106467791b47b0fa83efda84491a21RoboErik
10665c9469e010106467791b47b0fa83efda84491a21RoboErikvoid *cxcursor::createOverridenCXCursorsPool() {
10675c9469e010106467791b47b0fa83efda84491a21RoboErik  return new OverridenCursorsPool();
10685c9469e010106467791b47b0fa83efda84491a21RoboErik}
10695c9469e010106467791b47b0fa83efda84491a21RoboErik
10705c9469e010106467791b47b0fa83efda84491a21RoboErikvoid cxcursor::disposeOverridenCXCursorsPool(void *pool) {
10715c9469e010106467791b47b0fa83efda84491a21RoboErik  delete static_cast<OverridenCursorsPool*>(pool);
10725c9469e010106467791b47b0fa83efda84491a21RoboErik}
10735c9469e010106467791b47b0fa83efda84491a21RoboErik
10745c9469e010106467791b47b0fa83efda84491a21RoboErikextern "C" {
10755c9469e010106467791b47b0fa83efda84491a21RoboErikvoid clang_getOverriddenCursors(CXCursor cursor,
10765c9469e010106467791b47b0fa83efda84491a21RoboErik                                CXCursor **overridden,
10775c9469e010106467791b47b0fa83efda84491a21RoboErik                                unsigned *num_overridden) {
10785c9469e010106467791b47b0fa83efda84491a21RoboErik  if (overridden)
10795c9469e010106467791b47b0fa83efda84491a21RoboErik    *overridden = 0;
10805c9469e010106467791b47b0fa83efda84491a21RoboErik  if (num_overridden)
10815c9469e010106467791b47b0fa83efda84491a21RoboErik    *num_overridden = 0;
10825c9469e010106467791b47b0fa83efda84491a21RoboErik
10835c9469e010106467791b47b0fa83efda84491a21RoboErik  CXTranslationUnit TU = cxcursor::getCursorTU(cursor);
10845c9469e010106467791b47b0fa83efda84491a21RoboErik
10855c9469e010106467791b47b0fa83efda84491a21RoboErik  if (!overridden || !num_overridden || !TU)
10865c9469e010106467791b47b0fa83efda84491a21RoboErik    return;
10875c9469e010106467791b47b0fa83efda84491a21RoboErik
10885c9469e010106467791b47b0fa83efda84491a21RoboErik  if (!clang_isDeclaration(cursor.kind))
10895c9469e010106467791b47b0fa83efda84491a21RoboErik    return;
10905c9469e010106467791b47b0fa83efda84491a21RoboErik
10915c9469e010106467791b47b0fa83efda84491a21RoboErik  OverridenCursorsPool &pool =
10925c9469e010106467791b47b0fa83efda84491a21RoboErik    *static_cast<OverridenCursorsPool*>(TU->OverridenCursorsPool);
10935c9469e010106467791b47b0fa83efda84491a21RoboErik
10945c9469e010106467791b47b0fa83efda84491a21RoboErik  OverridenCursorsPool::CursorVec *Vec = 0;
10955c9469e010106467791b47b0fa83efda84491a21RoboErik
10965c9469e010106467791b47b0fa83efda84491a21RoboErik  if (!pool.AvailableCursors.empty()) {
10975c9469e010106467791b47b0fa83efda84491a21RoboErik    Vec = pool.AvailableCursors.back();
10985c9469e010106467791b47b0fa83efda84491a21RoboErik    pool.AvailableCursors.pop_back();
10995c9469e010106467791b47b0fa83efda84491a21RoboErik  }
11005c9469e010106467791b47b0fa83efda84491a21RoboErik  else {
11015c9469e010106467791b47b0fa83efda84491a21RoboErik    Vec = new OverridenCursorsPool::CursorVec();
110224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    pool.AllCursors.push_back(Vec);
110324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  }
110424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
110524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  // Clear out the vector, but don't free the memory contents.  This
1106e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik  // reduces malloc() traffic.
1107e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik  Vec->clear();
1108e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik
11095c9469e010106467791b47b0fa83efda84491a21RoboErik  // Use the first entry to contain a back reference to the vector.
111024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  // This is a complete hack.
111124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  CXCursor backRefCursor = MakeCXCursorInvalid(CXCursor_InvalidFile, TU);
111224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  backRefCursor.data[0] = Vec;
111324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  assert(cxcursor::getCursorTU(backRefCursor) == TU);
11141c91ca160d4a8f4f3cf3cf2a8672e0ccd16d88d4RoboErik  Vec->push_back(backRefCursor);
11151c91ca160d4a8f4f3cf3cf2a8672e0ccd16d88d4RoboErik
11161c91ca160d4a8f4f3cf3cf2a8672e0ccd16d88d4RoboErik  // Get the overriden cursors.
1117e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik  cxcursor::getOverriddenCursors(cursor, *Vec);
1118e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik
1119e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik  // Did we get any overriden cursors?  If not, return Vec to the pool
1120e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik  // of available cursor vectors.
1121e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik  if (Vec->size() == 1) {
1122e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik    pool.AvailableCursors.push_back(Vec);
112324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    return;
112424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  }
112524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
112624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  // Now tell the caller about the overriden cursors.
1127e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik  assert(Vec->size() > 1);
1128e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik  *overridden = &((*Vec)[1]);
1129e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik  *num_overridden = Vec->size() - 1;
11301c91ca160d4a8f4f3cf3cf2a8672e0ccd16d88d4RoboErik}
11311c91ca160d4a8f4f3cf3cf2a8672e0ccd16d88d4RoboErik
11321c91ca160d4a8f4f3cf3cf2a8672e0ccd16d88d4RoboErikvoid clang_disposeOverriddenCursors(CXCursor *overridden) {
1133e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik  if (!overridden)
1134e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik    return;
1135e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik
1136e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik  // Use pointer arithmetic to get back the first faux entry
1137e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik  // which has a back-reference to the TU and the vector.
1138e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik  --overridden;
11391c91ca160d4a8f4f3cf3cf2a8672e0ccd16d88d4RoboErik  OverridenCursorsPool::CursorVec *Vec =
11401c91ca160d4a8f4f3cf3cf2a8672e0ccd16d88d4RoboErik    static_cast<OverridenCursorsPool::CursorVec*>(overridden->data[0]);
114124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  CXTranslationUnit TU = getCursorTU(*overridden);
114224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
114324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  assert(Vec && TU);
114424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
11455c9469e010106467791b47b0fa83efda84491a21RoboErik  OverridenCursorsPool &pool =
11465c9469e010106467791b47b0fa83efda84491a21RoboErik    *static_cast<OverridenCursorsPool*>(TU->OverridenCursorsPool);
11475c9469e010106467791b47b0fa83efda84491a21RoboErik
11485c9469e010106467791b47b0fa83efda84491a21RoboErik  pool.AvailableCursors.push_back(Vec);
11495c9469e010106467791b47b0fa83efda84491a21RoboErik}
11505c9469e010106467791b47b0fa83efda84491a21RoboErik
11515c9469e010106467791b47b0fa83efda84491a21RoboErikint clang_Cursor_isDynamicCall(CXCursor C) {
11525c9469e010106467791b47b0fa83efda84491a21RoboErik  const Expr *E = 0;
115324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  if (clang_isExpression(C.kind))
115424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    E = getCursorExpr(C);
115524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  if (!E)
115624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    return 0;
11575c9469e010106467791b47b0fa83efda84491a21RoboErik
115824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  if (const ObjCMessageExpr *MsgE = dyn_cast<ObjCMessageExpr>(E))
115924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    return MsgE->getReceiverKind() == ObjCMessageExpr::Instance;
116024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
116124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  const MemberExpr *ME = 0;
1162e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik  if (isa<MemberExpr>(E))
116324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    ME = cast<MemberExpr>(E);
116424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  else if (const CallExpr *CE = dyn_cast<CallExpr>(E))
116524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    ME = dyn_cast_or_null<MemberExpr>(CE->getCallee());
116624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
11675c9469e010106467791b47b0fa83efda84491a21RoboErik  if (ME) {
1168e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik    if (const CXXMethodDecl *
11695c9469e010106467791b47b0fa83efda84491a21RoboErik          MD = dyn_cast_or_null<CXXMethodDecl>(ME->getMemberDecl()))
1170e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik      return MD->isVirtual() && !ME->hasQualifier();
117124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  }
117224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
117324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  return 0;
117424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown}
1175e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik
117624fa6c0dd42df057729e1a258388183f94da7f82Jeff BrownCXType clang_Cursor_getReceiverType(CXCursor C) {
117724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  CXTranslationUnit TU = cxcursor::getCursorTU(C);
117824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  const Expr *E = 0;
117924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown  if (clang_isExpression(C.kind))
1180e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik    E = getCursorExpr(C);
1181e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik
1182e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik  if (const ObjCMessageExpr *MsgE = dyn_cast_or_null<ObjCMessageExpr>(E))
1183e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik    return cxtype::MakeCXType(MsgE->getReceiverType(), TU);
11845c9469e010106467791b47b0fa83efda84491a21RoboErik
11855c9469e010106467791b47b0fa83efda84491a21RoboErik  return cxtype::MakeCXType(QualType(), TU);
11865c9469e010106467791b47b0fa83efda84491a21RoboErik}
11875c9469e010106467791b47b0fa83efda84491a21RoboErik
11885c9469e010106467791b47b0fa83efda84491a21RoboErik} // end: extern "C"
11895c9469e010106467791b47b0fa83efda84491a21RoboErik