CXCursor.cpp revision 8fa0a80b4482ad94e82c4a19e23de17fd69140b5
17dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch//===- CXCursor.cpp - Routines for manipulating CXCursors -----------------===// 27dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// 37dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// The LLVM Compiler Infrastructure 47dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// 57dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// This file is distributed under the University of Illinois Open Source 67dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// License. See LICENSE.TXT for details. 77dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// 87dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch//===----------------------------------------------------------------------===// 97dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// 107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// This file defines routines for manipulating CXCursors. It should be the 11558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// only file that has internal knowledge of the encoding of the data in 12558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// CXCursor. 13558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// 14558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch//===----------------------------------------------------------------------===// 15558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "CXTranslationUnit.h" 17558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "CXCursor.h" 18558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "CXString.h" 197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "clang/Frontend/ASTUnit.h" 207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "clang/AST/Decl.h" 217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "clang/AST/DeclCXX.h" 227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "clang/AST/DeclObjC.h" 237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "clang/AST/Expr.h" 247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "clang/AST/ExprCXX.h" 257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "clang-c/Index.h" 267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "llvm/Support/ErrorHandling.h" 277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 28558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochusing namespace clang; 29558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochusing namespace cxcursor; 30558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 31558790d6acca3451cf3a6b497803a5f07d0bec58Ben MurdochCXCursor cxcursor::MakeCXCursorInvalid(CXCursorKind K) { 327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch assert(K >= CXCursor_FirstInvalid && K <= CXCursor_LastInvalid); 337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CXCursor C = { K, { 0, 0, 0 } }; 349ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch return C; 357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 37558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochstatic CXCursorKind GetCursorKind(const Attr *A) { 38558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch assert(A && "Invalid arguments!"); 39558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch switch (A->getKind()) { 40558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch default: break; 41558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch case attr::IBAction: return CXCursor_IBActionAttr; 42558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch case attr::IBOutlet: return CXCursor_IBOutletAttr; 43558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch case attr::IBOutletCollection: return CXCursor_IBOutletCollectionAttr; 44558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 45558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 46558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return CXCursor_UnexposedAttr; 47558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 48558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 49558790d6acca3451cf3a6b497803a5f07d0bec58Ben MurdochCXCursor cxcursor::MakeCXCursor(const Attr *A, Decl *Parent, 50558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch CXTranslationUnit TU) { 51558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch assert(A && Parent && TU && "Invalid arguments!"); 52558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch CXCursor C = { GetCursorKind(A), { Parent, (void*)A, TU } }; 53558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return C; 54558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 55558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 56558790d6acca3451cf3a6b497803a5f07d0bec58Ben MurdochCXCursor cxcursor::MakeCXCursor(Decl *D, CXTranslationUnit TU, 57558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch bool FirstInDeclGroup) { 58558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch assert(D && TU && "Invalid arguments!"); 59558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch CXCursor C = { getCursorKindForDecl(D), 60558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch { D, (void*)(intptr_t) (FirstInDeclGroup ? 1 : 0), TU } 61558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch }; 62558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return C; 63558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 64558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 65558790d6acca3451cf3a6b497803a5f07d0bec58Ben MurdochCXCursor cxcursor::MakeCXCursor(Stmt *S, Decl *Parent, 66558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch CXTranslationUnit TU) { 67558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch assert(S && TU && "Invalid arguments!"); 68558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch CXCursorKind K = CXCursor_NotImplemented; 697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 70558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch switch (S->getStmtClass()) { 71558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch case Stmt::NoStmtClass: 727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case Stmt::NullStmtClass: 757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case Stmt::CompoundStmtClass: 767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case Stmt::CaseStmtClass: 777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case Stmt::DefaultStmtClass: 787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case Stmt::IfStmtClass: 797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case Stmt::SwitchStmtClass: 807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case Stmt::WhileStmtClass: 817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case Stmt::DoStmtClass: 827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case Stmt::ForStmtClass: 837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case Stmt::GotoStmtClass: 847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case Stmt::IndirectGotoStmtClass: 859ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch case Stmt::ContinueStmtClass: 867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case Stmt::BreakStmtClass: 877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case Stmt::ReturnStmtClass: 887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case Stmt::DeclStmtClass: 899ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch case Stmt::AsmStmtClass: 907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case Stmt::ObjCAtTryStmtClass: 91558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch case Stmt::ObjCAtCatchStmtClass: 927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case Stmt::ObjCAtFinallyStmtClass: 937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case Stmt::ObjCAtThrowStmtClass: 947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case Stmt::ObjCAtSynchronizedStmtClass: 95558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch case Stmt::ObjCAutoreleasePoolStmtClass: 967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case Stmt::ObjCForCollectionStmtClass: 977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case Stmt::CXXCatchStmtClass: 989ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch case Stmt::CXXTryStmtClass: 997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case Stmt::CXXForRangeStmtClass: 1007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case Stmt::SEHTryStmtClass: 1017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case Stmt::SEHExceptStmtClass: 1027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case Stmt::SEHFinallyStmtClass: 1037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case Stmt::MaterializeTemporaryExprClass: 1047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch K = CXCursor_UnexposedStmt; 1057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 1067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case Stmt::LabelStmtClass: 1087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch K = CXCursor_LabelStmt; 1097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 110558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 1117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case Stmt::PredefinedExprClass: 1127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case Stmt::IntegerLiteralClass: 1137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case Stmt::FloatingLiteralClass: 1147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case Stmt::ImaginaryLiteralClass: 1157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case Stmt::StringLiteralClass: 1167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case Stmt::CharacterLiteralClass: 1177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case Stmt::ParenExprClass: 1187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case Stmt::UnaryOperatorClass: 1197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case Stmt::OffsetOfExprClass: 1207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case Stmt::UnaryExprOrTypeTraitExprClass: 1217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case Stmt::ArraySubscriptExprClass: 1227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case Stmt::BinaryOperatorClass: 1237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case Stmt::CompoundAssignOperatorClass: 1247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case Stmt::ConditionalOperatorClass: 1259ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch case Stmt::BinaryConditionalOperatorClass: 1267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case Stmt::ImplicitCastExprClass: 1277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case Stmt::CStyleCastExprClass: 1287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case Stmt::CompoundLiteralExprClass: 1297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case Stmt::ExtVectorElementExprClass: 1307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case Stmt::InitListExprClass: 1317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case Stmt::DesignatedInitExprClass: 132558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch case Stmt::ImplicitValueInitExprClass: 133558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch case Stmt::ParenListExprClass: 134558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch case Stmt::VAArgExprClass: 135558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch case Stmt::AddrLabelExprClass: 136558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch case Stmt::StmtExprClass: 137558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch case Stmt::ChooseExprClass: 138558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch case Stmt::GenericSelectionExprClass: 139558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch case Stmt::GNUNullExprClass: 140558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch case Stmt::CXXStaticCastExprClass: 141558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch case Stmt::CXXDynamicCastExprClass: 142558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch case Stmt::CXXReinterpretCastExprClass: 143558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch case Stmt::CXXConstCastExprClass: 144558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch case Stmt::CXXFunctionalCastExprClass: 145558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch case Stmt::CXXTypeidExprClass: 146558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch case Stmt::CXXUuidofExprClass: 147558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch case Stmt::CXXBoolLiteralExprClass: 148558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch case Stmt::CXXNullPtrLiteralExprClass: 149558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch case Stmt::CXXThisExprClass: 150558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch case Stmt::CXXThrowExprClass: 151558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch case Stmt::CXXDefaultArgExprClass: 152558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch case Stmt::CXXScalarValueInitExprClass: 153558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch case Stmt::CXXNewExprClass: 154558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch case Stmt::CXXDeleteExprClass: 155558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch case Stmt::CXXPseudoDestructorExprClass: 156558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch case Stmt::UnresolvedLookupExprClass: 157558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch case Stmt::UnaryTypeTraitExprClass: 158558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch case Stmt::BinaryTypeTraitExprClass: 1597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case Stmt::ArrayTypeTraitExprClass: 1607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case Stmt::ExpressionTraitExprClass: 1617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case Stmt::DependentScopeDeclRefExprClass: 1627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case Stmt::CXXBindTemporaryExprClass: 1637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case Stmt::ExprWithCleanupsClass: 1647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case Stmt::CXXUnresolvedConstructExprClass: 1657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case Stmt::CXXDependentScopeMemberExprClass: 166558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch case Stmt::UnresolvedMemberExprClass: 1679ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch case Stmt::CXXNoexceptExprClass: 1689ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch case Stmt::ObjCStringLiteralClass: 1699ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch case Stmt::ObjCEncodeExprClass: 1709ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch case Stmt::ObjCSelectorExprClass: 1719ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch case Stmt::ObjCProtocolExprClass: 1729ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch case Stmt::ObjCIsaExprClass: 1739ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch case Stmt::ObjCIndirectCopyRestoreExprClass: 1749ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch case Stmt::ObjCBridgedCastExprClass: 1759ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch case Stmt::ShuffleVectorExprClass: 1767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case Stmt::BlockExprClass: 1777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case Stmt::OpaqueValueExprClass: 1789ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch case Stmt::PackExpansionExprClass: 1797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case Stmt::SizeOfPackExprClass: 1807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case Stmt::AsTypeExprClass: 1817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch K = CXCursor_UnexposedExpr; 1829ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch break; 1839ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch 1849ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch case Stmt::DeclRefExprClass: 1857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case Stmt::BlockDeclRefExprClass: 1867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case Stmt::SubstNonTypeTemplateParmExprClass: 1877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case Stmt::SubstNonTypeTemplateParmPackExprClass: 1887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // FIXME: UnresolvedLookupExpr? 189558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // FIXME: DependentScopeDeclRefExpr? 190558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch K = CXCursor_DeclRefExpr; 191558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch break; 192558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 193558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch case Stmt::MemberExprClass: 194558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch case Stmt::ObjCIvarRefExprClass: 195558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch case Stmt::ObjCPropertyRefExprClass: 196558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // FIXME: UnresolvedMemberExpr? 197558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // FIXME: CXXDependentScopeMemberExpr? 198558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch K = CXCursor_MemberRefExpr; 199558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch break; 200558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 2017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case Stmt::CallExprClass: 2027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case Stmt::CXXOperatorCallExprClass: 2037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case Stmt::CXXMemberCallExprClass: 2047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case Stmt::CUDAKernelCallExprClass: 2057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case Stmt::CXXConstructExprClass: 2067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case Stmt::CXXTemporaryObjectExprClass: 2077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // FIXME: CXXUnresolvedConstructExpr 2087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch K = CXCursor_CallExpr; 2097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 2107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2119ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch case Stmt::ObjCMessageExprClass: 2129ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch K = CXCursor_ObjCMessageExpr; 2137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 2147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 2157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CXCursor C = { K, { Parent, S, TU } }; 2177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return C; 2187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 2197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2207dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochCXCursor cxcursor::MakeCursorObjCSuperClassRef(ObjCInterfaceDecl *Super, 2217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SourceLocation Loc, 2227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CXTranslationUnit TU) { 223 assert(Super && TU && "Invalid arguments!"); 224 void *RawLoc = reinterpret_cast<void *>(Loc.getRawEncoding()); 225 CXCursor C = { CXCursor_ObjCSuperClassRef, { Super, RawLoc, TU } }; 226 return C; 227} 228 229std::pair<ObjCInterfaceDecl *, SourceLocation> 230cxcursor::getCursorObjCSuperClassRef(CXCursor C) { 231 assert(C.kind == CXCursor_ObjCSuperClassRef); 232 return std::make_pair(static_cast<ObjCInterfaceDecl *>(C.data[0]), 233 SourceLocation::getFromRawEncoding( 234 reinterpret_cast<uintptr_t>(C.data[1]))); 235} 236 237CXCursor cxcursor::MakeCursorObjCProtocolRef(ObjCProtocolDecl *Super, 238 SourceLocation Loc, 239 CXTranslationUnit TU) { 240 assert(Super && TU && "Invalid arguments!"); 241 void *RawLoc = reinterpret_cast<void *>(Loc.getRawEncoding()); 242 CXCursor C = { CXCursor_ObjCProtocolRef, { Super, RawLoc, TU } }; 243 return C; 244} 245 246std::pair<ObjCProtocolDecl *, SourceLocation> 247cxcursor::getCursorObjCProtocolRef(CXCursor C) { 248 assert(C.kind == CXCursor_ObjCProtocolRef); 249 return std::make_pair(static_cast<ObjCProtocolDecl *>(C.data[0]), 250 SourceLocation::getFromRawEncoding( 251 reinterpret_cast<uintptr_t>(C.data[1]))); 252} 253 254CXCursor cxcursor::MakeCursorObjCClassRef(ObjCInterfaceDecl *Class, 255 SourceLocation Loc, 256 CXTranslationUnit TU) { 257 // 'Class' can be null for invalid code. 258 if (!Class) 259 return MakeCXCursorInvalid(CXCursor_InvalidCode); 260 assert(TU && "Invalid arguments!"); 261 void *RawLoc = reinterpret_cast<void *>(Loc.getRawEncoding()); 262 CXCursor C = { CXCursor_ObjCClassRef, { Class, RawLoc, TU } }; 263 return C; 264} 265 266std::pair<ObjCInterfaceDecl *, SourceLocation> 267cxcursor::getCursorObjCClassRef(CXCursor C) { 268 assert(C.kind == CXCursor_ObjCClassRef); 269 return std::make_pair(static_cast<ObjCInterfaceDecl *>(C.data[0]), 270 SourceLocation::getFromRawEncoding( 271 reinterpret_cast<uintptr_t>(C.data[1]))); 272} 273 274CXCursor cxcursor::MakeCursorTypeRef(TypeDecl *Type, SourceLocation Loc, 275 CXTranslationUnit TU) { 276 assert(Type && TU && "Invalid arguments!"); 277 void *RawLoc = reinterpret_cast<void *>(Loc.getRawEncoding()); 278 CXCursor C = { CXCursor_TypeRef, { Type, RawLoc, TU } }; 279 return C; 280} 281 282std::pair<TypeDecl *, SourceLocation> 283cxcursor::getCursorTypeRef(CXCursor C) { 284 assert(C.kind == CXCursor_TypeRef); 285 return std::make_pair(static_cast<TypeDecl *>(C.data[0]), 286 SourceLocation::getFromRawEncoding( 287 reinterpret_cast<uintptr_t>(C.data[1]))); 288} 289 290CXCursor cxcursor::MakeCursorTemplateRef(TemplateDecl *Template, 291 SourceLocation Loc, 292 CXTranslationUnit TU) { 293 assert(Template && TU && "Invalid arguments!"); 294 void *RawLoc = reinterpret_cast<void *>(Loc.getRawEncoding()); 295 CXCursor C = { CXCursor_TemplateRef, { Template, RawLoc, TU } }; 296 return C; 297} 298 299std::pair<TemplateDecl *, SourceLocation> 300cxcursor::getCursorTemplateRef(CXCursor C) { 301 assert(C.kind == CXCursor_TemplateRef); 302 return std::make_pair(static_cast<TemplateDecl *>(C.data[0]), 303 SourceLocation::getFromRawEncoding( 304 reinterpret_cast<uintptr_t>(C.data[1]))); 305} 306 307CXCursor cxcursor::MakeCursorNamespaceRef(NamedDecl *NS, SourceLocation Loc, 308 CXTranslationUnit TU) { 309 310 assert(NS && (isa<NamespaceDecl>(NS) || isa<NamespaceAliasDecl>(NS)) && TU && 311 "Invalid arguments!"); 312 void *RawLoc = reinterpret_cast<void *>(Loc.getRawEncoding()); 313 CXCursor C = { CXCursor_NamespaceRef, { NS, RawLoc, TU } }; 314 return C; 315} 316 317std::pair<NamedDecl *, SourceLocation> 318cxcursor::getCursorNamespaceRef(CXCursor C) { 319 assert(C.kind == CXCursor_NamespaceRef); 320 return std::make_pair(static_cast<NamedDecl *>(C.data[0]), 321 SourceLocation::getFromRawEncoding( 322 reinterpret_cast<uintptr_t>(C.data[1]))); 323} 324 325CXCursor cxcursor::MakeCursorMemberRef(FieldDecl *Field, SourceLocation Loc, 326 CXTranslationUnit TU) { 327 328 assert(Field && TU && "Invalid arguments!"); 329 void *RawLoc = reinterpret_cast<void *>(Loc.getRawEncoding()); 330 CXCursor C = { CXCursor_MemberRef, { Field, RawLoc, TU } }; 331 return C; 332} 333 334std::pair<FieldDecl *, SourceLocation> 335cxcursor::getCursorMemberRef(CXCursor C) { 336 assert(C.kind == CXCursor_MemberRef); 337 return std::make_pair(static_cast<FieldDecl *>(C.data[0]), 338 SourceLocation::getFromRawEncoding( 339 reinterpret_cast<uintptr_t>(C.data[1]))); 340} 341 342CXCursor cxcursor::MakeCursorCXXBaseSpecifier(CXXBaseSpecifier *B, 343 CXTranslationUnit TU){ 344 CXCursor C = { CXCursor_CXXBaseSpecifier, { B, 0, TU } }; 345 return C; 346} 347 348CXXBaseSpecifier *cxcursor::getCursorCXXBaseSpecifier(CXCursor C) { 349 assert(C.kind == CXCursor_CXXBaseSpecifier); 350 return static_cast<CXXBaseSpecifier*>(C.data[0]); 351} 352 353CXCursor cxcursor::MakePreprocessingDirectiveCursor(SourceRange Range, 354 CXTranslationUnit TU) { 355 CXCursor C = { CXCursor_PreprocessingDirective, 356 { reinterpret_cast<void *>(Range.getBegin().getRawEncoding()), 357 reinterpret_cast<void *>(Range.getEnd().getRawEncoding()), 358 TU } 359 }; 360 return C; 361} 362 363SourceRange cxcursor::getCursorPreprocessingDirective(CXCursor C) { 364 assert(C.kind == CXCursor_PreprocessingDirective); 365 return SourceRange(SourceLocation::getFromRawEncoding( 366 reinterpret_cast<uintptr_t> (C.data[0])), 367 SourceLocation::getFromRawEncoding( 368 reinterpret_cast<uintptr_t> (C.data[1]))); 369} 370 371CXCursor cxcursor::MakeMacroDefinitionCursor(MacroDefinition *MI, 372 CXTranslationUnit TU) { 373 CXCursor C = { CXCursor_MacroDefinition, { MI, 0, TU } }; 374 return C; 375} 376 377MacroDefinition *cxcursor::getCursorMacroDefinition(CXCursor C) { 378 assert(C.kind == CXCursor_MacroDefinition); 379 return static_cast<MacroDefinition *>(C.data[0]); 380} 381 382CXCursor cxcursor::MakeMacroExpansionCursor(MacroExpansion *MI, 383 CXTranslationUnit TU) { 384 CXCursor C = { CXCursor_MacroExpansion, { MI, 0, TU } }; 385 return C; 386} 387 388MacroExpansion *cxcursor::getCursorMacroExpansion(CXCursor C) { 389 assert(C.kind == CXCursor_MacroExpansion); 390 return static_cast<MacroExpansion *>(C.data[0]); 391} 392 393CXCursor cxcursor::MakeInclusionDirectiveCursor(InclusionDirective *ID, 394 CXTranslationUnit TU) { 395 CXCursor C = { CXCursor_InclusionDirective, { ID, 0, TU } }; 396 return C; 397} 398 399InclusionDirective *cxcursor::getCursorInclusionDirective(CXCursor C) { 400 assert(C.kind == CXCursor_InclusionDirective); 401 return static_cast<InclusionDirective *>(C.data[0]); 402} 403 404CXCursor cxcursor::MakeCursorLabelRef(LabelStmt *Label, SourceLocation Loc, 405 CXTranslationUnit TU) { 406 407 assert(Label && TU && "Invalid arguments!"); 408 void *RawLoc = reinterpret_cast<void *>(Loc.getRawEncoding()); 409 CXCursor C = { CXCursor_LabelRef, { Label, RawLoc, TU } }; 410 return C; 411} 412 413std::pair<LabelStmt*, SourceLocation> 414cxcursor::getCursorLabelRef(CXCursor C) { 415 assert(C.kind == CXCursor_LabelRef); 416 return std::make_pair(static_cast<LabelStmt *>(C.data[0]), 417 SourceLocation::getFromRawEncoding( 418 reinterpret_cast<uintptr_t>(C.data[1]))); 419} 420 421CXCursor cxcursor::MakeCursorOverloadedDeclRef(OverloadExpr *E, 422 CXTranslationUnit TU) { 423 assert(E && TU && "Invalid arguments!"); 424 OverloadedDeclRefStorage Storage(E); 425 void *RawLoc = reinterpret_cast<void *>(E->getNameLoc().getRawEncoding()); 426 CXCursor C = { 427 CXCursor_OverloadedDeclRef, 428 { Storage.getOpaqueValue(), RawLoc, TU } 429 }; 430 return C; 431} 432 433CXCursor cxcursor::MakeCursorOverloadedDeclRef(Decl *D, 434 SourceLocation Loc, 435 CXTranslationUnit TU) { 436 assert(D && TU && "Invalid arguments!"); 437 void *RawLoc = reinterpret_cast<void *>(Loc.getRawEncoding()); 438 OverloadedDeclRefStorage Storage(D); 439 CXCursor C = { 440 CXCursor_OverloadedDeclRef, 441 { Storage.getOpaqueValue(), RawLoc, TU } 442 }; 443 return C; 444} 445 446CXCursor cxcursor::MakeCursorOverloadedDeclRef(TemplateName Name, 447 SourceLocation Loc, 448 CXTranslationUnit TU) { 449 assert(Name.getAsOverloadedTemplate() && TU && "Invalid arguments!"); 450 void *RawLoc = reinterpret_cast<void *>(Loc.getRawEncoding()); 451 OverloadedDeclRefStorage Storage(Name.getAsOverloadedTemplate()); 452 CXCursor C = { 453 CXCursor_OverloadedDeclRef, 454 { Storage.getOpaqueValue(), RawLoc, TU } 455 }; 456 return C; 457} 458 459std::pair<cxcursor::OverloadedDeclRefStorage, SourceLocation> 460cxcursor::getCursorOverloadedDeclRef(CXCursor C) { 461 assert(C.kind == CXCursor_OverloadedDeclRef); 462 return std::make_pair(OverloadedDeclRefStorage::getFromOpaqueValue(C.data[0]), 463 SourceLocation::getFromRawEncoding( 464 reinterpret_cast<uintptr_t>(C.data[1]))); 465} 466 467Decl *cxcursor::getCursorDecl(CXCursor Cursor) { 468 return (Decl *)Cursor.data[0]; 469} 470 471Expr *cxcursor::getCursorExpr(CXCursor Cursor) { 472 return dyn_cast_or_null<Expr>(getCursorStmt(Cursor)); 473} 474 475Stmt *cxcursor::getCursorStmt(CXCursor Cursor) { 476 if (Cursor.kind == CXCursor_ObjCSuperClassRef || 477 Cursor.kind == CXCursor_ObjCProtocolRef || 478 Cursor.kind == CXCursor_ObjCClassRef) 479 return 0; 480 481 return (Stmt *)Cursor.data[1]; 482} 483 484Attr *cxcursor::getCursorAttr(CXCursor Cursor) { 485 return (Attr *)Cursor.data[1]; 486} 487 488Decl *cxcursor::getCursorParentDecl(CXCursor Cursor) { 489 return (Decl *)Cursor.data[0]; 490} 491 492ASTContext &cxcursor::getCursorContext(CXCursor Cursor) { 493 return getCursorASTUnit(Cursor)->getASTContext(); 494} 495 496ASTUnit *cxcursor::getCursorASTUnit(CXCursor Cursor) { 497 return static_cast<ASTUnit *>(static_cast<CXTranslationUnit>(Cursor.data[2]) 498 ->TUData); 499} 500 501CXTranslationUnit cxcursor::getCursorTU(CXCursor Cursor) { 502 return static_cast<CXTranslationUnit>(Cursor.data[2]); 503} 504 505bool cxcursor::operator==(CXCursor X, CXCursor Y) { 506 return X.kind == Y.kind && X.data[0] == Y.data[0] && X.data[1] == Y.data[1] && 507 X.data[2] == Y.data[2]; 508} 509 510// FIXME: Remove once we can model DeclGroups and their appropriate ranges 511// properly in the ASTs. 512bool cxcursor::isFirstInDeclGroup(CXCursor C) { 513 assert(clang_isDeclaration(C.kind)); 514 return ((uintptr_t) (C.data[1])) != 0; 515} 516 517//===----------------------------------------------------------------------===// 518// CXCursorSet. 519//===----------------------------------------------------------------------===// 520 521typedef llvm::DenseMap<CXCursor, unsigned> CXCursorSet_Impl; 522 523static inline CXCursorSet packCXCursorSet(CXCursorSet_Impl *setImpl) { 524 return (CXCursorSet) setImpl; 525} 526static inline CXCursorSet_Impl *unpackCXCursorSet(CXCursorSet set) { 527 return (CXCursorSet_Impl*) set; 528} 529namespace llvm { 530template<> struct DenseMapInfo<CXCursor> { 531public: 532 static inline CXCursor getEmptyKey() { 533 return MakeCXCursorInvalid(CXCursor_InvalidFile); 534 } 535 static inline CXCursor getTombstoneKey() { 536 return MakeCXCursorInvalid(CXCursor_NoDeclFound); 537 } 538 static inline unsigned getHashValue(const CXCursor &cursor) { 539 return llvm::DenseMapInfo<std::pair<void*,void*> > 540 ::getHashValue(std::make_pair(cursor.data[0], cursor.data[1])); 541 } 542 static inline bool isEqual(const CXCursor &x, const CXCursor &y) { 543 return x.kind == y.kind && 544 x.data[0] == y.data[0] && 545 x.data[1] == y.data[1]; 546 } 547}; 548} 549 550extern "C" { 551CXCursorSet clang_createCXCursorSet() { 552 return packCXCursorSet(new CXCursorSet_Impl()); 553} 554 555void clang_disposeCXCursorSet(CXCursorSet set) { 556 delete unpackCXCursorSet(set); 557} 558 559unsigned clang_CXCursorSet_contains(CXCursorSet set, CXCursor cursor) { 560 CXCursorSet_Impl *setImpl = unpackCXCursorSet(set); 561 if (!setImpl) 562 return 0; 563 return setImpl->find(cursor) == setImpl->end(); 564} 565 566unsigned clang_CXCursorSet_insert(CXCursorSet set, CXCursor cursor) { 567 // Do not insert invalid cursors into the set. 568 if (cursor.kind >= CXCursor_FirstInvalid && 569 cursor.kind <= CXCursor_LastInvalid) 570 return 1; 571 572 CXCursorSet_Impl *setImpl = unpackCXCursorSet(set); 573 if (!setImpl) 574 return 1; 575 unsigned &entry = (*setImpl)[cursor]; 576 unsigned flag = entry == 0 ? 1 : 0; 577 entry = 1; 578 return flag; 579} 580 581CXCompletionString clang_getCursorCompletionString(CXCursor cursor) { 582 enum CXCursorKind kind = clang_getCursorKind(cursor); 583 if (clang_isDeclaration(kind)) { 584 Decl *decl = getCursorDecl(cursor); 585 if (isa<NamedDecl>(decl)) { 586 NamedDecl *namedDecl = (NamedDecl *)decl; 587 ASTUnit *unit = getCursorASTUnit(cursor); 588 if (unit->hasSema()) { 589 Sema &S = unit->getSema(); 590 CodeCompletionAllocator *Allocator 591 = unit->getCursorCompletionAllocator().getPtr(); 592 CodeCompletionResult Result(namedDecl); 593 CodeCompletionString *String 594 = Result.CreateCodeCompletionString(S, *Allocator); 595 return String; 596 } 597 } 598 } 599 else if (kind == CXCursor_MacroDefinition) { 600 MacroDefinition *definition = getCursorMacroDefinition(cursor); 601 const IdentifierInfo *MacroInfo = definition->getName(); 602 ASTUnit *unit = getCursorASTUnit(cursor); 603 if (unit->hasSema()) { 604 Sema &S = unit->getSema(); 605 CodeCompletionAllocator *Allocator 606 = unit->getCursorCompletionAllocator().getPtr(); 607 CodeCompletionResult Result((IdentifierInfo *)MacroInfo); 608 CodeCompletionString *String 609 = Result.CreateCodeCompletionString(S, *Allocator); 610 return String; 611 } 612 } 613 return NULL; 614} 615 616} // end: extern "C" 617