xref: /llvm-project/clang/tools/libclang/CXCursor.cpp (revision dc2c93017f8bf2a2c10b8e024f8f4a6409dbeeee)
1 //===- CXCursor.cpp - Routines for manipulating CXCursors -----------------===//
2 //
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
6 //
7 //===----------------------------------------------------------------------===//
8 //
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
11 // CXCursor.
12 //
13 //===----------------------------------------------------------------------===//
14 
15 #include "CXTranslationUnit.h"
16 #include "CXCursor.h"
17 #include "CXString.h"
18 #include "CXType.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"
30 
31 using namespace clang;
32 using namespace cxcursor;
33 
34 CXCursor cxcursor::MakeCXCursorInvalid(CXCursorKind K, CXTranslationUnit TU) {
35   assert(K >= CXCursor_FirstInvalid && K <= CXCursor_LastInvalid);
36   CXCursor C = { K, 0, { nullptr, nullptr, TU } };
37   return C;
38 }
39 
40 static CXCursorKind GetCursorKind(const Attr *A) {
41   assert(A && "Invalid arguments!");
42   switch (A->getKind()) {
43     default: break;
44     case attr::IBAction: return CXCursor_IBActionAttr;
45     case attr::IBOutlet: return CXCursor_IBOutletAttr;
46     case attr::IBOutletCollection: return CXCursor_IBOutletCollectionAttr;
47     case attr::Final: return CXCursor_CXXFinalAttr;
48     case attr::Override: return CXCursor_CXXOverrideAttr;
49     case attr::Annotate: return CXCursor_AnnotateAttr;
50     case attr::AsmLabel: return CXCursor_AsmLabelAttr;
51     case attr::Packed: return CXCursor_PackedAttr;
52     case attr::Pure: return CXCursor_PureAttr;
53     case attr::Const: return CXCursor_ConstAttr;
54     case attr::NoDuplicate: return CXCursor_NoDuplicateAttr;
55     case attr::CUDAConstant: return CXCursor_CUDAConstantAttr;
56     case attr::CUDADevice: return CXCursor_CUDADeviceAttr;
57     case attr::CUDAGlobal: return CXCursor_CUDAGlobalAttr;
58     case attr::CUDAHost: return CXCursor_CUDAHostAttr;
59     case attr::CUDAShared: return CXCursor_CUDASharedAttr;
60     case attr::Visibility: return CXCursor_VisibilityAttr;
61     case attr::DLLExport: return CXCursor_DLLExport;
62     case attr::DLLImport: return CXCursor_DLLImport;
63     case attr::NSReturnsRetained: return CXCursor_NSReturnsRetained;
64     case attr::NSReturnsNotRetained: return CXCursor_NSReturnsNotRetained;
65     case attr::NSReturnsAutoreleased: return CXCursor_NSReturnsAutoreleased;
66     case attr::NSConsumesSelf: return CXCursor_NSConsumesSelf;
67     case attr::NSConsumed: return CXCursor_NSConsumed;
68     case attr::ObjCException: return CXCursor_ObjCException;
69     case attr::ObjCNSObject: return CXCursor_ObjCNSObject;
70     case attr::ObjCIndependentClass: return CXCursor_ObjCIndependentClass;
71     case attr::ObjCPreciseLifetime: return CXCursor_ObjCPreciseLifetime;
72     case attr::ObjCReturnsInnerPointer: return CXCursor_ObjCReturnsInnerPointer;
73     case attr::ObjCRequiresSuper: return CXCursor_ObjCRequiresSuper;
74     case attr::ObjCRootClass: return CXCursor_ObjCRootClass;
75     case attr::ObjCSubclassingRestricted: return CXCursor_ObjCSubclassingRestricted;
76     case attr::ObjCExplicitProtocolImpl: return CXCursor_ObjCExplicitProtocolImpl;
77     case attr::ObjCDesignatedInitializer: return CXCursor_ObjCDesignatedInitializer;
78     case attr::ObjCRuntimeVisible: return CXCursor_ObjCRuntimeVisible;
79     case attr::ObjCBoxable: return CXCursor_ObjCBoxable;
80     case attr::FlagEnum: return CXCursor_FlagEnum;
81     case attr::Convergent: return CXCursor_ConvergentAttr;
82   }
83 
84   return CXCursor_UnexposedAttr;
85 }
86 
87 CXCursor cxcursor::MakeCXCursor(const Attr *A, const Decl *Parent,
88                                 CXTranslationUnit TU) {
89   assert(A && Parent && TU && "Invalid arguments!");
90   CXCursor C = { GetCursorKind(A), 0, { Parent, A, TU } };
91   return C;
92 }
93 
94 CXCursor cxcursor::MakeCXCursor(const Decl *D, CXTranslationUnit TU,
95                                 SourceRange RegionOfInterest,
96                                 bool FirstInDeclGroup) {
97   assert(D && TU && "Invalid arguments!");
98 
99   CXCursorKind K = getCursorKindForDecl(D);
100 
101   if (K == CXCursor_ObjCClassMethodDecl ||
102       K == CXCursor_ObjCInstanceMethodDecl) {
103     int SelectorIdIndex = -1;
104     // Check if cursor points to a selector id.
105     if (RegionOfInterest.isValid() &&
106         RegionOfInterest.getBegin() == RegionOfInterest.getEnd()) {
107       SmallVector<SourceLocation, 16> SelLocs;
108       cast<ObjCMethodDecl>(D)->getSelectorLocs(SelLocs);
109       SmallVectorImpl<SourceLocation>::iterator
110         I=std::find(SelLocs.begin(), SelLocs.end(),RegionOfInterest.getBegin());
111       if (I != SelLocs.end())
112         SelectorIdIndex = I - SelLocs.begin();
113     }
114     CXCursor C = { K, SelectorIdIndex,
115                    { D, (void*)(intptr_t) (FirstInDeclGroup ? 1 : 0), TU }};
116     return C;
117   }
118 
119   CXCursor C = { K, 0, { D, (void*)(intptr_t) (FirstInDeclGroup ? 1 : 0), TU }};
120   return C;
121 }
122 
123 CXCursor cxcursor::MakeCXCursor(const Stmt *S, const Decl *Parent,
124                                 CXTranslationUnit TU,
125                                 SourceRange RegionOfInterest) {
126   assert(S && TU && "Invalid arguments!");
127   CXCursorKind K = CXCursor_NotImplemented;
128 
129   switch (S->getStmtClass()) {
130   case Stmt::NoStmtClass:
131     break;
132 
133   case Stmt::CaseStmtClass:
134     K = CXCursor_CaseStmt;
135     break;
136 
137   case Stmt::DefaultStmtClass:
138     K = CXCursor_DefaultStmt;
139     break;
140 
141   case Stmt::IfStmtClass:
142     K = CXCursor_IfStmt;
143     break;
144 
145   case Stmt::SwitchStmtClass:
146     K = CXCursor_SwitchStmt;
147     break;
148 
149   case Stmt::WhileStmtClass:
150     K = CXCursor_WhileStmt;
151     break;
152 
153   case Stmt::DoStmtClass:
154     K = CXCursor_DoStmt;
155     break;
156 
157   case Stmt::ForStmtClass:
158     K = CXCursor_ForStmt;
159     break;
160 
161   case Stmt::GotoStmtClass:
162     K = CXCursor_GotoStmt;
163     break;
164 
165   case Stmt::IndirectGotoStmtClass:
166     K = CXCursor_IndirectGotoStmt;
167     break;
168 
169   case Stmt::ContinueStmtClass:
170     K = CXCursor_ContinueStmt;
171     break;
172 
173   case Stmt::BreakStmtClass:
174     K = CXCursor_BreakStmt;
175     break;
176 
177   case Stmt::ReturnStmtClass:
178     K = CXCursor_ReturnStmt;
179     break;
180 
181   case Stmt::GCCAsmStmtClass:
182     K = CXCursor_GCCAsmStmt;
183     break;
184 
185   case Stmt::MSAsmStmtClass:
186     K = CXCursor_MSAsmStmt;
187     break;
188 
189   case Stmt::ObjCAtTryStmtClass:
190     K = CXCursor_ObjCAtTryStmt;
191     break;
192 
193   case Stmt::ObjCAtCatchStmtClass:
194     K = CXCursor_ObjCAtCatchStmt;
195     break;
196 
197   case Stmt::ObjCAtFinallyStmtClass:
198     K = CXCursor_ObjCAtFinallyStmt;
199     break;
200 
201   case Stmt::ObjCAtThrowStmtClass:
202     K = CXCursor_ObjCAtThrowStmt;
203     break;
204 
205   case Stmt::ObjCAtSynchronizedStmtClass:
206     K = CXCursor_ObjCAtSynchronizedStmt;
207     break;
208 
209   case Stmt::ObjCAutoreleasePoolStmtClass:
210     K = CXCursor_ObjCAutoreleasePoolStmt;
211     break;
212 
213   case Stmt::ObjCForCollectionStmtClass:
214     K = CXCursor_ObjCForCollectionStmt;
215     break;
216 
217   case Stmt::CXXCatchStmtClass:
218     K = CXCursor_CXXCatchStmt;
219     break;
220 
221   case Stmt::CXXTryStmtClass:
222     K = CXCursor_CXXTryStmt;
223     break;
224 
225   case Stmt::CXXForRangeStmtClass:
226     K = CXCursor_CXXForRangeStmt;
227     break;
228 
229   case Stmt::SEHTryStmtClass:
230     K = CXCursor_SEHTryStmt;
231     break;
232 
233   case Stmt::SEHExceptStmtClass:
234     K = CXCursor_SEHExceptStmt;
235     break;
236 
237   case Stmt::SEHFinallyStmtClass:
238     K = CXCursor_SEHFinallyStmt;
239     break;
240 
241   case Stmt::SEHLeaveStmtClass:
242     K = CXCursor_SEHLeaveStmt;
243     break;
244 
245   case Stmt::CoroutineBodyStmtClass:
246   case Stmt::CoreturnStmtClass:
247     K = CXCursor_UnexposedStmt;
248     break;
249 
250   case Stmt::ArrayTypeTraitExprClass:
251   case Stmt::AsTypeExprClass:
252   case Stmt::AtomicExprClass:
253   case Stmt::BinaryConditionalOperatorClass:
254   case Stmt::TypeTraitExprClass:
255   case Stmt::CoawaitExprClass:
256   case Stmt::DependentCoawaitExprClass:
257   case Stmt::CoyieldExprClass:
258   case Stmt::CXXBindTemporaryExprClass:
259   case Stmt::CXXDefaultArgExprClass:
260   case Stmt::CXXDefaultInitExprClass:
261   case Stmt::CXXFoldExprClass:
262   case Stmt::CXXStdInitializerListExprClass:
263   case Stmt::CXXScalarValueInitExprClass:
264   case Stmt::CXXUuidofExprClass:
265   case Stmt::ChooseExprClass:
266   case Stmt::DesignatedInitExprClass:
267   case Stmt::DesignatedInitUpdateExprClass:
268   case Stmt::ArrayInitLoopExprClass:
269   case Stmt::ArrayInitIndexExprClass:
270   case Stmt::ExprWithCleanupsClass:
271   case Stmt::ExpressionTraitExprClass:
272   case Stmt::ExtVectorElementExprClass:
273   case Stmt::ImplicitCastExprClass:
274   case Stmt::ImplicitValueInitExprClass:
275   case Stmt::NoInitExprClass:
276   case Stmt::MaterializeTemporaryExprClass:
277   case Stmt::ObjCIndirectCopyRestoreExprClass:
278   case Stmt::OffsetOfExprClass:
279   case Stmt::ParenListExprClass:
280   case Stmt::PredefinedExprClass:
281   case Stmt::ShuffleVectorExprClass:
282   case Stmt::ConvertVectorExprClass:
283   case Stmt::VAArgExprClass:
284   case Stmt::ObjCArrayLiteralClass:
285   case Stmt::ObjCDictionaryLiteralClass:
286   case Stmt::ObjCBoxedExprClass:
287   case Stmt::ObjCSubscriptRefExprClass:
288     K = CXCursor_UnexposedExpr;
289     break;
290 
291   case Stmt::OpaqueValueExprClass:
292     if (Expr *Src = cast<OpaqueValueExpr>(S)->getSourceExpr())
293       return MakeCXCursor(Src, Parent, TU, RegionOfInterest);
294     K = CXCursor_UnexposedExpr;
295     break;
296 
297   case Stmt::PseudoObjectExprClass:
298     return MakeCXCursor(cast<PseudoObjectExpr>(S)->getSyntacticForm(),
299                         Parent, TU, RegionOfInterest);
300 
301   case Stmt::CompoundStmtClass:
302     K = CXCursor_CompoundStmt;
303     break;
304 
305   case Stmt::NullStmtClass:
306     K = CXCursor_NullStmt;
307     break;
308 
309   case Stmt::LabelStmtClass:
310     K = CXCursor_LabelStmt;
311     break;
312 
313   case Stmt::AttributedStmtClass:
314     K = CXCursor_UnexposedStmt;
315     break;
316 
317   case Stmt::DeclStmtClass:
318     K = CXCursor_DeclStmt;
319     break;
320 
321   case Stmt::CapturedStmtClass:
322     K = CXCursor_UnexposedStmt;
323     break;
324 
325   case Stmt::IntegerLiteralClass:
326     K = CXCursor_IntegerLiteral;
327     break;
328 
329   case Stmt::FixedPointLiteralClass:
330     K = CXCursor_FixedPointLiteral;
331     break;
332 
333   case Stmt::FloatingLiteralClass:
334     K = CXCursor_FloatingLiteral;
335     break;
336 
337   case Stmt::ImaginaryLiteralClass:
338     K = CXCursor_ImaginaryLiteral;
339     break;
340 
341   case Stmt::StringLiteralClass:
342     K = CXCursor_StringLiteral;
343     break;
344 
345   case Stmt::CharacterLiteralClass:
346     K = CXCursor_CharacterLiteral;
347     break;
348 
349   case Stmt::ConstantExprClass:
350     return MakeCXCursor(cast<ConstantExpr>(S)->getSubExpr(),
351                         Parent, TU, RegionOfInterest);
352 
353   case Stmt::ParenExprClass:
354     K = CXCursor_ParenExpr;
355     break;
356 
357   case Stmt::UnaryOperatorClass:
358     K = CXCursor_UnaryOperator;
359     break;
360 
361   case Stmt::UnaryExprOrTypeTraitExprClass:
362   case Stmt::CXXNoexceptExprClass:
363     K = CXCursor_UnaryExpr;
364     break;
365 
366   case Stmt::MSPropertySubscriptExprClass:
367   case Stmt::ArraySubscriptExprClass:
368     K = CXCursor_ArraySubscriptExpr;
369     break;
370 
371   case Stmt::OMPArraySectionExprClass:
372     K = CXCursor_OMPArraySectionExpr;
373     break;
374 
375   case Stmt::BinaryOperatorClass:
376     K = CXCursor_BinaryOperator;
377     break;
378 
379   case Stmt::CompoundAssignOperatorClass:
380     K = CXCursor_CompoundAssignOperator;
381     break;
382 
383   case Stmt::ConditionalOperatorClass:
384     K = CXCursor_ConditionalOperator;
385     break;
386 
387   case Stmt::CStyleCastExprClass:
388     K = CXCursor_CStyleCastExpr;
389     break;
390 
391   case Stmt::CompoundLiteralExprClass:
392     K = CXCursor_CompoundLiteralExpr;
393     break;
394 
395   case Stmt::InitListExprClass:
396     K = CXCursor_InitListExpr;
397     break;
398 
399   case Stmt::AddrLabelExprClass:
400     K = CXCursor_AddrLabelExpr;
401     break;
402 
403   case Stmt::StmtExprClass:
404     K = CXCursor_StmtExpr;
405     break;
406 
407   case Stmt::GenericSelectionExprClass:
408     K = CXCursor_GenericSelectionExpr;
409     break;
410 
411   case Stmt::GNUNullExprClass:
412     K = CXCursor_GNUNullExpr;
413     break;
414 
415   case Stmt::CXXStaticCastExprClass:
416     K = CXCursor_CXXStaticCastExpr;
417     break;
418 
419   case Stmt::CXXDynamicCastExprClass:
420     K = CXCursor_CXXDynamicCastExpr;
421     break;
422 
423   case Stmt::CXXReinterpretCastExprClass:
424     K = CXCursor_CXXReinterpretCastExpr;
425     break;
426 
427   case Stmt::CXXConstCastExprClass:
428     K = CXCursor_CXXConstCastExpr;
429     break;
430 
431   case Stmt::CXXFunctionalCastExprClass:
432     K = CXCursor_CXXFunctionalCastExpr;
433     break;
434 
435   case Stmt::CXXTypeidExprClass:
436     K = CXCursor_CXXTypeidExpr;
437     break;
438 
439   case Stmt::CXXBoolLiteralExprClass:
440     K = CXCursor_CXXBoolLiteralExpr;
441     break;
442 
443   case Stmt::CXXNullPtrLiteralExprClass:
444     K = CXCursor_CXXNullPtrLiteralExpr;
445     break;
446 
447   case Stmt::CXXThisExprClass:
448     K = CXCursor_CXXThisExpr;
449     break;
450 
451   case Stmt::CXXThrowExprClass:
452     K = CXCursor_CXXThrowExpr;
453     break;
454 
455   case Stmt::CXXNewExprClass:
456     K = CXCursor_CXXNewExpr;
457     break;
458 
459   case Stmt::CXXDeleteExprClass:
460     K = CXCursor_CXXDeleteExpr;
461     break;
462 
463   case Stmt::ObjCStringLiteralClass:
464     K = CXCursor_ObjCStringLiteral;
465     break;
466 
467   case Stmt::ObjCEncodeExprClass:
468     K = CXCursor_ObjCEncodeExpr;
469     break;
470 
471   case Stmt::ObjCSelectorExprClass:
472     K = CXCursor_ObjCSelectorExpr;
473     break;
474 
475   case Stmt::ObjCProtocolExprClass:
476     K = CXCursor_ObjCProtocolExpr;
477     break;
478 
479   case Stmt::ObjCBoolLiteralExprClass:
480     K = CXCursor_ObjCBoolLiteralExpr;
481     break;
482 
483   case Stmt::ObjCAvailabilityCheckExprClass:
484     K = CXCursor_ObjCAvailabilityCheckExpr;
485     break;
486 
487   case Stmt::ObjCBridgedCastExprClass:
488     K = CXCursor_ObjCBridgedCastExpr;
489     break;
490 
491   case Stmt::BlockExprClass:
492     K = CXCursor_BlockExpr;
493     break;
494 
495   case Stmt::PackExpansionExprClass:
496     K = CXCursor_PackExpansionExpr;
497     break;
498 
499   case Stmt::SizeOfPackExprClass:
500     K = CXCursor_SizeOfPackExpr;
501     break;
502 
503   case Stmt::DeclRefExprClass:
504     if (const ImplicitParamDecl *IPD =
505          dyn_cast_or_null<ImplicitParamDecl>(cast<DeclRefExpr>(S)->getDecl())) {
506       if (const ObjCMethodDecl *MD =
507             dyn_cast<ObjCMethodDecl>(IPD->getDeclContext())) {
508         if (MD->getSelfDecl() == IPD) {
509           K = CXCursor_ObjCSelfExpr;
510           break;
511         }
512       }
513     }
514 
515     K = CXCursor_DeclRefExpr;
516     break;
517 
518   case Stmt::DependentScopeDeclRefExprClass:
519   case Stmt::SubstNonTypeTemplateParmExprClass:
520   case Stmt::SubstNonTypeTemplateParmPackExprClass:
521   case Stmt::FunctionParmPackExprClass:
522   case Stmt::UnresolvedLookupExprClass:
523   case Stmt::TypoExprClass: // A typo could actually be a DeclRef or a MemberRef
524     K = CXCursor_DeclRefExpr;
525     break;
526 
527   case Stmt::CXXDependentScopeMemberExprClass:
528   case Stmt::CXXPseudoDestructorExprClass:
529   case Stmt::MemberExprClass:
530   case Stmt::MSPropertyRefExprClass:
531   case Stmt::ObjCIsaExprClass:
532   case Stmt::ObjCIvarRefExprClass:
533   case Stmt::ObjCPropertyRefExprClass:
534   case Stmt::UnresolvedMemberExprClass:
535     K = CXCursor_MemberRefExpr;
536     break;
537 
538   case Stmt::CallExprClass:
539   case Stmt::CXXOperatorCallExprClass:
540   case Stmt::CXXMemberCallExprClass:
541   case Stmt::CUDAKernelCallExprClass:
542   case Stmt::CXXConstructExprClass:
543   case Stmt::CXXInheritedCtorInitExprClass:
544   case Stmt::CXXTemporaryObjectExprClass:
545   case Stmt::CXXUnresolvedConstructExprClass:
546   case Stmt::UserDefinedLiteralClass:
547     K = CXCursor_CallExpr;
548     break;
549 
550   case Stmt::LambdaExprClass:
551     K = CXCursor_LambdaExpr;
552     break;
553 
554   case Stmt::ObjCMessageExprClass: {
555     K = CXCursor_ObjCMessageExpr;
556     int SelectorIdIndex = -1;
557     // Check if cursor points to a selector id.
558     if (RegionOfInterest.isValid() &&
559         RegionOfInterest.getBegin() == RegionOfInterest.getEnd()) {
560       SmallVector<SourceLocation, 16> SelLocs;
561       cast<ObjCMessageExpr>(S)->getSelectorLocs(SelLocs);
562       SmallVectorImpl<SourceLocation>::iterator
563         I=std::find(SelLocs.begin(), SelLocs.end(),RegionOfInterest.getBegin());
564       if (I != SelLocs.end())
565         SelectorIdIndex = I - SelLocs.begin();
566     }
567     CXCursor C = { K, 0, { Parent, S, TU } };
568     return getSelectorIdentifierCursor(SelectorIdIndex, C);
569   }
570 
571   case Stmt::MSDependentExistsStmtClass:
572     K = CXCursor_UnexposedStmt;
573     break;
574   case Stmt::OMPParallelDirectiveClass:
575     K = CXCursor_OMPParallelDirective;
576     break;
577   case Stmt::OMPSimdDirectiveClass:
578     K = CXCursor_OMPSimdDirective;
579     break;
580   case Stmt::OMPForDirectiveClass:
581     K = CXCursor_OMPForDirective;
582     break;
583   case Stmt::OMPForSimdDirectiveClass:
584     K = CXCursor_OMPForSimdDirective;
585     break;
586   case Stmt::OMPSectionsDirectiveClass:
587     K = CXCursor_OMPSectionsDirective;
588     break;
589   case Stmt::OMPSectionDirectiveClass:
590     K = CXCursor_OMPSectionDirective;
591     break;
592   case Stmt::OMPSingleDirectiveClass:
593     K = CXCursor_OMPSingleDirective;
594     break;
595   case Stmt::OMPMasterDirectiveClass:
596     K = CXCursor_OMPMasterDirective;
597     break;
598   case Stmt::OMPCriticalDirectiveClass:
599     K = CXCursor_OMPCriticalDirective;
600     break;
601   case Stmt::OMPParallelForDirectiveClass:
602     K = CXCursor_OMPParallelForDirective;
603     break;
604   case Stmt::OMPParallelForSimdDirectiveClass:
605     K = CXCursor_OMPParallelForSimdDirective;
606     break;
607   case Stmt::OMPParallelSectionsDirectiveClass:
608     K = CXCursor_OMPParallelSectionsDirective;
609     break;
610   case Stmt::OMPTaskDirectiveClass:
611     K = CXCursor_OMPTaskDirective;
612     break;
613   case Stmt::OMPTaskyieldDirectiveClass:
614     K = CXCursor_OMPTaskyieldDirective;
615     break;
616   case Stmt::OMPBarrierDirectiveClass:
617     K = CXCursor_OMPBarrierDirective;
618     break;
619   case Stmt::OMPTaskwaitDirectiveClass:
620     K = CXCursor_OMPTaskwaitDirective;
621     break;
622   case Stmt::OMPTaskgroupDirectiveClass:
623     K = CXCursor_OMPTaskgroupDirective;
624     break;
625   case Stmt::OMPFlushDirectiveClass:
626     K = CXCursor_OMPFlushDirective;
627     break;
628   case Stmt::OMPOrderedDirectiveClass:
629     K = CXCursor_OMPOrderedDirective;
630     break;
631   case Stmt::OMPAtomicDirectiveClass:
632     K = CXCursor_OMPAtomicDirective;
633     break;
634   case Stmt::OMPTargetDirectiveClass:
635     K = CXCursor_OMPTargetDirective;
636     break;
637   case Stmt::OMPTargetDataDirectiveClass:
638     K = CXCursor_OMPTargetDataDirective;
639     break;
640   case Stmt::OMPTargetEnterDataDirectiveClass:
641     K = CXCursor_OMPTargetEnterDataDirective;
642     break;
643   case Stmt::OMPTargetExitDataDirectiveClass:
644     K = CXCursor_OMPTargetExitDataDirective;
645     break;
646   case Stmt::OMPTargetParallelDirectiveClass:
647     K = CXCursor_OMPTargetParallelDirective;
648     break;
649   case Stmt::OMPTargetParallelForDirectiveClass:
650     K = CXCursor_OMPTargetParallelForDirective;
651     break;
652   case Stmt::OMPTargetUpdateDirectiveClass:
653     K = CXCursor_OMPTargetUpdateDirective;
654     break;
655   case Stmt::OMPTeamsDirectiveClass:
656     K = CXCursor_OMPTeamsDirective;
657     break;
658   case Stmt::OMPCancellationPointDirectiveClass:
659     K = CXCursor_OMPCancellationPointDirective;
660     break;
661   case Stmt::OMPCancelDirectiveClass:
662     K = CXCursor_OMPCancelDirective;
663     break;
664   case Stmt::OMPTaskLoopDirectiveClass:
665     K = CXCursor_OMPTaskLoopDirective;
666     break;
667   case Stmt::OMPTaskLoopSimdDirectiveClass:
668     K = CXCursor_OMPTaskLoopSimdDirective;
669     break;
670   case Stmt::OMPDistributeDirectiveClass:
671     K = CXCursor_OMPDistributeDirective;
672     break;
673   case Stmt::OMPDistributeParallelForDirectiveClass:
674     K = CXCursor_OMPDistributeParallelForDirective;
675     break;
676   case Stmt::OMPDistributeParallelForSimdDirectiveClass:
677     K = CXCursor_OMPDistributeParallelForSimdDirective;
678     break;
679   case Stmt::OMPDistributeSimdDirectiveClass:
680     K = CXCursor_OMPDistributeSimdDirective;
681     break;
682   case Stmt::OMPTargetParallelForSimdDirectiveClass:
683     K = CXCursor_OMPTargetParallelForSimdDirective;
684     break;
685   case Stmt::OMPTargetSimdDirectiveClass:
686     K = CXCursor_OMPTargetSimdDirective;
687     break;
688   case Stmt::OMPTeamsDistributeDirectiveClass:
689     K = CXCursor_OMPTeamsDistributeDirective;
690     break;
691   case Stmt::OMPTeamsDistributeSimdDirectiveClass:
692     K = CXCursor_OMPTeamsDistributeSimdDirective;
693     break;
694   case Stmt::OMPTeamsDistributeParallelForSimdDirectiveClass:
695     K = CXCursor_OMPTeamsDistributeParallelForSimdDirective;
696     break;
697   case Stmt::OMPTeamsDistributeParallelForDirectiveClass:
698     K = CXCursor_OMPTeamsDistributeParallelForDirective;
699     break;
700   case Stmt::OMPTargetTeamsDirectiveClass:
701     K = CXCursor_OMPTargetTeamsDirective;
702     break;
703   case Stmt::OMPTargetTeamsDistributeDirectiveClass:
704     K = CXCursor_OMPTargetTeamsDistributeDirective;
705     break;
706   case Stmt::OMPTargetTeamsDistributeParallelForDirectiveClass:
707     K = CXCursor_OMPTargetTeamsDistributeParallelForDirective;
708     break;
709   case Stmt::OMPTargetTeamsDistributeParallelForSimdDirectiveClass:
710     K = CXCursor_OMPTargetTeamsDistributeParallelForSimdDirective;
711     break;
712   case Stmt::OMPTargetTeamsDistributeSimdDirectiveClass:
713     K = CXCursor_OMPTargetTeamsDistributeSimdDirective;
714     break;
715   }
716 
717   CXCursor C = { K, 0, { Parent, S, TU } };
718   return C;
719 }
720 
721 CXCursor cxcursor::MakeCursorObjCSuperClassRef(ObjCInterfaceDecl *Super,
722                                                SourceLocation Loc,
723                                                CXTranslationUnit TU) {
724   assert(Super && TU && "Invalid arguments!");
725   void *RawLoc = Loc.getPtrEncoding();
726   CXCursor C = { CXCursor_ObjCSuperClassRef, 0, { Super, RawLoc, TU } };
727   return C;
728 }
729 
730 std::pair<const ObjCInterfaceDecl *, SourceLocation>
731 cxcursor::getCursorObjCSuperClassRef(CXCursor C) {
732   assert(C.kind == CXCursor_ObjCSuperClassRef);
733   return std::make_pair(static_cast<const ObjCInterfaceDecl *>(C.data[0]),
734                         SourceLocation::getFromPtrEncoding(C.data[1]));
735 }
736 
737 CXCursor cxcursor::MakeCursorObjCProtocolRef(const ObjCProtocolDecl *Proto,
738                                              SourceLocation Loc,
739                                              CXTranslationUnit TU) {
740   assert(Proto && TU && "Invalid arguments!");
741   void *RawLoc = Loc.getPtrEncoding();
742   CXCursor C = { CXCursor_ObjCProtocolRef, 0, { Proto, RawLoc, TU } };
743   return C;
744 }
745 
746 std::pair<const ObjCProtocolDecl *, SourceLocation>
747 cxcursor::getCursorObjCProtocolRef(CXCursor C) {
748   assert(C.kind == CXCursor_ObjCProtocolRef);
749   return std::make_pair(static_cast<const ObjCProtocolDecl *>(C.data[0]),
750                         SourceLocation::getFromPtrEncoding(C.data[1]));
751 }
752 
753 CXCursor cxcursor::MakeCursorObjCClassRef(const ObjCInterfaceDecl *Class,
754                                           SourceLocation Loc,
755                                           CXTranslationUnit TU) {
756   // 'Class' can be null for invalid code.
757   if (!Class)
758     return MakeCXCursorInvalid(CXCursor_InvalidCode);
759   assert(TU && "Invalid arguments!");
760   void *RawLoc = Loc.getPtrEncoding();
761   CXCursor C = { CXCursor_ObjCClassRef, 0, { Class, RawLoc, TU } };
762   return C;
763 }
764 
765 std::pair<const ObjCInterfaceDecl *, SourceLocation>
766 cxcursor::getCursorObjCClassRef(CXCursor C) {
767   assert(C.kind == CXCursor_ObjCClassRef);
768   return std::make_pair(static_cast<const ObjCInterfaceDecl *>(C.data[0]),
769                         SourceLocation::getFromPtrEncoding(C.data[1]));
770 }
771 
772 CXCursor cxcursor::MakeCursorTypeRef(const TypeDecl *Type, SourceLocation Loc,
773                                      CXTranslationUnit TU) {
774   assert(Type && TU && "Invalid arguments!");
775   void *RawLoc = Loc.getPtrEncoding();
776   CXCursor C = { CXCursor_TypeRef, 0, { Type, RawLoc, TU } };
777   return C;
778 }
779 
780 std::pair<const TypeDecl *, SourceLocation>
781 cxcursor::getCursorTypeRef(CXCursor C) {
782   assert(C.kind == CXCursor_TypeRef);
783   return std::make_pair(static_cast<const TypeDecl *>(C.data[0]),
784                         SourceLocation::getFromPtrEncoding(C.data[1]));
785 }
786 
787 CXCursor cxcursor::MakeCursorTemplateRef(const TemplateDecl *Template,
788                                          SourceLocation Loc,
789                                          CXTranslationUnit TU) {
790   assert(Template && TU && "Invalid arguments!");
791   void *RawLoc = Loc.getPtrEncoding();
792   CXCursor C = { CXCursor_TemplateRef, 0, { Template, RawLoc, TU } };
793   return C;
794 }
795 
796 std::pair<const TemplateDecl *, SourceLocation>
797 cxcursor::getCursorTemplateRef(CXCursor C) {
798   assert(C.kind == CXCursor_TemplateRef);
799   return std::make_pair(static_cast<const TemplateDecl *>(C.data[0]),
800                         SourceLocation::getFromPtrEncoding(C.data[1]));
801 }
802 
803 CXCursor cxcursor::MakeCursorNamespaceRef(const NamedDecl *NS,
804                                           SourceLocation Loc,
805                                           CXTranslationUnit TU) {
806 
807   assert(NS && (isa<NamespaceDecl>(NS) || isa<NamespaceAliasDecl>(NS)) && TU &&
808          "Invalid arguments!");
809   void *RawLoc = Loc.getPtrEncoding();
810   CXCursor C = { CXCursor_NamespaceRef, 0, { NS, RawLoc, TU } };
811   return C;
812 }
813 
814 std::pair<const NamedDecl *, SourceLocation>
815 cxcursor::getCursorNamespaceRef(CXCursor C) {
816   assert(C.kind == CXCursor_NamespaceRef);
817   return std::make_pair(static_cast<const NamedDecl *>(C.data[0]),
818                         SourceLocation::getFromPtrEncoding(C.data[1]));
819 }
820 
821 CXCursor cxcursor::MakeCursorVariableRef(const VarDecl *Var, SourceLocation Loc,
822                                          CXTranslationUnit TU) {
823 
824   assert(Var && TU && "Invalid arguments!");
825   void *RawLoc = Loc.getPtrEncoding();
826   CXCursor C = { CXCursor_VariableRef, 0, { Var, RawLoc, TU } };
827   return C;
828 }
829 
830 std::pair<const VarDecl *, SourceLocation>
831 cxcursor::getCursorVariableRef(CXCursor C) {
832   assert(C.kind == CXCursor_VariableRef);
833   return std::make_pair(static_cast<const VarDecl *>(C.data[0]),
834                         SourceLocation::getFromPtrEncoding(C.data[1]));
835 }
836 
837 CXCursor cxcursor::MakeCursorMemberRef(const FieldDecl *Field, SourceLocation Loc,
838                                        CXTranslationUnit TU) {
839 
840   assert(Field && TU && "Invalid arguments!");
841   void *RawLoc = Loc.getPtrEncoding();
842   CXCursor C = { CXCursor_MemberRef, 0, { Field, RawLoc, TU } };
843   return C;
844 }
845 
846 std::pair<const FieldDecl *, SourceLocation>
847 cxcursor::getCursorMemberRef(CXCursor C) {
848   assert(C.kind == CXCursor_MemberRef);
849   return std::make_pair(static_cast<const FieldDecl *>(C.data[0]),
850                         SourceLocation::getFromPtrEncoding(C.data[1]));
851 }
852 
853 CXCursor cxcursor::MakeCursorCXXBaseSpecifier(const CXXBaseSpecifier *B,
854                                               CXTranslationUnit TU){
855   CXCursor C = { CXCursor_CXXBaseSpecifier, 0, { B, nullptr, TU } };
856   return C;
857 }
858 
859 const CXXBaseSpecifier *cxcursor::getCursorCXXBaseSpecifier(CXCursor C) {
860   assert(C.kind == CXCursor_CXXBaseSpecifier);
861   return static_cast<const CXXBaseSpecifier*>(C.data[0]);
862 }
863 
864 CXCursor cxcursor::MakePreprocessingDirectiveCursor(SourceRange Range,
865                                                     CXTranslationUnit TU) {
866   CXCursor C = { CXCursor_PreprocessingDirective, 0,
867                  { Range.getBegin().getPtrEncoding(),
868                    Range.getEnd().getPtrEncoding(),
869                    TU }
870                };
871   return C;
872 }
873 
874 SourceRange cxcursor::getCursorPreprocessingDirective(CXCursor C) {
875   assert(C.kind == CXCursor_PreprocessingDirective);
876   SourceRange Range(SourceLocation::getFromPtrEncoding(C.data[0]),
877                     SourceLocation::getFromPtrEncoding(C.data[1]));
878   ASTUnit *TU = getCursorASTUnit(C);
879   return TU->mapRangeFromPreamble(Range);
880 }
881 
882 CXCursor cxcursor::MakeMacroDefinitionCursor(const MacroDefinitionRecord *MI,
883                                              CXTranslationUnit TU) {
884   CXCursor C = {CXCursor_MacroDefinition, 0, {MI, nullptr, TU}};
885   return C;
886 }
887 
888 const MacroDefinitionRecord *cxcursor::getCursorMacroDefinition(CXCursor C) {
889   assert(C.kind == CXCursor_MacroDefinition);
890   return static_cast<const MacroDefinitionRecord *>(C.data[0]);
891 }
892 
893 CXCursor cxcursor::MakeMacroExpansionCursor(MacroExpansion *MI,
894                                             CXTranslationUnit TU) {
895   CXCursor C = { CXCursor_MacroExpansion, 0, { MI, nullptr, TU } };
896   return C;
897 }
898 
899 CXCursor cxcursor::MakeMacroExpansionCursor(MacroDefinitionRecord *MI,
900                                             SourceLocation Loc,
901                                             CXTranslationUnit TU) {
902   assert(Loc.isValid());
903   CXCursor C = {CXCursor_MacroExpansion, 0, {MI, Loc.getPtrEncoding(), TU}};
904   return C;
905 }
906 
907 const IdentifierInfo *cxcursor::MacroExpansionCursor::getName() const {
908   if (isPseudo())
909     return getAsMacroDefinition()->getName();
910   return getAsMacroExpansion()->getName();
911 }
912 const MacroDefinitionRecord *
913 cxcursor::MacroExpansionCursor::getDefinition() const {
914   if (isPseudo())
915     return getAsMacroDefinition();
916   return getAsMacroExpansion()->getDefinition();
917 }
918 SourceRange cxcursor::MacroExpansionCursor::getSourceRange() const {
919   if (isPseudo())
920     return getPseudoLoc();
921   return getAsMacroExpansion()->getSourceRange();
922 }
923 
924 CXCursor cxcursor::MakeInclusionDirectiveCursor(InclusionDirective *ID,
925                                                 CXTranslationUnit TU) {
926   CXCursor C = { CXCursor_InclusionDirective, 0, { ID, nullptr, TU } };
927   return C;
928 }
929 
930 const InclusionDirective *cxcursor::getCursorInclusionDirective(CXCursor C) {
931   assert(C.kind == CXCursor_InclusionDirective);
932   return static_cast<const InclusionDirective *>(C.data[0]);
933 }
934 
935 CXCursor cxcursor::MakeCursorLabelRef(LabelStmt *Label, SourceLocation Loc,
936                                       CXTranslationUnit TU) {
937 
938   assert(Label && TU && "Invalid arguments!");
939   void *RawLoc = Loc.getPtrEncoding();
940   CXCursor C = { CXCursor_LabelRef, 0, { Label, RawLoc, TU } };
941   return C;
942 }
943 
944 std::pair<const LabelStmt *, SourceLocation>
945 cxcursor::getCursorLabelRef(CXCursor C) {
946   assert(C.kind == CXCursor_LabelRef);
947   return std::make_pair(static_cast<const LabelStmt *>(C.data[0]),
948                         SourceLocation::getFromPtrEncoding(C.data[1]));
949 }
950 
951 CXCursor cxcursor::MakeCursorOverloadedDeclRef(const OverloadExpr *E,
952                                                CXTranslationUnit TU) {
953   assert(E && TU && "Invalid arguments!");
954   OverloadedDeclRefStorage Storage(E);
955   void *RawLoc = E->getNameLoc().getPtrEncoding();
956   CXCursor C = {
957                  CXCursor_OverloadedDeclRef, 0,
958                  { Storage.getOpaqueValue(), RawLoc, TU }
959                };
960   return C;
961 }
962 
963 CXCursor cxcursor::MakeCursorOverloadedDeclRef(const Decl *D,
964                                                SourceLocation Loc,
965                                                CXTranslationUnit TU) {
966   assert(D && TU && "Invalid arguments!");
967   void *RawLoc = Loc.getPtrEncoding();
968   OverloadedDeclRefStorage Storage(D);
969   CXCursor C = {
970     CXCursor_OverloadedDeclRef, 0,
971     { Storage.getOpaqueValue(), RawLoc, TU }
972   };
973   return C;
974 }
975 
976 CXCursor cxcursor::MakeCursorOverloadedDeclRef(TemplateName Name,
977                                                SourceLocation Loc,
978                                                CXTranslationUnit TU) {
979   assert(Name.getAsOverloadedTemplate() && TU && "Invalid arguments!");
980   void *RawLoc = Loc.getPtrEncoding();
981   OverloadedDeclRefStorage Storage(Name.getAsOverloadedTemplate());
982   CXCursor C = {
983     CXCursor_OverloadedDeclRef, 0,
984     { Storage.getOpaqueValue(), RawLoc, TU }
985   };
986   return C;
987 }
988 
989 std::pair<cxcursor::OverloadedDeclRefStorage, SourceLocation>
990 cxcursor::getCursorOverloadedDeclRef(CXCursor C) {
991   assert(C.kind == CXCursor_OverloadedDeclRef);
992   return std::make_pair(OverloadedDeclRefStorage::getFromOpaqueValue(
993                                        const_cast<void *>(C.data[0])),
994                         SourceLocation::getFromPtrEncoding(C.data[1]));
995 }
996 
997 const Decl *cxcursor::getCursorDecl(CXCursor Cursor) {
998   return static_cast<const Decl *>(Cursor.data[0]);
999 }
1000 
1001 const Expr *cxcursor::getCursorExpr(CXCursor Cursor) {
1002   return dyn_cast_or_null<Expr>(getCursorStmt(Cursor));
1003 }
1004 
1005 const Stmt *cxcursor::getCursorStmt(CXCursor Cursor) {
1006   if (Cursor.kind == CXCursor_ObjCSuperClassRef ||
1007       Cursor.kind == CXCursor_ObjCProtocolRef ||
1008       Cursor.kind == CXCursor_ObjCClassRef)
1009     return nullptr;
1010 
1011   return static_cast<const Stmt *>(Cursor.data[1]);
1012 }
1013 
1014 const Attr *cxcursor::getCursorAttr(CXCursor Cursor) {
1015   return static_cast<const Attr *>(Cursor.data[1]);
1016 }
1017 
1018 ASTContext &cxcursor::getCursorContext(CXCursor Cursor) {
1019   return getCursorASTUnit(Cursor)->getASTContext();
1020 }
1021 
1022 ASTUnit *cxcursor::getCursorASTUnit(CXCursor Cursor) {
1023   CXTranslationUnit TU = getCursorTU(Cursor);
1024   if (!TU)
1025     return nullptr;
1026   return cxtu::getASTUnit(TU);
1027 }
1028 
1029 CXTranslationUnit cxcursor::getCursorTU(CXCursor Cursor) {
1030   return static_cast<CXTranslationUnit>(const_cast<void*>(Cursor.data[2]));
1031 }
1032 
1033 void cxcursor::getOverriddenCursors(CXCursor cursor,
1034                                     SmallVectorImpl<CXCursor> &overridden) {
1035   assert(clang_isDeclaration(cursor.kind));
1036   const NamedDecl *D = dyn_cast_or_null<NamedDecl>(getCursorDecl(cursor));
1037   if (!D)
1038     return;
1039 
1040   CXTranslationUnit TU = getCursorTU(cursor);
1041   SmallVector<const NamedDecl *, 8> OverDecls;
1042   D->getASTContext().getOverriddenMethods(D, OverDecls);
1043 
1044   for (SmallVectorImpl<const NamedDecl *>::iterator
1045          I = OverDecls.begin(), E = OverDecls.end(); I != E; ++I) {
1046     overridden.push_back(MakeCXCursor(*I, TU));
1047   }
1048 }
1049 
1050 std::pair<int, SourceLocation>
1051 cxcursor::getSelectorIdentifierIndexAndLoc(CXCursor cursor) {
1052   if (cursor.kind == CXCursor_ObjCMessageExpr) {
1053     if (cursor.xdata != -1)
1054       return std::make_pair(cursor.xdata,
1055                             cast<ObjCMessageExpr>(getCursorExpr(cursor))
1056                                                 ->getSelectorLoc(cursor.xdata));
1057   } else if (cursor.kind == CXCursor_ObjCClassMethodDecl ||
1058              cursor.kind == CXCursor_ObjCInstanceMethodDecl) {
1059     if (cursor.xdata != -1)
1060       return std::make_pair(cursor.xdata,
1061                             cast<ObjCMethodDecl>(getCursorDecl(cursor))
1062                                                 ->getSelectorLoc(cursor.xdata));
1063   }
1064 
1065   return std::make_pair(-1, SourceLocation());
1066 }
1067 
1068 CXCursor cxcursor::getSelectorIdentifierCursor(int SelIdx, CXCursor cursor) {
1069   CXCursor newCursor = cursor;
1070 
1071   if (cursor.kind == CXCursor_ObjCMessageExpr) {
1072     if (SelIdx == -1 ||
1073         unsigned(SelIdx) >= cast<ObjCMessageExpr>(getCursorExpr(cursor))
1074                                                          ->getNumSelectorLocs())
1075       newCursor.xdata = -1;
1076     else
1077       newCursor.xdata = SelIdx;
1078   } else if (cursor.kind == CXCursor_ObjCClassMethodDecl ||
1079              cursor.kind == CXCursor_ObjCInstanceMethodDecl) {
1080     if (SelIdx == -1 ||
1081         unsigned(SelIdx) >= cast<ObjCMethodDecl>(getCursorDecl(cursor))
1082                                                          ->getNumSelectorLocs())
1083       newCursor.xdata = -1;
1084     else
1085       newCursor.xdata = SelIdx;
1086   }
1087 
1088   return newCursor;
1089 }
1090 
1091 CXCursor cxcursor::getTypeRefCursor(CXCursor cursor) {
1092   if (cursor.kind != CXCursor_CallExpr)
1093     return cursor;
1094 
1095   if (cursor.xdata == 0)
1096     return cursor;
1097 
1098   const Expr *E = getCursorExpr(cursor);
1099   TypeSourceInfo *Type = nullptr;
1100   if (const CXXUnresolvedConstructExpr *
1101         UnCtor = dyn_cast<CXXUnresolvedConstructExpr>(E)) {
1102     Type = UnCtor->getTypeSourceInfo();
1103   } else if (const CXXTemporaryObjectExpr *Tmp =
1104                  dyn_cast<CXXTemporaryObjectExpr>(E)){
1105     Type = Tmp->getTypeSourceInfo();
1106   }
1107 
1108   if (!Type)
1109     return cursor;
1110 
1111   CXTranslationUnit TU = getCursorTU(cursor);
1112   QualType Ty = Type->getType();
1113   TypeLoc TL = Type->getTypeLoc();
1114   SourceLocation Loc = TL.getBeginLoc();
1115 
1116   if (const ElaboratedType *ElabT = Ty->getAs<ElaboratedType>()) {
1117     Ty = ElabT->getNamedType();
1118     ElaboratedTypeLoc ElabTL = TL.castAs<ElaboratedTypeLoc>();
1119     Loc = ElabTL.getNamedTypeLoc().getBeginLoc();
1120   }
1121 
1122   if (const TypedefType *Typedef = Ty->getAs<TypedefType>())
1123     return MakeCursorTypeRef(Typedef->getDecl(), Loc, TU);
1124   if (const TagType *Tag = Ty->getAs<TagType>())
1125     return MakeCursorTypeRef(Tag->getDecl(), Loc, TU);
1126   if (const TemplateTypeParmType *TemplP = Ty->getAs<TemplateTypeParmType>())
1127     return MakeCursorTypeRef(TemplP->getDecl(), Loc, TU);
1128 
1129   return cursor;
1130 }
1131 
1132 bool cxcursor::operator==(CXCursor X, CXCursor Y) {
1133   return X.kind == Y.kind && X.data[0] == Y.data[0] && X.data[1] == Y.data[1] &&
1134          X.data[2] == Y.data[2];
1135 }
1136 
1137 // FIXME: Remove once we can model DeclGroups and their appropriate ranges
1138 // properly in the ASTs.
1139 bool cxcursor::isFirstInDeclGroup(CXCursor C) {
1140   assert(clang_isDeclaration(C.kind));
1141   return ((uintptr_t) (C.data[1])) != 0;
1142 }
1143 
1144 //===----------------------------------------------------------------------===//
1145 // libclang CXCursor APIs
1146 //===----------------------------------------------------------------------===//
1147 
1148 int clang_Cursor_isNull(CXCursor cursor) {
1149   return clang_equalCursors(cursor, clang_getNullCursor());
1150 }
1151 
1152 CXTranslationUnit clang_Cursor_getTranslationUnit(CXCursor cursor) {
1153   return getCursorTU(cursor);
1154 }
1155 
1156 int clang_Cursor_getNumArguments(CXCursor C) {
1157   if (clang_isDeclaration(C.kind)) {
1158     const Decl *D = cxcursor::getCursorDecl(C);
1159     if (const ObjCMethodDecl *MD = dyn_cast_or_null<ObjCMethodDecl>(D))
1160       return MD->param_size();
1161     if (const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D))
1162       return FD->param_size();
1163   }
1164 
1165   if (clang_isExpression(C.kind)) {
1166     const Expr *E = cxcursor::getCursorExpr(C);
1167     if (const CallExpr *CE = dyn_cast<CallExpr>(E)) {
1168       return CE->getNumArgs();
1169     }
1170     if (const CXXConstructExpr *CE = dyn_cast<CXXConstructExpr>(E)) {
1171       return CE->getNumArgs();
1172     }
1173   }
1174 
1175   return -1;
1176 }
1177 
1178 CXCursor clang_Cursor_getArgument(CXCursor C, unsigned i) {
1179   if (clang_isDeclaration(C.kind)) {
1180     const Decl *D = cxcursor::getCursorDecl(C);
1181     if (const ObjCMethodDecl *MD = dyn_cast_or_null<ObjCMethodDecl>(D)) {
1182       if (i < MD->param_size())
1183         return cxcursor::MakeCXCursor(MD->parameters()[i],
1184                                       cxcursor::getCursorTU(C));
1185     } else if (const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D)) {
1186       if (i < FD->param_size())
1187         return cxcursor::MakeCXCursor(FD->parameters()[i],
1188                                       cxcursor::getCursorTU(C));
1189     }
1190   }
1191 
1192   if (clang_isExpression(C.kind)) {
1193     const Expr *E = cxcursor::getCursorExpr(C);
1194     if (const CallExpr *CE = dyn_cast<CallExpr>(E)) {
1195       if (i < CE->getNumArgs()) {
1196         return cxcursor::MakeCXCursor(CE->getArg(i),
1197                                       getCursorDecl(C),
1198                                       cxcursor::getCursorTU(C));
1199       }
1200     }
1201     if (const CXXConstructExpr *CE = dyn_cast<CXXConstructExpr>(E)) {
1202       if (i < CE->getNumArgs()) {
1203         return cxcursor::MakeCXCursor(CE->getArg(i),
1204                                       getCursorDecl(C),
1205                                       cxcursor::getCursorTU(C));
1206       }
1207     }
1208   }
1209 
1210   return clang_getNullCursor();
1211 }
1212 
1213 int clang_Cursor_getNumTemplateArguments(CXCursor C) {
1214   if (clang_getCursorKind(C) != CXCursor_FunctionDecl) {
1215     return -1;
1216   }
1217 
1218   const FunctionDecl *FD = llvm::dyn_cast_or_null<clang::FunctionDecl>(
1219       getCursorDecl(C));
1220   if (!FD) {
1221     return -1;
1222   }
1223 
1224   const FunctionTemplateSpecializationInfo* SpecInfo =
1225       FD->getTemplateSpecializationInfo();
1226   if (!SpecInfo) {
1227     return -1;
1228   }
1229 
1230   return SpecInfo->TemplateArguments->size();
1231 }
1232 
1233 enum CXGetTemplateArgumentStatus {
1234   /** The operation completed successfully */
1235   CXGetTemplateArgumentStatus_Success = 0,
1236 
1237   /** The specified cursor did not represent a FunctionDecl. */
1238   CXGetTemplateArgumentStatus_CursorNotFunctionDecl = -1,
1239 
1240   /** The specified cursor was not castable to a FunctionDecl. */
1241   CXGetTemplateArgumentStatus_BadFunctionDeclCast = -2,
1242 
1243   /** A NULL FunctionTemplateSpecializationInfo was retrieved. */
1244   CXGetTemplateArgumentStatus_NullTemplSpecInfo = -3,
1245 
1246   /** An invalid (OOB) argument index was specified */
1247   CXGetTemplateArgumentStatus_InvalidIndex = -4
1248 };
1249 
1250 static int clang_Cursor_getTemplateArgument(
1251     CXCursor C, unsigned I, TemplateArgument *TA) {
1252   if (clang_getCursorKind(C) != CXCursor_FunctionDecl) {
1253     return CXGetTemplateArgumentStatus_CursorNotFunctionDecl;
1254   }
1255 
1256   const FunctionDecl *FD = llvm::dyn_cast_or_null<clang::FunctionDecl>(
1257       getCursorDecl(C));
1258   if (!FD) {
1259     return CXGetTemplateArgumentStatus_BadFunctionDeclCast;
1260   }
1261 
1262   const FunctionTemplateSpecializationInfo* SpecInfo =
1263       FD->getTemplateSpecializationInfo();
1264   if (!SpecInfo) {
1265     return CXGetTemplateArgumentStatus_NullTemplSpecInfo;
1266   }
1267 
1268   if (I >= SpecInfo->TemplateArguments->size()) {
1269     return CXGetTemplateArgumentStatus_InvalidIndex;
1270   }
1271 
1272   *TA = SpecInfo->TemplateArguments->get(I);
1273   return 0;
1274 }
1275 
1276 enum CXTemplateArgumentKind clang_Cursor_getTemplateArgumentKind(CXCursor C,
1277                                                                  unsigned I) {
1278   TemplateArgument TA;
1279   if (clang_Cursor_getTemplateArgument(C, I, &TA)) {
1280     return CXTemplateArgumentKind_Invalid;
1281   }
1282 
1283   switch (TA.getKind()) {
1284     case TemplateArgument::Null: return CXTemplateArgumentKind_Null;
1285     case TemplateArgument::Type: return CXTemplateArgumentKind_Type;
1286     case TemplateArgument::Declaration:
1287       return CXTemplateArgumentKind_Declaration;
1288     case TemplateArgument::NullPtr: return CXTemplateArgumentKind_NullPtr;
1289     case TemplateArgument::Integral: return CXTemplateArgumentKind_Integral;
1290     case TemplateArgument::Template: return CXTemplateArgumentKind_Template;
1291     case TemplateArgument::TemplateExpansion:
1292       return CXTemplateArgumentKind_TemplateExpansion;
1293     case TemplateArgument::Expression: return CXTemplateArgumentKind_Expression;
1294     case TemplateArgument::Pack: return CXTemplateArgumentKind_Pack;
1295   }
1296 
1297   return CXTemplateArgumentKind_Invalid;
1298 }
1299 
1300 CXType clang_Cursor_getTemplateArgumentType(CXCursor C, unsigned I) {
1301   TemplateArgument TA;
1302   if (clang_Cursor_getTemplateArgument(C, I, &TA) !=
1303       CXGetTemplateArgumentStatus_Success) {
1304     return cxtype::MakeCXType(QualType(), getCursorTU(C));
1305   }
1306 
1307   if (TA.getKind() != TemplateArgument::Type) {
1308     return cxtype::MakeCXType(QualType(), getCursorTU(C));
1309   }
1310 
1311   return cxtype::MakeCXType(TA.getAsType(), getCursorTU(C));
1312 }
1313 
1314 long long clang_Cursor_getTemplateArgumentValue(CXCursor C, unsigned I) {
1315   TemplateArgument TA;
1316   if (clang_Cursor_getTemplateArgument(C, I, &TA) !=
1317       CXGetTemplateArgumentStatus_Success) {
1318     assert(0 && "Unable to retrieve TemplateArgument");
1319     return 0;
1320   }
1321 
1322   if (TA.getKind() != TemplateArgument::Integral) {
1323     assert(0 && "Passed template argument is not Integral");
1324     return 0;
1325   }
1326 
1327   return TA.getAsIntegral().getSExtValue();
1328 }
1329 
1330 unsigned long long clang_Cursor_getTemplateArgumentUnsignedValue(CXCursor C,
1331                                                                  unsigned I) {
1332   TemplateArgument TA;
1333   if (clang_Cursor_getTemplateArgument(C, I, &TA) !=
1334       CXGetTemplateArgumentStatus_Success) {
1335     assert(0 && "Unable to retrieve TemplateArgument");
1336     return 0;
1337   }
1338 
1339   if (TA.getKind() != TemplateArgument::Integral) {
1340     assert(0 && "Passed template argument is not Integral");
1341     return 0;
1342   }
1343 
1344   return TA.getAsIntegral().getZExtValue();
1345 }
1346 
1347 //===----------------------------------------------------------------------===//
1348 // CXCursorSet.
1349 //===----------------------------------------------------------------------===//
1350 
1351 typedef llvm::DenseMap<CXCursor, unsigned> CXCursorSet_Impl;
1352 
1353 static inline CXCursorSet packCXCursorSet(CXCursorSet_Impl *setImpl) {
1354   return (CXCursorSet) setImpl;
1355 }
1356 static inline CXCursorSet_Impl *unpackCXCursorSet(CXCursorSet set) {
1357   return (CXCursorSet_Impl*) set;
1358 }
1359 namespace llvm {
1360 template<> struct DenseMapInfo<CXCursor> {
1361 public:
1362   static inline CXCursor getEmptyKey() {
1363     return MakeCXCursorInvalid(CXCursor_InvalidFile);
1364   }
1365   static inline CXCursor getTombstoneKey() {
1366     return MakeCXCursorInvalid(CXCursor_NoDeclFound);
1367   }
1368   static inline unsigned getHashValue(const CXCursor &cursor) {
1369     return llvm::DenseMapInfo<std::pair<const void *, const void *> >
1370       ::getHashValue(std::make_pair(cursor.data[0], cursor.data[1]));
1371   }
1372   static inline bool isEqual(const CXCursor &x, const CXCursor &y) {
1373     return x.kind == y.kind &&
1374            x.data[0] == y.data[0] &&
1375            x.data[1] == y.data[1];
1376   }
1377 };
1378 }
1379 
1380 CXCursorSet clang_createCXCursorSet() {
1381   return packCXCursorSet(new CXCursorSet_Impl());
1382 }
1383 
1384 void clang_disposeCXCursorSet(CXCursorSet set) {
1385   delete unpackCXCursorSet(set);
1386 }
1387 
1388 unsigned clang_CXCursorSet_contains(CXCursorSet set, CXCursor cursor) {
1389   CXCursorSet_Impl *setImpl = unpackCXCursorSet(set);
1390   if (!setImpl)
1391     return 0;
1392   return setImpl->find(cursor) != setImpl->end();
1393 }
1394 
1395 unsigned clang_CXCursorSet_insert(CXCursorSet set, CXCursor cursor) {
1396   // Do not insert invalid cursors into the set.
1397   if (cursor.kind >= CXCursor_FirstInvalid &&
1398       cursor.kind <= CXCursor_LastInvalid)
1399     return 1;
1400 
1401   CXCursorSet_Impl *setImpl = unpackCXCursorSet(set);
1402   if (!setImpl)
1403     return 1;
1404   unsigned &entry = (*setImpl)[cursor];
1405   unsigned flag = entry == 0 ? 1 : 0;
1406   entry = 1;
1407   return flag;
1408 }
1409 
1410 CXCompletionString clang_getCursorCompletionString(CXCursor cursor) {
1411   enum CXCursorKind kind = clang_getCursorKind(cursor);
1412   if (clang_isDeclaration(kind)) {
1413     const Decl *decl = getCursorDecl(cursor);
1414     if (const NamedDecl *namedDecl = dyn_cast_or_null<NamedDecl>(decl)) {
1415       ASTUnit *unit = getCursorASTUnit(cursor);
1416       CodeCompletionResult Result(namedDecl, CCP_Declaration);
1417       CodeCompletionString *String
1418         = Result.CreateCodeCompletionString(unit->getASTContext(),
1419                                             unit->getPreprocessor(),
1420                                             CodeCompletionContext::CCC_Other,
1421                                  unit->getCodeCompletionTUInfo().getAllocator(),
1422                                  unit->getCodeCompletionTUInfo(),
1423                                  true);
1424       return String;
1425     }
1426   } else if (kind == CXCursor_MacroDefinition) {
1427     const MacroDefinitionRecord *definition = getCursorMacroDefinition(cursor);
1428     const IdentifierInfo *Macro = definition->getName();
1429     ASTUnit *unit = getCursorASTUnit(cursor);
1430     CodeCompletionResult Result(
1431         Macro,
1432         unit->getPreprocessor().getMacroDefinition(Macro).getMacroInfo());
1433     CodeCompletionString *String = Result.CreateCodeCompletionString(
1434         unit->getASTContext(), unit->getPreprocessor(),
1435         CodeCompletionContext::CCC_Other,
1436         unit->getCodeCompletionTUInfo().getAllocator(),
1437         unit->getCodeCompletionTUInfo(), false);
1438     return String;
1439   }
1440   return nullptr;
1441 }
1442 
1443 namespace {
1444   struct OverridenCursorsPool {
1445     typedef SmallVector<CXCursor, 2> CursorVec;
1446     std::vector<CursorVec*> AllCursors;
1447     std::vector<CursorVec*> AvailableCursors;
1448 
1449     ~OverridenCursorsPool() {
1450       for (std::vector<CursorVec*>::iterator I = AllCursors.begin(),
1451            E = AllCursors.end(); I != E; ++I) {
1452         delete *I;
1453       }
1454     }
1455   };
1456 }
1457 
1458 void *cxcursor::createOverridenCXCursorsPool() {
1459   return new OverridenCursorsPool();
1460 }
1461 
1462 void cxcursor::disposeOverridenCXCursorsPool(void *pool) {
1463   delete static_cast<OverridenCursorsPool*>(pool);
1464 }
1465 
1466 void clang_getOverriddenCursors(CXCursor cursor,
1467                                 CXCursor **overridden,
1468                                 unsigned *num_overridden) {
1469   if (overridden)
1470     *overridden = nullptr;
1471   if (num_overridden)
1472     *num_overridden = 0;
1473 
1474   CXTranslationUnit TU = cxcursor::getCursorTU(cursor);
1475 
1476   if (!overridden || !num_overridden || !TU)
1477     return;
1478 
1479   if (!clang_isDeclaration(cursor.kind))
1480     return;
1481 
1482   OverridenCursorsPool &pool =
1483     *static_cast<OverridenCursorsPool*>(TU->OverridenCursorsPool);
1484 
1485   OverridenCursorsPool::CursorVec *Vec = nullptr;
1486 
1487   if (!pool.AvailableCursors.empty()) {
1488     Vec = pool.AvailableCursors.back();
1489     pool.AvailableCursors.pop_back();
1490   }
1491   else {
1492     Vec = new OverridenCursorsPool::CursorVec();
1493     pool.AllCursors.push_back(Vec);
1494   }
1495 
1496   // Clear out the vector, but don't free the memory contents.  This
1497   // reduces malloc() traffic.
1498   Vec->clear();
1499 
1500   // Use the first entry to contain a back reference to the vector.
1501   // This is a complete hack.
1502   CXCursor backRefCursor = MakeCXCursorInvalid(CXCursor_InvalidFile, TU);
1503   backRefCursor.data[0] = Vec;
1504   assert(cxcursor::getCursorTU(backRefCursor) == TU);
1505   Vec->push_back(backRefCursor);
1506 
1507   // Get the overridden cursors.
1508   cxcursor::getOverriddenCursors(cursor, *Vec);
1509 
1510   // Did we get any overridden cursors?  If not, return Vec to the pool
1511   // of available cursor vectors.
1512   if (Vec->size() == 1) {
1513     pool.AvailableCursors.push_back(Vec);
1514     return;
1515   }
1516 
1517   // Now tell the caller about the overridden cursors.
1518   assert(Vec->size() > 1);
1519   *overridden = &((*Vec)[1]);
1520   *num_overridden = Vec->size() - 1;
1521 }
1522 
1523 void clang_disposeOverriddenCursors(CXCursor *overridden) {
1524   if (!overridden)
1525     return;
1526 
1527   // Use pointer arithmetic to get back the first faux entry
1528   // which has a back-reference to the TU and the vector.
1529   --overridden;
1530   OverridenCursorsPool::CursorVec *Vec =
1531       static_cast<OverridenCursorsPool::CursorVec *>(
1532           const_cast<void *>(overridden->data[0]));
1533   CXTranslationUnit TU = getCursorTU(*overridden);
1534 
1535   assert(Vec && TU);
1536 
1537   OverridenCursorsPool &pool =
1538     *static_cast<OverridenCursorsPool*>(TU->OverridenCursorsPool);
1539 
1540   pool.AvailableCursors.push_back(Vec);
1541 }
1542 
1543 int clang_Cursor_isDynamicCall(CXCursor C) {
1544   const Expr *E = nullptr;
1545   if (clang_isExpression(C.kind))
1546     E = getCursorExpr(C);
1547   if (!E)
1548     return 0;
1549 
1550   if (const ObjCMessageExpr *MsgE = dyn_cast<ObjCMessageExpr>(E)) {
1551     if (MsgE->getReceiverKind() != ObjCMessageExpr::Instance)
1552       return false;
1553     if (auto *RecE = dyn_cast<ObjCMessageExpr>(
1554             MsgE->getInstanceReceiver()->IgnoreParenCasts())) {
1555       if (RecE->getMethodFamily() == OMF_alloc)
1556         return false;
1557     }
1558     return true;
1559   }
1560 
1561   if (auto *PropRefE = dyn_cast<ObjCPropertyRefExpr>(E)) {
1562     return !PropRefE->isSuperReceiver();
1563   }
1564 
1565   const MemberExpr *ME = nullptr;
1566   if (isa<MemberExpr>(E))
1567     ME = cast<MemberExpr>(E);
1568   else if (const CallExpr *CE = dyn_cast<CallExpr>(E))
1569     ME = dyn_cast_or_null<MemberExpr>(CE->getCallee());
1570 
1571   if (ME) {
1572     if (const CXXMethodDecl *
1573           MD = dyn_cast_or_null<CXXMethodDecl>(ME->getMemberDecl()))
1574       return MD->isVirtual() &&
1575              ME->performsVirtualDispatch(
1576                  cxcursor::getCursorContext(C).getLangOpts());
1577   }
1578 
1579   return 0;
1580 }
1581 
1582 CXType clang_Cursor_getReceiverType(CXCursor C) {
1583   CXTranslationUnit TU = cxcursor::getCursorTU(C);
1584   const Expr *E = nullptr;
1585   if (clang_isExpression(C.kind))
1586     E = getCursorExpr(C);
1587 
1588   if (const ObjCMessageExpr *MsgE = dyn_cast_or_null<ObjCMessageExpr>(E))
1589     return cxtype::MakeCXType(MsgE->getReceiverType(), TU);
1590 
1591   if (auto *PropRefE = dyn_cast<ObjCPropertyRefExpr>(E)) {
1592     return cxtype::MakeCXType(
1593         PropRefE->getReceiverType(cxcursor::getCursorContext(C)), TU);
1594   }
1595 
1596   const MemberExpr *ME = nullptr;
1597   if (isa<MemberExpr>(E))
1598     ME = cast<MemberExpr>(E);
1599   else if (const CallExpr *CE = dyn_cast<CallExpr>(E))
1600     ME = dyn_cast_or_null<MemberExpr>(CE->getCallee());
1601 
1602   if (ME) {
1603     if (dyn_cast_or_null<CXXMethodDecl>(ME->getMemberDecl())) {
1604       auto receiverTy = ME->getBase()->IgnoreImpCasts()->getType();
1605       return cxtype::MakeCXType(receiverTy, TU);
1606     }
1607   }
1608 
1609   return cxtype::MakeCXType(QualType(), TU);
1610 }
1611