1 //===- CXCursor.cpp - Routines for manipulating CXCursors -----------------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 // This file defines routines for manipulating CXCursors. It should be the
10 // only file that has internal knowledge of the encoding of the data in
13 //===----------------------------------------------------------------------===//
17 #include "CXTranslationUnit.h"
19 #include "clang-c/Index.h"
20 #include "clang/AST/Attr.h"
21 #include "clang/AST/Decl.h"
22 #include "clang/AST/DeclCXX.h"
23 #include "clang/AST/DeclObjC.h"
24 #include "clang/AST/DeclTemplate.h"
25 #include "clang/AST/Expr.h"
26 #include "clang/AST/ExprCXX.h"
27 #include "clang/AST/ExprObjC.h"
28 #include "clang/Frontend/ASTUnit.h"
29 #include "llvm/Support/ErrorHandling.h"
31 using namespace clang
;
32 using namespace cxcursor
;
34 CXCursor
cxcursor::MakeCXCursorInvalid(CXCursorKind K
, CXTranslationUnit TU
) {
35 assert(K
>= CXCursor_FirstInvalid
&& K
<= CXCursor_LastInvalid
);
36 CXCursor C
= {K
, 0, {nullptr, nullptr, TU
}};
40 static CXCursorKind
GetCursorKind(const Attr
*A
) {
41 assert(A
&& "Invalid arguments!");
42 switch (A
->getKind()) {
46 return CXCursor_IBActionAttr
;
48 return CXCursor_IBOutletAttr
;
49 case attr::IBOutletCollection
:
50 return CXCursor_IBOutletCollectionAttr
;
52 return CXCursor_CXXFinalAttr
;
54 return CXCursor_CXXOverrideAttr
;
56 return CXCursor_AnnotateAttr
;
58 return CXCursor_AsmLabelAttr
;
60 return CXCursor_PackedAttr
;
62 return CXCursor_PureAttr
;
64 return CXCursor_ConstAttr
;
65 case attr::NoDuplicate
:
66 return CXCursor_NoDuplicateAttr
;
67 case attr::CUDAConstant
:
68 return CXCursor_CUDAConstantAttr
;
69 case attr::CUDADevice
:
70 return CXCursor_CUDADeviceAttr
;
71 case attr::CUDAGlobal
:
72 return CXCursor_CUDAGlobalAttr
;
74 return CXCursor_CUDAHostAttr
;
75 case attr::CUDAShared
:
76 return CXCursor_CUDASharedAttr
;
77 case attr::Visibility
:
78 return CXCursor_VisibilityAttr
;
80 return CXCursor_DLLExport
;
82 return CXCursor_DLLImport
;
83 case attr::NSReturnsRetained
:
84 return CXCursor_NSReturnsRetained
;
85 case attr::NSReturnsNotRetained
:
86 return CXCursor_NSReturnsNotRetained
;
87 case attr::NSReturnsAutoreleased
:
88 return CXCursor_NSReturnsAutoreleased
;
89 case attr::NSConsumesSelf
:
90 return CXCursor_NSConsumesSelf
;
91 case attr::NSConsumed
:
92 return CXCursor_NSConsumed
;
93 case attr::ObjCException
:
94 return CXCursor_ObjCException
;
95 case attr::ObjCNSObject
:
96 return CXCursor_ObjCNSObject
;
97 case attr::ObjCIndependentClass
:
98 return CXCursor_ObjCIndependentClass
;
99 case attr::ObjCPreciseLifetime
:
100 return CXCursor_ObjCPreciseLifetime
;
101 case attr::ObjCReturnsInnerPointer
:
102 return CXCursor_ObjCReturnsInnerPointer
;
103 case attr::ObjCRequiresSuper
:
104 return CXCursor_ObjCRequiresSuper
;
105 case attr::ObjCRootClass
:
106 return CXCursor_ObjCRootClass
;
107 case attr::ObjCSubclassingRestricted
:
108 return CXCursor_ObjCSubclassingRestricted
;
109 case attr::ObjCExplicitProtocolImpl
:
110 return CXCursor_ObjCExplicitProtocolImpl
;
111 case attr::ObjCDesignatedInitializer
:
112 return CXCursor_ObjCDesignatedInitializer
;
113 case attr::ObjCRuntimeVisible
:
114 return CXCursor_ObjCRuntimeVisible
;
115 case attr::ObjCBoxable
:
116 return CXCursor_ObjCBoxable
;
118 return CXCursor_FlagEnum
;
119 case attr::Convergent
:
120 return CXCursor_ConvergentAttr
;
121 case attr::WarnUnused
:
122 return CXCursor_WarnUnusedAttr
;
123 case attr::WarnUnusedResult
:
124 return CXCursor_WarnUnusedResultAttr
;
126 return CXCursor_AlignedAttr
;
129 return CXCursor_UnexposedAttr
;
132 CXCursor
cxcursor::MakeCXCursor(const Attr
*A
, const Decl
*Parent
,
133 CXTranslationUnit TU
) {
134 assert(A
&& Parent
&& TU
&& "Invalid arguments!");
135 CXCursor C
= {GetCursorKind(A
), 0, {Parent
, A
, TU
}};
139 CXCursor
cxcursor::MakeCXCursor(const Decl
*D
, CXTranslationUnit TU
,
140 SourceRange RegionOfInterest
,
141 bool FirstInDeclGroup
) {
142 assert(D
&& TU
&& "Invalid arguments!");
144 CXCursorKind K
= getCursorKindForDecl(D
);
146 if (K
== CXCursor_ObjCClassMethodDecl
||
147 K
== CXCursor_ObjCInstanceMethodDecl
) {
148 int SelectorIdIndex
= -1;
149 // Check if cursor points to a selector id.
150 if (RegionOfInterest
.isValid() &&
151 RegionOfInterest
.getBegin() == RegionOfInterest
.getEnd()) {
152 SmallVector
<SourceLocation
, 16> SelLocs
;
153 cast
<ObjCMethodDecl
>(D
)->getSelectorLocs(SelLocs
);
154 SmallVectorImpl
<SourceLocation
>::iterator I
=
155 llvm::find(SelLocs
, RegionOfInterest
.getBegin());
156 if (I
!= SelLocs
.end())
157 SelectorIdIndex
= I
- SelLocs
.begin();
161 {D
, (void *)(intptr_t)(FirstInDeclGroup
? 1 : 0), TU
}};
165 CXCursor C
= {K
, 0, {D
, (void *)(intptr_t)(FirstInDeclGroup
? 1 : 0), TU
}};
169 CXCursor
cxcursor::MakeCXCursor(const Stmt
*S
, const Decl
*Parent
,
170 CXTranslationUnit TU
,
171 SourceRange RegionOfInterest
) {
172 assert(S
&& TU
&& "Invalid arguments!");
173 CXCursorKind K
= CXCursor_NotImplemented
;
175 switch (S
->getStmtClass()) {
176 case Stmt::NoStmtClass
:
179 case Stmt::CaseStmtClass
:
180 K
= CXCursor_CaseStmt
;
183 case Stmt::DefaultStmtClass
:
184 K
= CXCursor_DefaultStmt
;
187 case Stmt::IfStmtClass
:
191 case Stmt::SwitchStmtClass
:
192 K
= CXCursor_SwitchStmt
;
195 case Stmt::WhileStmtClass
:
196 K
= CXCursor_WhileStmt
;
199 case Stmt::DoStmtClass
:
203 case Stmt::ForStmtClass
:
204 K
= CXCursor_ForStmt
;
207 case Stmt::GotoStmtClass
:
208 K
= CXCursor_GotoStmt
;
211 case Stmt::IndirectGotoStmtClass
:
212 K
= CXCursor_IndirectGotoStmt
;
215 case Stmt::ContinueStmtClass
:
216 K
= CXCursor_ContinueStmt
;
219 case Stmt::BreakStmtClass
:
220 K
= CXCursor_BreakStmt
;
223 case Stmt::ReturnStmtClass
:
224 K
= CXCursor_ReturnStmt
;
227 case Stmt::GCCAsmStmtClass
:
228 K
= CXCursor_GCCAsmStmt
;
231 case Stmt::MSAsmStmtClass
:
232 K
= CXCursor_MSAsmStmt
;
235 case Stmt::ObjCAtTryStmtClass
:
236 K
= CXCursor_ObjCAtTryStmt
;
239 case Stmt::ObjCAtCatchStmtClass
:
240 K
= CXCursor_ObjCAtCatchStmt
;
243 case Stmt::ObjCAtFinallyStmtClass
:
244 K
= CXCursor_ObjCAtFinallyStmt
;
247 case Stmt::ObjCAtThrowStmtClass
:
248 K
= CXCursor_ObjCAtThrowStmt
;
251 case Stmt::ObjCAtSynchronizedStmtClass
:
252 K
= CXCursor_ObjCAtSynchronizedStmt
;
255 case Stmt::ObjCAutoreleasePoolStmtClass
:
256 K
= CXCursor_ObjCAutoreleasePoolStmt
;
259 case Stmt::ObjCForCollectionStmtClass
:
260 K
= CXCursor_ObjCForCollectionStmt
;
263 case Stmt::CXXCatchStmtClass
:
264 K
= CXCursor_CXXCatchStmt
;
267 case Stmt::CXXTryStmtClass
:
268 K
= CXCursor_CXXTryStmt
;
271 case Stmt::CXXForRangeStmtClass
:
272 K
= CXCursor_CXXForRangeStmt
;
275 case Stmt::SEHTryStmtClass
:
276 K
= CXCursor_SEHTryStmt
;
279 case Stmt::SEHExceptStmtClass
:
280 K
= CXCursor_SEHExceptStmt
;
283 case Stmt::SEHFinallyStmtClass
:
284 K
= CXCursor_SEHFinallyStmt
;
287 case Stmt::SEHLeaveStmtClass
:
288 K
= CXCursor_SEHLeaveStmt
;
291 case Stmt::CoroutineBodyStmtClass
:
292 case Stmt::CoreturnStmtClass
:
293 K
= CXCursor_UnexposedStmt
;
296 case Stmt::ArrayTypeTraitExprClass
:
297 case Stmt::AsTypeExprClass
:
298 case Stmt::AtomicExprClass
:
299 case Stmt::BinaryConditionalOperatorClass
:
300 case Stmt::TypeTraitExprClass
:
301 case Stmt::CoawaitExprClass
:
302 case Stmt::DependentCoawaitExprClass
:
303 case Stmt::CoyieldExprClass
:
304 case Stmt::CXXBindTemporaryExprClass
:
305 case Stmt::CXXDefaultArgExprClass
:
306 case Stmt::CXXDefaultInitExprClass
:
307 case Stmt::CXXFoldExprClass
:
308 case Stmt::CXXRewrittenBinaryOperatorClass
:
309 case Stmt::CXXStdInitializerListExprClass
:
310 case Stmt::CXXScalarValueInitExprClass
:
311 case Stmt::CXXUuidofExprClass
:
312 case Stmt::ChooseExprClass
:
313 case Stmt::DesignatedInitExprClass
:
314 case Stmt::DesignatedInitUpdateExprClass
:
315 case Stmt::ArrayInitLoopExprClass
:
316 case Stmt::ArrayInitIndexExprClass
:
317 case Stmt::ExprWithCleanupsClass
:
318 case Stmt::ExpressionTraitExprClass
:
319 case Stmt::ExtVectorElementExprClass
:
320 case Stmt::ImplicitCastExprClass
:
321 case Stmt::ImplicitValueInitExprClass
:
322 case Stmt::NoInitExprClass
:
323 case Stmt::MaterializeTemporaryExprClass
:
324 case Stmt::ObjCIndirectCopyRestoreExprClass
:
325 case Stmt::OffsetOfExprClass
:
326 case Stmt::ParenListExprClass
:
327 case Stmt::PredefinedExprClass
:
328 case Stmt::ShuffleVectorExprClass
:
329 case Stmt::SourceLocExprClass
:
330 case Stmt::ConvertVectorExprClass
:
331 case Stmt::VAArgExprClass
:
332 case Stmt::ObjCArrayLiteralClass
:
333 case Stmt::ObjCDictionaryLiteralClass
:
334 case Stmt::ObjCBoxedExprClass
:
335 case Stmt::ObjCSubscriptRefExprClass
:
336 case Stmt::RecoveryExprClass
:
337 case Stmt::SYCLUniqueStableNameExprClass
:
338 case Stmt::EmbedExprClass
:
339 case Stmt::HLSLOutArgExprClass
:
340 case Stmt::OpenACCAsteriskSizeExprClass
:
341 case Stmt::ResolvedUnexpandedPackExprClass
:
342 K
= CXCursor_UnexposedExpr
;
345 case Stmt::OpaqueValueExprClass
:
346 if (Expr
*Src
= cast
<OpaqueValueExpr
>(S
)->getSourceExpr())
347 return MakeCXCursor(Src
, Parent
, TU
, RegionOfInterest
);
348 K
= CXCursor_UnexposedExpr
;
351 case Stmt::PseudoObjectExprClass
:
352 return MakeCXCursor(cast
<PseudoObjectExpr
>(S
)->getSyntacticForm(), Parent
,
353 TU
, RegionOfInterest
);
355 case Stmt::CompoundStmtClass
:
356 K
= CXCursor_CompoundStmt
;
359 case Stmt::NullStmtClass
:
360 K
= CXCursor_NullStmt
;
363 case Stmt::LabelStmtClass
:
364 K
= CXCursor_LabelStmt
;
367 case Stmt::AttributedStmtClass
:
368 K
= CXCursor_UnexposedStmt
;
371 case Stmt::DeclStmtClass
:
372 K
= CXCursor_DeclStmt
;
375 case Stmt::CapturedStmtClass
:
376 K
= CXCursor_UnexposedStmt
;
379 case Stmt::SYCLKernelCallStmtClass
:
380 K
= CXCursor_UnexposedStmt
;
383 case Stmt::IntegerLiteralClass
:
384 K
= CXCursor_IntegerLiteral
;
387 case Stmt::FixedPointLiteralClass
:
388 K
= CXCursor_FixedPointLiteral
;
391 case Stmt::FloatingLiteralClass
:
392 K
= CXCursor_FloatingLiteral
;
395 case Stmt::ImaginaryLiteralClass
:
396 K
= CXCursor_ImaginaryLiteral
;
399 case Stmt::StringLiteralClass
:
400 K
= CXCursor_StringLiteral
;
403 case Stmt::CharacterLiteralClass
:
404 K
= CXCursor_CharacterLiteral
;
407 case Stmt::ConstantExprClass
:
408 return MakeCXCursor(cast
<ConstantExpr
>(S
)->getSubExpr(), Parent
, TU
,
411 case Stmt::ParenExprClass
:
412 K
= CXCursor_ParenExpr
;
415 case Stmt::UnaryOperatorClass
:
416 K
= CXCursor_UnaryOperator
;
419 case Stmt::UnaryExprOrTypeTraitExprClass
:
420 case Stmt::CXXNoexceptExprClass
:
421 K
= CXCursor_UnaryExpr
;
424 case Stmt::MSPropertySubscriptExprClass
:
425 case Stmt::ArraySubscriptExprClass
:
426 K
= CXCursor_ArraySubscriptExpr
;
429 case Stmt::MatrixSubscriptExprClass
:
430 // TODO: add support for MatrixSubscriptExpr.
431 K
= CXCursor_UnexposedExpr
;
434 case Stmt::ArraySectionExprClass
:
435 K
= CXCursor_ArraySectionExpr
;
438 case Stmt::OMPArrayShapingExprClass
:
439 K
= CXCursor_OMPArrayShapingExpr
;
442 case Stmt::OMPIteratorExprClass
:
443 K
= CXCursor_OMPIteratorExpr
;
446 case Stmt::BinaryOperatorClass
:
447 K
= CXCursor_BinaryOperator
;
450 case Stmt::CompoundAssignOperatorClass
:
451 K
= CXCursor_CompoundAssignOperator
;
454 case Stmt::ConditionalOperatorClass
:
455 K
= CXCursor_ConditionalOperator
;
458 case Stmt::CStyleCastExprClass
:
459 K
= CXCursor_CStyleCastExpr
;
462 case Stmt::CompoundLiteralExprClass
:
463 K
= CXCursor_CompoundLiteralExpr
;
466 case Stmt::InitListExprClass
:
467 K
= CXCursor_InitListExpr
;
470 case Stmt::AddrLabelExprClass
:
471 K
= CXCursor_AddrLabelExpr
;
474 case Stmt::StmtExprClass
:
475 K
= CXCursor_StmtExpr
;
478 case Stmt::GenericSelectionExprClass
:
479 K
= CXCursor_GenericSelectionExpr
;
482 case Stmt::GNUNullExprClass
:
483 K
= CXCursor_GNUNullExpr
;
486 case Stmt::CXXStaticCastExprClass
:
487 K
= CXCursor_CXXStaticCastExpr
;
490 case Stmt::CXXDynamicCastExprClass
:
491 K
= CXCursor_CXXDynamicCastExpr
;
494 case Stmt::CXXReinterpretCastExprClass
:
495 K
= CXCursor_CXXReinterpretCastExpr
;
498 case Stmt::CXXConstCastExprClass
:
499 K
= CXCursor_CXXConstCastExpr
;
502 case Stmt::CXXFunctionalCastExprClass
:
503 K
= CXCursor_CXXFunctionalCastExpr
;
506 case Stmt::CXXAddrspaceCastExprClass
:
507 K
= CXCursor_CXXAddrspaceCastExpr
;
510 case Stmt::CXXTypeidExprClass
:
511 K
= CXCursor_CXXTypeidExpr
;
514 case Stmt::CXXBoolLiteralExprClass
:
515 K
= CXCursor_CXXBoolLiteralExpr
;
518 case Stmt::CXXNullPtrLiteralExprClass
:
519 K
= CXCursor_CXXNullPtrLiteralExpr
;
522 case Stmt::CXXThisExprClass
:
523 K
= CXCursor_CXXThisExpr
;
526 case Stmt::CXXThrowExprClass
:
527 K
= CXCursor_CXXThrowExpr
;
530 case Stmt::CXXNewExprClass
:
531 K
= CXCursor_CXXNewExpr
;
534 case Stmt::CXXDeleteExprClass
:
535 K
= CXCursor_CXXDeleteExpr
;
538 case Stmt::ObjCStringLiteralClass
:
539 K
= CXCursor_ObjCStringLiteral
;
542 case Stmt::ObjCEncodeExprClass
:
543 K
= CXCursor_ObjCEncodeExpr
;
546 case Stmt::ObjCSelectorExprClass
:
547 K
= CXCursor_ObjCSelectorExpr
;
550 case Stmt::ObjCProtocolExprClass
:
551 K
= CXCursor_ObjCProtocolExpr
;
554 case Stmt::ObjCBoolLiteralExprClass
:
555 K
= CXCursor_ObjCBoolLiteralExpr
;
558 case Stmt::ObjCAvailabilityCheckExprClass
:
559 K
= CXCursor_ObjCAvailabilityCheckExpr
;
562 case Stmt::ObjCBridgedCastExprClass
:
563 K
= CXCursor_ObjCBridgedCastExpr
;
566 case Stmt::BlockExprClass
:
567 K
= CXCursor_BlockExpr
;
570 case Stmt::PackExpansionExprClass
:
571 K
= CXCursor_PackExpansionExpr
;
574 case Stmt::SizeOfPackExprClass
:
575 K
= CXCursor_SizeOfPackExpr
;
578 case Stmt::PackIndexingExprClass
:
579 K
= CXCursor_PackIndexingExpr
;
582 case Stmt::DeclRefExprClass
:
583 if (const ImplicitParamDecl
*IPD
= dyn_cast_or_null
<ImplicitParamDecl
>(
584 cast
<DeclRefExpr
>(S
)->getDecl())) {
585 if (const ObjCMethodDecl
*MD
=
586 dyn_cast
<ObjCMethodDecl
>(IPD
->getDeclContext())) {
587 if (MD
->getSelfDecl() == IPD
) {
588 K
= CXCursor_ObjCSelfExpr
;
594 K
= CXCursor_DeclRefExpr
;
597 case Stmt::DependentScopeDeclRefExprClass
:
598 case Stmt::SubstNonTypeTemplateParmExprClass
:
599 case Stmt::SubstNonTypeTemplateParmPackExprClass
:
600 case Stmt::FunctionParmPackExprClass
:
601 case Stmt::UnresolvedLookupExprClass
:
602 case Stmt::TypoExprClass
: // A typo could actually be a DeclRef or a MemberRef
603 K
= CXCursor_DeclRefExpr
;
606 case Stmt::CXXDependentScopeMemberExprClass
:
607 case Stmt::CXXPseudoDestructorExprClass
:
608 case Stmt::MemberExprClass
:
609 case Stmt::MSPropertyRefExprClass
:
610 case Stmt::ObjCIsaExprClass
:
611 case Stmt::ObjCIvarRefExprClass
:
612 case Stmt::ObjCPropertyRefExprClass
:
613 case Stmt::UnresolvedMemberExprClass
:
614 K
= CXCursor_MemberRefExpr
;
617 case Stmt::CallExprClass
:
618 case Stmt::CXXOperatorCallExprClass
:
619 case Stmt::CXXMemberCallExprClass
:
620 case Stmt::CUDAKernelCallExprClass
:
621 case Stmt::CXXConstructExprClass
:
622 case Stmt::CXXInheritedCtorInitExprClass
:
623 case Stmt::CXXTemporaryObjectExprClass
:
624 case Stmt::CXXUnresolvedConstructExprClass
:
625 case Stmt::UserDefinedLiteralClass
:
626 K
= CXCursor_CallExpr
;
629 case Stmt::LambdaExprClass
:
630 K
= CXCursor_LambdaExpr
;
633 case Stmt::ObjCMessageExprClass
: {
634 K
= CXCursor_ObjCMessageExpr
;
635 int SelectorIdIndex
= -1;
636 // Check if cursor points to a selector id.
637 if (RegionOfInterest
.isValid() &&
638 RegionOfInterest
.getBegin() == RegionOfInterest
.getEnd()) {
639 SmallVector
<SourceLocation
, 16> SelLocs
;
640 cast
<ObjCMessageExpr
>(S
)->getSelectorLocs(SelLocs
);
641 SmallVectorImpl
<SourceLocation
>::iterator I
=
642 llvm::find(SelLocs
, RegionOfInterest
.getBegin());
643 if (I
!= SelLocs
.end())
644 SelectorIdIndex
= I
- SelLocs
.begin();
646 CXCursor C
= {K
, 0, {Parent
, S
, TU
}};
647 return getSelectorIdentifierCursor(SelectorIdIndex
, C
);
650 case Stmt::ConceptSpecializationExprClass
:
651 K
= CXCursor_ConceptSpecializationExpr
;
654 case Stmt::RequiresExprClass
:
655 K
= CXCursor_RequiresExpr
;
658 case Stmt::CXXParenListInitExprClass
:
659 K
= CXCursor_CXXParenListInitExpr
;
662 case Stmt::MSDependentExistsStmtClass
:
663 K
= CXCursor_UnexposedStmt
;
665 case Stmt::OMPCanonicalLoopClass
:
666 K
= CXCursor_OMPCanonicalLoop
;
668 case Stmt::OMPMetaDirectiveClass
:
669 K
= CXCursor_OMPMetaDirective
;
671 case Stmt::OMPParallelDirectiveClass
:
672 K
= CXCursor_OMPParallelDirective
;
674 case Stmt::OMPSimdDirectiveClass
:
675 K
= CXCursor_OMPSimdDirective
;
677 case Stmt::OMPTileDirectiveClass
:
678 K
= CXCursor_OMPTileDirective
;
680 case Stmt::OMPUnrollDirectiveClass
:
681 K
= CXCursor_OMPUnrollDirective
;
683 case Stmt::OMPReverseDirectiveClass
:
684 K
= CXCursor_OMPReverseDirective
;
686 case Stmt::OMPInterchangeDirectiveClass
:
687 K
= CXCursor_OMPTileDirective
;
689 case Stmt::OMPForDirectiveClass
:
690 K
= CXCursor_OMPForDirective
;
692 case Stmt::OMPForSimdDirectiveClass
:
693 K
= CXCursor_OMPForSimdDirective
;
695 case Stmt::OMPSectionsDirectiveClass
:
696 K
= CXCursor_OMPSectionsDirective
;
698 case Stmt::OMPSectionDirectiveClass
:
699 K
= CXCursor_OMPSectionDirective
;
701 case Stmt::OMPScopeDirectiveClass
:
702 K
= CXCursor_OMPScopeDirective
;
704 case Stmt::OMPSingleDirectiveClass
:
705 K
= CXCursor_OMPSingleDirective
;
707 case Stmt::OMPMasterDirectiveClass
:
708 K
= CXCursor_OMPMasterDirective
;
710 case Stmt::OMPCriticalDirectiveClass
:
711 K
= CXCursor_OMPCriticalDirective
;
713 case Stmt::OMPParallelForDirectiveClass
:
714 K
= CXCursor_OMPParallelForDirective
;
716 case Stmt::OMPParallelForSimdDirectiveClass
:
717 K
= CXCursor_OMPParallelForSimdDirective
;
719 case Stmt::OMPParallelMasterDirectiveClass
:
720 K
= CXCursor_OMPParallelMasterDirective
;
722 case Stmt::OMPParallelMaskedDirectiveClass
:
723 K
= CXCursor_OMPParallelMaskedDirective
;
725 case Stmt::OMPParallelSectionsDirectiveClass
:
726 K
= CXCursor_OMPParallelSectionsDirective
;
728 case Stmt::OMPTaskDirectiveClass
:
729 K
= CXCursor_OMPTaskDirective
;
731 case Stmt::OMPTaskyieldDirectiveClass
:
732 K
= CXCursor_OMPTaskyieldDirective
;
734 case Stmt::OMPBarrierDirectiveClass
:
735 K
= CXCursor_OMPBarrierDirective
;
737 case Stmt::OMPTaskwaitDirectiveClass
:
738 K
= CXCursor_OMPTaskwaitDirective
;
740 case Stmt::OMPErrorDirectiveClass
:
741 K
= CXCursor_OMPErrorDirective
;
743 case Stmt::OMPTaskgroupDirectiveClass
:
744 K
= CXCursor_OMPTaskgroupDirective
;
746 case Stmt::OMPFlushDirectiveClass
:
747 K
= CXCursor_OMPFlushDirective
;
749 case Stmt::OMPDepobjDirectiveClass
:
750 K
= CXCursor_OMPDepobjDirective
;
752 case Stmt::OMPScanDirectiveClass
:
753 K
= CXCursor_OMPScanDirective
;
755 case Stmt::OMPOrderedDirectiveClass
:
756 K
= CXCursor_OMPOrderedDirective
;
758 case Stmt::OMPAtomicDirectiveClass
:
759 K
= CXCursor_OMPAtomicDirective
;
761 case Stmt::OMPTargetDirectiveClass
:
762 K
= CXCursor_OMPTargetDirective
;
764 case Stmt::OMPTargetDataDirectiveClass
:
765 K
= CXCursor_OMPTargetDataDirective
;
767 case Stmt::OMPTargetEnterDataDirectiveClass
:
768 K
= CXCursor_OMPTargetEnterDataDirective
;
770 case Stmt::OMPTargetExitDataDirectiveClass
:
771 K
= CXCursor_OMPTargetExitDataDirective
;
773 case Stmt::OMPTargetParallelDirectiveClass
:
774 K
= CXCursor_OMPTargetParallelDirective
;
776 case Stmt::OMPTargetParallelForDirectiveClass
:
777 K
= CXCursor_OMPTargetParallelForDirective
;
779 case Stmt::OMPTargetUpdateDirectiveClass
:
780 K
= CXCursor_OMPTargetUpdateDirective
;
782 case Stmt::OMPTeamsDirectiveClass
:
783 K
= CXCursor_OMPTeamsDirective
;
785 case Stmt::OMPCancellationPointDirectiveClass
:
786 K
= CXCursor_OMPCancellationPointDirective
;
788 case Stmt::OMPCancelDirectiveClass
:
789 K
= CXCursor_OMPCancelDirective
;
791 case Stmt::OMPTaskLoopDirectiveClass
:
792 K
= CXCursor_OMPTaskLoopDirective
;
794 case Stmt::OMPTaskLoopSimdDirectiveClass
:
795 K
= CXCursor_OMPTaskLoopSimdDirective
;
797 case Stmt::OMPMasterTaskLoopDirectiveClass
:
798 K
= CXCursor_OMPMasterTaskLoopDirective
;
800 case Stmt::OMPMaskedTaskLoopDirectiveClass
:
801 K
= CXCursor_OMPMaskedTaskLoopDirective
;
803 case Stmt::OMPMasterTaskLoopSimdDirectiveClass
:
804 K
= CXCursor_OMPMasterTaskLoopSimdDirective
;
806 case Stmt::OMPMaskedTaskLoopSimdDirectiveClass
:
807 K
= CXCursor_OMPMaskedTaskLoopSimdDirective
;
809 case Stmt::OMPParallelMasterTaskLoopDirectiveClass
:
810 K
= CXCursor_OMPParallelMasterTaskLoopDirective
;
812 case Stmt::OMPParallelMaskedTaskLoopDirectiveClass
:
813 K
= CXCursor_OMPParallelMaskedTaskLoopDirective
;
815 case Stmt::OMPParallelMasterTaskLoopSimdDirectiveClass
:
816 K
= CXCursor_OMPParallelMasterTaskLoopSimdDirective
;
818 case Stmt::OMPParallelMaskedTaskLoopSimdDirectiveClass
:
819 K
= CXCursor_OMPParallelMaskedTaskLoopSimdDirective
;
821 case Stmt::OMPDistributeDirectiveClass
:
822 K
= CXCursor_OMPDistributeDirective
;
824 case Stmt::OMPDistributeParallelForDirectiveClass
:
825 K
= CXCursor_OMPDistributeParallelForDirective
;
827 case Stmt::OMPDistributeParallelForSimdDirectiveClass
:
828 K
= CXCursor_OMPDistributeParallelForSimdDirective
;
830 case Stmt::OMPDistributeSimdDirectiveClass
:
831 K
= CXCursor_OMPDistributeSimdDirective
;
833 case Stmt::OMPTargetParallelForSimdDirectiveClass
:
834 K
= CXCursor_OMPTargetParallelForSimdDirective
;
836 case Stmt::OMPTargetSimdDirectiveClass
:
837 K
= CXCursor_OMPTargetSimdDirective
;
839 case Stmt::OMPTeamsDistributeDirectiveClass
:
840 K
= CXCursor_OMPTeamsDistributeDirective
;
842 case Stmt::OMPTeamsDistributeSimdDirectiveClass
:
843 K
= CXCursor_OMPTeamsDistributeSimdDirective
;
845 case Stmt::OMPTeamsDistributeParallelForSimdDirectiveClass
:
846 K
= CXCursor_OMPTeamsDistributeParallelForSimdDirective
;
848 case Stmt::OMPTeamsDistributeParallelForDirectiveClass
:
849 K
= CXCursor_OMPTeamsDistributeParallelForDirective
;
851 case Stmt::OMPTargetTeamsDirectiveClass
:
852 K
= CXCursor_OMPTargetTeamsDirective
;
854 case Stmt::OMPTargetTeamsDistributeDirectiveClass
:
855 K
= CXCursor_OMPTargetTeamsDistributeDirective
;
857 case Stmt::OMPTargetTeamsDistributeParallelForDirectiveClass
:
858 K
= CXCursor_OMPTargetTeamsDistributeParallelForDirective
;
860 case Stmt::OMPTargetTeamsDistributeParallelForSimdDirectiveClass
:
861 K
= CXCursor_OMPTargetTeamsDistributeParallelForSimdDirective
;
863 case Stmt::OMPTargetTeamsDistributeSimdDirectiveClass
:
864 K
= CXCursor_OMPTargetTeamsDistributeSimdDirective
;
866 case Stmt::OMPInteropDirectiveClass
:
867 K
= CXCursor_OMPInteropDirective
;
869 case Stmt::OMPDispatchDirectiveClass
:
870 K
= CXCursor_OMPDispatchDirective
;
872 case Stmt::OMPMaskedDirectiveClass
:
873 K
= CXCursor_OMPMaskedDirective
;
875 case Stmt::OMPGenericLoopDirectiveClass
:
876 K
= CXCursor_OMPGenericLoopDirective
;
878 case Stmt::OMPTeamsGenericLoopDirectiveClass
:
879 K
= CXCursor_OMPTeamsGenericLoopDirective
;
881 case Stmt::OMPTargetTeamsGenericLoopDirectiveClass
:
882 K
= CXCursor_OMPTargetTeamsGenericLoopDirective
;
884 case Stmt::OMPParallelGenericLoopDirectiveClass
:
885 K
= CXCursor_OMPParallelGenericLoopDirective
;
887 case Stmt::OpenACCComputeConstructClass
:
888 K
= CXCursor_OpenACCComputeConstruct
;
890 case Stmt::OpenACCLoopConstructClass
:
891 K
= CXCursor_OpenACCLoopConstruct
;
893 case Stmt::OpenACCCombinedConstructClass
:
894 K
= CXCursor_OpenACCCombinedConstruct
;
896 case Stmt::OpenACCDataConstructClass
:
897 K
= CXCursor_OpenACCDataConstruct
;
899 case Stmt::OpenACCEnterDataConstructClass
:
900 K
= CXCursor_OpenACCEnterDataConstruct
;
902 case Stmt::OpenACCExitDataConstructClass
:
903 K
= CXCursor_OpenACCExitDataConstruct
;
905 case Stmt::OpenACCHostDataConstructClass
:
906 K
= CXCursor_OpenACCHostDataConstruct
;
908 case Stmt::OpenACCWaitConstructClass
:
909 K
= CXCursor_OpenACCWaitConstruct
;
911 case Stmt::OpenACCInitConstructClass
:
912 K
= CXCursor_OpenACCInitConstruct
;
914 case Stmt::OpenACCShutdownConstructClass
:
915 K
= CXCursor_OpenACCShutdownConstruct
;
917 case Stmt::OpenACCSetConstructClass
:
918 K
= CXCursor_OpenACCSetConstruct
;
920 case Stmt::OpenACCUpdateConstructClass
:
921 K
= CXCursor_OpenACCUpdateConstruct
;
923 case Stmt::OMPTargetParallelGenericLoopDirectiveClass
:
924 K
= CXCursor_OMPTargetParallelGenericLoopDirective
;
926 case Stmt::BuiltinBitCastExprClass
:
927 K
= CXCursor_BuiltinBitCastExpr
;
929 case Stmt::OMPAssumeDirectiveClass
:
930 K
= CXCursor_OMPAssumeDirective
;
934 CXCursor C
= {K
, 0, {Parent
, S
, TU
}};
938 CXCursor
cxcursor::MakeCursorObjCSuperClassRef(ObjCInterfaceDecl
*Super
,
940 CXTranslationUnit TU
) {
941 assert(Super
&& TU
&& "Invalid arguments!");
942 void *RawLoc
= Loc
.getPtrEncoding();
943 CXCursor C
= {CXCursor_ObjCSuperClassRef
, 0, {Super
, RawLoc
, TU
}};
947 std::pair
<const ObjCInterfaceDecl
*, SourceLocation
>
948 cxcursor::getCursorObjCSuperClassRef(CXCursor C
) {
949 assert(C
.kind
== CXCursor_ObjCSuperClassRef
);
950 return std::make_pair(static_cast<const ObjCInterfaceDecl
*>(C
.data
[0]),
951 SourceLocation::getFromPtrEncoding(C
.data
[1]));
954 CXCursor
cxcursor::MakeCursorObjCProtocolRef(const ObjCProtocolDecl
*Proto
,
956 CXTranslationUnit TU
) {
957 assert(Proto
&& TU
&& "Invalid arguments!");
958 void *RawLoc
= Loc
.getPtrEncoding();
959 CXCursor C
= {CXCursor_ObjCProtocolRef
, 0, {Proto
, RawLoc
, TU
}};
963 std::pair
<const ObjCProtocolDecl
*, SourceLocation
>
964 cxcursor::getCursorObjCProtocolRef(CXCursor C
) {
965 assert(C
.kind
== CXCursor_ObjCProtocolRef
);
966 return std::make_pair(static_cast<const ObjCProtocolDecl
*>(C
.data
[0]),
967 SourceLocation::getFromPtrEncoding(C
.data
[1]));
970 CXCursor
cxcursor::MakeCursorObjCClassRef(const ObjCInterfaceDecl
*Class
,
972 CXTranslationUnit TU
) {
973 // 'Class' can be null for invalid code.
975 return MakeCXCursorInvalid(CXCursor_InvalidCode
);
976 assert(TU
&& "Invalid arguments!");
977 void *RawLoc
= Loc
.getPtrEncoding();
978 CXCursor C
= {CXCursor_ObjCClassRef
, 0, {Class
, RawLoc
, TU
}};
982 std::pair
<const ObjCInterfaceDecl
*, SourceLocation
>
983 cxcursor::getCursorObjCClassRef(CXCursor C
) {
984 assert(C
.kind
== CXCursor_ObjCClassRef
);
985 return std::make_pair(static_cast<const ObjCInterfaceDecl
*>(C
.data
[0]),
986 SourceLocation::getFromPtrEncoding(C
.data
[1]));
989 CXCursor
cxcursor::MakeCursorTypeRef(const TypeDecl
*Type
, SourceLocation Loc
,
990 CXTranslationUnit TU
) {
991 assert(Type
&& TU
&& "Invalid arguments!");
992 void *RawLoc
= Loc
.getPtrEncoding();
993 CXCursor C
= {CXCursor_TypeRef
, 0, {Type
, RawLoc
, TU
}};
997 std::pair
<const TypeDecl
*, SourceLocation
>
998 cxcursor::getCursorTypeRef(CXCursor C
) {
999 assert(C
.kind
== CXCursor_TypeRef
);
1000 return std::make_pair(static_cast<const TypeDecl
*>(C
.data
[0]),
1001 SourceLocation::getFromPtrEncoding(C
.data
[1]));
1004 CXCursor
cxcursor::MakeCursorTemplateRef(const TemplateDecl
*Template
,
1006 CXTranslationUnit TU
) {
1007 assert(Template
&& TU
&& "Invalid arguments!");
1008 void *RawLoc
= Loc
.getPtrEncoding();
1009 CXCursor C
= {CXCursor_TemplateRef
, 0, {Template
, RawLoc
, TU
}};
1013 std::pair
<const TemplateDecl
*, SourceLocation
>
1014 cxcursor::getCursorTemplateRef(CXCursor C
) {
1015 assert(C
.kind
== CXCursor_TemplateRef
);
1016 return std::make_pair(static_cast<const TemplateDecl
*>(C
.data
[0]),
1017 SourceLocation::getFromPtrEncoding(C
.data
[1]));
1020 CXCursor
cxcursor::MakeCursorNamespaceRef(const NamedDecl
*NS
,
1022 CXTranslationUnit TU
) {
1024 assert(NS
&& (isa
<NamespaceDecl
>(NS
) || isa
<NamespaceAliasDecl
>(NS
)) && TU
&&
1025 "Invalid arguments!");
1026 void *RawLoc
= Loc
.getPtrEncoding();
1027 CXCursor C
= {CXCursor_NamespaceRef
, 0, {NS
, RawLoc
, TU
}};
1031 std::pair
<const NamedDecl
*, SourceLocation
>
1032 cxcursor::getCursorNamespaceRef(CXCursor C
) {
1033 assert(C
.kind
== CXCursor_NamespaceRef
);
1034 return std::make_pair(static_cast<const NamedDecl
*>(C
.data
[0]),
1035 SourceLocation::getFromPtrEncoding(C
.data
[1]));
1038 CXCursor
cxcursor::MakeCursorVariableRef(const VarDecl
*Var
, SourceLocation Loc
,
1039 CXTranslationUnit TU
) {
1041 assert(Var
&& TU
&& "Invalid arguments!");
1042 void *RawLoc
= Loc
.getPtrEncoding();
1043 CXCursor C
= {CXCursor_VariableRef
, 0, {Var
, RawLoc
, TU
}};
1047 std::pair
<const VarDecl
*, SourceLocation
>
1048 cxcursor::getCursorVariableRef(CXCursor C
) {
1049 assert(C
.kind
== CXCursor_VariableRef
);
1050 return std::make_pair(static_cast<const VarDecl
*>(C
.data
[0]),
1051 SourceLocation::getFromPtrEncoding(C
.data
[1]));
1054 CXCursor
cxcursor::MakeCursorMemberRef(const FieldDecl
*Field
,
1056 CXTranslationUnit TU
) {
1058 assert(Field
&& TU
&& "Invalid arguments!");
1059 void *RawLoc
= Loc
.getPtrEncoding();
1060 CXCursor C
= {CXCursor_MemberRef
, 0, {Field
, RawLoc
, TU
}};
1064 std::pair
<const FieldDecl
*, SourceLocation
>
1065 cxcursor::getCursorMemberRef(CXCursor C
) {
1066 assert(C
.kind
== CXCursor_MemberRef
);
1067 return std::make_pair(static_cast<const FieldDecl
*>(C
.data
[0]),
1068 SourceLocation::getFromPtrEncoding(C
.data
[1]));
1071 CXCursor
cxcursor::MakeCursorCXXBaseSpecifier(const CXXBaseSpecifier
*B
,
1072 CXTranslationUnit TU
) {
1073 CXCursor C
= {CXCursor_CXXBaseSpecifier
, 0, {B
, nullptr, TU
}};
1077 const CXXBaseSpecifier
*cxcursor::getCursorCXXBaseSpecifier(CXCursor C
) {
1078 assert(C
.kind
== CXCursor_CXXBaseSpecifier
);
1079 return static_cast<const CXXBaseSpecifier
*>(C
.data
[0]);
1082 CXCursor
cxcursor::MakePreprocessingDirectiveCursor(SourceRange Range
,
1083 CXTranslationUnit TU
) {
1085 CXCursor_PreprocessingDirective
,
1087 {Range
.getBegin().getPtrEncoding(), Range
.getEnd().getPtrEncoding(), TU
}};
1091 SourceRange
cxcursor::getCursorPreprocessingDirective(CXCursor C
) {
1092 assert(C
.kind
== CXCursor_PreprocessingDirective
);
1093 SourceRange
Range(SourceLocation::getFromPtrEncoding(C
.data
[0]),
1094 SourceLocation::getFromPtrEncoding(C
.data
[1]));
1095 ASTUnit
*TU
= getCursorASTUnit(C
);
1096 return TU
->mapRangeFromPreamble(Range
);
1099 CXCursor
cxcursor::MakeMacroDefinitionCursor(const MacroDefinitionRecord
*MI
,
1100 CXTranslationUnit TU
) {
1101 CXCursor C
= {CXCursor_MacroDefinition
, 0, {MI
, nullptr, TU
}};
1105 const MacroDefinitionRecord
*cxcursor::getCursorMacroDefinition(CXCursor C
) {
1106 assert(C
.kind
== CXCursor_MacroDefinition
);
1107 return static_cast<const MacroDefinitionRecord
*>(C
.data
[0]);
1110 CXCursor
cxcursor::MakeMacroExpansionCursor(MacroExpansion
*MI
,
1111 CXTranslationUnit TU
) {
1112 CXCursor C
= {CXCursor_MacroExpansion
, 0, {MI
, nullptr, TU
}};
1116 CXCursor
cxcursor::MakeMacroExpansionCursor(MacroDefinitionRecord
*MI
,
1118 CXTranslationUnit TU
) {
1119 assert(Loc
.isValid());
1120 CXCursor C
= {CXCursor_MacroExpansion
, 0, {MI
, Loc
.getPtrEncoding(), TU
}};
1124 const IdentifierInfo
*cxcursor::MacroExpansionCursor::getName() const {
1126 return getAsMacroDefinition()->getName();
1127 return getAsMacroExpansion()->getName();
1129 const MacroDefinitionRecord
*
1130 cxcursor::MacroExpansionCursor::getDefinition() const {
1132 return getAsMacroDefinition();
1133 return getAsMacroExpansion()->getDefinition();
1135 SourceRange
cxcursor::MacroExpansionCursor::getSourceRange() const {
1137 return getPseudoLoc();
1138 return getAsMacroExpansion()->getSourceRange();
1141 CXCursor
cxcursor::MakeInclusionDirectiveCursor(InclusionDirective
*ID
,
1142 CXTranslationUnit TU
) {
1143 CXCursor C
= {CXCursor_InclusionDirective
, 0, {ID
, nullptr, TU
}};
1147 const InclusionDirective
*cxcursor::getCursorInclusionDirective(CXCursor C
) {
1148 assert(C
.kind
== CXCursor_InclusionDirective
);
1149 return static_cast<const InclusionDirective
*>(C
.data
[0]);
1152 CXCursor
cxcursor::MakeCursorLabelRef(LabelStmt
*Label
, SourceLocation Loc
,
1153 CXTranslationUnit TU
) {
1155 assert(Label
&& TU
&& "Invalid arguments!");
1156 void *RawLoc
= Loc
.getPtrEncoding();
1157 CXCursor C
= {CXCursor_LabelRef
, 0, {Label
, RawLoc
, TU
}};
1161 std::pair
<const LabelStmt
*, SourceLocation
>
1162 cxcursor::getCursorLabelRef(CXCursor C
) {
1163 assert(C
.kind
== CXCursor_LabelRef
);
1164 return std::make_pair(static_cast<const LabelStmt
*>(C
.data
[0]),
1165 SourceLocation::getFromPtrEncoding(C
.data
[1]));
1168 CXCursor
cxcursor::MakeCursorOverloadedDeclRef(const OverloadExpr
*E
,
1169 CXTranslationUnit TU
) {
1170 assert(E
&& TU
&& "Invalid arguments!");
1171 OverloadedDeclRefStorage
Storage(E
);
1172 void *RawLoc
= E
->getNameLoc().getPtrEncoding();
1174 CXCursor_OverloadedDeclRef
, 0, {Storage
.getOpaqueValue(), RawLoc
, TU
}};
1178 CXCursor
cxcursor::MakeCursorOverloadedDeclRef(const Decl
*D
,
1180 CXTranslationUnit TU
) {
1181 assert(D
&& TU
&& "Invalid arguments!");
1182 void *RawLoc
= Loc
.getPtrEncoding();
1183 OverloadedDeclRefStorage
Storage(D
);
1185 CXCursor_OverloadedDeclRef
, 0, {Storage
.getOpaqueValue(), RawLoc
, TU
}};
1189 CXCursor
cxcursor::MakeCursorOverloadedDeclRef(TemplateName Name
,
1191 CXTranslationUnit TU
) {
1192 assert(Name
.getAsOverloadedTemplate() && TU
&& "Invalid arguments!");
1193 void *RawLoc
= Loc
.getPtrEncoding();
1194 OverloadedDeclRefStorage
Storage(Name
.getAsOverloadedTemplate());
1196 CXCursor_OverloadedDeclRef
, 0, {Storage
.getOpaqueValue(), RawLoc
, TU
}};
1200 std::pair
<cxcursor::OverloadedDeclRefStorage
, SourceLocation
>
1201 cxcursor::getCursorOverloadedDeclRef(CXCursor C
) {
1202 assert(C
.kind
== CXCursor_OverloadedDeclRef
);
1203 return std::make_pair(OverloadedDeclRefStorage::getFromOpaqueValue(
1204 const_cast<void *>(C
.data
[0])),
1205 SourceLocation::getFromPtrEncoding(C
.data
[1]));
1208 const Decl
*cxcursor::getCursorDecl(CXCursor Cursor
) {
1209 return static_cast<const Decl
*>(Cursor
.data
[0]);
1212 const Expr
*cxcursor::getCursorExpr(CXCursor Cursor
) {
1213 return dyn_cast_or_null
<Expr
>(getCursorStmt(Cursor
));
1216 const Stmt
*cxcursor::getCursorStmt(CXCursor Cursor
) {
1217 if (Cursor
.kind
== CXCursor_ObjCSuperClassRef
||
1218 Cursor
.kind
== CXCursor_ObjCProtocolRef
||
1219 Cursor
.kind
== CXCursor_ObjCClassRef
)
1222 return static_cast<const Stmt
*>(Cursor
.data
[1]);
1225 const Attr
*cxcursor::getCursorAttr(CXCursor Cursor
) {
1226 return static_cast<const Attr
*>(Cursor
.data
[1]);
1229 ASTContext
&cxcursor::getCursorContext(CXCursor Cursor
) {
1230 return getCursorASTUnit(Cursor
)->getASTContext();
1233 ASTUnit
*cxcursor::getCursorASTUnit(CXCursor Cursor
) {
1234 CXTranslationUnit TU
= getCursorTU(Cursor
);
1237 return cxtu::getASTUnit(TU
);
1240 CXTranslationUnit
cxcursor::getCursorTU(CXCursor Cursor
) {
1241 return static_cast<CXTranslationUnit
>(const_cast<void *>(Cursor
.data
[2]));
1244 void cxcursor::getOverriddenCursors(CXCursor cursor
,
1245 SmallVectorImpl
<CXCursor
> &overridden
) {
1246 assert(clang_isDeclaration(cursor
.kind
));
1247 const NamedDecl
*D
= dyn_cast_or_null
<NamedDecl
>(getCursorDecl(cursor
));
1251 CXTranslationUnit TU
= getCursorTU(cursor
);
1252 SmallVector
<const NamedDecl
*, 8> OverDecls
;
1253 D
->getASTContext().getOverriddenMethods(D
, OverDecls
);
1255 for (SmallVectorImpl
<const NamedDecl
*>::iterator I
= OverDecls
.begin(),
1256 E
= OverDecls
.end();
1258 overridden
.push_back(MakeCXCursor(*I
, TU
));
1262 std::pair
<int, SourceLocation
>
1263 cxcursor::getSelectorIdentifierIndexAndLoc(CXCursor cursor
) {
1264 if (cursor
.kind
== CXCursor_ObjCMessageExpr
) {
1265 if (cursor
.xdata
!= -1)
1266 return std::make_pair(cursor
.xdata
,
1267 cast
<ObjCMessageExpr
>(getCursorExpr(cursor
))
1268 ->getSelectorLoc(cursor
.xdata
));
1269 } else if (cursor
.kind
== CXCursor_ObjCClassMethodDecl
||
1270 cursor
.kind
== CXCursor_ObjCInstanceMethodDecl
) {
1271 if (cursor
.xdata
!= -1)
1272 return std::make_pair(cursor
.xdata
,
1273 cast
<ObjCMethodDecl
>(getCursorDecl(cursor
))
1274 ->getSelectorLoc(cursor
.xdata
));
1277 return std::make_pair(-1, SourceLocation());
1280 CXCursor
cxcursor::getSelectorIdentifierCursor(int SelIdx
, CXCursor cursor
) {
1281 CXCursor newCursor
= cursor
;
1283 if (cursor
.kind
== CXCursor_ObjCMessageExpr
) {
1286 cast
<ObjCMessageExpr
>(getCursorExpr(cursor
))->getNumSelectorLocs())
1287 newCursor
.xdata
= -1;
1289 newCursor
.xdata
= SelIdx
;
1290 } else if (cursor
.kind
== CXCursor_ObjCClassMethodDecl
||
1291 cursor
.kind
== CXCursor_ObjCInstanceMethodDecl
) {
1294 cast
<ObjCMethodDecl
>(getCursorDecl(cursor
))->getNumSelectorLocs())
1295 newCursor
.xdata
= -1;
1297 newCursor
.xdata
= SelIdx
;
1303 CXCursor
cxcursor::getTypeRefCursor(CXCursor cursor
) {
1304 if (cursor
.kind
!= CXCursor_CallExpr
)
1307 if (cursor
.xdata
== 0)
1310 const Expr
*E
= getCursorExpr(cursor
);
1311 TypeSourceInfo
*Type
= nullptr;
1312 if (const CXXUnresolvedConstructExpr
*UnCtor
=
1313 dyn_cast
<CXXUnresolvedConstructExpr
>(E
)) {
1314 Type
= UnCtor
->getTypeSourceInfo();
1315 } else if (const CXXTemporaryObjectExpr
*Tmp
=
1316 dyn_cast
<CXXTemporaryObjectExpr
>(E
)) {
1317 Type
= Tmp
->getTypeSourceInfo();
1323 CXTranslationUnit TU
= getCursorTU(cursor
);
1324 QualType Ty
= Type
->getType();
1325 TypeLoc TL
= Type
->getTypeLoc();
1326 SourceLocation Loc
= TL
.getBeginLoc();
1328 if (const ElaboratedType
*ElabT
= Ty
->getAs
<ElaboratedType
>()) {
1329 Ty
= ElabT
->getNamedType();
1330 ElaboratedTypeLoc ElabTL
= TL
.castAs
<ElaboratedTypeLoc
>();
1331 Loc
= ElabTL
.getNamedTypeLoc().getBeginLoc();
1334 if (const TypedefType
*Typedef
= Ty
->getAs
<TypedefType
>())
1335 return MakeCursorTypeRef(Typedef
->getDecl(), Loc
, TU
);
1336 if (const TagType
*Tag
= Ty
->getAs
<TagType
>())
1337 return MakeCursorTypeRef(Tag
->getDecl(), Loc
, TU
);
1338 if (const TemplateTypeParmType
*TemplP
= Ty
->getAs
<TemplateTypeParmType
>())
1339 return MakeCursorTypeRef(TemplP
->getDecl(), Loc
, TU
);
1344 bool cxcursor::operator==(CXCursor X
, CXCursor Y
) {
1345 return X
.kind
== Y
.kind
&& X
.data
[0] == Y
.data
[0] && X
.data
[1] == Y
.data
[1] &&
1346 X
.data
[2] == Y
.data
[2];
1349 // FIXME: Remove once we can model DeclGroups and their appropriate ranges
1350 // properly in the ASTs.
1351 bool cxcursor::isFirstInDeclGroup(CXCursor C
) {
1352 assert(clang_isDeclaration(C
.kind
));
1353 return ((uintptr_t)(C
.data
[1])) != 0;
1356 //===----------------------------------------------------------------------===//
1357 // libclang CXCursor APIs
1358 //===----------------------------------------------------------------------===//
1360 int clang_Cursor_isNull(CXCursor cursor
) {
1361 return clang_equalCursors(cursor
, clang_getNullCursor());
1364 CXTranslationUnit
clang_Cursor_getTranslationUnit(CXCursor cursor
) {
1365 return getCursorTU(cursor
);
1368 int clang_Cursor_getNumArguments(CXCursor C
) {
1369 if (clang_isDeclaration(C
.kind
)) {
1370 const Decl
*D
= cxcursor::getCursorDecl(C
);
1371 if (const ObjCMethodDecl
*MD
= dyn_cast_or_null
<ObjCMethodDecl
>(D
))
1372 return MD
->param_size();
1373 if (const FunctionDecl
*FD
= dyn_cast_or_null
<FunctionDecl
>(D
))
1374 return FD
->param_size();
1377 if (clang_isExpression(C
.kind
)) {
1378 const Expr
*E
= cxcursor::getCursorExpr(C
);
1379 if (const CallExpr
*CE
= dyn_cast
<CallExpr
>(E
)) {
1380 return CE
->getNumArgs();
1382 if (const CXXConstructExpr
*CE
= dyn_cast
<CXXConstructExpr
>(E
)) {
1383 return CE
->getNumArgs();
1390 CXCursor
clang_Cursor_getArgument(CXCursor C
, unsigned i
) {
1391 if (clang_isDeclaration(C
.kind
)) {
1392 const Decl
*D
= cxcursor::getCursorDecl(C
);
1393 if (const ObjCMethodDecl
*MD
= dyn_cast_or_null
<ObjCMethodDecl
>(D
)) {
1394 if (i
< MD
->param_size())
1395 return cxcursor::MakeCXCursor(MD
->parameters()[i
],
1396 cxcursor::getCursorTU(C
));
1397 } else if (const FunctionDecl
*FD
= dyn_cast_or_null
<FunctionDecl
>(D
)) {
1398 if (i
< FD
->param_size())
1399 return cxcursor::MakeCXCursor(FD
->parameters()[i
],
1400 cxcursor::getCursorTU(C
));
1404 if (clang_isExpression(C
.kind
)) {
1405 const Expr
*E
= cxcursor::getCursorExpr(C
);
1406 if (const CallExpr
*CE
= dyn_cast
<CallExpr
>(E
)) {
1407 if (i
< CE
->getNumArgs()) {
1408 return cxcursor::MakeCXCursor(CE
->getArg(i
), getCursorDecl(C
),
1409 cxcursor::getCursorTU(C
));
1412 if (const CXXConstructExpr
*CE
= dyn_cast
<CXXConstructExpr
>(E
)) {
1413 if (i
< CE
->getNumArgs()) {
1414 return cxcursor::MakeCXCursor(CE
->getArg(i
), getCursorDecl(C
),
1415 cxcursor::getCursorTU(C
));
1420 return clang_getNullCursor();
1423 int clang_Cursor_getNumTemplateArguments(CXCursor C
) {
1424 CXCursorKind kind
= clang_getCursorKind(C
);
1425 if (kind
!= CXCursor_FunctionDecl
&& kind
!= CXCursor_StructDecl
&&
1426 kind
!= CXCursor_ClassDecl
&&
1427 kind
!= CXCursor_ClassTemplatePartialSpecialization
) {
1431 if (const auto *FD
=
1432 llvm::dyn_cast_if_present
<clang::FunctionDecl
>(getCursorDecl(C
))) {
1433 const FunctionTemplateSpecializationInfo
*SpecInfo
=
1434 FD
->getTemplateSpecializationInfo();
1438 return SpecInfo
->TemplateArguments
->size();
1441 if (const auto *SD
=
1442 llvm::dyn_cast_if_present
<clang::ClassTemplateSpecializationDecl
>(
1443 getCursorDecl(C
))) {
1444 return SD
->getTemplateArgs().size();
1450 enum CXGetTemplateArgumentStatus
{
1451 /** The operation completed successfully */
1452 CXGetTemplateArgumentStatus_Success
= 0,
1454 /** The specified cursor did not represent a FunctionDecl or
1455 ClassTemplateSpecializationDecl. */
1456 CXGetTemplateArgumentStatus_CursorNotCompatibleDecl
= -1,
1458 /** The specified cursor was not castable to a FunctionDecl or
1459 ClassTemplateSpecializationDecl. */
1460 CXGetTemplateArgumentStatus_BadDeclCast
= -2,
1462 /** A NULL FunctionTemplateSpecializationInfo was retrieved. */
1463 CXGetTemplateArgumentStatus_NullTemplSpecInfo
= -3,
1465 /** An invalid (OOB) argument index was specified */
1466 CXGetTemplateArgumentStatus_InvalidIndex
= -4
1469 static int clang_Cursor_getTemplateArgument(CXCursor C
, unsigned I
,
1470 TemplateArgument
*TA
) {
1471 CXCursorKind kind
= clang_getCursorKind(C
);
1472 if (kind
!= CXCursor_FunctionDecl
&& kind
!= CXCursor_StructDecl
&&
1473 kind
!= CXCursor_ClassDecl
&&
1474 kind
!= CXCursor_ClassTemplatePartialSpecialization
) {
1478 if (const auto *FD
=
1479 llvm::dyn_cast_if_present
<clang::FunctionDecl
>(getCursorDecl(C
))) {
1481 const FunctionTemplateSpecializationInfo
*SpecInfo
=
1482 FD
->getTemplateSpecializationInfo();
1484 return CXGetTemplateArgumentStatus_NullTemplSpecInfo
;
1487 if (I
>= SpecInfo
->TemplateArguments
->size()) {
1488 return CXGetTemplateArgumentStatus_InvalidIndex
;
1491 *TA
= SpecInfo
->TemplateArguments
->get(I
);
1495 if (const auto *SD
=
1496 llvm::dyn_cast_if_present
<clang::ClassTemplateSpecializationDecl
>(
1497 getCursorDecl(C
))) {
1498 if (I
>= SD
->getTemplateArgs().size()) {
1499 return CXGetTemplateArgumentStatus_InvalidIndex
;
1502 *TA
= SD
->getTemplateArgs()[I
];
1506 return CXGetTemplateArgumentStatus_BadDeclCast
;
1509 enum CXTemplateArgumentKind
clang_Cursor_getTemplateArgumentKind(CXCursor C
,
1511 TemplateArgument TA
;
1512 if (clang_Cursor_getTemplateArgument(C
, I
, &TA
)) {
1513 return CXTemplateArgumentKind_Invalid
;
1516 switch (TA
.getKind()) {
1517 case TemplateArgument::Null
:
1518 return CXTemplateArgumentKind_Null
;
1519 case TemplateArgument::Type
:
1520 return CXTemplateArgumentKind_Type
;
1521 case TemplateArgument::Declaration
:
1522 return CXTemplateArgumentKind_Declaration
;
1523 case TemplateArgument::NullPtr
:
1524 return CXTemplateArgumentKind_NullPtr
;
1525 case TemplateArgument::Integral
:
1526 return CXTemplateArgumentKind_Integral
;
1527 case TemplateArgument::StructuralValue
:
1528 // FIXME: Expose these values.
1529 return CXTemplateArgumentKind_Invalid
;
1530 case TemplateArgument::Template
:
1531 return CXTemplateArgumentKind_Template
;
1532 case TemplateArgument::TemplateExpansion
:
1533 return CXTemplateArgumentKind_TemplateExpansion
;
1534 case TemplateArgument::Expression
:
1535 return CXTemplateArgumentKind_Expression
;
1536 case TemplateArgument::Pack
:
1537 return CXTemplateArgumentKind_Pack
;
1540 return CXTemplateArgumentKind_Invalid
;
1543 CXType
clang_Cursor_getTemplateArgumentType(CXCursor C
, unsigned I
) {
1544 TemplateArgument TA
;
1545 if (clang_Cursor_getTemplateArgument(C
, I
, &TA
) !=
1546 CXGetTemplateArgumentStatus_Success
) {
1547 return cxtype::MakeCXType(QualType(), getCursorTU(C
));
1550 if (TA
.getKind() != TemplateArgument::Type
) {
1551 return cxtype::MakeCXType(QualType(), getCursorTU(C
));
1554 return cxtype::MakeCXType(TA
.getAsType(), getCursorTU(C
));
1557 long long clang_Cursor_getTemplateArgumentValue(CXCursor C
, unsigned I
) {
1558 TemplateArgument TA
;
1559 if (clang_Cursor_getTemplateArgument(C
, I
, &TA
) !=
1560 CXGetTemplateArgumentStatus_Success
) {
1561 assert(0 && "Unable to retrieve TemplateArgument");
1565 if (TA
.getKind() != TemplateArgument::Integral
) {
1566 assert(0 && "Passed template argument is not Integral");
1570 return TA
.getAsIntegral().getSExtValue();
1573 unsigned long long clang_Cursor_getTemplateArgumentUnsignedValue(CXCursor C
,
1575 TemplateArgument TA
;
1576 if (clang_Cursor_getTemplateArgument(C
, I
, &TA
) !=
1577 CXGetTemplateArgumentStatus_Success
) {
1578 assert(0 && "Unable to retrieve TemplateArgument");
1582 if (TA
.getKind() != TemplateArgument::Integral
) {
1583 assert(0 && "Passed template argument is not Integral");
1587 return TA
.getAsIntegral().getZExtValue();
1590 //===----------------------------------------------------------------------===//
1592 //===----------------------------------------------------------------------===//
1594 typedef llvm::DenseMap
<CXCursor
, unsigned> CXCursorSet_Impl
;
1596 static inline CXCursorSet
packCXCursorSet(CXCursorSet_Impl
*setImpl
) {
1597 return (CXCursorSet
)setImpl
;
1599 static inline CXCursorSet_Impl
*unpackCXCursorSet(CXCursorSet set
) {
1600 return (CXCursorSet_Impl
*)set
;
1603 template <> struct DenseMapInfo
<CXCursor
> {
1605 static inline CXCursor
getEmptyKey() {
1606 return MakeCXCursorInvalid(CXCursor_InvalidFile
);
1608 static inline CXCursor
getTombstoneKey() {
1609 return MakeCXCursorInvalid(CXCursor_NoDeclFound
);
1611 static inline unsigned getHashValue(const CXCursor
&cursor
) {
1612 return llvm::DenseMapInfo
<std::pair
<const void *, const void *>>::
1613 getHashValue(std::make_pair(cursor
.data
[0], cursor
.data
[1]));
1615 static inline bool isEqual(const CXCursor
&x
, const CXCursor
&y
) {
1616 return x
.kind
== y
.kind
&& x
.data
[0] == y
.data
[0] && x
.data
[1] == y
.data
[1];
1621 CXCursorSet
clang_createCXCursorSet() {
1622 return packCXCursorSet(new CXCursorSet_Impl());
1625 void clang_disposeCXCursorSet(CXCursorSet set
) {
1626 delete unpackCXCursorSet(set
);
1629 unsigned clang_CXCursorSet_contains(CXCursorSet set
, CXCursor cursor
) {
1630 CXCursorSet_Impl
*setImpl
= unpackCXCursorSet(set
);
1633 return setImpl
->find(cursor
) != setImpl
->end();
1636 unsigned clang_CXCursorSet_insert(CXCursorSet set
, CXCursor cursor
) {
1637 // Do not insert invalid cursors into the set.
1638 if (cursor
.kind
>= CXCursor_FirstInvalid
&&
1639 cursor
.kind
<= CXCursor_LastInvalid
)
1642 CXCursorSet_Impl
*setImpl
= unpackCXCursorSet(set
);
1645 unsigned &entry
= (*setImpl
)[cursor
];
1646 unsigned flag
= entry
== 0 ? 1 : 0;
1651 CXCompletionString
clang_getCursorCompletionString(CXCursor cursor
) {
1652 enum CXCursorKind kind
= clang_getCursorKind(cursor
);
1653 if (clang_isDeclaration(kind
)) {
1654 const Decl
*decl
= getCursorDecl(cursor
);
1655 if (const NamedDecl
*namedDecl
= dyn_cast_or_null
<NamedDecl
>(decl
)) {
1656 ASTUnit
*unit
= getCursorASTUnit(cursor
);
1657 CodeCompletionResult
Result(namedDecl
, CCP_Declaration
);
1658 CodeCompletionString
*String
= Result
.CreateCodeCompletionString(
1659 unit
->getASTContext(), unit
->getPreprocessor(),
1660 CodeCompletionContext::CCC_Other
,
1661 unit
->getCodeCompletionTUInfo().getAllocator(),
1662 unit
->getCodeCompletionTUInfo(), true);
1665 } else if (kind
== CXCursor_MacroDefinition
) {
1666 const MacroDefinitionRecord
*definition
= getCursorMacroDefinition(cursor
);
1667 const IdentifierInfo
*Macro
= definition
->getName();
1668 ASTUnit
*unit
= getCursorASTUnit(cursor
);
1669 CodeCompletionResult
Result(
1671 unit
->getPreprocessor().getMacroDefinition(Macro
).getMacroInfo());
1672 CodeCompletionString
*String
= Result
.CreateCodeCompletionString(
1673 unit
->getASTContext(), unit
->getPreprocessor(),
1674 CodeCompletionContext::CCC_Other
,
1675 unit
->getCodeCompletionTUInfo().getAllocator(),
1676 unit
->getCodeCompletionTUInfo(), false);
1683 struct OverridenCursorsPool
{
1684 typedef SmallVector
<CXCursor
, 2> CursorVec
;
1685 std::vector
<CursorVec
*> AllCursors
;
1686 std::vector
<CursorVec
*> AvailableCursors
;
1688 ~OverridenCursorsPool() {
1689 for (std::vector
<CursorVec
*>::iterator I
= AllCursors
.begin(),
1690 E
= AllCursors
.end();
1698 void *cxcursor::createOverridenCXCursorsPool() {
1699 return new OverridenCursorsPool();
1702 void cxcursor::disposeOverridenCXCursorsPool(void *pool
) {
1703 delete static_cast<OverridenCursorsPool
*>(pool
);
1706 void clang_getOverriddenCursors(CXCursor cursor
, CXCursor
**overridden
,
1707 unsigned *num_overridden
) {
1709 *overridden
= nullptr;
1711 *num_overridden
= 0;
1713 CXTranslationUnit TU
= cxcursor::getCursorTU(cursor
);
1715 if (!overridden
|| !num_overridden
|| !TU
)
1718 if (!clang_isDeclaration(cursor
.kind
))
1721 OverridenCursorsPool
&pool
=
1722 *static_cast<OverridenCursorsPool
*>(TU
->OverridenCursorsPool
);
1724 OverridenCursorsPool::CursorVec
*Vec
= nullptr;
1726 if (!pool
.AvailableCursors
.empty()) {
1727 Vec
= pool
.AvailableCursors
.back();
1728 pool
.AvailableCursors
.pop_back();
1730 Vec
= new OverridenCursorsPool::CursorVec();
1731 pool
.AllCursors
.push_back(Vec
);
1734 // Clear out the vector, but don't free the memory contents. This
1735 // reduces malloc() traffic.
1738 // Use the first entry to contain a back reference to the vector.
1739 // This is a complete hack.
1740 CXCursor backRefCursor
= MakeCXCursorInvalid(CXCursor_InvalidFile
, TU
);
1741 backRefCursor
.data
[0] = Vec
;
1742 assert(cxcursor::getCursorTU(backRefCursor
) == TU
);
1743 Vec
->push_back(backRefCursor
);
1745 // Get the overridden cursors.
1746 cxcursor::getOverriddenCursors(cursor
, *Vec
);
1748 // Did we get any overridden cursors? If not, return Vec to the pool
1749 // of available cursor vectors.
1750 if (Vec
->size() == 1) {
1751 pool
.AvailableCursors
.push_back(Vec
);
1755 // Now tell the caller about the overridden cursors.
1756 assert(Vec
->size() > 1);
1757 *overridden
= &((*Vec
)[1]);
1758 *num_overridden
= Vec
->size() - 1;
1761 void clang_disposeOverriddenCursors(CXCursor
*overridden
) {
1765 // Use pointer arithmetic to get back the first faux entry
1766 // which has a back-reference to the TU and the vector.
1768 OverridenCursorsPool::CursorVec
*Vec
=
1769 static_cast<OverridenCursorsPool::CursorVec
*>(
1770 const_cast<void *>(overridden
->data
[0]));
1771 CXTranslationUnit TU
= getCursorTU(*overridden
);
1775 OverridenCursorsPool
&pool
=
1776 *static_cast<OverridenCursorsPool
*>(TU
->OverridenCursorsPool
);
1778 pool
.AvailableCursors
.push_back(Vec
);
1781 int clang_Cursor_isDynamicCall(CXCursor C
) {
1782 const Expr
*E
= nullptr;
1783 if (clang_isExpression(C
.kind
))
1784 E
= getCursorExpr(C
);
1788 if (const ObjCMessageExpr
*MsgE
= dyn_cast
<ObjCMessageExpr
>(E
)) {
1789 if (MsgE
->getReceiverKind() != ObjCMessageExpr::Instance
)
1791 if (auto *RecE
= dyn_cast
<ObjCMessageExpr
>(
1792 MsgE
->getInstanceReceiver()->IgnoreParenCasts())) {
1793 if (RecE
->getMethodFamily() == OMF_alloc
)
1799 if (auto *PropRefE
= dyn_cast
<ObjCPropertyRefExpr
>(E
)) {
1800 return !PropRefE
->isSuperReceiver();
1803 const MemberExpr
*ME
= nullptr;
1804 if (isa
<MemberExpr
>(E
))
1805 ME
= cast
<MemberExpr
>(E
);
1806 else if (const CallExpr
*CE
= dyn_cast
<CallExpr
>(E
))
1807 ME
= dyn_cast_or_null
<MemberExpr
>(CE
->getCallee());
1810 if (const CXXMethodDecl
*MD
=
1811 dyn_cast_or_null
<CXXMethodDecl
>(ME
->getMemberDecl()))
1812 return MD
->isVirtual() &&
1813 ME
->performsVirtualDispatch(
1814 cxcursor::getCursorContext(C
).getLangOpts());
1820 CXType
clang_Cursor_getReceiverType(CXCursor C
) {
1821 CXTranslationUnit TU
= cxcursor::getCursorTU(C
);
1822 const Expr
*E
= nullptr;
1823 if (clang_isExpression(C
.kind
))
1824 E
= getCursorExpr(C
);
1826 if (const ObjCMessageExpr
*MsgE
= dyn_cast_or_null
<ObjCMessageExpr
>(E
))
1827 return cxtype::MakeCXType(MsgE
->getReceiverType(), TU
);
1829 if (auto *PropRefE
= dyn_cast
<ObjCPropertyRefExpr
>(E
)) {
1830 return cxtype::MakeCXType(
1831 PropRefE
->getReceiverType(cxcursor::getCursorContext(C
)), TU
);
1834 const MemberExpr
*ME
= nullptr;
1835 if (isa
<MemberExpr
>(E
))
1836 ME
= cast
<MemberExpr
>(E
);
1837 else if (const CallExpr
*CE
= dyn_cast
<CallExpr
>(E
))
1838 ME
= dyn_cast_or_null
<MemberExpr
>(CE
->getCallee());
1841 if (isa_and_nonnull
<CXXMethodDecl
>(ME
->getMemberDecl())) {
1842 auto receiverTy
= ME
->getBase()->IgnoreImpCasts()->getType();
1843 return cxtype::MakeCXType(receiverTy
, TU
);
1847 return cxtype::MakeCXType(QualType(), TU
);