1 //===- CXCursor.cpp - Routines for manipulating CXCursors -----------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file defines routines for manipulating CXCursors. It should be the
11 // only file that has internal knowledge of the encoding of the data in
14 //===----------------------------------------------------------------------===//
16 #include "CXTranslationUnit.h"
20 #include "clang-c/Index.h"
21 #include "clang/AST/Attr.h"
22 #include "clang/AST/Decl.h"
23 #include "clang/AST/DeclCXX.h"
24 #include "clang/AST/DeclObjC.h"
25 #include "clang/AST/DeclTemplate.h"
26 #include "clang/AST/Expr.h"
27 #include "clang/AST/ExprCXX.h"
28 #include "clang/AST/ExprObjC.h"
29 #include "clang/Frontend/ASTUnit.h"
30 #include "llvm/Support/ErrorHandling.h"
32 using namespace clang;
33 using namespace cxcursor;
35 CXCursor cxcursor::MakeCXCursorInvalid(CXCursorKind K, CXTranslationUnit TU) {
36 assert(K >= CXCursor_FirstInvalid && K <= CXCursor_LastInvalid);
37 CXCursor C = { K, 0, { 0, 0, TU } };
41 static CXCursorKind GetCursorKind(const Attr *A) {
42 assert(A && "Invalid arguments!");
43 switch (A->getKind()) {
45 case attr::IBAction: return CXCursor_IBActionAttr;
46 case attr::IBOutlet: return CXCursor_IBOutletAttr;
47 case attr::IBOutletCollection: return CXCursor_IBOutletCollectionAttr;
48 case attr::Final: return CXCursor_CXXFinalAttr;
49 case attr::Override: return CXCursor_CXXOverrideAttr;
50 case attr::Annotate: return CXCursor_AnnotateAttr;
51 case attr::AsmLabel: return CXCursor_AsmLabelAttr;
52 case attr::Packed: return CXCursor_PackedAttr;
55 return CXCursor_UnexposedAttr;
58 CXCursor cxcursor::MakeCXCursor(const Attr *A, const Decl *Parent,
59 CXTranslationUnit TU) {
60 assert(A && Parent && TU && "Invalid arguments!");
61 CXCursor C = { GetCursorKind(A), 0, { Parent, A, TU } };
65 CXCursor cxcursor::MakeCXCursor(const Decl *D, CXTranslationUnit TU,
66 SourceRange RegionOfInterest,
67 bool FirstInDeclGroup) {
68 assert(D && TU && "Invalid arguments!");
70 CXCursorKind K = getCursorKindForDecl(D);
72 if (K == CXCursor_ObjCClassMethodDecl ||
73 K == CXCursor_ObjCInstanceMethodDecl) {
74 int SelectorIdIndex = -1;
75 // Check if cursor points to a selector id.
76 if (RegionOfInterest.isValid() &&
77 RegionOfInterest.getBegin() == RegionOfInterest.getEnd()) {
78 SmallVector<SourceLocation, 16> SelLocs;
79 cast<ObjCMethodDecl>(D)->getSelectorLocs(SelLocs);
80 SmallVectorImpl<SourceLocation>::iterator
81 I=std::find(SelLocs.begin(), SelLocs.end(),RegionOfInterest.getBegin());
82 if (I != SelLocs.end())
83 SelectorIdIndex = I - SelLocs.begin();
85 CXCursor C = { K, SelectorIdIndex,
86 { D, (void*)(intptr_t) (FirstInDeclGroup ? 1 : 0), TU }};
90 CXCursor C = { K, 0, { D, (void*)(intptr_t) (FirstInDeclGroup ? 1 : 0), TU }};
94 CXCursor cxcursor::MakeCXCursor(const Stmt *S, const Decl *Parent,
96 SourceRange RegionOfInterest) {
97 assert(S && TU && "Invalid arguments!");
98 CXCursorKind K = CXCursor_NotImplemented;
100 switch (S->getStmtClass()) {
101 case Stmt::NoStmtClass:
104 case Stmt::CaseStmtClass:
105 K = CXCursor_CaseStmt;
108 case Stmt::DefaultStmtClass:
109 K = CXCursor_DefaultStmt;
112 case Stmt::IfStmtClass:
116 case Stmt::SwitchStmtClass:
117 K = CXCursor_SwitchStmt;
120 case Stmt::WhileStmtClass:
121 K = CXCursor_WhileStmt;
124 case Stmt::DoStmtClass:
128 case Stmt::ForStmtClass:
129 K = CXCursor_ForStmt;
132 case Stmt::GotoStmtClass:
133 K = CXCursor_GotoStmt;
136 case Stmt::IndirectGotoStmtClass:
137 K = CXCursor_IndirectGotoStmt;
140 case Stmt::ContinueStmtClass:
141 K = CXCursor_ContinueStmt;
144 case Stmt::BreakStmtClass:
145 K = CXCursor_BreakStmt;
148 case Stmt::ReturnStmtClass:
149 K = CXCursor_ReturnStmt;
152 case Stmt::GCCAsmStmtClass:
153 K = CXCursor_GCCAsmStmt;
156 case Stmt::MSAsmStmtClass:
157 K = CXCursor_MSAsmStmt;
160 case Stmt::ObjCAtTryStmtClass:
161 K = CXCursor_ObjCAtTryStmt;
164 case Stmt::ObjCAtCatchStmtClass:
165 K = CXCursor_ObjCAtCatchStmt;
168 case Stmt::ObjCAtFinallyStmtClass:
169 K = CXCursor_ObjCAtFinallyStmt;
172 case Stmt::ObjCAtThrowStmtClass:
173 K = CXCursor_ObjCAtThrowStmt;
176 case Stmt::ObjCAtSynchronizedStmtClass:
177 K = CXCursor_ObjCAtSynchronizedStmt;
180 case Stmt::ObjCAutoreleasePoolStmtClass:
181 K = CXCursor_ObjCAutoreleasePoolStmt;
184 case Stmt::ObjCForCollectionStmtClass:
185 K = CXCursor_ObjCForCollectionStmt;
188 case Stmt::CXXCatchStmtClass:
189 K = CXCursor_CXXCatchStmt;
192 case Stmt::CXXTryStmtClass:
193 K = CXCursor_CXXTryStmt;
196 case Stmt::CXXForRangeStmtClass:
197 K = CXCursor_CXXForRangeStmt;
200 case Stmt::SEHTryStmtClass:
201 K = CXCursor_SEHTryStmt;
204 case Stmt::SEHExceptStmtClass:
205 K = CXCursor_SEHExceptStmt;
208 case Stmt::SEHFinallyStmtClass:
209 K = CXCursor_SEHFinallyStmt;
212 case Stmt::ArrayTypeTraitExprClass:
213 case Stmt::AsTypeExprClass:
214 case Stmt::AtomicExprClass:
215 case Stmt::BinaryConditionalOperatorClass:
216 case Stmt::BinaryTypeTraitExprClass:
217 case Stmt::TypeTraitExprClass:
218 case Stmt::CXXBindTemporaryExprClass:
219 case Stmt::CXXDefaultArgExprClass:
220 case Stmt::CXXDefaultInitExprClass:
221 case Stmt::CXXStdInitializerListExprClass:
222 case Stmt::CXXScalarValueInitExprClass:
223 case Stmt::CXXUuidofExprClass:
224 case Stmt::ChooseExprClass:
225 case Stmt::DesignatedInitExprClass:
226 case Stmt::ExprWithCleanupsClass:
227 case Stmt::ExpressionTraitExprClass:
228 case Stmt::ExtVectorElementExprClass:
229 case Stmt::ImplicitCastExprClass:
230 case Stmt::ImplicitValueInitExprClass:
231 case Stmt::MaterializeTemporaryExprClass:
232 case Stmt::ObjCIndirectCopyRestoreExprClass:
233 case Stmt::OffsetOfExprClass:
234 case Stmt::ParenListExprClass:
235 case Stmt::PredefinedExprClass:
236 case Stmt::ShuffleVectorExprClass:
237 case Stmt::ConvertVectorExprClass:
238 case Stmt::UnaryExprOrTypeTraitExprClass:
239 case Stmt::UnaryTypeTraitExprClass:
240 case Stmt::VAArgExprClass:
241 case Stmt::ObjCArrayLiteralClass:
242 case Stmt::ObjCDictionaryLiteralClass:
243 case Stmt::ObjCBoxedExprClass:
244 case Stmt::ObjCSubscriptRefExprClass:
245 K = CXCursor_UnexposedExpr;
248 case Stmt::OpaqueValueExprClass:
249 if (Expr *Src = cast<OpaqueValueExpr>(S)->getSourceExpr())
250 return MakeCXCursor(Src, Parent, TU, RegionOfInterest);
251 K = CXCursor_UnexposedExpr;
254 case Stmt::PseudoObjectExprClass:
255 return MakeCXCursor(cast<PseudoObjectExpr>(S)->getSyntacticForm(),
256 Parent, TU, RegionOfInterest);
258 case Stmt::CompoundStmtClass:
259 K = CXCursor_CompoundStmt;
262 case Stmt::NullStmtClass:
263 K = CXCursor_NullStmt;
266 case Stmt::LabelStmtClass:
267 K = CXCursor_LabelStmt;
270 case Stmt::AttributedStmtClass:
271 K = CXCursor_UnexposedStmt;
274 case Stmt::DeclStmtClass:
275 K = CXCursor_DeclStmt;
278 case Stmt::CapturedStmtClass:
279 K = CXCursor_UnexposedStmt;
282 case Stmt::IntegerLiteralClass:
283 K = CXCursor_IntegerLiteral;
286 case Stmt::FloatingLiteralClass:
287 K = CXCursor_FloatingLiteral;
290 case Stmt::ImaginaryLiteralClass:
291 K = CXCursor_ImaginaryLiteral;
294 case Stmt::StringLiteralClass:
295 K = CXCursor_StringLiteral;
298 case Stmt::CharacterLiteralClass:
299 K = CXCursor_CharacterLiteral;
302 case Stmt::ParenExprClass:
303 K = CXCursor_ParenExpr;
306 case Stmt::UnaryOperatorClass:
307 K = CXCursor_UnaryOperator;
310 case Stmt::CXXNoexceptExprClass:
311 K = CXCursor_UnaryExpr;
314 case Stmt::ArraySubscriptExprClass:
315 K = CXCursor_ArraySubscriptExpr;
318 case Stmt::BinaryOperatorClass:
319 K = CXCursor_BinaryOperator;
322 case Stmt::CompoundAssignOperatorClass:
323 K = CXCursor_CompoundAssignOperator;
326 case Stmt::ConditionalOperatorClass:
327 K = CXCursor_ConditionalOperator;
330 case Stmt::CStyleCastExprClass:
331 K = CXCursor_CStyleCastExpr;
334 case Stmt::CompoundLiteralExprClass:
335 K = CXCursor_CompoundLiteralExpr;
338 case Stmt::InitListExprClass:
339 K = CXCursor_InitListExpr;
342 case Stmt::AddrLabelExprClass:
343 K = CXCursor_AddrLabelExpr;
346 case Stmt::StmtExprClass:
347 K = CXCursor_StmtExpr;
350 case Stmt::GenericSelectionExprClass:
351 K = CXCursor_GenericSelectionExpr;
354 case Stmt::GNUNullExprClass:
355 K = CXCursor_GNUNullExpr;
358 case Stmt::CXXStaticCastExprClass:
359 K = CXCursor_CXXStaticCastExpr;
362 case Stmt::CXXDynamicCastExprClass:
363 K = CXCursor_CXXDynamicCastExpr;
366 case Stmt::CXXReinterpretCastExprClass:
367 K = CXCursor_CXXReinterpretCastExpr;
370 case Stmt::CXXConstCastExprClass:
371 K = CXCursor_CXXConstCastExpr;
374 case Stmt::CXXFunctionalCastExprClass:
375 K = CXCursor_CXXFunctionalCastExpr;
378 case Stmt::CXXTypeidExprClass:
379 K = CXCursor_CXXTypeidExpr;
382 case Stmt::CXXBoolLiteralExprClass:
383 K = CXCursor_CXXBoolLiteralExpr;
386 case Stmt::CXXNullPtrLiteralExprClass:
387 K = CXCursor_CXXNullPtrLiteralExpr;
390 case Stmt::CXXThisExprClass:
391 K = CXCursor_CXXThisExpr;
394 case Stmt::CXXThrowExprClass:
395 K = CXCursor_CXXThrowExpr;
398 case Stmt::CXXNewExprClass:
399 K = CXCursor_CXXNewExpr;
402 case Stmt::CXXDeleteExprClass:
403 K = CXCursor_CXXDeleteExpr;
406 case Stmt::ObjCStringLiteralClass:
407 K = CXCursor_ObjCStringLiteral;
410 case Stmt::ObjCEncodeExprClass:
411 K = CXCursor_ObjCEncodeExpr;
414 case Stmt::ObjCSelectorExprClass:
415 K = CXCursor_ObjCSelectorExpr;
418 case Stmt::ObjCProtocolExprClass:
419 K = CXCursor_ObjCProtocolExpr;
422 case Stmt::ObjCBoolLiteralExprClass:
423 K = CXCursor_ObjCBoolLiteralExpr;
426 case Stmt::ObjCBridgedCastExprClass:
427 K = CXCursor_ObjCBridgedCastExpr;
430 case Stmt::BlockExprClass:
431 K = CXCursor_BlockExpr;
434 case Stmt::PackExpansionExprClass:
435 K = CXCursor_PackExpansionExpr;
438 case Stmt::SizeOfPackExprClass:
439 K = CXCursor_SizeOfPackExpr;
442 case Stmt::DeclRefExprClass:
443 if (const ImplicitParamDecl *IPD =
444 dyn_cast_or_null<ImplicitParamDecl>(cast<DeclRefExpr>(S)->getDecl())) {
445 if (const ObjCMethodDecl *MD =
446 dyn_cast<ObjCMethodDecl>(IPD->getDeclContext())) {
447 if (MD->getSelfDecl() == IPD) {
448 K = CXCursor_ObjCSelfExpr;
454 K = CXCursor_DeclRefExpr;
457 case Stmt::DependentScopeDeclRefExprClass:
458 case Stmt::SubstNonTypeTemplateParmExprClass:
459 case Stmt::SubstNonTypeTemplateParmPackExprClass:
460 case Stmt::FunctionParmPackExprClass:
461 case Stmt::UnresolvedLookupExprClass:
462 K = CXCursor_DeclRefExpr;
465 case Stmt::CXXDependentScopeMemberExprClass:
466 case Stmt::CXXPseudoDestructorExprClass:
467 case Stmt::MemberExprClass:
468 case Stmt::MSPropertyRefExprClass:
469 case Stmt::ObjCIsaExprClass:
470 case Stmt::ObjCIvarRefExprClass:
471 case Stmt::ObjCPropertyRefExprClass:
472 case Stmt::UnresolvedMemberExprClass:
473 K = CXCursor_MemberRefExpr;
476 case Stmt::CallExprClass:
477 case Stmt::CXXOperatorCallExprClass:
478 case Stmt::CXXMemberCallExprClass:
479 case Stmt::CUDAKernelCallExprClass:
480 case Stmt::CXXConstructExprClass:
481 case Stmt::CXXTemporaryObjectExprClass:
482 case Stmt::CXXUnresolvedConstructExprClass:
483 case Stmt::UserDefinedLiteralClass:
484 K = CXCursor_CallExpr;
487 case Stmt::LambdaExprClass:
488 K = CXCursor_LambdaExpr;
491 case Stmt::ObjCMessageExprClass: {
492 K = CXCursor_ObjCMessageExpr;
493 int SelectorIdIndex = -1;
494 // Check if cursor points to a selector id.
495 if (RegionOfInterest.isValid() &&
496 RegionOfInterest.getBegin() == RegionOfInterest.getEnd()) {
497 SmallVector<SourceLocation, 16> SelLocs;
498 cast<ObjCMessageExpr>(S)->getSelectorLocs(SelLocs);
499 SmallVectorImpl<SourceLocation>::iterator
500 I=std::find(SelLocs.begin(), SelLocs.end(),RegionOfInterest.getBegin());
501 if (I != SelLocs.end())
502 SelectorIdIndex = I - SelLocs.begin();
504 CXCursor C = { K, 0, { Parent, S, TU } };
505 return getSelectorIdentifierCursor(SelectorIdIndex, C);
508 case Stmt::MSDependentExistsStmtClass:
509 K = CXCursor_UnexposedStmt;
511 case Stmt::OMPParallelDirectiveClass:
512 K = CXCursor_OMPParallelDirective;
517 CXCursor C = { K, 0, { Parent, S, TU } };
521 CXCursor cxcursor::MakeCursorObjCSuperClassRef(ObjCInterfaceDecl *Super,
523 CXTranslationUnit TU) {
524 assert(Super && TU && "Invalid arguments!");
525 void *RawLoc = Loc.getPtrEncoding();
526 CXCursor C = { CXCursor_ObjCSuperClassRef, 0, { Super, RawLoc, TU } };
530 std::pair<const ObjCInterfaceDecl *, SourceLocation>
531 cxcursor::getCursorObjCSuperClassRef(CXCursor C) {
532 assert(C.kind == CXCursor_ObjCSuperClassRef);
533 return std::make_pair(static_cast<const ObjCInterfaceDecl *>(C.data[0]),
534 SourceLocation::getFromPtrEncoding(C.data[1]));
537 CXCursor cxcursor::MakeCursorObjCProtocolRef(const ObjCProtocolDecl *Proto,
539 CXTranslationUnit TU) {
540 assert(Proto && TU && "Invalid arguments!");
541 void *RawLoc = Loc.getPtrEncoding();
542 CXCursor C = { CXCursor_ObjCProtocolRef, 0, { Proto, RawLoc, TU } };
546 std::pair<const ObjCProtocolDecl *, SourceLocation>
547 cxcursor::getCursorObjCProtocolRef(CXCursor C) {
548 assert(C.kind == CXCursor_ObjCProtocolRef);
549 return std::make_pair(static_cast<const ObjCProtocolDecl *>(C.data[0]),
550 SourceLocation::getFromPtrEncoding(C.data[1]));
553 CXCursor cxcursor::MakeCursorObjCClassRef(const ObjCInterfaceDecl *Class,
555 CXTranslationUnit TU) {
556 // 'Class' can be null for invalid code.
558 return MakeCXCursorInvalid(CXCursor_InvalidCode);
559 assert(TU && "Invalid arguments!");
560 void *RawLoc = Loc.getPtrEncoding();
561 CXCursor C = { CXCursor_ObjCClassRef, 0, { Class, RawLoc, TU } };
565 std::pair<const ObjCInterfaceDecl *, SourceLocation>
566 cxcursor::getCursorObjCClassRef(CXCursor C) {
567 assert(C.kind == CXCursor_ObjCClassRef);
568 return std::make_pair(static_cast<const ObjCInterfaceDecl *>(C.data[0]),
569 SourceLocation::getFromPtrEncoding(C.data[1]));
572 CXCursor cxcursor::MakeCursorTypeRef(const TypeDecl *Type, SourceLocation Loc,
573 CXTranslationUnit TU) {
574 assert(Type && TU && "Invalid arguments!");
575 void *RawLoc = Loc.getPtrEncoding();
576 CXCursor C = { CXCursor_TypeRef, 0, { Type, RawLoc, TU } };
580 std::pair<const TypeDecl *, SourceLocation>
581 cxcursor::getCursorTypeRef(CXCursor C) {
582 assert(C.kind == CXCursor_TypeRef);
583 return std::make_pair(static_cast<const TypeDecl *>(C.data[0]),
584 SourceLocation::getFromPtrEncoding(C.data[1]));
587 CXCursor cxcursor::MakeCursorTemplateRef(const TemplateDecl *Template,
589 CXTranslationUnit TU) {
590 assert(Template && TU && "Invalid arguments!");
591 void *RawLoc = Loc.getPtrEncoding();
592 CXCursor C = { CXCursor_TemplateRef, 0, { Template, RawLoc, TU } };
596 std::pair<const TemplateDecl *, SourceLocation>
597 cxcursor::getCursorTemplateRef(CXCursor C) {
598 assert(C.kind == CXCursor_TemplateRef);
599 return std::make_pair(static_cast<const TemplateDecl *>(C.data[0]),
600 SourceLocation::getFromPtrEncoding(C.data[1]));
603 CXCursor cxcursor::MakeCursorNamespaceRef(const NamedDecl *NS,
605 CXTranslationUnit TU) {
607 assert(NS && (isa<NamespaceDecl>(NS) || isa<NamespaceAliasDecl>(NS)) && TU &&
608 "Invalid arguments!");
609 void *RawLoc = Loc.getPtrEncoding();
610 CXCursor C = { CXCursor_NamespaceRef, 0, { NS, RawLoc, TU } };
614 std::pair<const NamedDecl *, SourceLocation>
615 cxcursor::getCursorNamespaceRef(CXCursor C) {
616 assert(C.kind == CXCursor_NamespaceRef);
617 return std::make_pair(static_cast<const NamedDecl *>(C.data[0]),
618 SourceLocation::getFromPtrEncoding(C.data[1]));
621 CXCursor cxcursor::MakeCursorVariableRef(const VarDecl *Var, SourceLocation Loc,
622 CXTranslationUnit TU) {
624 assert(Var && TU && "Invalid arguments!");
625 void *RawLoc = Loc.getPtrEncoding();
626 CXCursor C = { CXCursor_VariableRef, 0, { Var, RawLoc, TU } };
630 std::pair<const VarDecl *, SourceLocation>
631 cxcursor::getCursorVariableRef(CXCursor C) {
632 assert(C.kind == CXCursor_VariableRef);
633 return std::make_pair(static_cast<const VarDecl *>(C.data[0]),
634 SourceLocation::getFromPtrEncoding(C.data[1]));
637 CXCursor cxcursor::MakeCursorMemberRef(const FieldDecl *Field, SourceLocation Loc,
638 CXTranslationUnit TU) {
640 assert(Field && TU && "Invalid arguments!");
641 void *RawLoc = Loc.getPtrEncoding();
642 CXCursor C = { CXCursor_MemberRef, 0, { Field, RawLoc, TU } };
646 std::pair<const FieldDecl *, SourceLocation>
647 cxcursor::getCursorMemberRef(CXCursor C) {
648 assert(C.kind == CXCursor_MemberRef);
649 return std::make_pair(static_cast<const FieldDecl *>(C.data[0]),
650 SourceLocation::getFromPtrEncoding(C.data[1]));
653 CXCursor cxcursor::MakeCursorCXXBaseSpecifier(const CXXBaseSpecifier *B,
654 CXTranslationUnit TU){
655 CXCursor C = { CXCursor_CXXBaseSpecifier, 0, { B, 0, TU } };
659 const CXXBaseSpecifier *cxcursor::getCursorCXXBaseSpecifier(CXCursor C) {
660 assert(C.kind == CXCursor_CXXBaseSpecifier);
661 return static_cast<const CXXBaseSpecifier*>(C.data[0]);
664 CXCursor cxcursor::MakePreprocessingDirectiveCursor(SourceRange Range,
665 CXTranslationUnit TU) {
666 CXCursor C = { CXCursor_PreprocessingDirective, 0,
667 { Range.getBegin().getPtrEncoding(),
668 Range.getEnd().getPtrEncoding(),
674 SourceRange cxcursor::getCursorPreprocessingDirective(CXCursor C) {
675 assert(C.kind == CXCursor_PreprocessingDirective);
676 SourceRange Range(SourceLocation::getFromPtrEncoding(C.data[0]),
677 SourceLocation::getFromPtrEncoding(C.data[1]));
678 ASTUnit *TU = getCursorASTUnit(C);
679 return TU->mapRangeFromPreamble(Range);
682 CXCursor cxcursor::MakeMacroDefinitionCursor(const MacroDefinition *MI,
683 CXTranslationUnit TU) {
684 CXCursor C = { CXCursor_MacroDefinition, 0, { MI, 0, TU } };
688 const MacroDefinition *cxcursor::getCursorMacroDefinition(CXCursor C) {
689 assert(C.kind == CXCursor_MacroDefinition);
690 return static_cast<const MacroDefinition *>(C.data[0]);
693 CXCursor cxcursor::MakeMacroExpansionCursor(MacroExpansion *MI,
694 CXTranslationUnit TU) {
695 CXCursor C = { CXCursor_MacroExpansion, 0, { MI, 0, TU } };
699 CXCursor cxcursor::MakeMacroExpansionCursor(MacroDefinition *MI,
701 CXTranslationUnit TU) {
702 assert(Loc.isValid());
703 CXCursor C = { CXCursor_MacroExpansion, 0, { MI, Loc.getPtrEncoding(), TU } };
707 const IdentifierInfo *cxcursor::MacroExpansionCursor::getName() const {
709 return getAsMacroDefinition()->getName();
710 return getAsMacroExpansion()->getName();
712 const MacroDefinition *cxcursor::MacroExpansionCursor::getDefinition() const {
714 return getAsMacroDefinition();
715 return getAsMacroExpansion()->getDefinition();
717 SourceRange cxcursor::MacroExpansionCursor::getSourceRange() const {
719 return getPseudoLoc();
720 return getAsMacroExpansion()->getSourceRange();
723 CXCursor cxcursor::MakeInclusionDirectiveCursor(InclusionDirective *ID,
724 CXTranslationUnit TU) {
725 CXCursor C = { CXCursor_InclusionDirective, 0, { ID, 0, TU } };
729 const InclusionDirective *cxcursor::getCursorInclusionDirective(CXCursor C) {
730 assert(C.kind == CXCursor_InclusionDirective);
731 return static_cast<const InclusionDirective *>(C.data[0]);
734 CXCursor cxcursor::MakeCursorLabelRef(LabelStmt *Label, SourceLocation Loc,
735 CXTranslationUnit TU) {
737 assert(Label && TU && "Invalid arguments!");
738 void *RawLoc = Loc.getPtrEncoding();
739 CXCursor C = { CXCursor_LabelRef, 0, { Label, RawLoc, TU } };
743 std::pair<const LabelStmt *, SourceLocation>
744 cxcursor::getCursorLabelRef(CXCursor C) {
745 assert(C.kind == CXCursor_LabelRef);
746 return std::make_pair(static_cast<const LabelStmt *>(C.data[0]),
747 SourceLocation::getFromPtrEncoding(C.data[1]));
750 CXCursor cxcursor::MakeCursorOverloadedDeclRef(const OverloadExpr *E,
751 CXTranslationUnit TU) {
752 assert(E && TU && "Invalid arguments!");
753 OverloadedDeclRefStorage Storage(E);
754 void *RawLoc = E->getNameLoc().getPtrEncoding();
756 CXCursor_OverloadedDeclRef, 0,
757 { Storage.getOpaqueValue(), RawLoc, TU }
762 CXCursor cxcursor::MakeCursorOverloadedDeclRef(const Decl *D,
764 CXTranslationUnit TU) {
765 assert(D && TU && "Invalid arguments!");
766 void *RawLoc = Loc.getPtrEncoding();
767 OverloadedDeclRefStorage Storage(D);
769 CXCursor_OverloadedDeclRef, 0,
770 { Storage.getOpaqueValue(), RawLoc, TU }
775 CXCursor cxcursor::MakeCursorOverloadedDeclRef(TemplateName Name,
777 CXTranslationUnit TU) {
778 assert(Name.getAsOverloadedTemplate() && TU && "Invalid arguments!");
779 void *RawLoc = Loc.getPtrEncoding();
780 OverloadedDeclRefStorage Storage(Name.getAsOverloadedTemplate());
782 CXCursor_OverloadedDeclRef, 0,
783 { Storage.getOpaqueValue(), RawLoc, TU }
788 std::pair<cxcursor::OverloadedDeclRefStorage, SourceLocation>
789 cxcursor::getCursorOverloadedDeclRef(CXCursor C) {
790 assert(C.kind == CXCursor_OverloadedDeclRef);
791 return std::make_pair(OverloadedDeclRefStorage::getFromOpaqueValue(
792 const_cast<void *>(C.data[0])),
793 SourceLocation::getFromPtrEncoding(C.data[1]));
796 const Decl *cxcursor::getCursorDecl(CXCursor Cursor) {
797 return static_cast<const Decl *>(Cursor.data[0]);
800 const Expr *cxcursor::getCursorExpr(CXCursor Cursor) {
801 return dyn_cast_or_null<Expr>(getCursorStmt(Cursor));
804 const Stmt *cxcursor::getCursorStmt(CXCursor Cursor) {
805 if (Cursor.kind == CXCursor_ObjCSuperClassRef ||
806 Cursor.kind == CXCursor_ObjCProtocolRef ||
807 Cursor.kind == CXCursor_ObjCClassRef)
810 return static_cast<const Stmt *>(Cursor.data[1]);
813 const Attr *cxcursor::getCursorAttr(CXCursor Cursor) {
814 return static_cast<const Attr *>(Cursor.data[1]);
817 const Decl *cxcursor::getCursorParentDecl(CXCursor Cursor) {
818 return static_cast<const Decl *>(Cursor.data[0]);
821 ASTContext &cxcursor::getCursorContext(CXCursor Cursor) {
822 return getCursorASTUnit(Cursor)->getASTContext();
825 ASTUnit *cxcursor::getCursorASTUnit(CXCursor Cursor) {
826 CXTranslationUnit TU = getCursorTU(Cursor);
829 return cxtu::getASTUnit(TU);
832 CXTranslationUnit cxcursor::getCursorTU(CXCursor Cursor) {
833 return static_cast<CXTranslationUnit>(const_cast<void*>(Cursor.data[2]));
836 void cxcursor::getOverriddenCursors(CXCursor cursor,
837 SmallVectorImpl<CXCursor> &overridden) {
838 assert(clang_isDeclaration(cursor.kind));
839 const NamedDecl *D = dyn_cast_or_null<NamedDecl>(getCursorDecl(cursor));
843 CXTranslationUnit TU = getCursorTU(cursor);
844 SmallVector<const NamedDecl *, 8> OverDecls;
845 D->getASTContext().getOverriddenMethods(D, OverDecls);
847 for (SmallVectorImpl<const NamedDecl *>::iterator
848 I = OverDecls.begin(), E = OverDecls.end(); I != E; ++I) {
849 overridden.push_back(MakeCXCursor(*I, TU));
853 std::pair<int, SourceLocation>
854 cxcursor::getSelectorIdentifierIndexAndLoc(CXCursor cursor) {
855 if (cursor.kind == CXCursor_ObjCMessageExpr) {
856 if (cursor.xdata != -1)
857 return std::make_pair(cursor.xdata,
858 cast<ObjCMessageExpr>(getCursorExpr(cursor))
859 ->getSelectorLoc(cursor.xdata));
860 } else if (cursor.kind == CXCursor_ObjCClassMethodDecl ||
861 cursor.kind == CXCursor_ObjCInstanceMethodDecl) {
862 if (cursor.xdata != -1)
863 return std::make_pair(cursor.xdata,
864 cast<ObjCMethodDecl>(getCursorDecl(cursor))
865 ->getSelectorLoc(cursor.xdata));
868 return std::make_pair(-1, SourceLocation());
871 CXCursor cxcursor::getSelectorIdentifierCursor(int SelIdx, CXCursor cursor) {
872 CXCursor newCursor = cursor;
874 if (cursor.kind == CXCursor_ObjCMessageExpr) {
876 unsigned(SelIdx) >= cast<ObjCMessageExpr>(getCursorExpr(cursor))
877 ->getNumSelectorLocs())
878 newCursor.xdata = -1;
880 newCursor.xdata = SelIdx;
881 } else if (cursor.kind == CXCursor_ObjCClassMethodDecl ||
882 cursor.kind == CXCursor_ObjCInstanceMethodDecl) {
884 unsigned(SelIdx) >= cast<ObjCMethodDecl>(getCursorDecl(cursor))
885 ->getNumSelectorLocs())
886 newCursor.xdata = -1;
888 newCursor.xdata = SelIdx;
894 CXCursor cxcursor::getTypeRefCursor(CXCursor cursor) {
895 if (cursor.kind != CXCursor_CallExpr)
898 if (cursor.xdata == 0)
901 const Expr *E = getCursorExpr(cursor);
902 TypeSourceInfo *Type = 0;
903 if (const CXXUnresolvedConstructExpr *
904 UnCtor = dyn_cast<CXXUnresolvedConstructExpr>(E)) {
905 Type = UnCtor->getTypeSourceInfo();
906 } else if (const CXXTemporaryObjectExpr *Tmp =
907 dyn_cast<CXXTemporaryObjectExpr>(E)){
908 Type = Tmp->getTypeSourceInfo();
914 CXTranslationUnit TU = getCursorTU(cursor);
915 QualType Ty = Type->getType();
916 TypeLoc TL = Type->getTypeLoc();
917 SourceLocation Loc = TL.getBeginLoc();
919 if (const ElaboratedType *ElabT = Ty->getAs<ElaboratedType>()) {
920 Ty = ElabT->getNamedType();
921 ElaboratedTypeLoc ElabTL = TL.castAs<ElaboratedTypeLoc>();
922 Loc = ElabTL.getNamedTypeLoc().getBeginLoc();
925 if (const TypedefType *Typedef = Ty->getAs<TypedefType>())
926 return MakeCursorTypeRef(Typedef->getDecl(), Loc, TU);
927 if (const TagType *Tag = Ty->getAs<TagType>())
928 return MakeCursorTypeRef(Tag->getDecl(), Loc, TU);
929 if (const TemplateTypeParmType *TemplP = Ty->getAs<TemplateTypeParmType>())
930 return MakeCursorTypeRef(TemplP->getDecl(), Loc, TU);
935 bool cxcursor::operator==(CXCursor X, CXCursor Y) {
936 return X.kind == Y.kind && X.data[0] == Y.data[0] && X.data[1] == Y.data[1] &&
937 X.data[2] == Y.data[2];
940 // FIXME: Remove once we can model DeclGroups and their appropriate ranges
941 // properly in the ASTs.
942 bool cxcursor::isFirstInDeclGroup(CXCursor C) {
943 assert(clang_isDeclaration(C.kind));
944 return ((uintptr_t) (C.data[1])) != 0;
947 //===----------------------------------------------------------------------===//
948 // libclang CXCursor APIs
949 //===----------------------------------------------------------------------===//
953 int clang_Cursor_isNull(CXCursor cursor) {
954 return clang_equalCursors(cursor, clang_getNullCursor());
957 CXTranslationUnit clang_Cursor_getTranslationUnit(CXCursor cursor) {
958 return getCursorTU(cursor);
961 int clang_Cursor_getNumArguments(CXCursor C) {
962 if (clang_isDeclaration(C.kind)) {
963 const Decl *D = cxcursor::getCursorDecl(C);
964 if (const ObjCMethodDecl *MD = dyn_cast_or_null<ObjCMethodDecl>(D))
965 return MD->param_size();
966 if (const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D))
967 return FD->param_size();
970 if (clang_isExpression(C.kind)) {
971 const Expr *E = cxcursor::getCursorExpr(C);
972 if (const CallExpr *CE = dyn_cast<CallExpr>(E)) {
973 return CE->getNumArgs();
980 CXCursor clang_Cursor_getArgument(CXCursor C, unsigned i) {
981 if (clang_isDeclaration(C.kind)) {
982 const Decl *D = cxcursor::getCursorDecl(C);
983 if (const ObjCMethodDecl *MD = dyn_cast_or_null<ObjCMethodDecl>(D)) {
984 if (i < MD->param_size())
985 return cxcursor::MakeCXCursor(MD->param_begin()[i],
986 cxcursor::getCursorTU(C));
987 } else if (const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D)) {
988 if (i < FD->param_size())
989 return cxcursor::MakeCXCursor(FD->param_begin()[i],
990 cxcursor::getCursorTU(C));
994 if (clang_isExpression(C.kind)) {
995 const Expr *E = cxcursor::getCursorExpr(C);
996 if (const CallExpr *CE = dyn_cast<CallExpr>(E)) {
997 if (i < CE->getNumArgs()) {
998 return cxcursor::MakeCXCursor(CE->getArg(i),
1000 cxcursor::getCursorTU(C));
1005 return clang_getNullCursor();
1008 } // end: extern "C"
1010 //===----------------------------------------------------------------------===//
1012 //===----------------------------------------------------------------------===//
1014 typedef llvm::DenseMap<CXCursor, unsigned> CXCursorSet_Impl;
1016 static inline CXCursorSet packCXCursorSet(CXCursorSet_Impl *setImpl) {
1017 return (CXCursorSet) setImpl;
1019 static inline CXCursorSet_Impl *unpackCXCursorSet(CXCursorSet set) {
1020 return (CXCursorSet_Impl*) set;
1023 template<> struct DenseMapInfo<CXCursor> {
1025 static inline CXCursor getEmptyKey() {
1026 return MakeCXCursorInvalid(CXCursor_InvalidFile);
1028 static inline CXCursor getTombstoneKey() {
1029 return MakeCXCursorInvalid(CXCursor_NoDeclFound);
1031 static inline unsigned getHashValue(const CXCursor &cursor) {
1032 return llvm::DenseMapInfo<std::pair<const void *, const void *> >
1033 ::getHashValue(std::make_pair(cursor.data[0], cursor.data[1]));
1035 static inline bool isEqual(const CXCursor &x, const CXCursor &y) {
1036 return x.kind == y.kind &&
1037 x.data[0] == y.data[0] &&
1038 x.data[1] == y.data[1];
1044 CXCursorSet clang_createCXCursorSet() {
1045 return packCXCursorSet(new CXCursorSet_Impl());
1048 void clang_disposeCXCursorSet(CXCursorSet set) {
1049 delete unpackCXCursorSet(set);
1052 unsigned clang_CXCursorSet_contains(CXCursorSet set, CXCursor cursor) {
1053 CXCursorSet_Impl *setImpl = unpackCXCursorSet(set);
1056 return setImpl->find(cursor) != setImpl->end();
1059 unsigned clang_CXCursorSet_insert(CXCursorSet set, CXCursor cursor) {
1060 // Do not insert invalid cursors into the set.
1061 if (cursor.kind >= CXCursor_FirstInvalid &&
1062 cursor.kind <= CXCursor_LastInvalid)
1065 CXCursorSet_Impl *setImpl = unpackCXCursorSet(set);
1068 unsigned &entry = (*setImpl)[cursor];
1069 unsigned flag = entry == 0 ? 1 : 0;
1074 CXCompletionString clang_getCursorCompletionString(CXCursor cursor) {
1075 enum CXCursorKind kind = clang_getCursorKind(cursor);
1076 if (clang_isDeclaration(kind)) {
1077 const Decl *decl = getCursorDecl(cursor);
1078 if (const NamedDecl *namedDecl = dyn_cast_or_null<NamedDecl>(decl)) {
1079 ASTUnit *unit = getCursorASTUnit(cursor);
1080 CodeCompletionResult Result(namedDecl, CCP_Declaration);
1081 CodeCompletionString *String
1082 = Result.CreateCodeCompletionString(unit->getASTContext(),
1083 unit->getPreprocessor(),
1084 unit->getCodeCompletionTUInfo().getAllocator(),
1085 unit->getCodeCompletionTUInfo(),
1090 else if (kind == CXCursor_MacroDefinition) {
1091 const MacroDefinition *definition = getCursorMacroDefinition(cursor);
1092 const IdentifierInfo *MacroInfo = definition->getName();
1093 ASTUnit *unit = getCursorASTUnit(cursor);
1094 CodeCompletionResult Result(MacroInfo);
1095 CodeCompletionString *String
1096 = Result.CreateCodeCompletionString(unit->getASTContext(),
1097 unit->getPreprocessor(),
1098 unit->getCodeCompletionTUInfo().getAllocator(),
1099 unit->getCodeCompletionTUInfo(),
1108 struct OverridenCursorsPool {
1109 typedef SmallVector<CXCursor, 2> CursorVec;
1110 std::vector<CursorVec*> AllCursors;
1111 std::vector<CursorVec*> AvailableCursors;
1113 ~OverridenCursorsPool() {
1114 for (std::vector<CursorVec*>::iterator I = AllCursors.begin(),
1115 E = AllCursors.end(); I != E; ++I) {
1122 void *cxcursor::createOverridenCXCursorsPool() {
1123 return new OverridenCursorsPool();
1126 void cxcursor::disposeOverridenCXCursorsPool(void *pool) {
1127 delete static_cast<OverridenCursorsPool*>(pool);
1131 void clang_getOverriddenCursors(CXCursor cursor,
1132 CXCursor **overridden,
1133 unsigned *num_overridden) {
1137 *num_overridden = 0;
1139 CXTranslationUnit TU = cxcursor::getCursorTU(cursor);
1141 if (!overridden || !num_overridden || !TU)
1144 if (!clang_isDeclaration(cursor.kind))
1147 OverridenCursorsPool &pool =
1148 *static_cast<OverridenCursorsPool*>(TU->OverridenCursorsPool);
1150 OverridenCursorsPool::CursorVec *Vec = 0;
1152 if (!pool.AvailableCursors.empty()) {
1153 Vec = pool.AvailableCursors.back();
1154 pool.AvailableCursors.pop_back();
1157 Vec = new OverridenCursorsPool::CursorVec();
1158 pool.AllCursors.push_back(Vec);
1161 // Clear out the vector, but don't free the memory contents. This
1162 // reduces malloc() traffic.
1165 // Use the first entry to contain a back reference to the vector.
1166 // This is a complete hack.
1167 CXCursor backRefCursor = MakeCXCursorInvalid(CXCursor_InvalidFile, TU);
1168 backRefCursor.data[0] = Vec;
1169 assert(cxcursor::getCursorTU(backRefCursor) == TU);
1170 Vec->push_back(backRefCursor);
1172 // Get the overriden cursors.
1173 cxcursor::getOverriddenCursors(cursor, *Vec);
1175 // Did we get any overriden cursors? If not, return Vec to the pool
1176 // of available cursor vectors.
1177 if (Vec->size() == 1) {
1178 pool.AvailableCursors.push_back(Vec);
1182 // Now tell the caller about the overriden cursors.
1183 assert(Vec->size() > 1);
1184 *overridden = &((*Vec)[1]);
1185 *num_overridden = Vec->size() - 1;
1188 void clang_disposeOverriddenCursors(CXCursor *overridden) {
1192 // Use pointer arithmetic to get back the first faux entry
1193 // which has a back-reference to the TU and the vector.
1195 OverridenCursorsPool::CursorVec *Vec =
1196 static_cast<OverridenCursorsPool::CursorVec *>(
1197 const_cast<void *>(overridden->data[0]));
1198 CXTranslationUnit TU = getCursorTU(*overridden);
1202 OverridenCursorsPool &pool =
1203 *static_cast<OverridenCursorsPool*>(TU->OverridenCursorsPool);
1205 pool.AvailableCursors.push_back(Vec);
1208 int clang_Cursor_isDynamicCall(CXCursor C) {
1210 if (clang_isExpression(C.kind))
1211 E = getCursorExpr(C);
1215 if (const ObjCMessageExpr *MsgE = dyn_cast<ObjCMessageExpr>(E))
1216 return MsgE->getReceiverKind() == ObjCMessageExpr::Instance;
1218 const MemberExpr *ME = 0;
1219 if (isa<MemberExpr>(E))
1220 ME = cast<MemberExpr>(E);
1221 else if (const CallExpr *CE = dyn_cast<CallExpr>(E))
1222 ME = dyn_cast_or_null<MemberExpr>(CE->getCallee());
1225 if (const CXXMethodDecl *
1226 MD = dyn_cast_or_null<CXXMethodDecl>(ME->getMemberDecl()))
1227 return MD->isVirtual() && !ME->hasQualifier();
1233 CXType clang_Cursor_getReceiverType(CXCursor C) {
1234 CXTranslationUnit TU = cxcursor::getCursorTU(C);
1236 if (clang_isExpression(C.kind))
1237 E = getCursorExpr(C);
1239 if (const ObjCMessageExpr *MsgE = dyn_cast_or_null<ObjCMessageExpr>(E))
1240 return cxtype::MakeCXType(MsgE->getReceiverType(), TU);
1242 return cxtype::MakeCXType(QualType(), TU);
1245 } // end: extern "C"