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