1 //===- CIndex.cpp - Clang-C Source Indexing Library -----------------------===//
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 implements the main API hooks in the Clang-C Source Indexing
10 // library.
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #include "CIndexDiagnostic.h"
15 #include "CIndexer.h"
16 #include "CLog.h"
17 #include "CXCursor.h"
18 #include "CXSourceLocation.h"
19 #include "CXString.h"
20 #include "CXTranslationUnit.h"
21 #include "CXType.h"
22 #include "CursorVisitor.h"
23 #include "clang-c/FatalErrorHandler.h"
24 #include "clang/AST/Attr.h"
25 #include "clang/AST/DeclObjCCommon.h"
26 #include "clang/AST/Mangle.h"
27 #include "clang/AST/OpenMPClause.h"
28 #include "clang/AST/StmtVisitor.h"
29 #include "clang/Basic/Diagnostic.h"
30 #include "clang/Basic/DiagnosticCategories.h"
31 #include "clang/Basic/DiagnosticIDs.h"
32 #include "clang/Basic/Stack.h"
33 #include "clang/Basic/TargetInfo.h"
34 #include "clang/Basic/Version.h"
35 #include "clang/Frontend/ASTUnit.h"
36 #include "clang/Frontend/CompilerInstance.h"
37 #include "clang/Index/CommentToXML.h"
38 #include "clang/Lex/HeaderSearch.h"
39 #include "clang/Lex/Lexer.h"
40 #include "clang/Lex/PreprocessingRecord.h"
41 #include "clang/Lex/Preprocessor.h"
42 #include "llvm/ADT/Optional.h"
43 #include "llvm/ADT/STLExtras.h"
44 #include "llvm/ADT/StringSwitch.h"
45 #include "llvm/Config/llvm-config.h"
46 #include "llvm/Support/Compiler.h"
47 #include "llvm/Support/CrashRecoveryContext.h"
48 #include "llvm/Support/Format.h"
49 #include "llvm/Support/ManagedStatic.h"
50 #include "llvm/Support/MemoryBuffer.h"
51 #include "llvm/Support/Program.h"
52 #include "llvm/Support/SaveAndRestore.h"
53 #include "llvm/Support/Signals.h"
54 #include "llvm/Support/TargetSelect.h"
55 #include "llvm/Support/Threading.h"
56 #include "llvm/Support/Timer.h"
57 #include "llvm/Support/raw_ostream.h"
58 #include <mutex>
59 
60 #if LLVM_ENABLE_THREADS != 0 && defined(__APPLE__)
61 #define USE_DARWIN_THREADS
62 #endif
63 
64 #ifdef USE_DARWIN_THREADS
65 #include <pthread.h>
66 #endif
67 
68 using namespace clang;
69 using namespace clang::cxcursor;
70 using namespace clang::cxtu;
71 using namespace clang::cxindex;
72 
73 CXTranslationUnit cxtu::MakeCXTranslationUnit(CIndexer *CIdx,
74                                               std::unique_ptr<ASTUnit> AU) {
75   if (!AU)
76     return nullptr;
77   assert(CIdx);
78   CXTranslationUnit D = new CXTranslationUnitImpl();
79   D->CIdx = CIdx;
80   D->TheASTUnit = AU.release();
81   D->StringPool = new cxstring::CXStringPool();
82   D->Diagnostics = nullptr;
83   D->OverridenCursorsPool = createOverridenCXCursorsPool();
84   D->CommentToXML = nullptr;
85   D->ParsingOptions = 0;
86   D->Arguments = {};
87   return D;
88 }
89 
90 bool cxtu::isASTReadError(ASTUnit *AU) {
91   for (ASTUnit::stored_diag_iterator D = AU->stored_diag_begin(),
92                                      DEnd = AU->stored_diag_end();
93        D != DEnd; ++D) {
94     if (D->getLevel() >= DiagnosticsEngine::Error &&
95         DiagnosticIDs::getCategoryNumberForDiag(D->getID()) ==
96             diag::DiagCat_AST_Deserialization_Issue)
97       return true;
98   }
99   return false;
100 }
101 
102 cxtu::CXTUOwner::~CXTUOwner() {
103   if (TU)
104     clang_disposeTranslationUnit(TU);
105 }
106 
107 /// Compare two source ranges to determine their relative position in
108 /// the translation unit.
109 static RangeComparisonResult RangeCompare(SourceManager &SM, SourceRange R1,
110                                           SourceRange R2) {
111   assert(R1.isValid() && "First range is invalid?");
112   assert(R2.isValid() && "Second range is invalid?");
113   if (R1.getEnd() != R2.getBegin() &&
114       SM.isBeforeInTranslationUnit(R1.getEnd(), R2.getBegin()))
115     return RangeBefore;
116   if (R2.getEnd() != R1.getBegin() &&
117       SM.isBeforeInTranslationUnit(R2.getEnd(), R1.getBegin()))
118     return RangeAfter;
119   return RangeOverlap;
120 }
121 
122 /// Determine if a source location falls within, before, or after a
123 ///   a given source range.
124 static RangeComparisonResult LocationCompare(SourceManager &SM,
125                                              SourceLocation L, SourceRange R) {
126   assert(R.isValid() && "First range is invalid?");
127   assert(L.isValid() && "Second range is invalid?");
128   if (L == R.getBegin() || L == R.getEnd())
129     return RangeOverlap;
130   if (SM.isBeforeInTranslationUnit(L, R.getBegin()))
131     return RangeBefore;
132   if (SM.isBeforeInTranslationUnit(R.getEnd(), L))
133     return RangeAfter;
134   return RangeOverlap;
135 }
136 
137 /// Translate a Clang source range into a CIndex source range.
138 ///
139 /// Clang internally represents ranges where the end location points to the
140 /// start of the token at the end. However, for external clients it is more
141 /// useful to have a CXSourceRange be a proper half-open interval. This routine
142 /// does the appropriate translation.
143 CXSourceRange cxloc::translateSourceRange(const SourceManager &SM,
144                                           const LangOptions &LangOpts,
145                                           const CharSourceRange &R) {
146   // We want the last character in this location, so we will adjust the
147   // location accordingly.
148   SourceLocation EndLoc = R.getEnd();
149   bool IsTokenRange = R.isTokenRange();
150   if (EndLoc.isValid() && EndLoc.isMacroID() &&
151       !SM.isMacroArgExpansion(EndLoc)) {
152     CharSourceRange Expansion = SM.getExpansionRange(EndLoc);
153     EndLoc = Expansion.getEnd();
154     IsTokenRange = Expansion.isTokenRange();
155   }
156   if (IsTokenRange && EndLoc.isValid()) {
157     unsigned Length =
158         Lexer::MeasureTokenLength(SM.getSpellingLoc(EndLoc), SM, LangOpts);
159     EndLoc = EndLoc.getLocWithOffset(Length);
160   }
161 
162   CXSourceRange Result = {
163       {&SM, &LangOpts}, R.getBegin().getRawEncoding(), EndLoc.getRawEncoding()};
164   return Result;
165 }
166 
167 CharSourceRange cxloc::translateCXRangeToCharRange(CXSourceRange R) {
168   return CharSourceRange::getCharRange(
169       SourceLocation::getFromRawEncoding(R.begin_int_data),
170       SourceLocation::getFromRawEncoding(R.end_int_data));
171 }
172 
173 //===----------------------------------------------------------------------===//
174 // Cursor visitor.
175 //===----------------------------------------------------------------------===//
176 
177 static SourceRange getRawCursorExtent(CXCursor C);
178 static SourceRange getFullCursorExtent(CXCursor C, SourceManager &SrcMgr);
179 
180 RangeComparisonResult CursorVisitor::CompareRegionOfInterest(SourceRange R) {
181   return RangeCompare(AU->getSourceManager(), R, RegionOfInterest);
182 }
183 
184 /// Visit the given cursor and, if requested by the visitor,
185 /// its children.
186 ///
187 /// \param Cursor the cursor to visit.
188 ///
189 /// \param CheckedRegionOfInterest if true, then the caller already checked
190 /// that this cursor is within the region of interest.
191 ///
192 /// \returns true if the visitation should be aborted, false if it
193 /// should continue.
194 bool CursorVisitor::Visit(CXCursor Cursor, bool CheckedRegionOfInterest) {
195   if (clang_isInvalid(Cursor.kind))
196     return false;
197 
198   if (clang_isDeclaration(Cursor.kind)) {
199     const Decl *D = getCursorDecl(Cursor);
200     if (!D) {
201       assert(0 && "Invalid declaration cursor");
202       return true; // abort.
203     }
204 
205     // Ignore implicit declarations, unless it's an objc method because
206     // currently we should report implicit methods for properties when indexing.
207     if (D->isImplicit() && !isa<ObjCMethodDecl>(D))
208       return false;
209   }
210 
211   // If we have a range of interest, and this cursor doesn't intersect with it,
212   // we're done.
213   if (RegionOfInterest.isValid() && !CheckedRegionOfInterest) {
214     SourceRange Range = getRawCursorExtent(Cursor);
215     if (Range.isInvalid() || CompareRegionOfInterest(Range))
216       return false;
217   }
218 
219   switch (Visitor(Cursor, Parent, ClientData)) {
220   case CXChildVisit_Break:
221     return true;
222 
223   case CXChildVisit_Continue:
224     return false;
225 
226   case CXChildVisit_Recurse: {
227     bool ret = VisitChildren(Cursor);
228     if (PostChildrenVisitor)
229       if (PostChildrenVisitor(Cursor, ClientData))
230         return true;
231     return ret;
232   }
233   }
234 
235   llvm_unreachable("Invalid CXChildVisitResult!");
236 }
237 
238 static bool visitPreprocessedEntitiesInRange(SourceRange R,
239                                              PreprocessingRecord &PPRec,
240                                              CursorVisitor &Visitor) {
241   SourceManager &SM = Visitor.getASTUnit()->getSourceManager();
242   FileID FID;
243 
244   if (!Visitor.shouldVisitIncludedEntities()) {
245     // If the begin/end of the range lie in the same FileID, do the optimization
246     // where we skip preprocessed entities that do not come from the same
247     // FileID.
248     FID = SM.getFileID(SM.getFileLoc(R.getBegin()));
249     if (FID != SM.getFileID(SM.getFileLoc(R.getEnd())))
250       FID = FileID();
251   }
252 
253   const auto &Entities = PPRec.getPreprocessedEntitiesInRange(R);
254   return Visitor.visitPreprocessedEntities(Entities.begin(), Entities.end(),
255                                            PPRec, FID);
256 }
257 
258 bool CursorVisitor::visitFileRegion() {
259   if (RegionOfInterest.isInvalid())
260     return false;
261 
262   ASTUnit *Unit = cxtu::getASTUnit(TU);
263   SourceManager &SM = Unit->getSourceManager();
264 
265   std::pair<FileID, unsigned> Begin = SM.getDecomposedLoc(
266                                   SM.getFileLoc(RegionOfInterest.getBegin())),
267                               End = SM.getDecomposedLoc(
268                                   SM.getFileLoc(RegionOfInterest.getEnd()));
269 
270   if (End.first != Begin.first) {
271     // If the end does not reside in the same file, try to recover by
272     // picking the end of the file of begin location.
273     End.first = Begin.first;
274     End.second = SM.getFileIDSize(Begin.first);
275   }
276 
277   assert(Begin.first == End.first);
278   if (Begin.second > End.second)
279     return false;
280 
281   FileID File = Begin.first;
282   unsigned Offset = Begin.second;
283   unsigned Length = End.second - Begin.second;
284 
285   if (!VisitDeclsOnly && !VisitPreprocessorLast)
286     if (visitPreprocessedEntitiesInRegion())
287       return true; // visitation break.
288 
289   if (visitDeclsFromFileRegion(File, Offset, Length))
290     return true; // visitation break.
291 
292   if (!VisitDeclsOnly && VisitPreprocessorLast)
293     return visitPreprocessedEntitiesInRegion();
294 
295   return false;
296 }
297 
298 static bool isInLexicalContext(Decl *D, DeclContext *DC) {
299   if (!DC)
300     return false;
301 
302   for (DeclContext *DeclDC = D->getLexicalDeclContext(); DeclDC;
303        DeclDC = DeclDC->getLexicalParent()) {
304     if (DeclDC == DC)
305       return true;
306   }
307   return false;
308 }
309 
310 bool CursorVisitor::visitDeclsFromFileRegion(FileID File, unsigned Offset,
311                                              unsigned Length) {
312   ASTUnit *Unit = cxtu::getASTUnit(TU);
313   SourceManager &SM = Unit->getSourceManager();
314   SourceRange Range = RegionOfInterest;
315 
316   SmallVector<Decl *, 16> Decls;
317   Unit->findFileRegionDecls(File, Offset, Length, Decls);
318 
319   // If we didn't find any file level decls for the file, try looking at the
320   // file that it was included from.
321   while (Decls.empty() || Decls.front()->isTopLevelDeclInObjCContainer()) {
322     bool Invalid = false;
323     const SrcMgr::SLocEntry &SLEntry = SM.getSLocEntry(File, &Invalid);
324     if (Invalid)
325       return false;
326 
327     SourceLocation Outer;
328     if (SLEntry.isFile())
329       Outer = SLEntry.getFile().getIncludeLoc();
330     else
331       Outer = SLEntry.getExpansion().getExpansionLocStart();
332     if (Outer.isInvalid())
333       return false;
334 
335     std::tie(File, Offset) = SM.getDecomposedExpansionLoc(Outer);
336     Length = 0;
337     Unit->findFileRegionDecls(File, Offset, Length, Decls);
338   }
339 
340   assert(!Decls.empty());
341 
342   bool VisitedAtLeastOnce = false;
343   DeclContext *CurDC = nullptr;
344   SmallVectorImpl<Decl *>::iterator DIt = Decls.begin();
345   for (SmallVectorImpl<Decl *>::iterator DE = Decls.end(); DIt != DE; ++DIt) {
346     Decl *D = *DIt;
347     if (D->getSourceRange().isInvalid())
348       continue;
349 
350     if (isInLexicalContext(D, CurDC))
351       continue;
352 
353     CurDC = dyn_cast<DeclContext>(D);
354 
355     if (TagDecl *TD = dyn_cast<TagDecl>(D))
356       if (!TD->isFreeStanding())
357         continue;
358 
359     RangeComparisonResult CompRes =
360         RangeCompare(SM, D->getSourceRange(), Range);
361     if (CompRes == RangeBefore)
362       continue;
363     if (CompRes == RangeAfter)
364       break;
365 
366     assert(CompRes == RangeOverlap);
367     VisitedAtLeastOnce = true;
368 
369     if (isa<ObjCContainerDecl>(D)) {
370       FileDI_current = &DIt;
371       FileDE_current = DE;
372     } else {
373       FileDI_current = nullptr;
374     }
375 
376     if (Visit(MakeCXCursor(D, TU, Range), /*CheckedRegionOfInterest=*/true))
377       return true; // visitation break.
378   }
379 
380   if (VisitedAtLeastOnce)
381     return false;
382 
383   // No Decls overlapped with the range. Move up the lexical context until there
384   // is a context that contains the range or we reach the translation unit
385   // level.
386   DeclContext *DC = DIt == Decls.begin()
387                         ? (*DIt)->getLexicalDeclContext()
388                         : (*(DIt - 1))->getLexicalDeclContext();
389 
390   while (DC && !DC->isTranslationUnit()) {
391     Decl *D = cast<Decl>(DC);
392     SourceRange CurDeclRange = D->getSourceRange();
393     if (CurDeclRange.isInvalid())
394       break;
395 
396     if (RangeCompare(SM, CurDeclRange, Range) == RangeOverlap) {
397       if (Visit(MakeCXCursor(D, TU, Range), /*CheckedRegionOfInterest=*/true))
398         return true; // visitation break.
399     }
400 
401     DC = D->getLexicalDeclContext();
402   }
403 
404   return false;
405 }
406 
407 bool CursorVisitor::visitPreprocessedEntitiesInRegion() {
408   if (!AU->getPreprocessor().getPreprocessingRecord())
409     return false;
410 
411   PreprocessingRecord &PPRec = *AU->getPreprocessor().getPreprocessingRecord();
412   SourceManager &SM = AU->getSourceManager();
413 
414   if (RegionOfInterest.isValid()) {
415     SourceRange MappedRange = AU->mapRangeToPreamble(RegionOfInterest);
416     SourceLocation B = MappedRange.getBegin();
417     SourceLocation E = MappedRange.getEnd();
418 
419     if (AU->isInPreambleFileID(B)) {
420       if (SM.isLoadedSourceLocation(E))
421         return visitPreprocessedEntitiesInRange(SourceRange(B, E), PPRec,
422                                                 *this);
423 
424       // Beginning of range lies in the preamble but it also extends beyond
425       // it into the main file. Split the range into 2 parts, one covering
426       // the preamble and another covering the main file. This allows subsequent
427       // calls to visitPreprocessedEntitiesInRange to accept a source range that
428       // lies in the same FileID, allowing it to skip preprocessed entities that
429       // do not come from the same FileID.
430       bool breaked = visitPreprocessedEntitiesInRange(
431           SourceRange(B, AU->getEndOfPreambleFileID()), PPRec, *this);
432       if (breaked)
433         return true;
434       return visitPreprocessedEntitiesInRange(
435           SourceRange(AU->getStartOfMainFileID(), E), PPRec, *this);
436     }
437 
438     return visitPreprocessedEntitiesInRange(SourceRange(B, E), PPRec, *this);
439   }
440 
441   bool OnlyLocalDecls = !AU->isMainFileAST() && AU->getOnlyLocalDecls();
442 
443   if (OnlyLocalDecls)
444     return visitPreprocessedEntities(PPRec.local_begin(), PPRec.local_end(),
445                                      PPRec);
446 
447   return visitPreprocessedEntities(PPRec.begin(), PPRec.end(), PPRec);
448 }
449 
450 template <typename InputIterator>
451 bool CursorVisitor::visitPreprocessedEntities(InputIterator First,
452                                               InputIterator Last,
453                                               PreprocessingRecord &PPRec,
454                                               FileID FID) {
455   for (; First != Last; ++First) {
456     if (!FID.isInvalid() && !PPRec.isEntityInFileID(First, FID))
457       continue;
458 
459     PreprocessedEntity *PPE = *First;
460     if (!PPE)
461       continue;
462 
463     if (MacroExpansion *ME = dyn_cast<MacroExpansion>(PPE)) {
464       if (Visit(MakeMacroExpansionCursor(ME, TU)))
465         return true;
466 
467       continue;
468     }
469 
470     if (MacroDefinitionRecord *MD = dyn_cast<MacroDefinitionRecord>(PPE)) {
471       if (Visit(MakeMacroDefinitionCursor(MD, TU)))
472         return true;
473 
474       continue;
475     }
476 
477     if (InclusionDirective *ID = dyn_cast<InclusionDirective>(PPE)) {
478       if (Visit(MakeInclusionDirectiveCursor(ID, TU)))
479         return true;
480 
481       continue;
482     }
483   }
484 
485   return false;
486 }
487 
488 /// Visit the children of the given cursor.
489 ///
490 /// \returns true if the visitation should be aborted, false if it
491 /// should continue.
492 bool CursorVisitor::VisitChildren(CXCursor Cursor) {
493   if (clang_isReference(Cursor.kind) &&
494       Cursor.kind != CXCursor_CXXBaseSpecifier) {
495     // By definition, references have no children.
496     return false;
497   }
498 
499   // Set the Parent field to Cursor, then back to its old value once we're
500   // done.
501   SetParentRAII SetParent(Parent, StmtParent, Cursor);
502 
503   if (clang_isDeclaration(Cursor.kind)) {
504     Decl *D = const_cast<Decl *>(getCursorDecl(Cursor));
505     if (!D)
506       return false;
507 
508     return VisitAttributes(D) || Visit(D);
509   }
510 
511   if (clang_isStatement(Cursor.kind)) {
512     if (const Stmt *S = getCursorStmt(Cursor))
513       return Visit(S);
514 
515     return false;
516   }
517 
518   if (clang_isExpression(Cursor.kind)) {
519     if (const Expr *E = getCursorExpr(Cursor))
520       return Visit(E);
521 
522     return false;
523   }
524 
525   if (clang_isTranslationUnit(Cursor.kind)) {
526     CXTranslationUnit TU = getCursorTU(Cursor);
527     ASTUnit *CXXUnit = cxtu::getASTUnit(TU);
528 
529     int VisitOrder[2] = {VisitPreprocessorLast, !VisitPreprocessorLast};
530     for (unsigned I = 0; I != 2; ++I) {
531       if (VisitOrder[I]) {
532         if (!CXXUnit->isMainFileAST() && CXXUnit->getOnlyLocalDecls() &&
533             RegionOfInterest.isInvalid()) {
534           for (ASTUnit::top_level_iterator TL = CXXUnit->top_level_begin(),
535                                            TLEnd = CXXUnit->top_level_end();
536                TL != TLEnd; ++TL) {
537             const Optional<bool> V = handleDeclForVisitation(*TL);
538             if (!V.hasValue())
539               continue;
540             return V.getValue();
541           }
542         } else if (VisitDeclContext(
543                        CXXUnit->getASTContext().getTranslationUnitDecl()))
544           return true;
545         continue;
546       }
547 
548       // Walk the preprocessing record.
549       if (CXXUnit->getPreprocessor().getPreprocessingRecord())
550         visitPreprocessedEntitiesInRegion();
551     }
552 
553     return false;
554   }
555 
556   if (Cursor.kind == CXCursor_CXXBaseSpecifier) {
557     if (const CXXBaseSpecifier *Base = getCursorCXXBaseSpecifier(Cursor)) {
558       if (TypeSourceInfo *BaseTSInfo = Base->getTypeSourceInfo()) {
559         return Visit(BaseTSInfo->getTypeLoc());
560       }
561     }
562   }
563 
564   if (Cursor.kind == CXCursor_IBOutletCollectionAttr) {
565     const IBOutletCollectionAttr *A =
566         cast<IBOutletCollectionAttr>(cxcursor::getCursorAttr(Cursor));
567     if (const ObjCObjectType *ObjT = A->getInterface()->getAs<ObjCObjectType>())
568       return Visit(cxcursor::MakeCursorObjCClassRef(
569           ObjT->getInterface(),
570           A->getInterfaceLoc()->getTypeLoc().getBeginLoc(), TU));
571   }
572 
573   // If pointing inside a macro definition, check if the token is an identifier
574   // that was ever defined as a macro. In such a case, create a "pseudo" macro
575   // expansion cursor for that token.
576   SourceLocation BeginLoc = RegionOfInterest.getBegin();
577   if (Cursor.kind == CXCursor_MacroDefinition &&
578       BeginLoc == RegionOfInterest.getEnd()) {
579     SourceLocation Loc = AU->mapLocationToPreamble(BeginLoc);
580     const MacroInfo *MI =
581         getMacroInfo(cxcursor::getCursorMacroDefinition(Cursor), TU);
582     if (MacroDefinitionRecord *MacroDef =
583             checkForMacroInMacroDefinition(MI, Loc, TU))
584       return Visit(cxcursor::MakeMacroExpansionCursor(MacroDef, BeginLoc, TU));
585   }
586 
587   // Nothing to visit at the moment.
588   return false;
589 }
590 
591 bool CursorVisitor::VisitBlockDecl(BlockDecl *B) {
592   if (TypeSourceInfo *TSInfo = B->getSignatureAsWritten())
593     if (Visit(TSInfo->getTypeLoc()))
594       return true;
595 
596   if (Stmt *Body = B->getBody())
597     return Visit(MakeCXCursor(Body, StmtParent, TU, RegionOfInterest));
598 
599   return false;
600 }
601 
602 Optional<bool> CursorVisitor::shouldVisitCursor(CXCursor Cursor) {
603   if (RegionOfInterest.isValid()) {
604     SourceRange Range = getFullCursorExtent(Cursor, AU->getSourceManager());
605     if (Range.isInvalid())
606       return None;
607 
608     switch (CompareRegionOfInterest(Range)) {
609     case RangeBefore:
610       // This declaration comes before the region of interest; skip it.
611       return None;
612 
613     case RangeAfter:
614       // This declaration comes after the region of interest; we're done.
615       return false;
616 
617     case RangeOverlap:
618       // This declaration overlaps the region of interest; visit it.
619       break;
620     }
621   }
622   return true;
623 }
624 
625 bool CursorVisitor::VisitDeclContext(DeclContext *DC) {
626   DeclContext::decl_iterator I = DC->decls_begin(), E = DC->decls_end();
627 
628   // FIXME: Eventually remove.  This part of a hack to support proper
629   // iteration over all Decls contained lexically within an ObjC container.
630   SaveAndRestore<DeclContext::decl_iterator *> DI_saved(DI_current, &I);
631   SaveAndRestore<DeclContext::decl_iterator> DE_saved(DE_current, E);
632 
633   for (; I != E; ++I) {
634     Decl *D = *I;
635     if (D->getLexicalDeclContext() != DC)
636       continue;
637     // Filter out synthesized property accessor redeclarations.
638     if (isa<ObjCImplDecl>(DC))
639       if (auto *OMD = dyn_cast<ObjCMethodDecl>(D))
640         if (OMD->isSynthesizedAccessorStub())
641           continue;
642     const Optional<bool> V = handleDeclForVisitation(D);
643     if (!V.hasValue())
644       continue;
645     return V.getValue();
646   }
647   return false;
648 }
649 
650 Optional<bool> CursorVisitor::handleDeclForVisitation(const Decl *D) {
651   CXCursor Cursor = MakeCXCursor(D, TU, RegionOfInterest);
652 
653   // Ignore synthesized ivars here, otherwise if we have something like:
654   //   @synthesize prop = _prop;
655   // and '_prop' is not declared, we will encounter a '_prop' ivar before
656   // encountering the 'prop' synthesize declaration and we will think that
657   // we passed the region-of-interest.
658   if (auto *ivarD = dyn_cast<ObjCIvarDecl>(D)) {
659     if (ivarD->getSynthesize())
660       return None;
661   }
662 
663   // FIXME: ObjCClassRef/ObjCProtocolRef for forward class/protocol
664   // declarations is a mismatch with the compiler semantics.
665   if (Cursor.kind == CXCursor_ObjCInterfaceDecl) {
666     auto *ID = cast<ObjCInterfaceDecl>(D);
667     if (!ID->isThisDeclarationADefinition())
668       Cursor = MakeCursorObjCClassRef(ID, ID->getLocation(), TU);
669 
670   } else if (Cursor.kind == CXCursor_ObjCProtocolDecl) {
671     auto *PD = cast<ObjCProtocolDecl>(D);
672     if (!PD->isThisDeclarationADefinition())
673       Cursor = MakeCursorObjCProtocolRef(PD, PD->getLocation(), TU);
674   }
675 
676   const Optional<bool> V = shouldVisitCursor(Cursor);
677   if (!V.hasValue())
678     return None;
679   if (!V.getValue())
680     return false;
681   if (Visit(Cursor, true))
682     return true;
683   return None;
684 }
685 
686 bool CursorVisitor::VisitTranslationUnitDecl(TranslationUnitDecl *D) {
687   llvm_unreachable("Translation units are visited directly by Visit()");
688 }
689 
690 bool CursorVisitor::VisitTypeAliasTemplateDecl(TypeAliasTemplateDecl *D) {
691   if (VisitTemplateParameters(D->getTemplateParameters()))
692     return true;
693 
694   return Visit(MakeCXCursor(D->getTemplatedDecl(), TU, RegionOfInterest));
695 }
696 
697 bool CursorVisitor::VisitTypeAliasDecl(TypeAliasDecl *D) {
698   if (TypeSourceInfo *TSInfo = D->getTypeSourceInfo())
699     return Visit(TSInfo->getTypeLoc());
700 
701   return false;
702 }
703 
704 bool CursorVisitor::VisitTypedefDecl(TypedefDecl *D) {
705   if (TypeSourceInfo *TSInfo = D->getTypeSourceInfo())
706     return Visit(TSInfo->getTypeLoc());
707 
708   return false;
709 }
710 
711 bool CursorVisitor::VisitTagDecl(TagDecl *D) { return VisitDeclContext(D); }
712 
713 bool CursorVisitor::VisitClassTemplateSpecializationDecl(
714     ClassTemplateSpecializationDecl *D) {
715   bool ShouldVisitBody = false;
716   switch (D->getSpecializationKind()) {
717   case TSK_Undeclared:
718   case TSK_ImplicitInstantiation:
719     // Nothing to visit
720     return false;
721 
722   case TSK_ExplicitInstantiationDeclaration:
723   case TSK_ExplicitInstantiationDefinition:
724     break;
725 
726   case TSK_ExplicitSpecialization:
727     ShouldVisitBody = true;
728     break;
729   }
730 
731   // Visit the template arguments used in the specialization.
732   if (TypeSourceInfo *SpecType = D->getTypeAsWritten()) {
733     TypeLoc TL = SpecType->getTypeLoc();
734     if (TemplateSpecializationTypeLoc TSTLoc =
735             TL.getAs<TemplateSpecializationTypeLoc>()) {
736       for (unsigned I = 0, N = TSTLoc.getNumArgs(); I != N; ++I)
737         if (VisitTemplateArgumentLoc(TSTLoc.getArgLoc(I)))
738           return true;
739     }
740   }
741 
742   return ShouldVisitBody && VisitCXXRecordDecl(D);
743 }
744 
745 bool CursorVisitor::VisitClassTemplatePartialSpecializationDecl(
746     ClassTemplatePartialSpecializationDecl *D) {
747   // FIXME: Visit the "outer" template parameter lists on the TagDecl
748   // before visiting these template parameters.
749   if (VisitTemplateParameters(D->getTemplateParameters()))
750     return true;
751 
752   // Visit the partial specialization arguments.
753   const ASTTemplateArgumentListInfo *Info = D->getTemplateArgsAsWritten();
754   const TemplateArgumentLoc *TemplateArgs = Info->getTemplateArgs();
755   for (unsigned I = 0, N = Info->NumTemplateArgs; I != N; ++I)
756     if (VisitTemplateArgumentLoc(TemplateArgs[I]))
757       return true;
758 
759   return VisitCXXRecordDecl(D);
760 }
761 
762 bool CursorVisitor::VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D) {
763   if (const auto *TC = D->getTypeConstraint())
764     if (Visit(MakeCXCursor(TC->getImmediatelyDeclaredConstraint(), StmtParent,
765                            TU, RegionOfInterest)))
766       return true;
767 
768   // Visit the default argument.
769   if (D->hasDefaultArgument() && !D->defaultArgumentWasInherited())
770     if (TypeSourceInfo *DefArg = D->getDefaultArgumentInfo())
771       if (Visit(DefArg->getTypeLoc()))
772         return true;
773 
774   return false;
775 }
776 
777 bool CursorVisitor::VisitEnumConstantDecl(EnumConstantDecl *D) {
778   if (Expr *Init = D->getInitExpr())
779     return Visit(MakeCXCursor(Init, StmtParent, TU, RegionOfInterest));
780   return false;
781 }
782 
783 bool CursorVisitor::VisitDeclaratorDecl(DeclaratorDecl *DD) {
784   unsigned NumParamList = DD->getNumTemplateParameterLists();
785   for (unsigned i = 0; i < NumParamList; i++) {
786     TemplateParameterList *Params = DD->getTemplateParameterList(i);
787     if (VisitTemplateParameters(Params))
788       return true;
789   }
790 
791   if (TypeSourceInfo *TSInfo = DD->getTypeSourceInfo())
792     if (Visit(TSInfo->getTypeLoc()))
793       return true;
794 
795   // Visit the nested-name-specifier, if present.
796   if (NestedNameSpecifierLoc QualifierLoc = DD->getQualifierLoc())
797     if (VisitNestedNameSpecifierLoc(QualifierLoc))
798       return true;
799 
800   return false;
801 }
802 
803 static bool HasTrailingReturnType(FunctionDecl *ND) {
804   const QualType Ty = ND->getType();
805   if (const FunctionType *AFT = Ty->getAs<FunctionType>()) {
806     if (const FunctionProtoType *FT = dyn_cast<FunctionProtoType>(AFT))
807       return FT->hasTrailingReturn();
808   }
809 
810   return false;
811 }
812 
813 /// Compare two base or member initializers based on their source order.
814 static int CompareCXXCtorInitializers(CXXCtorInitializer *const *X,
815                                       CXXCtorInitializer *const *Y) {
816   return (*X)->getSourceOrder() - (*Y)->getSourceOrder();
817 }
818 
819 bool CursorVisitor::VisitFunctionDecl(FunctionDecl *ND) {
820   unsigned NumParamList = ND->getNumTemplateParameterLists();
821   for (unsigned i = 0; i < NumParamList; i++) {
822     TemplateParameterList *Params = ND->getTemplateParameterList(i);
823     if (VisitTemplateParameters(Params))
824       return true;
825   }
826 
827   if (TypeSourceInfo *TSInfo = ND->getTypeSourceInfo()) {
828     // Visit the function declaration's syntactic components in the order
829     // written. This requires a bit of work.
830     TypeLoc TL = TSInfo->getTypeLoc().IgnoreParens();
831     FunctionTypeLoc FTL = TL.getAs<FunctionTypeLoc>();
832     const bool HasTrailingRT = HasTrailingReturnType(ND);
833 
834     // If we have a function declared directly (without the use of a typedef),
835     // visit just the return type. Otherwise, just visit the function's type
836     // now.
837     if ((FTL && !isa<CXXConversionDecl>(ND) && !HasTrailingRT &&
838          Visit(FTL.getReturnLoc())) ||
839         (!FTL && Visit(TL)))
840       return true;
841 
842     // Visit the nested-name-specifier, if present.
843     if (NestedNameSpecifierLoc QualifierLoc = ND->getQualifierLoc())
844       if (VisitNestedNameSpecifierLoc(QualifierLoc))
845         return true;
846 
847     // Visit the declaration name.
848     if (!isa<CXXDestructorDecl>(ND))
849       if (VisitDeclarationNameInfo(ND->getNameInfo()))
850         return true;
851 
852     // FIXME: Visit explicitly-specified template arguments!
853 
854     // Visit the function parameters, if we have a function type.
855     if (FTL && VisitFunctionTypeLoc(FTL, true))
856       return true;
857 
858     // Visit the function's trailing return type.
859     if (FTL && HasTrailingRT && Visit(FTL.getReturnLoc()))
860       return true;
861 
862     // FIXME: Attributes?
863   }
864 
865   if (ND->doesThisDeclarationHaveABody() && !ND->isLateTemplateParsed()) {
866     if (CXXConstructorDecl *Constructor = dyn_cast<CXXConstructorDecl>(ND)) {
867       // Find the initializers that were written in the source.
868       SmallVector<CXXCtorInitializer *, 4> WrittenInits;
869       for (auto *I : Constructor->inits()) {
870         if (!I->isWritten())
871           continue;
872 
873         WrittenInits.push_back(I);
874       }
875 
876       // Sort the initializers in source order
877       llvm::array_pod_sort(WrittenInits.begin(), WrittenInits.end(),
878                            &CompareCXXCtorInitializers);
879 
880       // Visit the initializers in source order
881       for (unsigned I = 0, N = WrittenInits.size(); I != N; ++I) {
882         CXXCtorInitializer *Init = WrittenInits[I];
883         if (Init->isAnyMemberInitializer()) {
884           if (Visit(MakeCursorMemberRef(Init->getAnyMember(),
885                                         Init->getMemberLocation(), TU)))
886             return true;
887         } else if (TypeSourceInfo *TInfo = Init->getTypeSourceInfo()) {
888           if (Visit(TInfo->getTypeLoc()))
889             return true;
890         }
891 
892         // Visit the initializer value.
893         if (Expr *Initializer = Init->getInit())
894           if (Visit(MakeCXCursor(Initializer, ND, TU, RegionOfInterest)))
895             return true;
896       }
897     }
898 
899     if (Visit(MakeCXCursor(ND->getBody(), StmtParent, TU, RegionOfInterest)))
900       return true;
901   }
902 
903   return false;
904 }
905 
906 bool CursorVisitor::VisitFieldDecl(FieldDecl *D) {
907   if (VisitDeclaratorDecl(D))
908     return true;
909 
910   if (Expr *BitWidth = D->getBitWidth())
911     return Visit(MakeCXCursor(BitWidth, StmtParent, TU, RegionOfInterest));
912 
913   if (Expr *Init = D->getInClassInitializer())
914     return Visit(MakeCXCursor(Init, StmtParent, TU, RegionOfInterest));
915 
916   return false;
917 }
918 
919 bool CursorVisitor::VisitVarDecl(VarDecl *D) {
920   if (VisitDeclaratorDecl(D))
921     return true;
922 
923   if (Expr *Init = D->getInit())
924     return Visit(MakeCXCursor(Init, StmtParent, TU, RegionOfInterest));
925 
926   return false;
927 }
928 
929 bool CursorVisitor::VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D) {
930   if (VisitDeclaratorDecl(D))
931     return true;
932 
933   if (D->hasDefaultArgument() && !D->defaultArgumentWasInherited())
934     if (Expr *DefArg = D->getDefaultArgument())
935       return Visit(MakeCXCursor(DefArg, StmtParent, TU, RegionOfInterest));
936 
937   return false;
938 }
939 
940 bool CursorVisitor::VisitFunctionTemplateDecl(FunctionTemplateDecl *D) {
941   // FIXME: Visit the "outer" template parameter lists on the FunctionDecl
942   // before visiting these template parameters.
943   if (VisitTemplateParameters(D->getTemplateParameters()))
944     return true;
945 
946   auto *FD = D->getTemplatedDecl();
947   return VisitAttributes(FD) || VisitFunctionDecl(FD);
948 }
949 
950 bool CursorVisitor::VisitClassTemplateDecl(ClassTemplateDecl *D) {
951   // FIXME: Visit the "outer" template parameter lists on the TagDecl
952   // before visiting these template parameters.
953   if (VisitTemplateParameters(D->getTemplateParameters()))
954     return true;
955 
956   auto *CD = D->getTemplatedDecl();
957   return VisitAttributes(CD) || VisitCXXRecordDecl(CD);
958 }
959 
960 bool CursorVisitor::VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D) {
961   if (VisitTemplateParameters(D->getTemplateParameters()))
962     return true;
963 
964   if (D->hasDefaultArgument() && !D->defaultArgumentWasInherited() &&
965       VisitTemplateArgumentLoc(D->getDefaultArgument()))
966     return true;
967 
968   return false;
969 }
970 
971 bool CursorVisitor::VisitObjCTypeParamDecl(ObjCTypeParamDecl *D) {
972   // Visit the bound, if it's explicit.
973   if (D->hasExplicitBound()) {
974     if (auto TInfo = D->getTypeSourceInfo()) {
975       if (Visit(TInfo->getTypeLoc()))
976         return true;
977     }
978   }
979 
980   return false;
981 }
982 
983 bool CursorVisitor::VisitObjCMethodDecl(ObjCMethodDecl *ND) {
984   if (TypeSourceInfo *TSInfo = ND->getReturnTypeSourceInfo())
985     if (Visit(TSInfo->getTypeLoc()))
986       return true;
987 
988   for (const auto *P : ND->parameters()) {
989     if (Visit(MakeCXCursor(P, TU, RegionOfInterest)))
990       return true;
991   }
992 
993   return ND->isThisDeclarationADefinition() &&
994          Visit(MakeCXCursor(ND->getBody(), StmtParent, TU, RegionOfInterest));
995 }
996 
997 template <typename DeclIt>
998 static void addRangedDeclsInContainer(DeclIt *DI_current, DeclIt DE_current,
999                                       SourceManager &SM, SourceLocation EndLoc,
1000                                       SmallVectorImpl<Decl *> &Decls) {
1001   DeclIt next = *DI_current;
1002   while (++next != DE_current) {
1003     Decl *D_next = *next;
1004     if (!D_next)
1005       break;
1006     SourceLocation L = D_next->getBeginLoc();
1007     if (!L.isValid())
1008       break;
1009     if (SM.isBeforeInTranslationUnit(L, EndLoc)) {
1010       *DI_current = next;
1011       Decls.push_back(D_next);
1012       continue;
1013     }
1014     break;
1015   }
1016 }
1017 
1018 bool CursorVisitor::VisitObjCContainerDecl(ObjCContainerDecl *D) {
1019   // FIXME: Eventually convert back to just 'VisitDeclContext()'.  Essentially
1020   // an @implementation can lexically contain Decls that are not properly
1021   // nested in the AST.  When we identify such cases, we need to retrofit
1022   // this nesting here.
1023   if (!DI_current && !FileDI_current)
1024     return VisitDeclContext(D);
1025 
1026   // Scan the Decls that immediately come after the container
1027   // in the current DeclContext.  If any fall within the
1028   // container's lexical region, stash them into a vector
1029   // for later processing.
1030   SmallVector<Decl *, 24> DeclsInContainer;
1031   SourceLocation EndLoc = D->getSourceRange().getEnd();
1032   SourceManager &SM = AU->getSourceManager();
1033   if (EndLoc.isValid()) {
1034     if (DI_current) {
1035       addRangedDeclsInContainer(DI_current, DE_current, SM, EndLoc,
1036                                 DeclsInContainer);
1037     } else {
1038       addRangedDeclsInContainer(FileDI_current, FileDE_current, SM, EndLoc,
1039                                 DeclsInContainer);
1040     }
1041   }
1042 
1043   // The common case.
1044   if (DeclsInContainer.empty())
1045     return VisitDeclContext(D);
1046 
1047   // Get all the Decls in the DeclContext, and sort them with the
1048   // additional ones we've collected.  Then visit them.
1049   for (auto *SubDecl : D->decls()) {
1050     if (!SubDecl || SubDecl->getLexicalDeclContext() != D ||
1051         SubDecl->getBeginLoc().isInvalid())
1052       continue;
1053     DeclsInContainer.push_back(SubDecl);
1054   }
1055 
1056   // Now sort the Decls so that they appear in lexical order.
1057   llvm::sort(DeclsInContainer, [&SM](Decl *A, Decl *B) {
1058     SourceLocation L_A = A->getBeginLoc();
1059     SourceLocation L_B = B->getBeginLoc();
1060     return L_A != L_B
1061                ? SM.isBeforeInTranslationUnit(L_A, L_B)
1062                : SM.isBeforeInTranslationUnit(A->getEndLoc(), B->getEndLoc());
1063   });
1064 
1065   // Now visit the decls.
1066   for (SmallVectorImpl<Decl *>::iterator I = DeclsInContainer.begin(),
1067                                          E = DeclsInContainer.end();
1068        I != E; ++I) {
1069     CXCursor Cursor = MakeCXCursor(*I, TU, RegionOfInterest);
1070     const Optional<bool> &V = shouldVisitCursor(Cursor);
1071     if (!V.hasValue())
1072       continue;
1073     if (!V.getValue())
1074       return false;
1075     if (Visit(Cursor, true))
1076       return true;
1077   }
1078   return false;
1079 }
1080 
1081 bool CursorVisitor::VisitObjCCategoryDecl(ObjCCategoryDecl *ND) {
1082   if (Visit(MakeCursorObjCClassRef(ND->getClassInterface(), ND->getLocation(),
1083                                    TU)))
1084     return true;
1085 
1086   if (VisitObjCTypeParamList(ND->getTypeParamList()))
1087     return true;
1088 
1089   ObjCCategoryDecl::protocol_loc_iterator PL = ND->protocol_loc_begin();
1090   for (ObjCCategoryDecl::protocol_iterator I = ND->protocol_begin(),
1091                                            E = ND->protocol_end();
1092        I != E; ++I, ++PL)
1093     if (Visit(MakeCursorObjCProtocolRef(*I, *PL, TU)))
1094       return true;
1095 
1096   return VisitObjCContainerDecl(ND);
1097 }
1098 
1099 bool CursorVisitor::VisitObjCProtocolDecl(ObjCProtocolDecl *PID) {
1100   if (!PID->isThisDeclarationADefinition())
1101     return Visit(MakeCursorObjCProtocolRef(PID, PID->getLocation(), TU));
1102 
1103   ObjCProtocolDecl::protocol_loc_iterator PL = PID->protocol_loc_begin();
1104   for (ObjCProtocolDecl::protocol_iterator I = PID->protocol_begin(),
1105                                            E = PID->protocol_end();
1106        I != E; ++I, ++PL)
1107     if (Visit(MakeCursorObjCProtocolRef(*I, *PL, TU)))
1108       return true;
1109 
1110   return VisitObjCContainerDecl(PID);
1111 }
1112 
1113 bool CursorVisitor::VisitObjCPropertyDecl(ObjCPropertyDecl *PD) {
1114   if (PD->getTypeSourceInfo() && Visit(PD->getTypeSourceInfo()->getTypeLoc()))
1115     return true;
1116 
1117   // FIXME: This implements a workaround with @property declarations also being
1118   // installed in the DeclContext for the @interface.  Eventually this code
1119   // should be removed.
1120   ObjCCategoryDecl *CDecl = dyn_cast<ObjCCategoryDecl>(PD->getDeclContext());
1121   if (!CDecl || !CDecl->IsClassExtension())
1122     return false;
1123 
1124   ObjCInterfaceDecl *ID = CDecl->getClassInterface();
1125   if (!ID)
1126     return false;
1127 
1128   IdentifierInfo *PropertyId = PD->getIdentifier();
1129   ObjCPropertyDecl *prevDecl = ObjCPropertyDecl::findPropertyDecl(
1130       cast<DeclContext>(ID), PropertyId, PD->getQueryKind());
1131 
1132   if (!prevDecl)
1133     return false;
1134 
1135   // Visit synthesized methods since they will be skipped when visiting
1136   // the @interface.
1137   if (ObjCMethodDecl *MD = prevDecl->getGetterMethodDecl())
1138     if (MD->isPropertyAccessor() && MD->getLexicalDeclContext() == CDecl)
1139       if (Visit(MakeCXCursor(MD, TU, RegionOfInterest)))
1140         return true;
1141 
1142   if (ObjCMethodDecl *MD = prevDecl->getSetterMethodDecl())
1143     if (MD->isPropertyAccessor() && MD->getLexicalDeclContext() == CDecl)
1144       if (Visit(MakeCXCursor(MD, TU, RegionOfInterest)))
1145         return true;
1146 
1147   return false;
1148 }
1149 
1150 bool CursorVisitor::VisitObjCTypeParamList(ObjCTypeParamList *typeParamList) {
1151   if (!typeParamList)
1152     return false;
1153 
1154   for (auto *typeParam : *typeParamList) {
1155     // Visit the type parameter.
1156     if (Visit(MakeCXCursor(typeParam, TU, RegionOfInterest)))
1157       return true;
1158   }
1159 
1160   return false;
1161 }
1162 
1163 bool CursorVisitor::VisitObjCInterfaceDecl(ObjCInterfaceDecl *D) {
1164   if (!D->isThisDeclarationADefinition()) {
1165     // Forward declaration is treated like a reference.
1166     return Visit(MakeCursorObjCClassRef(D, D->getLocation(), TU));
1167   }
1168 
1169   // Objective-C type parameters.
1170   if (VisitObjCTypeParamList(D->getTypeParamListAsWritten()))
1171     return true;
1172 
1173   // Issue callbacks for super class.
1174   if (D->getSuperClass() && Visit(MakeCursorObjCSuperClassRef(
1175                                 D->getSuperClass(), D->getSuperClassLoc(), TU)))
1176     return true;
1177 
1178   if (TypeSourceInfo *SuperClassTInfo = D->getSuperClassTInfo())
1179     if (Visit(SuperClassTInfo->getTypeLoc()))
1180       return true;
1181 
1182   ObjCInterfaceDecl::protocol_loc_iterator PL = D->protocol_loc_begin();
1183   for (ObjCInterfaceDecl::protocol_iterator I = D->protocol_begin(),
1184                                             E = D->protocol_end();
1185        I != E; ++I, ++PL)
1186     if (Visit(MakeCursorObjCProtocolRef(*I, *PL, TU)))
1187       return true;
1188 
1189   return VisitObjCContainerDecl(D);
1190 }
1191 
1192 bool CursorVisitor::VisitObjCImplDecl(ObjCImplDecl *D) {
1193   return VisitObjCContainerDecl(D);
1194 }
1195 
1196 bool CursorVisitor::VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D) {
1197   // 'ID' could be null when dealing with invalid code.
1198   if (ObjCInterfaceDecl *ID = D->getClassInterface())
1199     if (Visit(MakeCursorObjCClassRef(ID, D->getLocation(), TU)))
1200       return true;
1201 
1202   return VisitObjCImplDecl(D);
1203 }
1204 
1205 bool CursorVisitor::VisitObjCImplementationDecl(ObjCImplementationDecl *D) {
1206 #if 0
1207   // Issue callbacks for super class.
1208   // FIXME: No source location information!
1209   if (D->getSuperClass() &&
1210       Visit(MakeCursorObjCSuperClassRef(D->getSuperClass(),
1211                                         D->getSuperClassLoc(),
1212                                         TU)))
1213     return true;
1214 #endif
1215 
1216   return VisitObjCImplDecl(D);
1217 }
1218 
1219 bool CursorVisitor::VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *PD) {
1220   if (ObjCIvarDecl *Ivar = PD->getPropertyIvarDecl())
1221     if (PD->isIvarNameSpecified())
1222       return Visit(MakeCursorMemberRef(Ivar, PD->getPropertyIvarDeclLoc(), TU));
1223 
1224   return false;
1225 }
1226 
1227 bool CursorVisitor::VisitNamespaceDecl(NamespaceDecl *D) {
1228   return VisitDeclContext(D);
1229 }
1230 
1231 bool CursorVisitor::VisitNamespaceAliasDecl(NamespaceAliasDecl *D) {
1232   // Visit nested-name-specifier.
1233   if (NestedNameSpecifierLoc QualifierLoc = D->getQualifierLoc())
1234     if (VisitNestedNameSpecifierLoc(QualifierLoc))
1235       return true;
1236 
1237   return Visit(MakeCursorNamespaceRef(D->getAliasedNamespace(),
1238                                       D->getTargetNameLoc(), TU));
1239 }
1240 
1241 bool CursorVisitor::VisitUsingDecl(UsingDecl *D) {
1242   // Visit nested-name-specifier.
1243   if (NestedNameSpecifierLoc QualifierLoc = D->getQualifierLoc()) {
1244     if (VisitNestedNameSpecifierLoc(QualifierLoc))
1245       return true;
1246   }
1247 
1248   if (Visit(MakeCursorOverloadedDeclRef(D, D->getLocation(), TU)))
1249     return true;
1250 
1251   return VisitDeclarationNameInfo(D->getNameInfo());
1252 }
1253 
1254 bool CursorVisitor::VisitUsingDirectiveDecl(UsingDirectiveDecl *D) {
1255   // Visit nested-name-specifier.
1256   if (NestedNameSpecifierLoc QualifierLoc = D->getQualifierLoc())
1257     if (VisitNestedNameSpecifierLoc(QualifierLoc))
1258       return true;
1259 
1260   return Visit(MakeCursorNamespaceRef(D->getNominatedNamespaceAsWritten(),
1261                                       D->getIdentLocation(), TU));
1262 }
1263 
1264 bool CursorVisitor::VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D) {
1265   // Visit nested-name-specifier.
1266   if (NestedNameSpecifierLoc QualifierLoc = D->getQualifierLoc()) {
1267     if (VisitNestedNameSpecifierLoc(QualifierLoc))
1268       return true;
1269   }
1270 
1271   return VisitDeclarationNameInfo(D->getNameInfo());
1272 }
1273 
1274 bool CursorVisitor::VisitUnresolvedUsingTypenameDecl(
1275     UnresolvedUsingTypenameDecl *D) {
1276   // Visit nested-name-specifier.
1277   if (NestedNameSpecifierLoc QualifierLoc = D->getQualifierLoc())
1278     if (VisitNestedNameSpecifierLoc(QualifierLoc))
1279       return true;
1280 
1281   return false;
1282 }
1283 
1284 bool CursorVisitor::VisitStaticAssertDecl(StaticAssertDecl *D) {
1285   if (Visit(MakeCXCursor(D->getAssertExpr(), StmtParent, TU, RegionOfInterest)))
1286     return true;
1287   if (StringLiteral *Message = D->getMessage())
1288     if (Visit(MakeCXCursor(Message, StmtParent, TU, RegionOfInterest)))
1289       return true;
1290   return false;
1291 }
1292 
1293 bool CursorVisitor::VisitFriendDecl(FriendDecl *D) {
1294   if (NamedDecl *FriendD = D->getFriendDecl()) {
1295     if (Visit(MakeCXCursor(FriendD, TU, RegionOfInterest)))
1296       return true;
1297   } else if (TypeSourceInfo *TI = D->getFriendType()) {
1298     if (Visit(TI->getTypeLoc()))
1299       return true;
1300   }
1301   return false;
1302 }
1303 
1304 bool CursorVisitor::VisitDecompositionDecl(DecompositionDecl *D) {
1305   for (auto *B : D->bindings()) {
1306     if (Visit(MakeCXCursor(B, TU, RegionOfInterest)))
1307       return true;
1308   }
1309   return VisitVarDecl(D);
1310 }
1311 
1312 bool CursorVisitor::VisitDeclarationNameInfo(DeclarationNameInfo Name) {
1313   switch (Name.getName().getNameKind()) {
1314   case clang::DeclarationName::Identifier:
1315   case clang::DeclarationName::CXXLiteralOperatorName:
1316   case clang::DeclarationName::CXXDeductionGuideName:
1317   case clang::DeclarationName::CXXOperatorName:
1318   case clang::DeclarationName::CXXUsingDirective:
1319     return false;
1320 
1321   case clang::DeclarationName::CXXConstructorName:
1322   case clang::DeclarationName::CXXDestructorName:
1323   case clang::DeclarationName::CXXConversionFunctionName:
1324     if (TypeSourceInfo *TSInfo = Name.getNamedTypeInfo())
1325       return Visit(TSInfo->getTypeLoc());
1326     return false;
1327 
1328   case clang::DeclarationName::ObjCZeroArgSelector:
1329   case clang::DeclarationName::ObjCOneArgSelector:
1330   case clang::DeclarationName::ObjCMultiArgSelector:
1331     // FIXME: Per-identifier location info?
1332     return false;
1333   }
1334 
1335   llvm_unreachable("Invalid DeclarationName::Kind!");
1336 }
1337 
1338 bool CursorVisitor::VisitNestedNameSpecifier(NestedNameSpecifier *NNS,
1339                                              SourceRange Range) {
1340   // FIXME: This whole routine is a hack to work around the lack of proper
1341   // source information in nested-name-specifiers (PR5791). Since we do have
1342   // a beginning source location, we can visit the first component of the
1343   // nested-name-specifier, if it's a single-token component.
1344   if (!NNS)
1345     return false;
1346 
1347   // Get the first component in the nested-name-specifier.
1348   while (NestedNameSpecifier *Prefix = NNS->getPrefix())
1349     NNS = Prefix;
1350 
1351   switch (NNS->getKind()) {
1352   case NestedNameSpecifier::Namespace:
1353     return Visit(
1354         MakeCursorNamespaceRef(NNS->getAsNamespace(), Range.getBegin(), TU));
1355 
1356   case NestedNameSpecifier::NamespaceAlias:
1357     return Visit(MakeCursorNamespaceRef(NNS->getAsNamespaceAlias(),
1358                                         Range.getBegin(), TU));
1359 
1360   case NestedNameSpecifier::TypeSpec: {
1361     // If the type has a form where we know that the beginning of the source
1362     // range matches up with a reference cursor. Visit the appropriate reference
1363     // cursor.
1364     const Type *T = NNS->getAsType();
1365     if (const TypedefType *Typedef = dyn_cast<TypedefType>(T))
1366       return Visit(MakeCursorTypeRef(Typedef->getDecl(), Range.getBegin(), TU));
1367     if (const TagType *Tag = dyn_cast<TagType>(T))
1368       return Visit(MakeCursorTypeRef(Tag->getDecl(), Range.getBegin(), TU));
1369     if (const TemplateSpecializationType *TST =
1370             dyn_cast<TemplateSpecializationType>(T))
1371       return VisitTemplateName(TST->getTemplateName(), Range.getBegin());
1372     break;
1373   }
1374 
1375   case NestedNameSpecifier::TypeSpecWithTemplate:
1376   case NestedNameSpecifier::Global:
1377   case NestedNameSpecifier::Identifier:
1378   case NestedNameSpecifier::Super:
1379     break;
1380   }
1381 
1382   return false;
1383 }
1384 
1385 bool CursorVisitor::VisitNestedNameSpecifierLoc(
1386     NestedNameSpecifierLoc Qualifier) {
1387   SmallVector<NestedNameSpecifierLoc, 4> Qualifiers;
1388   for (; Qualifier; Qualifier = Qualifier.getPrefix())
1389     Qualifiers.push_back(Qualifier);
1390 
1391   while (!Qualifiers.empty()) {
1392     NestedNameSpecifierLoc Q = Qualifiers.pop_back_val();
1393     NestedNameSpecifier *NNS = Q.getNestedNameSpecifier();
1394     switch (NNS->getKind()) {
1395     case NestedNameSpecifier::Namespace:
1396       if (Visit(MakeCursorNamespaceRef(NNS->getAsNamespace(),
1397                                        Q.getLocalBeginLoc(), TU)))
1398         return true;
1399 
1400       break;
1401 
1402     case NestedNameSpecifier::NamespaceAlias:
1403       if (Visit(MakeCursorNamespaceRef(NNS->getAsNamespaceAlias(),
1404                                        Q.getLocalBeginLoc(), TU)))
1405         return true;
1406 
1407       break;
1408 
1409     case NestedNameSpecifier::TypeSpec:
1410     case NestedNameSpecifier::TypeSpecWithTemplate:
1411       if (Visit(Q.getTypeLoc()))
1412         return true;
1413 
1414       break;
1415 
1416     case NestedNameSpecifier::Global:
1417     case NestedNameSpecifier::Identifier:
1418     case NestedNameSpecifier::Super:
1419       break;
1420     }
1421   }
1422 
1423   return false;
1424 }
1425 
1426 bool CursorVisitor::VisitTemplateParameters(
1427     const TemplateParameterList *Params) {
1428   if (!Params)
1429     return false;
1430 
1431   for (TemplateParameterList::const_iterator P = Params->begin(),
1432                                              PEnd = Params->end();
1433        P != PEnd; ++P) {
1434     if (Visit(MakeCXCursor(*P, TU, RegionOfInterest)))
1435       return true;
1436   }
1437 
1438   return false;
1439 }
1440 
1441 bool CursorVisitor::VisitTemplateName(TemplateName Name, SourceLocation Loc) {
1442   switch (Name.getKind()) {
1443   case TemplateName::Template:
1444     return Visit(MakeCursorTemplateRef(Name.getAsTemplateDecl(), Loc, TU));
1445 
1446   case TemplateName::OverloadedTemplate:
1447     // Visit the overloaded template set.
1448     if (Visit(MakeCursorOverloadedDeclRef(Name, Loc, TU)))
1449       return true;
1450 
1451     return false;
1452 
1453   case TemplateName::AssumedTemplate:
1454     // FIXME: Visit DeclarationName?
1455     return false;
1456 
1457   case TemplateName::DependentTemplate:
1458     // FIXME: Visit nested-name-specifier.
1459     return false;
1460 
1461   case TemplateName::QualifiedTemplate:
1462     // FIXME: Visit nested-name-specifier.
1463     return Visit(MakeCursorTemplateRef(
1464         Name.getAsQualifiedTemplateName()->getDecl(), Loc, TU));
1465 
1466   case TemplateName::SubstTemplateTemplateParm:
1467     return Visit(MakeCursorTemplateRef(
1468         Name.getAsSubstTemplateTemplateParm()->getParameter(), Loc, TU));
1469 
1470   case TemplateName::SubstTemplateTemplateParmPack:
1471     return Visit(MakeCursorTemplateRef(
1472         Name.getAsSubstTemplateTemplateParmPack()->getParameterPack(), Loc,
1473         TU));
1474   }
1475 
1476   llvm_unreachable("Invalid TemplateName::Kind!");
1477 }
1478 
1479 bool CursorVisitor::VisitTemplateArgumentLoc(const TemplateArgumentLoc &TAL) {
1480   switch (TAL.getArgument().getKind()) {
1481   case TemplateArgument::Null:
1482   case TemplateArgument::Integral:
1483   case TemplateArgument::Pack:
1484     return false;
1485 
1486   case TemplateArgument::Type:
1487     if (TypeSourceInfo *TSInfo = TAL.getTypeSourceInfo())
1488       return Visit(TSInfo->getTypeLoc());
1489     return false;
1490 
1491   case TemplateArgument::Declaration:
1492     if (Expr *E = TAL.getSourceDeclExpression())
1493       return Visit(MakeCXCursor(E, StmtParent, TU, RegionOfInterest));
1494     return false;
1495 
1496   case TemplateArgument::NullPtr:
1497     if (Expr *E = TAL.getSourceNullPtrExpression())
1498       return Visit(MakeCXCursor(E, StmtParent, TU, RegionOfInterest));
1499     return false;
1500 
1501   case TemplateArgument::Expression:
1502     if (Expr *E = TAL.getSourceExpression())
1503       return Visit(MakeCXCursor(E, StmtParent, TU, RegionOfInterest));
1504     return false;
1505 
1506   case TemplateArgument::Template:
1507   case TemplateArgument::TemplateExpansion:
1508     if (VisitNestedNameSpecifierLoc(TAL.getTemplateQualifierLoc()))
1509       return true;
1510 
1511     return VisitTemplateName(TAL.getArgument().getAsTemplateOrTemplatePattern(),
1512                              TAL.getTemplateNameLoc());
1513   }
1514 
1515   llvm_unreachable("Invalid TemplateArgument::Kind!");
1516 }
1517 
1518 bool CursorVisitor::VisitLinkageSpecDecl(LinkageSpecDecl *D) {
1519   return VisitDeclContext(D);
1520 }
1521 
1522 bool CursorVisitor::VisitQualifiedTypeLoc(QualifiedTypeLoc TL) {
1523   return Visit(TL.getUnqualifiedLoc());
1524 }
1525 
1526 bool CursorVisitor::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) {
1527   ASTContext &Context = AU->getASTContext();
1528 
1529   // Some builtin types (such as Objective-C's "id", "sel", and
1530   // "Class") have associated declarations. Create cursors for those.
1531   QualType VisitType;
1532   switch (TL.getTypePtr()->getKind()) {
1533 
1534   case BuiltinType::Void:
1535   case BuiltinType::NullPtr:
1536   case BuiltinType::Dependent:
1537 #define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix)                   \
1538   case BuiltinType::Id:
1539 #include "clang/Basic/OpenCLImageTypes.def"
1540 #define EXT_OPAQUE_TYPE(ExtTYpe, Id, Ext) case BuiltinType::Id:
1541 #include "clang/Basic/OpenCLExtensionTypes.def"
1542   case BuiltinType::OCLSampler:
1543   case BuiltinType::OCLEvent:
1544   case BuiltinType::OCLClkEvent:
1545   case BuiltinType::OCLQueue:
1546   case BuiltinType::OCLReserveID:
1547 #define SVE_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
1548 #include "clang/Basic/AArch64SVEACLETypes.def"
1549 #define PPC_VECTOR_TYPE(Name, Id, Size) case BuiltinType::Id:
1550 #include "clang/Basic/PPCTypes.def"
1551 #define RVV_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
1552 #include "clang/Basic/RISCVVTypes.def"
1553 #define BUILTIN_TYPE(Id, SingletonId)
1554 #define SIGNED_TYPE(Id, SingletonId) case BuiltinType::Id:
1555 #define UNSIGNED_TYPE(Id, SingletonId) case BuiltinType::Id:
1556 #define FLOATING_TYPE(Id, SingletonId) case BuiltinType::Id:
1557 #define PLACEHOLDER_TYPE(Id, SingletonId) case BuiltinType::Id:
1558 #include "clang/AST/BuiltinTypes.def"
1559     break;
1560 
1561   case BuiltinType::ObjCId:
1562     VisitType = Context.getObjCIdType();
1563     break;
1564 
1565   case BuiltinType::ObjCClass:
1566     VisitType = Context.getObjCClassType();
1567     break;
1568 
1569   case BuiltinType::ObjCSel:
1570     VisitType = Context.getObjCSelType();
1571     break;
1572   }
1573 
1574   if (!VisitType.isNull()) {
1575     if (const TypedefType *Typedef = VisitType->getAs<TypedefType>())
1576       return Visit(
1577           MakeCursorTypeRef(Typedef->getDecl(), TL.getBuiltinLoc(), TU));
1578   }
1579 
1580   return false;
1581 }
1582 
1583 bool CursorVisitor::VisitTypedefTypeLoc(TypedefTypeLoc TL) {
1584   return Visit(MakeCursorTypeRef(TL.getTypedefNameDecl(), TL.getNameLoc(), TU));
1585 }
1586 
1587 bool CursorVisitor::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) {
1588   return Visit(MakeCursorTypeRef(TL.getDecl(), TL.getNameLoc(), TU));
1589 }
1590 
1591 bool CursorVisitor::VisitTagTypeLoc(TagTypeLoc TL) {
1592   if (TL.isDefinition())
1593     return Visit(MakeCXCursor(TL.getDecl(), TU, RegionOfInterest));
1594 
1595   return Visit(MakeCursorTypeRef(TL.getDecl(), TL.getNameLoc(), TU));
1596 }
1597 
1598 bool CursorVisitor::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) {
1599   return Visit(MakeCursorTypeRef(TL.getDecl(), TL.getNameLoc(), TU));
1600 }
1601 
1602 bool CursorVisitor::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) {
1603   return Visit(MakeCursorObjCClassRef(TL.getIFaceDecl(), TL.getNameLoc(), TU));
1604 }
1605 
1606 bool CursorVisitor::VisitObjCTypeParamTypeLoc(ObjCTypeParamTypeLoc TL) {
1607   if (Visit(MakeCursorTypeRef(TL.getDecl(), TL.getBeginLoc(), TU)))
1608     return true;
1609   for (unsigned I = 0, N = TL.getNumProtocols(); I != N; ++I) {
1610     if (Visit(MakeCursorObjCProtocolRef(TL.getProtocol(I), TL.getProtocolLoc(I),
1611                                         TU)))
1612       return true;
1613   }
1614 
1615   return false;
1616 }
1617 
1618 bool CursorVisitor::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) {
1619   if (TL.hasBaseTypeAsWritten() && Visit(TL.getBaseLoc()))
1620     return true;
1621 
1622   for (unsigned I = 0, N = TL.getNumTypeArgs(); I != N; ++I) {
1623     if (Visit(TL.getTypeArgTInfo(I)->getTypeLoc()))
1624       return true;
1625   }
1626 
1627   for (unsigned I = 0, N = TL.getNumProtocols(); I != N; ++I) {
1628     if (Visit(MakeCursorObjCProtocolRef(TL.getProtocol(I), TL.getProtocolLoc(I),
1629                                         TU)))
1630       return true;
1631   }
1632 
1633   return false;
1634 }
1635 
1636 bool CursorVisitor::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) {
1637   return Visit(TL.getPointeeLoc());
1638 }
1639 
1640 bool CursorVisitor::VisitParenTypeLoc(ParenTypeLoc TL) {
1641   return Visit(TL.getInnerLoc());
1642 }
1643 
1644 bool CursorVisitor::VisitMacroQualifiedTypeLoc(MacroQualifiedTypeLoc TL) {
1645   return Visit(TL.getInnerLoc());
1646 }
1647 
1648 bool CursorVisitor::VisitPointerTypeLoc(PointerTypeLoc TL) {
1649   return Visit(TL.getPointeeLoc());
1650 }
1651 
1652 bool CursorVisitor::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) {
1653   return Visit(TL.getPointeeLoc());
1654 }
1655 
1656 bool CursorVisitor::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) {
1657   return Visit(TL.getPointeeLoc());
1658 }
1659 
1660 bool CursorVisitor::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) {
1661   return Visit(TL.getPointeeLoc());
1662 }
1663 
1664 bool CursorVisitor::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) {
1665   return Visit(TL.getPointeeLoc());
1666 }
1667 
1668 bool CursorVisitor::VisitAttributedTypeLoc(AttributedTypeLoc TL) {
1669   return Visit(TL.getModifiedLoc());
1670 }
1671 
1672 bool CursorVisitor::VisitFunctionTypeLoc(FunctionTypeLoc TL,
1673                                          bool SkipResultType) {
1674   if (!SkipResultType && Visit(TL.getReturnLoc()))
1675     return true;
1676 
1677   for (unsigned I = 0, N = TL.getNumParams(); I != N; ++I)
1678     if (Decl *D = TL.getParam(I))
1679       if (Visit(MakeCXCursor(D, TU, RegionOfInterest)))
1680         return true;
1681 
1682   return false;
1683 }
1684 
1685 bool CursorVisitor::VisitArrayTypeLoc(ArrayTypeLoc TL) {
1686   if (Visit(TL.getElementLoc()))
1687     return true;
1688 
1689   if (Expr *Size = TL.getSizeExpr())
1690     return Visit(MakeCXCursor(Size, StmtParent, TU, RegionOfInterest));
1691 
1692   return false;
1693 }
1694 
1695 bool CursorVisitor::VisitDecayedTypeLoc(DecayedTypeLoc TL) {
1696   return Visit(TL.getOriginalLoc());
1697 }
1698 
1699 bool CursorVisitor::VisitAdjustedTypeLoc(AdjustedTypeLoc TL) {
1700   return Visit(TL.getOriginalLoc());
1701 }
1702 
1703 bool CursorVisitor::VisitDeducedTemplateSpecializationTypeLoc(
1704     DeducedTemplateSpecializationTypeLoc TL) {
1705   if (VisitTemplateName(TL.getTypePtr()->getTemplateName(),
1706                         TL.getTemplateNameLoc()))
1707     return true;
1708 
1709   return false;
1710 }
1711 
1712 bool CursorVisitor::VisitTemplateSpecializationTypeLoc(
1713     TemplateSpecializationTypeLoc TL) {
1714   // Visit the template name.
1715   if (VisitTemplateName(TL.getTypePtr()->getTemplateName(),
1716                         TL.getTemplateNameLoc()))
1717     return true;
1718 
1719   // Visit the template arguments.
1720   for (unsigned I = 0, N = TL.getNumArgs(); I != N; ++I)
1721     if (VisitTemplateArgumentLoc(TL.getArgLoc(I)))
1722       return true;
1723 
1724   return false;
1725 }
1726 
1727 bool CursorVisitor::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) {
1728   return Visit(MakeCXCursor(TL.getUnderlyingExpr(), StmtParent, TU));
1729 }
1730 
1731 bool CursorVisitor::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) {
1732   if (TypeSourceInfo *TSInfo = TL.getUnderlyingTInfo())
1733     return Visit(TSInfo->getTypeLoc());
1734 
1735   return false;
1736 }
1737 
1738 bool CursorVisitor::VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) {
1739   if (TypeSourceInfo *TSInfo = TL.getUnderlyingTInfo())
1740     return Visit(TSInfo->getTypeLoc());
1741 
1742   return false;
1743 }
1744 
1745 bool CursorVisitor::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) {
1746   return VisitNestedNameSpecifierLoc(TL.getQualifierLoc());
1747 }
1748 
1749 bool CursorVisitor::VisitDependentTemplateSpecializationTypeLoc(
1750     DependentTemplateSpecializationTypeLoc TL) {
1751   // Visit the nested-name-specifier, if there is one.
1752   if (TL.getQualifierLoc() && VisitNestedNameSpecifierLoc(TL.getQualifierLoc()))
1753     return true;
1754 
1755   // Visit the template arguments.
1756   for (unsigned I = 0, N = TL.getNumArgs(); I != N; ++I)
1757     if (VisitTemplateArgumentLoc(TL.getArgLoc(I)))
1758       return true;
1759 
1760   return false;
1761 }
1762 
1763 bool CursorVisitor::VisitElaboratedTypeLoc(ElaboratedTypeLoc TL) {
1764   if (VisitNestedNameSpecifierLoc(TL.getQualifierLoc()))
1765     return true;
1766 
1767   return Visit(TL.getNamedTypeLoc());
1768 }
1769 
1770 bool CursorVisitor::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) {
1771   return Visit(TL.getPatternLoc());
1772 }
1773 
1774 bool CursorVisitor::VisitDecltypeTypeLoc(DecltypeTypeLoc TL) {
1775   if (Expr *E = TL.getUnderlyingExpr())
1776     return Visit(MakeCXCursor(E, StmtParent, TU));
1777 
1778   return false;
1779 }
1780 
1781 bool CursorVisitor::VisitInjectedClassNameTypeLoc(InjectedClassNameTypeLoc TL) {
1782   return Visit(MakeCursorTypeRef(TL.getDecl(), TL.getNameLoc(), TU));
1783 }
1784 
1785 bool CursorVisitor::VisitAtomicTypeLoc(AtomicTypeLoc TL) {
1786   return Visit(TL.getValueLoc());
1787 }
1788 
1789 bool CursorVisitor::VisitPipeTypeLoc(PipeTypeLoc TL) {
1790   return Visit(TL.getValueLoc());
1791 }
1792 
1793 #define DEFAULT_TYPELOC_IMPL(CLASS, PARENT)                                    \
1794   bool CursorVisitor::Visit##CLASS##TypeLoc(CLASS##TypeLoc TL) {               \
1795     return Visit##PARENT##Loc(TL);                                             \
1796   }
1797 
1798 DEFAULT_TYPELOC_IMPL(Complex, Type)
1799 DEFAULT_TYPELOC_IMPL(ConstantArray, ArrayType)
1800 DEFAULT_TYPELOC_IMPL(IncompleteArray, ArrayType)
1801 DEFAULT_TYPELOC_IMPL(VariableArray, ArrayType)
1802 DEFAULT_TYPELOC_IMPL(DependentSizedArray, ArrayType)
1803 DEFAULT_TYPELOC_IMPL(DependentAddressSpace, Type)
1804 DEFAULT_TYPELOC_IMPL(DependentVector, Type)
1805 DEFAULT_TYPELOC_IMPL(DependentSizedExtVector, Type)
1806 DEFAULT_TYPELOC_IMPL(Vector, Type)
1807 DEFAULT_TYPELOC_IMPL(ExtVector, VectorType)
1808 DEFAULT_TYPELOC_IMPL(ConstantMatrix, MatrixType)
1809 DEFAULT_TYPELOC_IMPL(DependentSizedMatrix, MatrixType)
1810 DEFAULT_TYPELOC_IMPL(FunctionProto, FunctionType)
1811 DEFAULT_TYPELOC_IMPL(FunctionNoProto, FunctionType)
1812 DEFAULT_TYPELOC_IMPL(Record, TagType)
1813 DEFAULT_TYPELOC_IMPL(Enum, TagType)
1814 DEFAULT_TYPELOC_IMPL(SubstTemplateTypeParm, Type)
1815 DEFAULT_TYPELOC_IMPL(SubstTemplateTypeParmPack, Type)
1816 DEFAULT_TYPELOC_IMPL(Auto, Type)
1817 DEFAULT_TYPELOC_IMPL(ExtInt, Type)
1818 DEFAULT_TYPELOC_IMPL(DependentExtInt, Type)
1819 
1820 bool CursorVisitor::VisitCXXRecordDecl(CXXRecordDecl *D) {
1821   // Visit the nested-name-specifier, if present.
1822   if (NestedNameSpecifierLoc QualifierLoc = D->getQualifierLoc())
1823     if (VisitNestedNameSpecifierLoc(QualifierLoc))
1824       return true;
1825 
1826   if (D->isCompleteDefinition()) {
1827     for (const auto &I : D->bases()) {
1828       if (Visit(cxcursor::MakeCursorCXXBaseSpecifier(&I, TU)))
1829         return true;
1830     }
1831   }
1832 
1833   return VisitTagDecl(D);
1834 }
1835 
1836 bool CursorVisitor::VisitAttributes(Decl *D) {
1837   for (const auto *I : D->attrs())
1838     if ((TU->ParsingOptions & CXTranslationUnit_VisitImplicitAttributes ||
1839          !I->isImplicit()) &&
1840         Visit(MakeCXCursor(I, D, TU)))
1841       return true;
1842 
1843   return false;
1844 }
1845 
1846 //===----------------------------------------------------------------------===//
1847 // Data-recursive visitor methods.
1848 //===----------------------------------------------------------------------===//
1849 
1850 namespace {
1851 #define DEF_JOB(NAME, DATA, KIND)                                              \
1852   class NAME : public VisitorJob {                                             \
1853   public:                                                                      \
1854     NAME(const DATA *d, CXCursor parent)                                       \
1855         : VisitorJob(parent, VisitorJob::KIND, d) {}                           \
1856     static bool classof(const VisitorJob *VJ) {                                \
1857       return VJ->getKind() == KIND;                                            \
1858     }                                                                          \
1859     const DATA *get() const { return static_cast<const DATA *>(data[0]); }     \
1860   };
1861 
1862 DEF_JOB(StmtVisit, Stmt, StmtVisitKind)
1863 DEF_JOB(MemberExprParts, MemberExpr, MemberExprPartsKind)
1864 DEF_JOB(DeclRefExprParts, DeclRefExpr, DeclRefExprPartsKind)
1865 DEF_JOB(OverloadExprParts, OverloadExpr, OverloadExprPartsKind)
1866 DEF_JOB(SizeOfPackExprParts, SizeOfPackExpr, SizeOfPackExprPartsKind)
1867 DEF_JOB(LambdaExprParts, LambdaExpr, LambdaExprPartsKind)
1868 DEF_JOB(PostChildrenVisit, void, PostChildrenVisitKind)
1869 #undef DEF_JOB
1870 
1871 class ExplicitTemplateArgsVisit : public VisitorJob {
1872 public:
1873   ExplicitTemplateArgsVisit(const TemplateArgumentLoc *Begin,
1874                             const TemplateArgumentLoc *End, CXCursor parent)
1875       : VisitorJob(parent, VisitorJob::ExplicitTemplateArgsVisitKind, Begin,
1876                    End) {}
1877   static bool classof(const VisitorJob *VJ) {
1878     return VJ->getKind() == ExplicitTemplateArgsVisitKind;
1879   }
1880   const TemplateArgumentLoc *begin() const {
1881     return static_cast<const TemplateArgumentLoc *>(data[0]);
1882   }
1883   const TemplateArgumentLoc *end() {
1884     return static_cast<const TemplateArgumentLoc *>(data[1]);
1885   }
1886 };
1887 class DeclVisit : public VisitorJob {
1888 public:
1889   DeclVisit(const Decl *D, CXCursor parent, bool isFirst)
1890       : VisitorJob(parent, VisitorJob::DeclVisitKind, D,
1891                    isFirst ? (void *)1 : (void *)nullptr) {}
1892   static bool classof(const VisitorJob *VJ) {
1893     return VJ->getKind() == DeclVisitKind;
1894   }
1895   const Decl *get() const { return static_cast<const Decl *>(data[0]); }
1896   bool isFirst() const { return data[1] != nullptr; }
1897 };
1898 class TypeLocVisit : public VisitorJob {
1899 public:
1900   TypeLocVisit(TypeLoc tl, CXCursor parent)
1901       : VisitorJob(parent, VisitorJob::TypeLocVisitKind,
1902                    tl.getType().getAsOpaquePtr(), tl.getOpaqueData()) {}
1903 
1904   static bool classof(const VisitorJob *VJ) {
1905     return VJ->getKind() == TypeLocVisitKind;
1906   }
1907 
1908   TypeLoc get() const {
1909     QualType T = QualType::getFromOpaquePtr(data[0]);
1910     return TypeLoc(T, const_cast<void *>(data[1]));
1911   }
1912 };
1913 
1914 class LabelRefVisit : public VisitorJob {
1915 public:
1916   LabelRefVisit(LabelDecl *LD, SourceLocation labelLoc, CXCursor parent)
1917       : VisitorJob(parent, VisitorJob::LabelRefVisitKind, LD,
1918                    labelLoc.getPtrEncoding()) {}
1919 
1920   static bool classof(const VisitorJob *VJ) {
1921     return VJ->getKind() == VisitorJob::LabelRefVisitKind;
1922   }
1923   const LabelDecl *get() const {
1924     return static_cast<const LabelDecl *>(data[0]);
1925   }
1926   SourceLocation getLoc() const {
1927     return SourceLocation::getFromPtrEncoding(data[1]);
1928   }
1929 };
1930 
1931 class NestedNameSpecifierLocVisit : public VisitorJob {
1932 public:
1933   NestedNameSpecifierLocVisit(NestedNameSpecifierLoc Qualifier, CXCursor parent)
1934       : VisitorJob(parent, VisitorJob::NestedNameSpecifierLocVisitKind,
1935                    Qualifier.getNestedNameSpecifier(),
1936                    Qualifier.getOpaqueData()) {}
1937 
1938   static bool classof(const VisitorJob *VJ) {
1939     return VJ->getKind() == VisitorJob::NestedNameSpecifierLocVisitKind;
1940   }
1941 
1942   NestedNameSpecifierLoc get() const {
1943     return NestedNameSpecifierLoc(
1944         const_cast<NestedNameSpecifier *>(
1945             static_cast<const NestedNameSpecifier *>(data[0])),
1946         const_cast<void *>(data[1]));
1947   }
1948 };
1949 
1950 class DeclarationNameInfoVisit : public VisitorJob {
1951 public:
1952   DeclarationNameInfoVisit(const Stmt *S, CXCursor parent)
1953       : VisitorJob(parent, VisitorJob::DeclarationNameInfoVisitKind, S) {}
1954   static bool classof(const VisitorJob *VJ) {
1955     return VJ->getKind() == VisitorJob::DeclarationNameInfoVisitKind;
1956   }
1957   DeclarationNameInfo get() const {
1958     const Stmt *S = static_cast<const Stmt *>(data[0]);
1959     switch (S->getStmtClass()) {
1960     default:
1961       llvm_unreachable("Unhandled Stmt");
1962     case clang::Stmt::MSDependentExistsStmtClass:
1963       return cast<MSDependentExistsStmt>(S)->getNameInfo();
1964     case Stmt::CXXDependentScopeMemberExprClass:
1965       return cast<CXXDependentScopeMemberExpr>(S)->getMemberNameInfo();
1966     case Stmt::DependentScopeDeclRefExprClass:
1967       return cast<DependentScopeDeclRefExpr>(S)->getNameInfo();
1968     case Stmt::OMPCriticalDirectiveClass:
1969       return cast<OMPCriticalDirective>(S)->getDirectiveName();
1970     }
1971   }
1972 };
1973 class MemberRefVisit : public VisitorJob {
1974 public:
1975   MemberRefVisit(const FieldDecl *D, SourceLocation L, CXCursor parent)
1976       : VisitorJob(parent, VisitorJob::MemberRefVisitKind, D,
1977                    L.getPtrEncoding()) {}
1978   static bool classof(const VisitorJob *VJ) {
1979     return VJ->getKind() == VisitorJob::MemberRefVisitKind;
1980   }
1981   const FieldDecl *get() const {
1982     return static_cast<const FieldDecl *>(data[0]);
1983   }
1984   SourceLocation getLoc() const {
1985     return SourceLocation::getFromRawEncoding((unsigned)(uintptr_t)data[1]);
1986   }
1987 };
1988 class EnqueueVisitor : public ConstStmtVisitor<EnqueueVisitor, void> {
1989   friend class OMPClauseEnqueue;
1990   VisitorWorkList &WL;
1991   CXCursor Parent;
1992 
1993 public:
1994   EnqueueVisitor(VisitorWorkList &wl, CXCursor parent)
1995       : WL(wl), Parent(parent) {}
1996 
1997   void VisitAddrLabelExpr(const AddrLabelExpr *E);
1998   void VisitBlockExpr(const BlockExpr *B);
1999   void VisitCompoundLiteralExpr(const CompoundLiteralExpr *E);
2000   void VisitCompoundStmt(const CompoundStmt *S);
2001   void VisitCXXDefaultArgExpr(const CXXDefaultArgExpr *E) { /* Do nothing. */
2002   }
2003   void VisitMSDependentExistsStmt(const MSDependentExistsStmt *S);
2004   void VisitCXXDependentScopeMemberExpr(const CXXDependentScopeMemberExpr *E);
2005   void VisitCXXNewExpr(const CXXNewExpr *E);
2006   void VisitCXXScalarValueInitExpr(const CXXScalarValueInitExpr *E);
2007   void VisitCXXOperatorCallExpr(const CXXOperatorCallExpr *E);
2008   void VisitCXXPseudoDestructorExpr(const CXXPseudoDestructorExpr *E);
2009   void VisitCXXTemporaryObjectExpr(const CXXTemporaryObjectExpr *E);
2010   void VisitCXXTypeidExpr(const CXXTypeidExpr *E);
2011   void VisitCXXUnresolvedConstructExpr(const CXXUnresolvedConstructExpr *E);
2012   void VisitCXXUuidofExpr(const CXXUuidofExpr *E);
2013   void VisitCXXCatchStmt(const CXXCatchStmt *S);
2014   void VisitCXXForRangeStmt(const CXXForRangeStmt *S);
2015   void VisitDeclRefExpr(const DeclRefExpr *D);
2016   void VisitDeclStmt(const DeclStmt *S);
2017   void VisitDependentScopeDeclRefExpr(const DependentScopeDeclRefExpr *E);
2018   void VisitDesignatedInitExpr(const DesignatedInitExpr *E);
2019   void VisitExplicitCastExpr(const ExplicitCastExpr *E);
2020   void VisitForStmt(const ForStmt *FS);
2021   void VisitGotoStmt(const GotoStmt *GS);
2022   void VisitIfStmt(const IfStmt *If);
2023   void VisitInitListExpr(const InitListExpr *IE);
2024   void VisitMemberExpr(const MemberExpr *M);
2025   void VisitOffsetOfExpr(const OffsetOfExpr *E);
2026   void VisitObjCEncodeExpr(const ObjCEncodeExpr *E);
2027   void VisitObjCMessageExpr(const ObjCMessageExpr *M);
2028   void VisitOverloadExpr(const OverloadExpr *E);
2029   void VisitUnaryExprOrTypeTraitExpr(const UnaryExprOrTypeTraitExpr *E);
2030   void VisitStmt(const Stmt *S);
2031   void VisitSwitchStmt(const SwitchStmt *S);
2032   void VisitWhileStmt(const WhileStmt *W);
2033   void VisitTypeTraitExpr(const TypeTraitExpr *E);
2034   void VisitArrayTypeTraitExpr(const ArrayTypeTraitExpr *E);
2035   void VisitExpressionTraitExpr(const ExpressionTraitExpr *E);
2036   void VisitUnresolvedMemberExpr(const UnresolvedMemberExpr *U);
2037   void VisitVAArgExpr(const VAArgExpr *E);
2038   void VisitSizeOfPackExpr(const SizeOfPackExpr *E);
2039   void VisitPseudoObjectExpr(const PseudoObjectExpr *E);
2040   void VisitOpaqueValueExpr(const OpaqueValueExpr *E);
2041   void VisitLambdaExpr(const LambdaExpr *E);
2042   void VisitOMPExecutableDirective(const OMPExecutableDirective *D);
2043   void VisitOMPLoopBasedDirective(const OMPLoopBasedDirective *D);
2044   void VisitOMPLoopDirective(const OMPLoopDirective *D);
2045   void VisitOMPParallelDirective(const OMPParallelDirective *D);
2046   void VisitOMPSimdDirective(const OMPSimdDirective *D);
2047   void VisitOMPTileDirective(const OMPTileDirective *D);
2048   void VisitOMPForDirective(const OMPForDirective *D);
2049   void VisitOMPForSimdDirective(const OMPForSimdDirective *D);
2050   void VisitOMPSectionsDirective(const OMPSectionsDirective *D);
2051   void VisitOMPSectionDirective(const OMPSectionDirective *D);
2052   void VisitOMPSingleDirective(const OMPSingleDirective *D);
2053   void VisitOMPMasterDirective(const OMPMasterDirective *D);
2054   void VisitOMPCriticalDirective(const OMPCriticalDirective *D);
2055   void VisitOMPParallelForDirective(const OMPParallelForDirective *D);
2056   void VisitOMPParallelForSimdDirective(const OMPParallelForSimdDirective *D);
2057   void VisitOMPParallelMasterDirective(const OMPParallelMasterDirective *D);
2058   void VisitOMPParallelSectionsDirective(const OMPParallelSectionsDirective *D);
2059   void VisitOMPTaskDirective(const OMPTaskDirective *D);
2060   void VisitOMPTaskyieldDirective(const OMPTaskyieldDirective *D);
2061   void VisitOMPBarrierDirective(const OMPBarrierDirective *D);
2062   void VisitOMPTaskwaitDirective(const OMPTaskwaitDirective *D);
2063   void VisitOMPTaskgroupDirective(const OMPTaskgroupDirective *D);
2064   void
2065   VisitOMPCancellationPointDirective(const OMPCancellationPointDirective *D);
2066   void VisitOMPCancelDirective(const OMPCancelDirective *D);
2067   void VisitOMPFlushDirective(const OMPFlushDirective *D);
2068   void VisitOMPDepobjDirective(const OMPDepobjDirective *D);
2069   void VisitOMPScanDirective(const OMPScanDirective *D);
2070   void VisitOMPOrderedDirective(const OMPOrderedDirective *D);
2071   void VisitOMPAtomicDirective(const OMPAtomicDirective *D);
2072   void VisitOMPTargetDirective(const OMPTargetDirective *D);
2073   void VisitOMPTargetDataDirective(const OMPTargetDataDirective *D);
2074   void VisitOMPTargetEnterDataDirective(const OMPTargetEnterDataDirective *D);
2075   void VisitOMPTargetExitDataDirective(const OMPTargetExitDataDirective *D);
2076   void VisitOMPTargetParallelDirective(const OMPTargetParallelDirective *D);
2077   void
2078   VisitOMPTargetParallelForDirective(const OMPTargetParallelForDirective *D);
2079   void VisitOMPTeamsDirective(const OMPTeamsDirective *D);
2080   void VisitOMPTaskLoopDirective(const OMPTaskLoopDirective *D);
2081   void VisitOMPTaskLoopSimdDirective(const OMPTaskLoopSimdDirective *D);
2082   void VisitOMPMasterTaskLoopDirective(const OMPMasterTaskLoopDirective *D);
2083   void
2084   VisitOMPMasterTaskLoopSimdDirective(const OMPMasterTaskLoopSimdDirective *D);
2085   void VisitOMPParallelMasterTaskLoopDirective(
2086       const OMPParallelMasterTaskLoopDirective *D);
2087   void VisitOMPParallelMasterTaskLoopSimdDirective(
2088       const OMPParallelMasterTaskLoopSimdDirective *D);
2089   void VisitOMPDistributeDirective(const OMPDistributeDirective *D);
2090   void VisitOMPDistributeParallelForDirective(
2091       const OMPDistributeParallelForDirective *D);
2092   void VisitOMPDistributeParallelForSimdDirective(
2093       const OMPDistributeParallelForSimdDirective *D);
2094   void VisitOMPDistributeSimdDirective(const OMPDistributeSimdDirective *D);
2095   void VisitOMPTargetParallelForSimdDirective(
2096       const OMPTargetParallelForSimdDirective *D);
2097   void VisitOMPTargetSimdDirective(const OMPTargetSimdDirective *D);
2098   void VisitOMPTeamsDistributeDirective(const OMPTeamsDistributeDirective *D);
2099   void VisitOMPTeamsDistributeSimdDirective(
2100       const OMPTeamsDistributeSimdDirective *D);
2101   void VisitOMPTeamsDistributeParallelForSimdDirective(
2102       const OMPTeamsDistributeParallelForSimdDirective *D);
2103   void VisitOMPTeamsDistributeParallelForDirective(
2104       const OMPTeamsDistributeParallelForDirective *D);
2105   void VisitOMPTargetTeamsDirective(const OMPTargetTeamsDirective *D);
2106   void VisitOMPTargetTeamsDistributeDirective(
2107       const OMPTargetTeamsDistributeDirective *D);
2108   void VisitOMPTargetTeamsDistributeParallelForDirective(
2109       const OMPTargetTeamsDistributeParallelForDirective *D);
2110   void VisitOMPTargetTeamsDistributeParallelForSimdDirective(
2111       const OMPTargetTeamsDistributeParallelForSimdDirective *D);
2112   void VisitOMPTargetTeamsDistributeSimdDirective(
2113       const OMPTargetTeamsDistributeSimdDirective *D);
2114 
2115 private:
2116   void AddDeclarationNameInfo(const Stmt *S);
2117   void AddNestedNameSpecifierLoc(NestedNameSpecifierLoc Qualifier);
2118   void AddExplicitTemplateArgs(const TemplateArgumentLoc *A,
2119                                unsigned NumTemplateArgs);
2120   void AddMemberRef(const FieldDecl *D, SourceLocation L);
2121   void AddStmt(const Stmt *S);
2122   void AddDecl(const Decl *D, bool isFirst = true);
2123   void AddTypeLoc(TypeSourceInfo *TI);
2124   void EnqueueChildren(const Stmt *S);
2125   void EnqueueChildren(const OMPClause *S);
2126 };
2127 } // namespace
2128 
2129 void EnqueueVisitor::AddDeclarationNameInfo(const Stmt *S) {
2130   // 'S' should always be non-null, since it comes from the
2131   // statement we are visiting.
2132   WL.push_back(DeclarationNameInfoVisit(S, Parent));
2133 }
2134 
2135 void EnqueueVisitor::AddNestedNameSpecifierLoc(
2136     NestedNameSpecifierLoc Qualifier) {
2137   if (Qualifier)
2138     WL.push_back(NestedNameSpecifierLocVisit(Qualifier, Parent));
2139 }
2140 
2141 void EnqueueVisitor::AddStmt(const Stmt *S) {
2142   if (S)
2143     WL.push_back(StmtVisit(S, Parent));
2144 }
2145 void EnqueueVisitor::AddDecl(const Decl *D, bool isFirst) {
2146   if (D)
2147     WL.push_back(DeclVisit(D, Parent, isFirst));
2148 }
2149 void EnqueueVisitor::AddExplicitTemplateArgs(const TemplateArgumentLoc *A,
2150                                              unsigned NumTemplateArgs) {
2151   WL.push_back(ExplicitTemplateArgsVisit(A, A + NumTemplateArgs, Parent));
2152 }
2153 void EnqueueVisitor::AddMemberRef(const FieldDecl *D, SourceLocation L) {
2154   if (D)
2155     WL.push_back(MemberRefVisit(D, L, Parent));
2156 }
2157 void EnqueueVisitor::AddTypeLoc(TypeSourceInfo *TI) {
2158   if (TI)
2159     WL.push_back(TypeLocVisit(TI->getTypeLoc(), Parent));
2160 }
2161 void EnqueueVisitor::EnqueueChildren(const Stmt *S) {
2162   unsigned size = WL.size();
2163   for (const Stmt *SubStmt : S->children()) {
2164     AddStmt(SubStmt);
2165   }
2166   if (size == WL.size())
2167     return;
2168   // Now reverse the entries we just added.  This will match the DFS
2169   // ordering performed by the worklist.
2170   VisitorWorkList::iterator I = WL.begin() + size, E = WL.end();
2171   std::reverse(I, E);
2172 }
2173 namespace {
2174 class OMPClauseEnqueue : public ConstOMPClauseVisitor<OMPClauseEnqueue> {
2175   EnqueueVisitor *Visitor;
2176   /// Process clauses with list of variables.
2177   template <typename T> void VisitOMPClauseList(T *Node);
2178 
2179 public:
2180   OMPClauseEnqueue(EnqueueVisitor *Visitor) : Visitor(Visitor) {}
2181 #define GEN_CLANG_CLAUSE_CLASS
2182 #define CLAUSE_CLASS(Enum, Str, Class) void Visit##Class(const Class *C);
2183 #include "llvm/Frontend/OpenMP/OMP.inc"
2184   void VisitOMPClauseWithPreInit(const OMPClauseWithPreInit *C);
2185   void VisitOMPClauseWithPostUpdate(const OMPClauseWithPostUpdate *C);
2186 };
2187 
2188 void OMPClauseEnqueue::VisitOMPClauseWithPreInit(
2189     const OMPClauseWithPreInit *C) {
2190   Visitor->AddStmt(C->getPreInitStmt());
2191 }
2192 
2193 void OMPClauseEnqueue::VisitOMPClauseWithPostUpdate(
2194     const OMPClauseWithPostUpdate *C) {
2195   VisitOMPClauseWithPreInit(C);
2196   Visitor->AddStmt(C->getPostUpdateExpr());
2197 }
2198 
2199 void OMPClauseEnqueue::VisitOMPIfClause(const OMPIfClause *C) {
2200   VisitOMPClauseWithPreInit(C);
2201   Visitor->AddStmt(C->getCondition());
2202 }
2203 
2204 void OMPClauseEnqueue::VisitOMPFinalClause(const OMPFinalClause *C) {
2205   Visitor->AddStmt(C->getCondition());
2206 }
2207 
2208 void OMPClauseEnqueue::VisitOMPNumThreadsClause(const OMPNumThreadsClause *C) {
2209   VisitOMPClauseWithPreInit(C);
2210   Visitor->AddStmt(C->getNumThreads());
2211 }
2212 
2213 void OMPClauseEnqueue::VisitOMPSafelenClause(const OMPSafelenClause *C) {
2214   Visitor->AddStmt(C->getSafelen());
2215 }
2216 
2217 void OMPClauseEnqueue::VisitOMPSimdlenClause(const OMPSimdlenClause *C) {
2218   Visitor->AddStmt(C->getSimdlen());
2219 }
2220 
2221 void OMPClauseEnqueue::VisitOMPSizesClause(const OMPSizesClause *C) {
2222   for (auto E : C->getSizesRefs())
2223     Visitor->AddStmt(E);
2224 }
2225 
2226 void OMPClauseEnqueue::VisitOMPAllocatorClause(const OMPAllocatorClause *C) {
2227   Visitor->AddStmt(C->getAllocator());
2228 }
2229 
2230 void OMPClauseEnqueue::VisitOMPCollapseClause(const OMPCollapseClause *C) {
2231   Visitor->AddStmt(C->getNumForLoops());
2232 }
2233 
2234 void OMPClauseEnqueue::VisitOMPDefaultClause(const OMPDefaultClause *C) {}
2235 
2236 void OMPClauseEnqueue::VisitOMPProcBindClause(const OMPProcBindClause *C) {}
2237 
2238 void OMPClauseEnqueue::VisitOMPScheduleClause(const OMPScheduleClause *C) {
2239   VisitOMPClauseWithPreInit(C);
2240   Visitor->AddStmt(C->getChunkSize());
2241 }
2242 
2243 void OMPClauseEnqueue::VisitOMPOrderedClause(const OMPOrderedClause *C) {
2244   Visitor->AddStmt(C->getNumForLoops());
2245 }
2246 
2247 void OMPClauseEnqueue::VisitOMPDetachClause(const OMPDetachClause *C) {
2248   Visitor->AddStmt(C->getEventHandler());
2249 }
2250 
2251 void OMPClauseEnqueue::VisitOMPNowaitClause(const OMPNowaitClause *) {}
2252 
2253 void OMPClauseEnqueue::VisitOMPUntiedClause(const OMPUntiedClause *) {}
2254 
2255 void OMPClauseEnqueue::VisitOMPMergeableClause(const OMPMergeableClause *) {}
2256 
2257 void OMPClauseEnqueue::VisitOMPReadClause(const OMPReadClause *) {}
2258 
2259 void OMPClauseEnqueue::VisitOMPWriteClause(const OMPWriteClause *) {}
2260 
2261 void OMPClauseEnqueue::VisitOMPUpdateClause(const OMPUpdateClause *) {}
2262 
2263 void OMPClauseEnqueue::VisitOMPCaptureClause(const OMPCaptureClause *) {}
2264 
2265 void OMPClauseEnqueue::VisitOMPSeqCstClause(const OMPSeqCstClause *) {}
2266 
2267 void OMPClauseEnqueue::VisitOMPAcqRelClause(const OMPAcqRelClause *) {}
2268 
2269 void OMPClauseEnqueue::VisitOMPAcquireClause(const OMPAcquireClause *) {}
2270 
2271 void OMPClauseEnqueue::VisitOMPReleaseClause(const OMPReleaseClause *) {}
2272 
2273 void OMPClauseEnqueue::VisitOMPRelaxedClause(const OMPRelaxedClause *) {}
2274 
2275 void OMPClauseEnqueue::VisitOMPThreadsClause(const OMPThreadsClause *) {}
2276 
2277 void OMPClauseEnqueue::VisitOMPSIMDClause(const OMPSIMDClause *) {}
2278 
2279 void OMPClauseEnqueue::VisitOMPNogroupClause(const OMPNogroupClause *) {}
2280 
2281 void OMPClauseEnqueue::VisitOMPInitClause(const OMPInitClause *C) {
2282   VisitOMPClauseList(C);
2283 }
2284 
2285 void OMPClauseEnqueue::VisitOMPUseClause(const OMPUseClause *C) {
2286   Visitor->AddStmt(C->getInteropVar());
2287 }
2288 
2289 void OMPClauseEnqueue::VisitOMPDestroyClause(const OMPDestroyClause *C) {
2290   if (C->getInteropVar())
2291     Visitor->AddStmt(C->getInteropVar());
2292 }
2293 
2294 void OMPClauseEnqueue::VisitOMPUnifiedAddressClause(
2295     const OMPUnifiedAddressClause *) {}
2296 
2297 void OMPClauseEnqueue::VisitOMPUnifiedSharedMemoryClause(
2298     const OMPUnifiedSharedMemoryClause *) {}
2299 
2300 void OMPClauseEnqueue::VisitOMPReverseOffloadClause(
2301     const OMPReverseOffloadClause *) {}
2302 
2303 void OMPClauseEnqueue::VisitOMPDynamicAllocatorsClause(
2304     const OMPDynamicAllocatorsClause *) {}
2305 
2306 void OMPClauseEnqueue::VisitOMPAtomicDefaultMemOrderClause(
2307     const OMPAtomicDefaultMemOrderClause *) {}
2308 
2309 void OMPClauseEnqueue::VisitOMPDeviceClause(const OMPDeviceClause *C) {
2310   Visitor->AddStmt(C->getDevice());
2311 }
2312 
2313 void OMPClauseEnqueue::VisitOMPNumTeamsClause(const OMPNumTeamsClause *C) {
2314   VisitOMPClauseWithPreInit(C);
2315   Visitor->AddStmt(C->getNumTeams());
2316 }
2317 
2318 void OMPClauseEnqueue::VisitOMPThreadLimitClause(
2319     const OMPThreadLimitClause *C) {
2320   VisitOMPClauseWithPreInit(C);
2321   Visitor->AddStmt(C->getThreadLimit());
2322 }
2323 
2324 void OMPClauseEnqueue::VisitOMPPriorityClause(const OMPPriorityClause *C) {
2325   Visitor->AddStmt(C->getPriority());
2326 }
2327 
2328 void OMPClauseEnqueue::VisitOMPGrainsizeClause(const OMPGrainsizeClause *C) {
2329   Visitor->AddStmt(C->getGrainsize());
2330 }
2331 
2332 void OMPClauseEnqueue::VisitOMPNumTasksClause(const OMPNumTasksClause *C) {
2333   Visitor->AddStmt(C->getNumTasks());
2334 }
2335 
2336 void OMPClauseEnqueue::VisitOMPHintClause(const OMPHintClause *C) {
2337   Visitor->AddStmt(C->getHint());
2338 }
2339 
2340 template <typename T> void OMPClauseEnqueue::VisitOMPClauseList(T *Node) {
2341   for (const auto *I : Node->varlists()) {
2342     Visitor->AddStmt(I);
2343   }
2344 }
2345 
2346 void OMPClauseEnqueue::VisitOMPInclusiveClause(const OMPInclusiveClause *C) {
2347   VisitOMPClauseList(C);
2348 }
2349 void OMPClauseEnqueue::VisitOMPExclusiveClause(const OMPExclusiveClause *C) {
2350   VisitOMPClauseList(C);
2351 }
2352 void OMPClauseEnqueue::VisitOMPAllocateClause(const OMPAllocateClause *C) {
2353   VisitOMPClauseList(C);
2354   Visitor->AddStmt(C->getAllocator());
2355 }
2356 void OMPClauseEnqueue::VisitOMPPrivateClause(const OMPPrivateClause *C) {
2357   VisitOMPClauseList(C);
2358   for (const auto *E : C->private_copies()) {
2359     Visitor->AddStmt(E);
2360   }
2361 }
2362 void OMPClauseEnqueue::VisitOMPFirstprivateClause(
2363     const OMPFirstprivateClause *C) {
2364   VisitOMPClauseList(C);
2365   VisitOMPClauseWithPreInit(C);
2366   for (const auto *E : C->private_copies()) {
2367     Visitor->AddStmt(E);
2368   }
2369   for (const auto *E : C->inits()) {
2370     Visitor->AddStmt(E);
2371   }
2372 }
2373 void OMPClauseEnqueue::VisitOMPLastprivateClause(
2374     const OMPLastprivateClause *C) {
2375   VisitOMPClauseList(C);
2376   VisitOMPClauseWithPostUpdate(C);
2377   for (auto *E : C->private_copies()) {
2378     Visitor->AddStmt(E);
2379   }
2380   for (auto *E : C->source_exprs()) {
2381     Visitor->AddStmt(E);
2382   }
2383   for (auto *E : C->destination_exprs()) {
2384     Visitor->AddStmt(E);
2385   }
2386   for (auto *E : C->assignment_ops()) {
2387     Visitor->AddStmt(E);
2388   }
2389 }
2390 void OMPClauseEnqueue::VisitOMPSharedClause(const OMPSharedClause *C) {
2391   VisitOMPClauseList(C);
2392 }
2393 void OMPClauseEnqueue::VisitOMPReductionClause(const OMPReductionClause *C) {
2394   VisitOMPClauseList(C);
2395   VisitOMPClauseWithPostUpdate(C);
2396   for (auto *E : C->privates()) {
2397     Visitor->AddStmt(E);
2398   }
2399   for (auto *E : C->lhs_exprs()) {
2400     Visitor->AddStmt(E);
2401   }
2402   for (auto *E : C->rhs_exprs()) {
2403     Visitor->AddStmt(E);
2404   }
2405   for (auto *E : C->reduction_ops()) {
2406     Visitor->AddStmt(E);
2407   }
2408   if (C->getModifier() == clang::OMPC_REDUCTION_inscan) {
2409     for (auto *E : C->copy_ops()) {
2410       Visitor->AddStmt(E);
2411     }
2412     for (auto *E : C->copy_array_temps()) {
2413       Visitor->AddStmt(E);
2414     }
2415     for (auto *E : C->copy_array_elems()) {
2416       Visitor->AddStmt(E);
2417     }
2418   }
2419 }
2420 void OMPClauseEnqueue::VisitOMPTaskReductionClause(
2421     const OMPTaskReductionClause *C) {
2422   VisitOMPClauseList(C);
2423   VisitOMPClauseWithPostUpdate(C);
2424   for (auto *E : C->privates()) {
2425     Visitor->AddStmt(E);
2426   }
2427   for (auto *E : C->lhs_exprs()) {
2428     Visitor->AddStmt(E);
2429   }
2430   for (auto *E : C->rhs_exprs()) {
2431     Visitor->AddStmt(E);
2432   }
2433   for (auto *E : C->reduction_ops()) {
2434     Visitor->AddStmt(E);
2435   }
2436 }
2437 void OMPClauseEnqueue::VisitOMPInReductionClause(
2438     const OMPInReductionClause *C) {
2439   VisitOMPClauseList(C);
2440   VisitOMPClauseWithPostUpdate(C);
2441   for (auto *E : C->privates()) {
2442     Visitor->AddStmt(E);
2443   }
2444   for (auto *E : C->lhs_exprs()) {
2445     Visitor->AddStmt(E);
2446   }
2447   for (auto *E : C->rhs_exprs()) {
2448     Visitor->AddStmt(E);
2449   }
2450   for (auto *E : C->reduction_ops()) {
2451     Visitor->AddStmt(E);
2452   }
2453   for (auto *E : C->taskgroup_descriptors())
2454     Visitor->AddStmt(E);
2455 }
2456 void OMPClauseEnqueue::VisitOMPLinearClause(const OMPLinearClause *C) {
2457   VisitOMPClauseList(C);
2458   VisitOMPClauseWithPostUpdate(C);
2459   for (const auto *E : C->privates()) {
2460     Visitor->AddStmt(E);
2461   }
2462   for (const auto *E : C->inits()) {
2463     Visitor->AddStmt(E);
2464   }
2465   for (const auto *E : C->updates()) {
2466     Visitor->AddStmt(E);
2467   }
2468   for (const auto *E : C->finals()) {
2469     Visitor->AddStmt(E);
2470   }
2471   Visitor->AddStmt(C->getStep());
2472   Visitor->AddStmt(C->getCalcStep());
2473 }
2474 void OMPClauseEnqueue::VisitOMPAlignedClause(const OMPAlignedClause *C) {
2475   VisitOMPClauseList(C);
2476   Visitor->AddStmt(C->getAlignment());
2477 }
2478 void OMPClauseEnqueue::VisitOMPCopyinClause(const OMPCopyinClause *C) {
2479   VisitOMPClauseList(C);
2480   for (auto *E : C->source_exprs()) {
2481     Visitor->AddStmt(E);
2482   }
2483   for (auto *E : C->destination_exprs()) {
2484     Visitor->AddStmt(E);
2485   }
2486   for (auto *E : C->assignment_ops()) {
2487     Visitor->AddStmt(E);
2488   }
2489 }
2490 void OMPClauseEnqueue::VisitOMPCopyprivateClause(
2491     const OMPCopyprivateClause *C) {
2492   VisitOMPClauseList(C);
2493   for (auto *E : C->source_exprs()) {
2494     Visitor->AddStmt(E);
2495   }
2496   for (auto *E : C->destination_exprs()) {
2497     Visitor->AddStmt(E);
2498   }
2499   for (auto *E : C->assignment_ops()) {
2500     Visitor->AddStmt(E);
2501   }
2502 }
2503 void OMPClauseEnqueue::VisitOMPFlushClause(const OMPFlushClause *C) {
2504   VisitOMPClauseList(C);
2505 }
2506 void OMPClauseEnqueue::VisitOMPDepobjClause(const OMPDepobjClause *C) {
2507   Visitor->AddStmt(C->getDepobj());
2508 }
2509 void OMPClauseEnqueue::VisitOMPDependClause(const OMPDependClause *C) {
2510   VisitOMPClauseList(C);
2511 }
2512 void OMPClauseEnqueue::VisitOMPMapClause(const OMPMapClause *C) {
2513   VisitOMPClauseList(C);
2514 }
2515 void OMPClauseEnqueue::VisitOMPDistScheduleClause(
2516     const OMPDistScheduleClause *C) {
2517   VisitOMPClauseWithPreInit(C);
2518   Visitor->AddStmt(C->getChunkSize());
2519 }
2520 void OMPClauseEnqueue::VisitOMPDefaultmapClause(
2521     const OMPDefaultmapClause * /*C*/) {}
2522 void OMPClauseEnqueue::VisitOMPToClause(const OMPToClause *C) {
2523   VisitOMPClauseList(C);
2524 }
2525 void OMPClauseEnqueue::VisitOMPFromClause(const OMPFromClause *C) {
2526   VisitOMPClauseList(C);
2527 }
2528 void OMPClauseEnqueue::VisitOMPUseDevicePtrClause(
2529     const OMPUseDevicePtrClause *C) {
2530   VisitOMPClauseList(C);
2531 }
2532 void OMPClauseEnqueue::VisitOMPUseDeviceAddrClause(
2533     const OMPUseDeviceAddrClause *C) {
2534   VisitOMPClauseList(C);
2535 }
2536 void OMPClauseEnqueue::VisitOMPIsDevicePtrClause(
2537     const OMPIsDevicePtrClause *C) {
2538   VisitOMPClauseList(C);
2539 }
2540 void OMPClauseEnqueue::VisitOMPNontemporalClause(
2541     const OMPNontemporalClause *C) {
2542   VisitOMPClauseList(C);
2543   for (const auto *E : C->private_refs())
2544     Visitor->AddStmt(E);
2545 }
2546 void OMPClauseEnqueue::VisitOMPOrderClause(const OMPOrderClause *C) {}
2547 void OMPClauseEnqueue::VisitOMPUsesAllocatorsClause(
2548     const OMPUsesAllocatorsClause *C) {
2549   for (unsigned I = 0, E = C->getNumberOfAllocators(); I < E; ++I) {
2550     const OMPUsesAllocatorsClause::Data &D = C->getAllocatorData(I);
2551     Visitor->AddStmt(D.Allocator);
2552     Visitor->AddStmt(D.AllocatorTraits);
2553   }
2554 }
2555 void OMPClauseEnqueue::VisitOMPAffinityClause(const OMPAffinityClause *C) {
2556   Visitor->AddStmt(C->getModifier());
2557   for (const Expr *E : C->varlists())
2558     Visitor->AddStmt(E);
2559 }
2560 } // namespace
2561 
2562 void EnqueueVisitor::EnqueueChildren(const OMPClause *S) {
2563   unsigned size = WL.size();
2564   OMPClauseEnqueue Visitor(this);
2565   Visitor.Visit(S);
2566   if (size == WL.size())
2567     return;
2568   // Now reverse the entries we just added.  This will match the DFS
2569   // ordering performed by the worklist.
2570   VisitorWorkList::iterator I = WL.begin() + size, E = WL.end();
2571   std::reverse(I, E);
2572 }
2573 void EnqueueVisitor::VisitAddrLabelExpr(const AddrLabelExpr *E) {
2574   WL.push_back(LabelRefVisit(E->getLabel(), E->getLabelLoc(), Parent));
2575 }
2576 void EnqueueVisitor::VisitBlockExpr(const BlockExpr *B) {
2577   AddDecl(B->getBlockDecl());
2578 }
2579 void EnqueueVisitor::VisitCompoundLiteralExpr(const CompoundLiteralExpr *E) {
2580   EnqueueChildren(E);
2581   AddTypeLoc(E->getTypeSourceInfo());
2582 }
2583 void EnqueueVisitor::VisitCompoundStmt(const CompoundStmt *S) {
2584   for (auto &I : llvm::reverse(S->body()))
2585     AddStmt(I);
2586 }
2587 void EnqueueVisitor::VisitMSDependentExistsStmt(
2588     const MSDependentExistsStmt *S) {
2589   AddStmt(S->getSubStmt());
2590   AddDeclarationNameInfo(S);
2591   if (NestedNameSpecifierLoc QualifierLoc = S->getQualifierLoc())
2592     AddNestedNameSpecifierLoc(QualifierLoc);
2593 }
2594 
2595 void EnqueueVisitor::VisitCXXDependentScopeMemberExpr(
2596     const CXXDependentScopeMemberExpr *E) {
2597   if (E->hasExplicitTemplateArgs())
2598     AddExplicitTemplateArgs(E->getTemplateArgs(), E->getNumTemplateArgs());
2599   AddDeclarationNameInfo(E);
2600   if (NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc())
2601     AddNestedNameSpecifierLoc(QualifierLoc);
2602   if (!E->isImplicitAccess())
2603     AddStmt(E->getBase());
2604 }
2605 void EnqueueVisitor::VisitCXXNewExpr(const CXXNewExpr *E) {
2606   // Enqueue the initializer , if any.
2607   AddStmt(E->getInitializer());
2608   // Enqueue the array size, if any.
2609   AddStmt(E->getArraySize().getValueOr(nullptr));
2610   // Enqueue the allocated type.
2611   AddTypeLoc(E->getAllocatedTypeSourceInfo());
2612   // Enqueue the placement arguments.
2613   for (unsigned I = E->getNumPlacementArgs(); I > 0; --I)
2614     AddStmt(E->getPlacementArg(I - 1));
2615 }
2616 void EnqueueVisitor::VisitCXXOperatorCallExpr(const CXXOperatorCallExpr *CE) {
2617   for (unsigned I = CE->getNumArgs(); I > 1 /* Yes, this is 1 */; --I)
2618     AddStmt(CE->getArg(I - 1));
2619   AddStmt(CE->getCallee());
2620   AddStmt(CE->getArg(0));
2621 }
2622 void EnqueueVisitor::VisitCXXPseudoDestructorExpr(
2623     const CXXPseudoDestructorExpr *E) {
2624   // Visit the name of the type being destroyed.
2625   AddTypeLoc(E->getDestroyedTypeInfo());
2626   // Visit the scope type that looks disturbingly like the nested-name-specifier
2627   // but isn't.
2628   AddTypeLoc(E->getScopeTypeInfo());
2629   // Visit the nested-name-specifier.
2630   if (NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc())
2631     AddNestedNameSpecifierLoc(QualifierLoc);
2632   // Visit base expression.
2633   AddStmt(E->getBase());
2634 }
2635 void EnqueueVisitor::VisitCXXScalarValueInitExpr(
2636     const CXXScalarValueInitExpr *E) {
2637   AddTypeLoc(E->getTypeSourceInfo());
2638 }
2639 void EnqueueVisitor::VisitCXXTemporaryObjectExpr(
2640     const CXXTemporaryObjectExpr *E) {
2641   EnqueueChildren(E);
2642   AddTypeLoc(E->getTypeSourceInfo());
2643 }
2644 void EnqueueVisitor::VisitCXXTypeidExpr(const CXXTypeidExpr *E) {
2645   EnqueueChildren(E);
2646   if (E->isTypeOperand())
2647     AddTypeLoc(E->getTypeOperandSourceInfo());
2648 }
2649 
2650 void EnqueueVisitor::VisitCXXUnresolvedConstructExpr(
2651     const CXXUnresolvedConstructExpr *E) {
2652   EnqueueChildren(E);
2653   AddTypeLoc(E->getTypeSourceInfo());
2654 }
2655 void EnqueueVisitor::VisitCXXUuidofExpr(const CXXUuidofExpr *E) {
2656   EnqueueChildren(E);
2657   if (E->isTypeOperand())
2658     AddTypeLoc(E->getTypeOperandSourceInfo());
2659 }
2660 
2661 void EnqueueVisitor::VisitCXXCatchStmt(const CXXCatchStmt *S) {
2662   EnqueueChildren(S);
2663   AddDecl(S->getExceptionDecl());
2664 }
2665 
2666 void EnqueueVisitor::VisitCXXForRangeStmt(const CXXForRangeStmt *S) {
2667   AddStmt(S->getBody());
2668   AddStmt(S->getRangeInit());
2669   AddDecl(S->getLoopVariable());
2670 }
2671 
2672 void EnqueueVisitor::VisitDeclRefExpr(const DeclRefExpr *DR) {
2673   if (DR->hasExplicitTemplateArgs())
2674     AddExplicitTemplateArgs(DR->getTemplateArgs(), DR->getNumTemplateArgs());
2675   WL.push_back(DeclRefExprParts(DR, Parent));
2676 }
2677 void EnqueueVisitor::VisitDependentScopeDeclRefExpr(
2678     const DependentScopeDeclRefExpr *E) {
2679   if (E->hasExplicitTemplateArgs())
2680     AddExplicitTemplateArgs(E->getTemplateArgs(), E->getNumTemplateArgs());
2681   AddDeclarationNameInfo(E);
2682   AddNestedNameSpecifierLoc(E->getQualifierLoc());
2683 }
2684 void EnqueueVisitor::VisitDeclStmt(const DeclStmt *S) {
2685   unsigned size = WL.size();
2686   bool isFirst = true;
2687   for (const auto *D : S->decls()) {
2688     AddDecl(D, isFirst);
2689     isFirst = false;
2690   }
2691   if (size == WL.size())
2692     return;
2693   // Now reverse the entries we just added.  This will match the DFS
2694   // ordering performed by the worklist.
2695   VisitorWorkList::iterator I = WL.begin() + size, E = WL.end();
2696   std::reverse(I, E);
2697 }
2698 void EnqueueVisitor::VisitDesignatedInitExpr(const DesignatedInitExpr *E) {
2699   AddStmt(E->getInit());
2700   for (const DesignatedInitExpr::Designator &D :
2701        llvm::reverse(E->designators())) {
2702     if (D.isFieldDesignator()) {
2703       if (FieldDecl *Field = D.getField())
2704         AddMemberRef(Field, D.getFieldLoc());
2705       continue;
2706     }
2707     if (D.isArrayDesignator()) {
2708       AddStmt(E->getArrayIndex(D));
2709       continue;
2710     }
2711     assert(D.isArrayRangeDesignator() && "Unknown designator kind");
2712     AddStmt(E->getArrayRangeEnd(D));
2713     AddStmt(E->getArrayRangeStart(D));
2714   }
2715 }
2716 void EnqueueVisitor::VisitExplicitCastExpr(const ExplicitCastExpr *E) {
2717   EnqueueChildren(E);
2718   AddTypeLoc(E->getTypeInfoAsWritten());
2719 }
2720 void EnqueueVisitor::VisitForStmt(const ForStmt *FS) {
2721   AddStmt(FS->getBody());
2722   AddStmt(FS->getInc());
2723   AddStmt(FS->getCond());
2724   AddDecl(FS->getConditionVariable());
2725   AddStmt(FS->getInit());
2726 }
2727 void EnqueueVisitor::VisitGotoStmt(const GotoStmt *GS) {
2728   WL.push_back(LabelRefVisit(GS->getLabel(), GS->getLabelLoc(), Parent));
2729 }
2730 void EnqueueVisitor::VisitIfStmt(const IfStmt *If) {
2731   AddStmt(If->getElse());
2732   AddStmt(If->getThen());
2733   AddStmt(If->getCond());
2734   AddStmt(If->getInit());
2735   AddDecl(If->getConditionVariable());
2736 }
2737 void EnqueueVisitor::VisitInitListExpr(const InitListExpr *IE) {
2738   // We care about the syntactic form of the initializer list, only.
2739   if (InitListExpr *Syntactic = IE->getSyntacticForm())
2740     IE = Syntactic;
2741   EnqueueChildren(IE);
2742 }
2743 void EnqueueVisitor::VisitMemberExpr(const MemberExpr *M) {
2744   WL.push_back(MemberExprParts(M, Parent));
2745 
2746   // If the base of the member access expression is an implicit 'this', don't
2747   // visit it.
2748   // FIXME: If we ever want to show these implicit accesses, this will be
2749   // unfortunate. However, clang_getCursor() relies on this behavior.
2750   if (M->isImplicitAccess())
2751     return;
2752 
2753   // Ignore base anonymous struct/union fields, otherwise they will shadow the
2754   // real field that we are interested in.
2755   if (auto *SubME = dyn_cast<MemberExpr>(M->getBase())) {
2756     if (auto *FD = dyn_cast_or_null<FieldDecl>(SubME->getMemberDecl())) {
2757       if (FD->isAnonymousStructOrUnion()) {
2758         AddStmt(SubME->getBase());
2759         return;
2760       }
2761     }
2762   }
2763 
2764   AddStmt(M->getBase());
2765 }
2766 void EnqueueVisitor::VisitObjCEncodeExpr(const ObjCEncodeExpr *E) {
2767   AddTypeLoc(E->getEncodedTypeSourceInfo());
2768 }
2769 void EnqueueVisitor::VisitObjCMessageExpr(const ObjCMessageExpr *M) {
2770   EnqueueChildren(M);
2771   AddTypeLoc(M->getClassReceiverTypeInfo());
2772 }
2773 void EnqueueVisitor::VisitOffsetOfExpr(const OffsetOfExpr *E) {
2774   // Visit the components of the offsetof expression.
2775   for (unsigned N = E->getNumComponents(), I = N; I > 0; --I) {
2776     const OffsetOfNode &Node = E->getComponent(I - 1);
2777     switch (Node.getKind()) {
2778     case OffsetOfNode::Array:
2779       AddStmt(E->getIndexExpr(Node.getArrayExprIndex()));
2780       break;
2781     case OffsetOfNode::Field:
2782       AddMemberRef(Node.getField(), Node.getSourceRange().getEnd());
2783       break;
2784     case OffsetOfNode::Identifier:
2785     case OffsetOfNode::Base:
2786       continue;
2787     }
2788   }
2789   // Visit the type into which we're computing the offset.
2790   AddTypeLoc(E->getTypeSourceInfo());
2791 }
2792 void EnqueueVisitor::VisitOverloadExpr(const OverloadExpr *E) {
2793   if (E->hasExplicitTemplateArgs())
2794     AddExplicitTemplateArgs(E->getTemplateArgs(), E->getNumTemplateArgs());
2795   WL.push_back(OverloadExprParts(E, Parent));
2796 }
2797 void EnqueueVisitor::VisitUnaryExprOrTypeTraitExpr(
2798     const UnaryExprOrTypeTraitExpr *E) {
2799   EnqueueChildren(E);
2800   if (E->isArgumentType())
2801     AddTypeLoc(E->getArgumentTypeInfo());
2802 }
2803 void EnqueueVisitor::VisitStmt(const Stmt *S) { EnqueueChildren(S); }
2804 void EnqueueVisitor::VisitSwitchStmt(const SwitchStmt *S) {
2805   AddStmt(S->getBody());
2806   AddStmt(S->getCond());
2807   AddDecl(S->getConditionVariable());
2808 }
2809 
2810 void EnqueueVisitor::VisitWhileStmt(const WhileStmt *W) {
2811   AddStmt(W->getBody());
2812   AddStmt(W->getCond());
2813   AddDecl(W->getConditionVariable());
2814 }
2815 
2816 void EnqueueVisitor::VisitTypeTraitExpr(const TypeTraitExpr *E) {
2817   for (unsigned I = E->getNumArgs(); I > 0; --I)
2818     AddTypeLoc(E->getArg(I - 1));
2819 }
2820 
2821 void EnqueueVisitor::VisitArrayTypeTraitExpr(const ArrayTypeTraitExpr *E) {
2822   AddTypeLoc(E->getQueriedTypeSourceInfo());
2823 }
2824 
2825 void EnqueueVisitor::VisitExpressionTraitExpr(const ExpressionTraitExpr *E) {
2826   EnqueueChildren(E);
2827 }
2828 
2829 void EnqueueVisitor::VisitUnresolvedMemberExpr(const UnresolvedMemberExpr *U) {
2830   VisitOverloadExpr(U);
2831   if (!U->isImplicitAccess())
2832     AddStmt(U->getBase());
2833 }
2834 void EnqueueVisitor::VisitVAArgExpr(const VAArgExpr *E) {
2835   AddStmt(E->getSubExpr());
2836   AddTypeLoc(E->getWrittenTypeInfo());
2837 }
2838 void EnqueueVisitor::VisitSizeOfPackExpr(const SizeOfPackExpr *E) {
2839   WL.push_back(SizeOfPackExprParts(E, Parent));
2840 }
2841 void EnqueueVisitor::VisitOpaqueValueExpr(const OpaqueValueExpr *E) {
2842   // If the opaque value has a source expression, just transparently
2843   // visit that.  This is useful for (e.g.) pseudo-object expressions.
2844   if (Expr *SourceExpr = E->getSourceExpr())
2845     return Visit(SourceExpr);
2846 }
2847 void EnqueueVisitor::VisitLambdaExpr(const LambdaExpr *E) {
2848   AddStmt(E->getBody());
2849   WL.push_back(LambdaExprParts(E, Parent));
2850 }
2851 void EnqueueVisitor::VisitPseudoObjectExpr(const PseudoObjectExpr *E) {
2852   // Treat the expression like its syntactic form.
2853   Visit(E->getSyntacticForm());
2854 }
2855 
2856 void EnqueueVisitor::VisitOMPExecutableDirective(
2857     const OMPExecutableDirective *D) {
2858   EnqueueChildren(D);
2859   for (ArrayRef<OMPClause *>::iterator I = D->clauses().begin(),
2860                                        E = D->clauses().end();
2861        I != E; ++I)
2862     EnqueueChildren(*I);
2863 }
2864 
2865 void EnqueueVisitor::VisitOMPLoopBasedDirective(
2866     const OMPLoopBasedDirective *D) {
2867   VisitOMPExecutableDirective(D);
2868 }
2869 
2870 void EnqueueVisitor::VisitOMPLoopDirective(const OMPLoopDirective *D) {
2871   VisitOMPLoopBasedDirective(D);
2872 }
2873 
2874 void EnqueueVisitor::VisitOMPParallelDirective(const OMPParallelDirective *D) {
2875   VisitOMPExecutableDirective(D);
2876 }
2877 
2878 void EnqueueVisitor::VisitOMPSimdDirective(const OMPSimdDirective *D) {
2879   VisitOMPLoopDirective(D);
2880 }
2881 
2882 void EnqueueVisitor::VisitOMPTileDirective(const OMPTileDirective *D) {
2883   VisitOMPLoopBasedDirective(D);
2884 }
2885 
2886 void EnqueueVisitor::VisitOMPForDirective(const OMPForDirective *D) {
2887   VisitOMPLoopDirective(D);
2888 }
2889 
2890 void EnqueueVisitor::VisitOMPForSimdDirective(const OMPForSimdDirective *D) {
2891   VisitOMPLoopDirective(D);
2892 }
2893 
2894 void EnqueueVisitor::VisitOMPSectionsDirective(const OMPSectionsDirective *D) {
2895   VisitOMPExecutableDirective(D);
2896 }
2897 
2898 void EnqueueVisitor::VisitOMPSectionDirective(const OMPSectionDirective *D) {
2899   VisitOMPExecutableDirective(D);
2900 }
2901 
2902 void EnqueueVisitor::VisitOMPSingleDirective(const OMPSingleDirective *D) {
2903   VisitOMPExecutableDirective(D);
2904 }
2905 
2906 void EnqueueVisitor::VisitOMPMasterDirective(const OMPMasterDirective *D) {
2907   VisitOMPExecutableDirective(D);
2908 }
2909 
2910 void EnqueueVisitor::VisitOMPCriticalDirective(const OMPCriticalDirective *D) {
2911   VisitOMPExecutableDirective(D);
2912   AddDeclarationNameInfo(D);
2913 }
2914 
2915 void EnqueueVisitor::VisitOMPParallelForDirective(
2916     const OMPParallelForDirective *D) {
2917   VisitOMPLoopDirective(D);
2918 }
2919 
2920 void EnqueueVisitor::VisitOMPParallelForSimdDirective(
2921     const OMPParallelForSimdDirective *D) {
2922   VisitOMPLoopDirective(D);
2923 }
2924 
2925 void EnqueueVisitor::VisitOMPParallelMasterDirective(
2926     const OMPParallelMasterDirective *D) {
2927   VisitOMPExecutableDirective(D);
2928 }
2929 
2930 void EnqueueVisitor::VisitOMPParallelSectionsDirective(
2931     const OMPParallelSectionsDirective *D) {
2932   VisitOMPExecutableDirective(D);
2933 }
2934 
2935 void EnqueueVisitor::VisitOMPTaskDirective(const OMPTaskDirective *D) {
2936   VisitOMPExecutableDirective(D);
2937 }
2938 
2939 void EnqueueVisitor::VisitOMPTaskyieldDirective(
2940     const OMPTaskyieldDirective *D) {
2941   VisitOMPExecutableDirective(D);
2942 }
2943 
2944 void EnqueueVisitor::VisitOMPBarrierDirective(const OMPBarrierDirective *D) {
2945   VisitOMPExecutableDirective(D);
2946 }
2947 
2948 void EnqueueVisitor::VisitOMPTaskwaitDirective(const OMPTaskwaitDirective *D) {
2949   VisitOMPExecutableDirective(D);
2950 }
2951 
2952 void EnqueueVisitor::VisitOMPTaskgroupDirective(
2953     const OMPTaskgroupDirective *D) {
2954   VisitOMPExecutableDirective(D);
2955   if (const Expr *E = D->getReductionRef())
2956     VisitStmt(E);
2957 }
2958 
2959 void EnqueueVisitor::VisitOMPFlushDirective(const OMPFlushDirective *D) {
2960   VisitOMPExecutableDirective(D);
2961 }
2962 
2963 void EnqueueVisitor::VisitOMPDepobjDirective(const OMPDepobjDirective *D) {
2964   VisitOMPExecutableDirective(D);
2965 }
2966 
2967 void EnqueueVisitor::VisitOMPScanDirective(const OMPScanDirective *D) {
2968   VisitOMPExecutableDirective(D);
2969 }
2970 
2971 void EnqueueVisitor::VisitOMPOrderedDirective(const OMPOrderedDirective *D) {
2972   VisitOMPExecutableDirective(D);
2973 }
2974 
2975 void EnqueueVisitor::VisitOMPAtomicDirective(const OMPAtomicDirective *D) {
2976   VisitOMPExecutableDirective(D);
2977 }
2978 
2979 void EnqueueVisitor::VisitOMPTargetDirective(const OMPTargetDirective *D) {
2980   VisitOMPExecutableDirective(D);
2981 }
2982 
2983 void EnqueueVisitor::VisitOMPTargetDataDirective(
2984     const OMPTargetDataDirective *D) {
2985   VisitOMPExecutableDirective(D);
2986 }
2987 
2988 void EnqueueVisitor::VisitOMPTargetEnterDataDirective(
2989     const OMPTargetEnterDataDirective *D) {
2990   VisitOMPExecutableDirective(D);
2991 }
2992 
2993 void EnqueueVisitor::VisitOMPTargetExitDataDirective(
2994     const OMPTargetExitDataDirective *D) {
2995   VisitOMPExecutableDirective(D);
2996 }
2997 
2998 void EnqueueVisitor::VisitOMPTargetParallelDirective(
2999     const OMPTargetParallelDirective *D) {
3000   VisitOMPExecutableDirective(D);
3001 }
3002 
3003 void EnqueueVisitor::VisitOMPTargetParallelForDirective(
3004     const OMPTargetParallelForDirective *D) {
3005   VisitOMPLoopDirective(D);
3006 }
3007 
3008 void EnqueueVisitor::VisitOMPTeamsDirective(const OMPTeamsDirective *D) {
3009   VisitOMPExecutableDirective(D);
3010 }
3011 
3012 void EnqueueVisitor::VisitOMPCancellationPointDirective(
3013     const OMPCancellationPointDirective *D) {
3014   VisitOMPExecutableDirective(D);
3015 }
3016 
3017 void EnqueueVisitor::VisitOMPCancelDirective(const OMPCancelDirective *D) {
3018   VisitOMPExecutableDirective(D);
3019 }
3020 
3021 void EnqueueVisitor::VisitOMPTaskLoopDirective(const OMPTaskLoopDirective *D) {
3022   VisitOMPLoopDirective(D);
3023 }
3024 
3025 void EnqueueVisitor::VisitOMPTaskLoopSimdDirective(
3026     const OMPTaskLoopSimdDirective *D) {
3027   VisitOMPLoopDirective(D);
3028 }
3029 
3030 void EnqueueVisitor::VisitOMPMasterTaskLoopDirective(
3031     const OMPMasterTaskLoopDirective *D) {
3032   VisitOMPLoopDirective(D);
3033 }
3034 
3035 void EnqueueVisitor::VisitOMPMasterTaskLoopSimdDirective(
3036     const OMPMasterTaskLoopSimdDirective *D) {
3037   VisitOMPLoopDirective(D);
3038 }
3039 
3040 void EnqueueVisitor::VisitOMPParallelMasterTaskLoopDirective(
3041     const OMPParallelMasterTaskLoopDirective *D) {
3042   VisitOMPLoopDirective(D);
3043 }
3044 
3045 void EnqueueVisitor::VisitOMPParallelMasterTaskLoopSimdDirective(
3046     const OMPParallelMasterTaskLoopSimdDirective *D) {
3047   VisitOMPLoopDirective(D);
3048 }
3049 
3050 void EnqueueVisitor::VisitOMPDistributeDirective(
3051     const OMPDistributeDirective *D) {
3052   VisitOMPLoopDirective(D);
3053 }
3054 
3055 void EnqueueVisitor::VisitOMPDistributeParallelForDirective(
3056     const OMPDistributeParallelForDirective *D) {
3057   VisitOMPLoopDirective(D);
3058 }
3059 
3060 void EnqueueVisitor::VisitOMPDistributeParallelForSimdDirective(
3061     const OMPDistributeParallelForSimdDirective *D) {
3062   VisitOMPLoopDirective(D);
3063 }
3064 
3065 void EnqueueVisitor::VisitOMPDistributeSimdDirective(
3066     const OMPDistributeSimdDirective *D) {
3067   VisitOMPLoopDirective(D);
3068 }
3069 
3070 void EnqueueVisitor::VisitOMPTargetParallelForSimdDirective(
3071     const OMPTargetParallelForSimdDirective *D) {
3072   VisitOMPLoopDirective(D);
3073 }
3074 
3075 void EnqueueVisitor::VisitOMPTargetSimdDirective(
3076     const OMPTargetSimdDirective *D) {
3077   VisitOMPLoopDirective(D);
3078 }
3079 
3080 void EnqueueVisitor::VisitOMPTeamsDistributeDirective(
3081     const OMPTeamsDistributeDirective *D) {
3082   VisitOMPLoopDirective(D);
3083 }
3084 
3085 void EnqueueVisitor::VisitOMPTeamsDistributeSimdDirective(
3086     const OMPTeamsDistributeSimdDirective *D) {
3087   VisitOMPLoopDirective(D);
3088 }
3089 
3090 void EnqueueVisitor::VisitOMPTeamsDistributeParallelForSimdDirective(
3091     const OMPTeamsDistributeParallelForSimdDirective *D) {
3092   VisitOMPLoopDirective(D);
3093 }
3094 
3095 void EnqueueVisitor::VisitOMPTeamsDistributeParallelForDirective(
3096     const OMPTeamsDistributeParallelForDirective *D) {
3097   VisitOMPLoopDirective(D);
3098 }
3099 
3100 void EnqueueVisitor::VisitOMPTargetTeamsDirective(
3101     const OMPTargetTeamsDirective *D) {
3102   VisitOMPExecutableDirective(D);
3103 }
3104 
3105 void EnqueueVisitor::VisitOMPTargetTeamsDistributeDirective(
3106     const OMPTargetTeamsDistributeDirective *D) {
3107   VisitOMPLoopDirective(D);
3108 }
3109 
3110 void EnqueueVisitor::VisitOMPTargetTeamsDistributeParallelForDirective(
3111     const OMPTargetTeamsDistributeParallelForDirective *D) {
3112   VisitOMPLoopDirective(D);
3113 }
3114 
3115 void EnqueueVisitor::VisitOMPTargetTeamsDistributeParallelForSimdDirective(
3116     const OMPTargetTeamsDistributeParallelForSimdDirective *D) {
3117   VisitOMPLoopDirective(D);
3118 }
3119 
3120 void EnqueueVisitor::VisitOMPTargetTeamsDistributeSimdDirective(
3121     const OMPTargetTeamsDistributeSimdDirective *D) {
3122   VisitOMPLoopDirective(D);
3123 }
3124 
3125 void CursorVisitor::EnqueueWorkList(VisitorWorkList &WL, const Stmt *S) {
3126   EnqueueVisitor(WL, MakeCXCursor(S, StmtParent, TU, RegionOfInterest))
3127       .Visit(S);
3128 }
3129 
3130 bool CursorVisitor::IsInRegionOfInterest(CXCursor C) {
3131   if (RegionOfInterest.isValid()) {
3132     SourceRange Range = getRawCursorExtent(C);
3133     if (Range.isInvalid() || CompareRegionOfInterest(Range))
3134       return false;
3135   }
3136   return true;
3137 }
3138 
3139 bool CursorVisitor::RunVisitorWorkList(VisitorWorkList &WL) {
3140   while (!WL.empty()) {
3141     // Dequeue the worklist item.
3142     VisitorJob LI = WL.pop_back_val();
3143 
3144     // Set the Parent field, then back to its old value once we're done.
3145     SetParentRAII SetParent(Parent, StmtParent, LI.getParent());
3146 
3147     switch (LI.getKind()) {
3148     case VisitorJob::DeclVisitKind: {
3149       const Decl *D = cast<DeclVisit>(&LI)->get();
3150       if (!D)
3151         continue;
3152 
3153       // For now, perform default visitation for Decls.
3154       if (Visit(MakeCXCursor(D, TU, RegionOfInterest,
3155                              cast<DeclVisit>(&LI)->isFirst())))
3156         return true;
3157 
3158       continue;
3159     }
3160     case VisitorJob::ExplicitTemplateArgsVisitKind: {
3161       for (const TemplateArgumentLoc &Arg :
3162            *cast<ExplicitTemplateArgsVisit>(&LI)) {
3163         if (VisitTemplateArgumentLoc(Arg))
3164           return true;
3165       }
3166       continue;
3167     }
3168     case VisitorJob::TypeLocVisitKind: {
3169       // Perform default visitation for TypeLocs.
3170       if (Visit(cast<TypeLocVisit>(&LI)->get()))
3171         return true;
3172       continue;
3173     }
3174     case VisitorJob::LabelRefVisitKind: {
3175       const LabelDecl *LS = cast<LabelRefVisit>(&LI)->get();
3176       if (LabelStmt *stmt = LS->getStmt()) {
3177         if (Visit(MakeCursorLabelRef(stmt, cast<LabelRefVisit>(&LI)->getLoc(),
3178                                      TU))) {
3179           return true;
3180         }
3181       }
3182       continue;
3183     }
3184 
3185     case VisitorJob::NestedNameSpecifierLocVisitKind: {
3186       NestedNameSpecifierLocVisit *V = cast<NestedNameSpecifierLocVisit>(&LI);
3187       if (VisitNestedNameSpecifierLoc(V->get()))
3188         return true;
3189       continue;
3190     }
3191 
3192     case VisitorJob::DeclarationNameInfoVisitKind: {
3193       if (VisitDeclarationNameInfo(cast<DeclarationNameInfoVisit>(&LI)->get()))
3194         return true;
3195       continue;
3196     }
3197     case VisitorJob::MemberRefVisitKind: {
3198       MemberRefVisit *V = cast<MemberRefVisit>(&LI);
3199       if (Visit(MakeCursorMemberRef(V->get(), V->getLoc(), TU)))
3200         return true;
3201       continue;
3202     }
3203     case VisitorJob::StmtVisitKind: {
3204       const Stmt *S = cast<StmtVisit>(&LI)->get();
3205       if (!S)
3206         continue;
3207 
3208       // Update the current cursor.
3209       CXCursor Cursor = MakeCXCursor(S, StmtParent, TU, RegionOfInterest);
3210       if (!IsInRegionOfInterest(Cursor))
3211         continue;
3212       switch (Visitor(Cursor, Parent, ClientData)) {
3213       case CXChildVisit_Break:
3214         return true;
3215       case CXChildVisit_Continue:
3216         break;
3217       case CXChildVisit_Recurse:
3218         if (PostChildrenVisitor)
3219           WL.push_back(PostChildrenVisit(nullptr, Cursor));
3220         EnqueueWorkList(WL, S);
3221         break;
3222       }
3223       continue;
3224     }
3225     case VisitorJob::MemberExprPartsKind: {
3226       // Handle the other pieces in the MemberExpr besides the base.
3227       const MemberExpr *M = cast<MemberExprParts>(&LI)->get();
3228 
3229       // Visit the nested-name-specifier
3230       if (NestedNameSpecifierLoc QualifierLoc = M->getQualifierLoc())
3231         if (VisitNestedNameSpecifierLoc(QualifierLoc))
3232           return true;
3233 
3234       // Visit the declaration name.
3235       if (VisitDeclarationNameInfo(M->getMemberNameInfo()))
3236         return true;
3237 
3238       // Visit the explicitly-specified template arguments, if any.
3239       if (M->hasExplicitTemplateArgs()) {
3240         for (const TemplateArgumentLoc *Arg = M->getTemplateArgs(),
3241                                        *ArgEnd = Arg + M->getNumTemplateArgs();
3242              Arg != ArgEnd; ++Arg) {
3243           if (VisitTemplateArgumentLoc(*Arg))
3244             return true;
3245         }
3246       }
3247       continue;
3248     }
3249     case VisitorJob::DeclRefExprPartsKind: {
3250       const DeclRefExpr *DR = cast<DeclRefExprParts>(&LI)->get();
3251       // Visit nested-name-specifier, if present.
3252       if (NestedNameSpecifierLoc QualifierLoc = DR->getQualifierLoc())
3253         if (VisitNestedNameSpecifierLoc(QualifierLoc))
3254           return true;
3255       // Visit declaration name.
3256       if (VisitDeclarationNameInfo(DR->getNameInfo()))
3257         return true;
3258       continue;
3259     }
3260     case VisitorJob::OverloadExprPartsKind: {
3261       const OverloadExpr *O = cast<OverloadExprParts>(&LI)->get();
3262       // Visit the nested-name-specifier.
3263       if (NestedNameSpecifierLoc QualifierLoc = O->getQualifierLoc())
3264         if (VisitNestedNameSpecifierLoc(QualifierLoc))
3265           return true;
3266       // Visit the declaration name.
3267       if (VisitDeclarationNameInfo(O->getNameInfo()))
3268         return true;
3269       // Visit the overloaded declaration reference.
3270       if (Visit(MakeCursorOverloadedDeclRef(O, TU)))
3271         return true;
3272       continue;
3273     }
3274     case VisitorJob::SizeOfPackExprPartsKind: {
3275       const SizeOfPackExpr *E = cast<SizeOfPackExprParts>(&LI)->get();
3276       NamedDecl *Pack = E->getPack();
3277       if (isa<TemplateTypeParmDecl>(Pack)) {
3278         if (Visit(MakeCursorTypeRef(cast<TemplateTypeParmDecl>(Pack),
3279                                     E->getPackLoc(), TU)))
3280           return true;
3281 
3282         continue;
3283       }
3284 
3285       if (isa<TemplateTemplateParmDecl>(Pack)) {
3286         if (Visit(MakeCursorTemplateRef(cast<TemplateTemplateParmDecl>(Pack),
3287                                         E->getPackLoc(), TU)))
3288           return true;
3289 
3290         continue;
3291       }
3292 
3293       // Non-type template parameter packs and function parameter packs are
3294       // treated like DeclRefExpr cursors.
3295       continue;
3296     }
3297 
3298     case VisitorJob::LambdaExprPartsKind: {
3299       // Visit non-init captures.
3300       const LambdaExpr *E = cast<LambdaExprParts>(&LI)->get();
3301       for (LambdaExpr::capture_iterator C = E->explicit_capture_begin(),
3302                                         CEnd = E->explicit_capture_end();
3303            C != CEnd; ++C) {
3304         if (!C->capturesVariable())
3305           continue;
3306 
3307         if (Visit(MakeCursorVariableRef(C->getCapturedVar(), C->getLocation(),
3308                                         TU)))
3309           return true;
3310       }
3311       // Visit init captures
3312       for (auto InitExpr : E->capture_inits()) {
3313         if (InitExpr && Visit(InitExpr))
3314           return true;
3315       }
3316 
3317       TypeLoc TL = E->getCallOperator()->getTypeSourceInfo()->getTypeLoc();
3318       // Visit parameters and return type, if present.
3319       if (FunctionTypeLoc Proto = TL.getAs<FunctionProtoTypeLoc>()) {
3320         if (E->hasExplicitParameters()) {
3321           // Visit parameters.
3322           for (unsigned I = 0, N = Proto.getNumParams(); I != N; ++I)
3323             if (Visit(MakeCXCursor(Proto.getParam(I), TU)))
3324               return true;
3325         }
3326         if (E->hasExplicitResultType()) {
3327           // Visit result type.
3328           if (Visit(Proto.getReturnLoc()))
3329             return true;
3330         }
3331       }
3332       break;
3333     }
3334 
3335     case VisitorJob::PostChildrenVisitKind:
3336       if (PostChildrenVisitor(Parent, ClientData))
3337         return true;
3338       break;
3339     }
3340   }
3341   return false;
3342 }
3343 
3344 bool CursorVisitor::Visit(const Stmt *S) {
3345   VisitorWorkList *WL = nullptr;
3346   if (!WorkListFreeList.empty()) {
3347     WL = WorkListFreeList.back();
3348     WL->clear();
3349     WorkListFreeList.pop_back();
3350   } else {
3351     WL = new VisitorWorkList();
3352     WorkListCache.push_back(WL);
3353   }
3354   EnqueueWorkList(*WL, S);
3355   bool result = RunVisitorWorkList(*WL);
3356   WorkListFreeList.push_back(WL);
3357   return result;
3358 }
3359 
3360 namespace {
3361 typedef SmallVector<SourceRange, 4> RefNamePieces;
3362 RefNamePieces buildPieces(unsigned NameFlags, bool IsMemberRefExpr,
3363                           const DeclarationNameInfo &NI, SourceRange QLoc,
3364                           const SourceRange *TemplateArgsLoc = nullptr) {
3365   const bool WantQualifier = NameFlags & CXNameRange_WantQualifier;
3366   const bool WantTemplateArgs = NameFlags & CXNameRange_WantTemplateArgs;
3367   const bool WantSinglePiece = NameFlags & CXNameRange_WantSinglePiece;
3368 
3369   const DeclarationName::NameKind Kind = NI.getName().getNameKind();
3370 
3371   RefNamePieces Pieces;
3372 
3373   if (WantQualifier && QLoc.isValid())
3374     Pieces.push_back(QLoc);
3375 
3376   if (Kind != DeclarationName::CXXOperatorName || IsMemberRefExpr)
3377     Pieces.push_back(NI.getLoc());
3378 
3379   if (WantTemplateArgs && TemplateArgsLoc && TemplateArgsLoc->isValid())
3380     Pieces.push_back(*TemplateArgsLoc);
3381 
3382   if (Kind == DeclarationName::CXXOperatorName) {
3383     Pieces.push_back(NI.getInfo().getCXXOperatorNameBeginLoc());
3384     Pieces.push_back(NI.getInfo().getCXXOperatorNameEndLoc());
3385   }
3386 
3387   if (WantSinglePiece) {
3388     SourceRange R(Pieces.front().getBegin(), Pieces.back().getEnd());
3389     Pieces.clear();
3390     Pieces.push_back(R);
3391   }
3392 
3393   return Pieces;
3394 }
3395 } // namespace
3396 
3397 //===----------------------------------------------------------------------===//
3398 // Misc. API hooks.
3399 //===----------------------------------------------------------------------===//
3400 
3401 namespace {
3402 struct RegisterFatalErrorHandler {
3403   RegisterFatalErrorHandler() {
3404     clang_install_aborting_llvm_fatal_error_handler();
3405   }
3406 };
3407 } // namespace
3408 
3409 static llvm::ManagedStatic<RegisterFatalErrorHandler>
3410     RegisterFatalErrorHandlerOnce;
3411 
3412 CXIndex clang_createIndex(int excludeDeclarationsFromPCH,
3413                           int displayDiagnostics) {
3414   // We use crash recovery to make some of our APIs more reliable, implicitly
3415   // enable it.
3416   if (!getenv("LIBCLANG_DISABLE_CRASH_RECOVERY"))
3417     llvm::CrashRecoveryContext::Enable();
3418 
3419   // Look through the managed static to trigger construction of the managed
3420   // static which registers our fatal error handler. This ensures it is only
3421   // registered once.
3422   (void)*RegisterFatalErrorHandlerOnce;
3423 
3424   // Initialize targets for clang module support.
3425   llvm::InitializeAllTargets();
3426   llvm::InitializeAllTargetMCs();
3427   llvm::InitializeAllAsmPrinters();
3428   llvm::InitializeAllAsmParsers();
3429 
3430   CIndexer *CIdxr = new CIndexer();
3431 
3432   if (excludeDeclarationsFromPCH)
3433     CIdxr->setOnlyLocalDecls();
3434   if (displayDiagnostics)
3435     CIdxr->setDisplayDiagnostics();
3436 
3437   if (getenv("LIBCLANG_BGPRIO_INDEX"))
3438     CIdxr->setCXGlobalOptFlags(CIdxr->getCXGlobalOptFlags() |
3439                                CXGlobalOpt_ThreadBackgroundPriorityForIndexing);
3440   if (getenv("LIBCLANG_BGPRIO_EDIT"))
3441     CIdxr->setCXGlobalOptFlags(CIdxr->getCXGlobalOptFlags() |
3442                                CXGlobalOpt_ThreadBackgroundPriorityForEditing);
3443 
3444   return CIdxr;
3445 }
3446 
3447 void clang_disposeIndex(CXIndex CIdx) {
3448   if (CIdx)
3449     delete static_cast<CIndexer *>(CIdx);
3450 }
3451 
3452 void clang_CXIndex_setGlobalOptions(CXIndex CIdx, unsigned options) {
3453   if (CIdx)
3454     static_cast<CIndexer *>(CIdx)->setCXGlobalOptFlags(options);
3455 }
3456 
3457 unsigned clang_CXIndex_getGlobalOptions(CXIndex CIdx) {
3458   if (CIdx)
3459     return static_cast<CIndexer *>(CIdx)->getCXGlobalOptFlags();
3460   return 0;
3461 }
3462 
3463 void clang_CXIndex_setInvocationEmissionPathOption(CXIndex CIdx,
3464                                                    const char *Path) {
3465   if (CIdx)
3466     static_cast<CIndexer *>(CIdx)->setInvocationEmissionPath(Path ? Path : "");
3467 }
3468 
3469 void clang_toggleCrashRecovery(unsigned isEnabled) {
3470   if (isEnabled)
3471     llvm::CrashRecoveryContext::Enable();
3472   else
3473     llvm::CrashRecoveryContext::Disable();
3474 }
3475 
3476 CXTranslationUnit clang_createTranslationUnit(CXIndex CIdx,
3477                                               const char *ast_filename) {
3478   CXTranslationUnit TU;
3479   enum CXErrorCode Result =
3480       clang_createTranslationUnit2(CIdx, ast_filename, &TU);
3481   (void)Result;
3482   assert((TU && Result == CXError_Success) ||
3483          (!TU && Result != CXError_Success));
3484   return TU;
3485 }
3486 
3487 enum CXErrorCode clang_createTranslationUnit2(CXIndex CIdx,
3488                                               const char *ast_filename,
3489                                               CXTranslationUnit *out_TU) {
3490   if (out_TU)
3491     *out_TU = nullptr;
3492 
3493   if (!CIdx || !ast_filename || !out_TU)
3494     return CXError_InvalidArguments;
3495 
3496   LOG_FUNC_SECTION { *Log << ast_filename; }
3497 
3498   CIndexer *CXXIdx = static_cast<CIndexer *>(CIdx);
3499   FileSystemOptions FileSystemOpts;
3500 
3501   IntrusiveRefCntPtr<DiagnosticsEngine> Diags =
3502       CompilerInstance::createDiagnostics(new DiagnosticOptions());
3503   std::unique_ptr<ASTUnit> AU = ASTUnit::LoadFromASTFile(
3504       ast_filename, CXXIdx->getPCHContainerOperations()->getRawReader(),
3505       ASTUnit::LoadEverything, Diags, FileSystemOpts, /*UseDebugInfo=*/false,
3506       CXXIdx->getOnlyLocalDecls(), CaptureDiagsKind::All,
3507       /*AllowASTWithCompilerErrors=*/true,
3508       /*UserFilesAreVolatile=*/true);
3509   *out_TU = MakeCXTranslationUnit(CXXIdx, std::move(AU));
3510   return *out_TU ? CXError_Success : CXError_Failure;
3511 }
3512 
3513 unsigned clang_defaultEditingTranslationUnitOptions() {
3514   return CXTranslationUnit_PrecompiledPreamble |
3515          CXTranslationUnit_CacheCompletionResults;
3516 }
3517 
3518 CXTranslationUnit clang_createTranslationUnitFromSourceFile(
3519     CXIndex CIdx, const char *source_filename, int num_command_line_args,
3520     const char *const *command_line_args, unsigned num_unsaved_files,
3521     struct CXUnsavedFile *unsaved_files) {
3522   unsigned Options = CXTranslationUnit_DetailedPreprocessingRecord;
3523   return clang_parseTranslationUnit(CIdx, source_filename, command_line_args,
3524                                     num_command_line_args, unsaved_files,
3525                                     num_unsaved_files, Options);
3526 }
3527 
3528 static CXErrorCode
3529 clang_parseTranslationUnit_Impl(CXIndex CIdx, const char *source_filename,
3530                                 const char *const *command_line_args,
3531                                 int num_command_line_args,
3532                                 ArrayRef<CXUnsavedFile> unsaved_files,
3533                                 unsigned options, CXTranslationUnit *out_TU) {
3534   // Set up the initial return values.
3535   if (out_TU)
3536     *out_TU = nullptr;
3537 
3538   // Check arguments.
3539   if (!CIdx || !out_TU)
3540     return CXError_InvalidArguments;
3541 
3542   CIndexer *CXXIdx = static_cast<CIndexer *>(CIdx);
3543 
3544   if (CXXIdx->isOptEnabled(CXGlobalOpt_ThreadBackgroundPriorityForIndexing))
3545     setThreadBackgroundPriority();
3546 
3547   bool PrecompilePreamble = options & CXTranslationUnit_PrecompiledPreamble;
3548   bool CreatePreambleOnFirstParse =
3549       options & CXTranslationUnit_CreatePreambleOnFirstParse;
3550   // FIXME: Add a flag for modules.
3551   TranslationUnitKind TUKind = (options & (CXTranslationUnit_Incomplete |
3552                                            CXTranslationUnit_SingleFileParse))
3553                                    ? TU_Prefix
3554                                    : TU_Complete;
3555   bool CacheCodeCompletionResults =
3556       options & CXTranslationUnit_CacheCompletionResults;
3557   bool IncludeBriefCommentsInCodeCompletion =
3558       options & CXTranslationUnit_IncludeBriefCommentsInCodeCompletion;
3559   bool SingleFileParse = options & CXTranslationUnit_SingleFileParse;
3560   bool ForSerialization = options & CXTranslationUnit_ForSerialization;
3561   bool RetainExcludedCB =
3562       options & CXTranslationUnit_RetainExcludedConditionalBlocks;
3563   SkipFunctionBodiesScope SkipFunctionBodies = SkipFunctionBodiesScope::None;
3564   if (options & CXTranslationUnit_SkipFunctionBodies) {
3565     SkipFunctionBodies =
3566         (options & CXTranslationUnit_LimitSkipFunctionBodiesToPreamble)
3567             ? SkipFunctionBodiesScope::Preamble
3568             : SkipFunctionBodiesScope::PreambleAndMainFile;
3569   }
3570 
3571   // Configure the diagnostics.
3572   IntrusiveRefCntPtr<DiagnosticsEngine> Diags(
3573       CompilerInstance::createDiagnostics(new DiagnosticOptions));
3574 
3575   if (options & CXTranslationUnit_KeepGoing)
3576     Diags->setFatalsAsError(true);
3577 
3578   CaptureDiagsKind CaptureDiagnostics = CaptureDiagsKind::All;
3579   if (options & CXTranslationUnit_IgnoreNonErrorsFromIncludedFiles)
3580     CaptureDiagnostics = CaptureDiagsKind::AllWithoutNonErrorsFromIncludes;
3581 
3582   // Recover resources if we crash before exiting this function.
3583   llvm::CrashRecoveryContextCleanupRegistrar<
3584       DiagnosticsEngine,
3585       llvm::CrashRecoveryContextReleaseRefCleanup<DiagnosticsEngine>>
3586       DiagCleanup(Diags.get());
3587 
3588   std::unique_ptr<std::vector<ASTUnit::RemappedFile>> RemappedFiles(
3589       new std::vector<ASTUnit::RemappedFile>());
3590 
3591   // Recover resources if we crash before exiting this function.
3592   llvm::CrashRecoveryContextCleanupRegistrar<std::vector<ASTUnit::RemappedFile>>
3593       RemappedCleanup(RemappedFiles.get());
3594 
3595   for (auto &UF : unsaved_files) {
3596     std::unique_ptr<llvm::MemoryBuffer> MB =
3597         llvm::MemoryBuffer::getMemBufferCopy(getContents(UF), UF.Filename);
3598     RemappedFiles->push_back(std::make_pair(UF.Filename, MB.release()));
3599   }
3600 
3601   std::unique_ptr<std::vector<const char *>> Args(
3602       new std::vector<const char *>());
3603 
3604   // Recover resources if we crash before exiting this method.
3605   llvm::CrashRecoveryContextCleanupRegistrar<std::vector<const char *>>
3606       ArgsCleanup(Args.get());
3607 
3608   // Since the Clang C library is primarily used by batch tools dealing with
3609   // (often very broken) source code, where spell-checking can have a
3610   // significant negative impact on performance (particularly when
3611   // precompiled headers are involved), we disable it by default.
3612   // Only do this if we haven't found a spell-checking-related argument.
3613   bool FoundSpellCheckingArgument = false;
3614   for (int I = 0; I != num_command_line_args; ++I) {
3615     if (strcmp(command_line_args[I], "-fno-spell-checking") == 0 ||
3616         strcmp(command_line_args[I], "-fspell-checking") == 0) {
3617       FoundSpellCheckingArgument = true;
3618       break;
3619     }
3620   }
3621   Args->insert(Args->end(), command_line_args,
3622                command_line_args + num_command_line_args);
3623 
3624   if (!FoundSpellCheckingArgument)
3625     Args->insert(Args->begin() + 1, "-fno-spell-checking");
3626 
3627   // The 'source_filename' argument is optional.  If the caller does not
3628   // specify it then it is assumed that the source file is specified
3629   // in the actual argument list.
3630   // Put the source file after command_line_args otherwise if '-x' flag is
3631   // present it will be unused.
3632   if (source_filename)
3633     Args->push_back(source_filename);
3634 
3635   // Do we need the detailed preprocessing record?
3636   if (options & CXTranslationUnit_DetailedPreprocessingRecord) {
3637     Args->push_back("-Xclang");
3638     Args->push_back("-detailed-preprocessing-record");
3639   }
3640 
3641   // Suppress any editor placeholder diagnostics.
3642   Args->push_back("-fallow-editor-placeholders");
3643 
3644   unsigned NumErrors = Diags->getClient()->getNumErrors();
3645   std::unique_ptr<ASTUnit> ErrUnit;
3646   // Unless the user specified that they want the preamble on the first parse
3647   // set it up to be created on the first reparse. This makes the first parse
3648   // faster, trading for a slower (first) reparse.
3649   unsigned PrecompilePreambleAfterNParses =
3650       !PrecompilePreamble ? 0 : 2 - CreatePreambleOnFirstParse;
3651 
3652   LibclangInvocationReporter InvocationReporter(
3653       *CXXIdx, LibclangInvocationReporter::OperationKind::ParseOperation,
3654       options, llvm::makeArrayRef(*Args), /*InvocationArgs=*/None,
3655       unsaved_files);
3656   std::unique_ptr<ASTUnit> Unit(ASTUnit::LoadFromCommandLine(
3657       Args->data(), Args->data() + Args->size(),
3658       CXXIdx->getPCHContainerOperations(), Diags,
3659       CXXIdx->getClangResourcesPath(), CXXIdx->getOnlyLocalDecls(),
3660       CaptureDiagnostics, *RemappedFiles.get(),
3661       /*RemappedFilesKeepOriginalName=*/true, PrecompilePreambleAfterNParses,
3662       TUKind, CacheCodeCompletionResults, IncludeBriefCommentsInCodeCompletion,
3663       /*AllowPCHWithCompilerErrors=*/true, SkipFunctionBodies, SingleFileParse,
3664       /*UserFilesAreVolatile=*/true, ForSerialization, RetainExcludedCB,
3665       CXXIdx->getPCHContainerOperations()->getRawReader().getFormat(),
3666       &ErrUnit));
3667 
3668   // Early failures in LoadFromCommandLine may return with ErrUnit unset.
3669   if (!Unit && !ErrUnit)
3670     return CXError_ASTReadError;
3671 
3672   if (NumErrors != Diags->getClient()->getNumErrors()) {
3673     // Make sure to check that 'Unit' is non-NULL.
3674     if (CXXIdx->getDisplayDiagnostics())
3675       printDiagsToStderr(Unit ? Unit.get() : ErrUnit.get());
3676   }
3677 
3678   if (isASTReadError(Unit ? Unit.get() : ErrUnit.get()))
3679     return CXError_ASTReadError;
3680 
3681   *out_TU = MakeCXTranslationUnit(CXXIdx, std::move(Unit));
3682   if (CXTranslationUnitImpl *TU = *out_TU) {
3683     TU->ParsingOptions = options;
3684     TU->Arguments.reserve(Args->size());
3685     for (const char *Arg : *Args)
3686       TU->Arguments.push_back(Arg);
3687     return CXError_Success;
3688   }
3689   return CXError_Failure;
3690 }
3691 
3692 CXTranslationUnit
3693 clang_parseTranslationUnit(CXIndex CIdx, const char *source_filename,
3694                            const char *const *command_line_args,
3695                            int num_command_line_args,
3696                            struct CXUnsavedFile *unsaved_files,
3697                            unsigned num_unsaved_files, unsigned options) {
3698   CXTranslationUnit TU;
3699   enum CXErrorCode Result = clang_parseTranslationUnit2(
3700       CIdx, source_filename, command_line_args, num_command_line_args,
3701       unsaved_files, num_unsaved_files, options, &TU);
3702   (void)Result;
3703   assert((TU && Result == CXError_Success) ||
3704          (!TU && Result != CXError_Success));
3705   return TU;
3706 }
3707 
3708 enum CXErrorCode clang_parseTranslationUnit2(
3709     CXIndex CIdx, const char *source_filename,
3710     const char *const *command_line_args, int num_command_line_args,
3711     struct CXUnsavedFile *unsaved_files, unsigned num_unsaved_files,
3712     unsigned options, CXTranslationUnit *out_TU) {
3713   noteBottomOfStack();
3714   SmallVector<const char *, 4> Args;
3715   Args.push_back("clang");
3716   Args.append(command_line_args, command_line_args + num_command_line_args);
3717   return clang_parseTranslationUnit2FullArgv(
3718       CIdx, source_filename, Args.data(), Args.size(), unsaved_files,
3719       num_unsaved_files, options, out_TU);
3720 }
3721 
3722 enum CXErrorCode clang_parseTranslationUnit2FullArgv(
3723     CXIndex CIdx, const char *source_filename,
3724     const char *const *command_line_args, int num_command_line_args,
3725     struct CXUnsavedFile *unsaved_files, unsigned num_unsaved_files,
3726     unsigned options, CXTranslationUnit *out_TU) {
3727   LOG_FUNC_SECTION {
3728     *Log << source_filename << ": ";
3729     for (int i = 0; i != num_command_line_args; ++i)
3730       *Log << command_line_args[i] << " ";
3731   }
3732 
3733   if (num_unsaved_files && !unsaved_files)
3734     return CXError_InvalidArguments;
3735 
3736   CXErrorCode result = CXError_Failure;
3737   auto ParseTranslationUnitImpl = [=, &result] {
3738     noteBottomOfStack();
3739     result = clang_parseTranslationUnit_Impl(
3740         CIdx, source_filename, command_line_args, num_command_line_args,
3741         llvm::makeArrayRef(unsaved_files, num_unsaved_files), options, out_TU);
3742   };
3743 
3744   llvm::CrashRecoveryContext CRC;
3745 
3746   if (!RunSafely(CRC, ParseTranslationUnitImpl)) {
3747     fprintf(stderr, "libclang: crash detected during parsing: {\n");
3748     fprintf(stderr, "  'source_filename' : '%s'\n", source_filename);
3749     fprintf(stderr, "  'command_line_args' : [");
3750     for (int i = 0; i != num_command_line_args; ++i) {
3751       if (i)
3752         fprintf(stderr, ", ");
3753       fprintf(stderr, "'%s'", command_line_args[i]);
3754     }
3755     fprintf(stderr, "],\n");
3756     fprintf(stderr, "  'unsaved_files' : [");
3757     for (unsigned i = 0; i != num_unsaved_files; ++i) {
3758       if (i)
3759         fprintf(stderr, ", ");
3760       fprintf(stderr, "('%s', '...', %ld)", unsaved_files[i].Filename,
3761               unsaved_files[i].Length);
3762     }
3763     fprintf(stderr, "],\n");
3764     fprintf(stderr, "  'options' : %d,\n", options);
3765     fprintf(stderr, "}\n");
3766 
3767     return CXError_Crashed;
3768   } else if (getenv("LIBCLANG_RESOURCE_USAGE")) {
3769     if (CXTranslationUnit *TU = out_TU)
3770       PrintLibclangResourceUsage(*TU);
3771   }
3772 
3773   return result;
3774 }
3775 
3776 CXString clang_Type_getObjCEncoding(CXType CT) {
3777   CXTranslationUnit tu = static_cast<CXTranslationUnit>(CT.data[1]);
3778   ASTContext &Ctx = getASTUnit(tu)->getASTContext();
3779   std::string encoding;
3780   Ctx.getObjCEncodingForType(QualType::getFromOpaquePtr(CT.data[0]), encoding);
3781 
3782   return cxstring::createDup(encoding);
3783 }
3784 
3785 static const IdentifierInfo *getMacroIdentifier(CXCursor C) {
3786   if (C.kind == CXCursor_MacroDefinition) {
3787     if (const MacroDefinitionRecord *MDR = getCursorMacroDefinition(C))
3788       return MDR->getName();
3789   } else if (C.kind == CXCursor_MacroExpansion) {
3790     MacroExpansionCursor ME = getCursorMacroExpansion(C);
3791     return ME.getName();
3792   }
3793   return nullptr;
3794 }
3795 
3796 unsigned clang_Cursor_isMacroFunctionLike(CXCursor C) {
3797   const IdentifierInfo *II = getMacroIdentifier(C);
3798   if (!II) {
3799     return false;
3800   }
3801   ASTUnit *ASTU = getCursorASTUnit(C);
3802   Preprocessor &PP = ASTU->getPreprocessor();
3803   if (const MacroInfo *MI = PP.getMacroInfo(II))
3804     return MI->isFunctionLike();
3805   return false;
3806 }
3807 
3808 unsigned clang_Cursor_isMacroBuiltin(CXCursor C) {
3809   const IdentifierInfo *II = getMacroIdentifier(C);
3810   if (!II) {
3811     return false;
3812   }
3813   ASTUnit *ASTU = getCursorASTUnit(C);
3814   Preprocessor &PP = ASTU->getPreprocessor();
3815   if (const MacroInfo *MI = PP.getMacroInfo(II))
3816     return MI->isBuiltinMacro();
3817   return false;
3818 }
3819 
3820 unsigned clang_Cursor_isFunctionInlined(CXCursor C) {
3821   const Decl *D = getCursorDecl(C);
3822   const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D);
3823   if (!FD) {
3824     return false;
3825   }
3826   return FD->isInlined();
3827 }
3828 
3829 static StringLiteral *getCFSTR_value(CallExpr *callExpr) {
3830   if (callExpr->getNumArgs() != 1) {
3831     return nullptr;
3832   }
3833 
3834   StringLiteral *S = nullptr;
3835   auto *arg = callExpr->getArg(0);
3836   if (arg->getStmtClass() == Stmt::ImplicitCastExprClass) {
3837     ImplicitCastExpr *I = static_cast<ImplicitCastExpr *>(arg);
3838     auto *subExpr = I->getSubExprAsWritten();
3839 
3840     if (subExpr->getStmtClass() != Stmt::StringLiteralClass) {
3841       return nullptr;
3842     }
3843 
3844     S = static_cast<StringLiteral *>(I->getSubExprAsWritten());
3845   } else if (arg->getStmtClass() == Stmt::StringLiteralClass) {
3846     S = static_cast<StringLiteral *>(callExpr->getArg(0));
3847   } else {
3848     return nullptr;
3849   }
3850   return S;
3851 }
3852 
3853 struct ExprEvalResult {
3854   CXEvalResultKind EvalType;
3855   union {
3856     unsigned long long unsignedVal;
3857     long long intVal;
3858     double floatVal;
3859     char *stringVal;
3860   } EvalData;
3861   bool IsUnsignedInt;
3862   ~ExprEvalResult() {
3863     if (EvalType != CXEval_UnExposed && EvalType != CXEval_Float &&
3864         EvalType != CXEval_Int) {
3865       delete[] EvalData.stringVal;
3866     }
3867   }
3868 };
3869 
3870 void clang_EvalResult_dispose(CXEvalResult E) {
3871   delete static_cast<ExprEvalResult *>(E);
3872 }
3873 
3874 CXEvalResultKind clang_EvalResult_getKind(CXEvalResult E) {
3875   if (!E) {
3876     return CXEval_UnExposed;
3877   }
3878   return ((ExprEvalResult *)E)->EvalType;
3879 }
3880 
3881 int clang_EvalResult_getAsInt(CXEvalResult E) {
3882   return clang_EvalResult_getAsLongLong(E);
3883 }
3884 
3885 long long clang_EvalResult_getAsLongLong(CXEvalResult E) {
3886   if (!E) {
3887     return 0;
3888   }
3889   ExprEvalResult *Result = (ExprEvalResult *)E;
3890   if (Result->IsUnsignedInt)
3891     return Result->EvalData.unsignedVal;
3892   return Result->EvalData.intVal;
3893 }
3894 
3895 unsigned clang_EvalResult_isUnsignedInt(CXEvalResult E) {
3896   return ((ExprEvalResult *)E)->IsUnsignedInt;
3897 }
3898 
3899 unsigned long long clang_EvalResult_getAsUnsigned(CXEvalResult E) {
3900   if (!E) {
3901     return 0;
3902   }
3903 
3904   ExprEvalResult *Result = (ExprEvalResult *)E;
3905   if (Result->IsUnsignedInt)
3906     return Result->EvalData.unsignedVal;
3907   return Result->EvalData.intVal;
3908 }
3909 
3910 double clang_EvalResult_getAsDouble(CXEvalResult E) {
3911   if (!E) {
3912     return 0;
3913   }
3914   return ((ExprEvalResult *)E)->EvalData.floatVal;
3915 }
3916 
3917 const char *clang_EvalResult_getAsStr(CXEvalResult E) {
3918   if (!E) {
3919     return nullptr;
3920   }
3921   return ((ExprEvalResult *)E)->EvalData.stringVal;
3922 }
3923 
3924 static const ExprEvalResult *evaluateExpr(Expr *expr, CXCursor C) {
3925   Expr::EvalResult ER;
3926   ASTContext &ctx = getCursorContext(C);
3927   if (!expr)
3928     return nullptr;
3929 
3930   expr = expr->IgnoreParens();
3931   if (expr->isValueDependent())
3932     return nullptr;
3933   if (!expr->EvaluateAsRValue(ER, ctx))
3934     return nullptr;
3935 
3936   QualType rettype;
3937   CallExpr *callExpr;
3938   auto result = std::make_unique<ExprEvalResult>();
3939   result->EvalType = CXEval_UnExposed;
3940   result->IsUnsignedInt = false;
3941 
3942   if (ER.Val.isInt()) {
3943     result->EvalType = CXEval_Int;
3944 
3945     auto &val = ER.Val.getInt();
3946     if (val.isUnsigned()) {
3947       result->IsUnsignedInt = true;
3948       result->EvalData.unsignedVal = val.getZExtValue();
3949     } else {
3950       result->EvalData.intVal = val.getExtValue();
3951     }
3952 
3953     return result.release();
3954   }
3955 
3956   if (ER.Val.isFloat()) {
3957     llvm::SmallVector<char, 100> Buffer;
3958     ER.Val.getFloat().toString(Buffer);
3959     std::string floatStr(Buffer.data(), Buffer.size());
3960     result->EvalType = CXEval_Float;
3961     bool ignored;
3962     llvm::APFloat apFloat = ER.Val.getFloat();
3963     apFloat.convert(llvm::APFloat::IEEEdouble(),
3964                     llvm::APFloat::rmNearestTiesToEven, &ignored);
3965     result->EvalData.floatVal = apFloat.convertToDouble();
3966     return result.release();
3967   }
3968 
3969   if (expr->getStmtClass() == Stmt::ImplicitCastExprClass) {
3970     const ImplicitCastExpr *I = dyn_cast<ImplicitCastExpr>(expr);
3971     auto *subExpr = I->getSubExprAsWritten();
3972     if (subExpr->getStmtClass() == Stmt::StringLiteralClass ||
3973         subExpr->getStmtClass() == Stmt::ObjCStringLiteralClass) {
3974       const StringLiteral *StrE = nullptr;
3975       const ObjCStringLiteral *ObjCExpr;
3976       ObjCExpr = dyn_cast<ObjCStringLiteral>(subExpr);
3977 
3978       if (ObjCExpr) {
3979         StrE = ObjCExpr->getString();
3980         result->EvalType = CXEval_ObjCStrLiteral;
3981       } else {
3982         StrE = cast<StringLiteral>(I->getSubExprAsWritten());
3983         result->EvalType = CXEval_StrLiteral;
3984       }
3985 
3986       std::string strRef(StrE->getString().str());
3987       result->EvalData.stringVal = new char[strRef.size() + 1];
3988       strncpy((char *)result->EvalData.stringVal, strRef.c_str(),
3989               strRef.size());
3990       result->EvalData.stringVal[strRef.size()] = '\0';
3991       return result.release();
3992     }
3993   } else if (expr->getStmtClass() == Stmt::ObjCStringLiteralClass ||
3994              expr->getStmtClass() == Stmt::StringLiteralClass) {
3995     const StringLiteral *StrE = nullptr;
3996     const ObjCStringLiteral *ObjCExpr;
3997     ObjCExpr = dyn_cast<ObjCStringLiteral>(expr);
3998 
3999     if (ObjCExpr) {
4000       StrE = ObjCExpr->getString();
4001       result->EvalType = CXEval_ObjCStrLiteral;
4002     } else {
4003       StrE = cast<StringLiteral>(expr);
4004       result->EvalType = CXEval_StrLiteral;
4005     }
4006 
4007     std::string strRef(StrE->getString().str());
4008     result->EvalData.stringVal = new char[strRef.size() + 1];
4009     strncpy((char *)result->EvalData.stringVal, strRef.c_str(), strRef.size());
4010     result->EvalData.stringVal[strRef.size()] = '\0';
4011     return result.release();
4012   }
4013 
4014   if (expr->getStmtClass() == Stmt::CStyleCastExprClass) {
4015     CStyleCastExpr *CC = static_cast<CStyleCastExpr *>(expr);
4016 
4017     rettype = CC->getType();
4018     if (rettype.getAsString() == "CFStringRef" &&
4019         CC->getSubExpr()->getStmtClass() == Stmt::CallExprClass) {
4020 
4021       callExpr = static_cast<CallExpr *>(CC->getSubExpr());
4022       StringLiteral *S = getCFSTR_value(callExpr);
4023       if (S) {
4024         std::string strLiteral(S->getString().str());
4025         result->EvalType = CXEval_CFStr;
4026 
4027         result->EvalData.stringVal = new char[strLiteral.size() + 1];
4028         strncpy((char *)result->EvalData.stringVal, strLiteral.c_str(),
4029                 strLiteral.size());
4030         result->EvalData.stringVal[strLiteral.size()] = '\0';
4031         return result.release();
4032       }
4033     }
4034 
4035   } else if (expr->getStmtClass() == Stmt::CallExprClass) {
4036     callExpr = static_cast<CallExpr *>(expr);
4037     rettype = callExpr->getCallReturnType(ctx);
4038 
4039     if (rettype->isVectorType() || callExpr->getNumArgs() > 1)
4040       return nullptr;
4041 
4042     if (rettype->isIntegralType(ctx) || rettype->isRealFloatingType()) {
4043       if (callExpr->getNumArgs() == 1 &&
4044           !callExpr->getArg(0)->getType()->isIntegralType(ctx))
4045         return nullptr;
4046     } else if (rettype.getAsString() == "CFStringRef") {
4047 
4048       StringLiteral *S = getCFSTR_value(callExpr);
4049       if (S) {
4050         std::string strLiteral(S->getString().str());
4051         result->EvalType = CXEval_CFStr;
4052         result->EvalData.stringVal = new char[strLiteral.size() + 1];
4053         strncpy((char *)result->EvalData.stringVal, strLiteral.c_str(),
4054                 strLiteral.size());
4055         result->EvalData.stringVal[strLiteral.size()] = '\0';
4056         return result.release();
4057       }
4058     }
4059   } else if (expr->getStmtClass() == Stmt::DeclRefExprClass) {
4060     DeclRefExpr *D = static_cast<DeclRefExpr *>(expr);
4061     ValueDecl *V = D->getDecl();
4062     if (V->getKind() == Decl::Function) {
4063       std::string strName = V->getNameAsString();
4064       result->EvalType = CXEval_Other;
4065       result->EvalData.stringVal = new char[strName.size() + 1];
4066       strncpy(result->EvalData.stringVal, strName.c_str(), strName.size());
4067       result->EvalData.stringVal[strName.size()] = '\0';
4068       return result.release();
4069     }
4070   }
4071 
4072   return nullptr;
4073 }
4074 
4075 static const Expr *evaluateDeclExpr(const Decl *D) {
4076   if (!D)
4077     return nullptr;
4078   if (auto *Var = dyn_cast<VarDecl>(D))
4079     return Var->getInit();
4080   else if (auto *Field = dyn_cast<FieldDecl>(D))
4081     return Field->getInClassInitializer();
4082   return nullptr;
4083 }
4084 
4085 static const Expr *evaluateCompoundStmtExpr(const CompoundStmt *CS) {
4086   assert(CS && "invalid compound statement");
4087   for (auto *bodyIterator : CS->body()) {
4088     if (const auto *E = dyn_cast<Expr>(bodyIterator))
4089       return E;
4090   }
4091   return nullptr;
4092 }
4093 
4094 CXEvalResult clang_Cursor_Evaluate(CXCursor C) {
4095   const Expr *E = nullptr;
4096   if (clang_getCursorKind(C) == CXCursor_CompoundStmt)
4097     E = evaluateCompoundStmtExpr(cast<CompoundStmt>(getCursorStmt(C)));
4098   else if (clang_isDeclaration(C.kind))
4099     E = evaluateDeclExpr(getCursorDecl(C));
4100   else if (clang_isExpression(C.kind))
4101     E = getCursorExpr(C);
4102   if (E)
4103     return const_cast<CXEvalResult>(
4104         reinterpret_cast<const void *>(evaluateExpr(const_cast<Expr *>(E), C)));
4105   return nullptr;
4106 }
4107 
4108 unsigned clang_Cursor_hasAttrs(CXCursor C) {
4109   const Decl *D = getCursorDecl(C);
4110   if (!D) {
4111     return 0;
4112   }
4113 
4114   if (D->hasAttrs()) {
4115     return 1;
4116   }
4117 
4118   return 0;
4119 }
4120 unsigned clang_defaultSaveOptions(CXTranslationUnit TU) {
4121   return CXSaveTranslationUnit_None;
4122 }
4123 
4124 static CXSaveError clang_saveTranslationUnit_Impl(CXTranslationUnit TU,
4125                                                   const char *FileName,
4126                                                   unsigned options) {
4127   CIndexer *CXXIdx = TU->CIdx;
4128   if (CXXIdx->isOptEnabled(CXGlobalOpt_ThreadBackgroundPriorityForIndexing))
4129     setThreadBackgroundPriority();
4130 
4131   bool hadError = cxtu::getASTUnit(TU)->Save(FileName);
4132   return hadError ? CXSaveError_Unknown : CXSaveError_None;
4133 }
4134 
4135 int clang_saveTranslationUnit(CXTranslationUnit TU, const char *FileName,
4136                               unsigned options) {
4137   LOG_FUNC_SECTION { *Log << TU << ' ' << FileName; }
4138 
4139   if (isNotUsableTU(TU)) {
4140     LOG_BAD_TU(TU);
4141     return CXSaveError_InvalidTU;
4142   }
4143 
4144   ASTUnit *CXXUnit = cxtu::getASTUnit(TU);
4145   ASTUnit::ConcurrencyCheck Check(*CXXUnit);
4146   if (!CXXUnit->hasSema())
4147     return CXSaveError_InvalidTU;
4148 
4149   CXSaveError result;
4150   auto SaveTranslationUnitImpl = [=, &result]() {
4151     result = clang_saveTranslationUnit_Impl(TU, FileName, options);
4152   };
4153 
4154   if (!CXXUnit->getDiagnostics().hasUnrecoverableErrorOccurred()) {
4155     SaveTranslationUnitImpl();
4156 
4157     if (getenv("LIBCLANG_RESOURCE_USAGE"))
4158       PrintLibclangResourceUsage(TU);
4159 
4160     return result;
4161   }
4162 
4163   // We have an AST that has invalid nodes due to compiler errors.
4164   // Use a crash recovery thread for protection.
4165 
4166   llvm::CrashRecoveryContext CRC;
4167 
4168   if (!RunSafely(CRC, SaveTranslationUnitImpl)) {
4169     fprintf(stderr, "libclang: crash detected during AST saving: {\n");
4170     fprintf(stderr, "  'filename' : '%s'\n", FileName);
4171     fprintf(stderr, "  'options' : %d,\n", options);
4172     fprintf(stderr, "}\n");
4173 
4174     return CXSaveError_Unknown;
4175 
4176   } else if (getenv("LIBCLANG_RESOURCE_USAGE")) {
4177     PrintLibclangResourceUsage(TU);
4178   }
4179 
4180   return result;
4181 }
4182 
4183 void clang_disposeTranslationUnit(CXTranslationUnit CTUnit) {
4184   if (CTUnit) {
4185     // If the translation unit has been marked as unsafe to free, just discard
4186     // it.
4187     ASTUnit *Unit = cxtu::getASTUnit(CTUnit);
4188     if (Unit && Unit->isUnsafeToFree())
4189       return;
4190 
4191     delete cxtu::getASTUnit(CTUnit);
4192     delete CTUnit->StringPool;
4193     delete static_cast<CXDiagnosticSetImpl *>(CTUnit->Diagnostics);
4194     disposeOverridenCXCursorsPool(CTUnit->OverridenCursorsPool);
4195     delete CTUnit->CommentToXML;
4196     delete CTUnit;
4197   }
4198 }
4199 
4200 unsigned clang_suspendTranslationUnit(CXTranslationUnit CTUnit) {
4201   if (CTUnit) {
4202     ASTUnit *Unit = cxtu::getASTUnit(CTUnit);
4203 
4204     if (Unit && Unit->isUnsafeToFree())
4205       return false;
4206 
4207     Unit->ResetForParse();
4208     return true;
4209   }
4210 
4211   return false;
4212 }
4213 
4214 unsigned clang_defaultReparseOptions(CXTranslationUnit TU) {
4215   return CXReparse_None;
4216 }
4217 
4218 static CXErrorCode
4219 clang_reparseTranslationUnit_Impl(CXTranslationUnit TU,
4220                                   ArrayRef<CXUnsavedFile> unsaved_files,
4221                                   unsigned options) {
4222   // Check arguments.
4223   if (isNotUsableTU(TU)) {
4224     LOG_BAD_TU(TU);
4225     return CXError_InvalidArguments;
4226   }
4227 
4228   // Reset the associated diagnostics.
4229   delete static_cast<CXDiagnosticSetImpl *>(TU->Diagnostics);
4230   TU->Diagnostics = nullptr;
4231 
4232   CIndexer *CXXIdx = TU->CIdx;
4233   if (CXXIdx->isOptEnabled(CXGlobalOpt_ThreadBackgroundPriorityForEditing))
4234     setThreadBackgroundPriority();
4235 
4236   ASTUnit *CXXUnit = cxtu::getASTUnit(TU);
4237   ASTUnit::ConcurrencyCheck Check(*CXXUnit);
4238 
4239   std::unique_ptr<std::vector<ASTUnit::RemappedFile>> RemappedFiles(
4240       new std::vector<ASTUnit::RemappedFile>());
4241 
4242   // Recover resources if we crash before exiting this function.
4243   llvm::CrashRecoveryContextCleanupRegistrar<std::vector<ASTUnit::RemappedFile>>
4244       RemappedCleanup(RemappedFiles.get());
4245 
4246   for (auto &UF : unsaved_files) {
4247     std::unique_ptr<llvm::MemoryBuffer> MB =
4248         llvm::MemoryBuffer::getMemBufferCopy(getContents(UF), UF.Filename);
4249     RemappedFiles->push_back(std::make_pair(UF.Filename, MB.release()));
4250   }
4251 
4252   if (!CXXUnit->Reparse(CXXIdx->getPCHContainerOperations(),
4253                         *RemappedFiles.get()))
4254     return CXError_Success;
4255   if (isASTReadError(CXXUnit))
4256     return CXError_ASTReadError;
4257   return CXError_Failure;
4258 }
4259 
4260 int clang_reparseTranslationUnit(CXTranslationUnit TU,
4261                                  unsigned num_unsaved_files,
4262                                  struct CXUnsavedFile *unsaved_files,
4263                                  unsigned options) {
4264   LOG_FUNC_SECTION { *Log << TU; }
4265 
4266   if (num_unsaved_files && !unsaved_files)
4267     return CXError_InvalidArguments;
4268 
4269   CXErrorCode result;
4270   auto ReparseTranslationUnitImpl = [=, &result]() {
4271     result = clang_reparseTranslationUnit_Impl(
4272         TU, llvm::makeArrayRef(unsaved_files, num_unsaved_files), options);
4273   };
4274 
4275   llvm::CrashRecoveryContext CRC;
4276 
4277   if (!RunSafely(CRC, ReparseTranslationUnitImpl)) {
4278     fprintf(stderr, "libclang: crash detected during reparsing\n");
4279     cxtu::getASTUnit(TU)->setUnsafeToFree(true);
4280     return CXError_Crashed;
4281   } else if (getenv("LIBCLANG_RESOURCE_USAGE"))
4282     PrintLibclangResourceUsage(TU);
4283 
4284   return result;
4285 }
4286 
4287 CXString clang_getTranslationUnitSpelling(CXTranslationUnit CTUnit) {
4288   if (isNotUsableTU(CTUnit)) {
4289     LOG_BAD_TU(CTUnit);
4290     return cxstring::createEmpty();
4291   }
4292 
4293   ASTUnit *CXXUnit = cxtu::getASTUnit(CTUnit);
4294   return cxstring::createDup(CXXUnit->getOriginalSourceFileName());
4295 }
4296 
4297 CXCursor clang_getTranslationUnitCursor(CXTranslationUnit TU) {
4298   if (isNotUsableTU(TU)) {
4299     LOG_BAD_TU(TU);
4300     return clang_getNullCursor();
4301   }
4302 
4303   ASTUnit *CXXUnit = cxtu::getASTUnit(TU);
4304   return MakeCXCursor(CXXUnit->getASTContext().getTranslationUnitDecl(), TU);
4305 }
4306 
4307 CXTargetInfo clang_getTranslationUnitTargetInfo(CXTranslationUnit CTUnit) {
4308   if (isNotUsableTU(CTUnit)) {
4309     LOG_BAD_TU(CTUnit);
4310     return nullptr;
4311   }
4312 
4313   CXTargetInfoImpl *impl = new CXTargetInfoImpl();
4314   impl->TranslationUnit = CTUnit;
4315   return impl;
4316 }
4317 
4318 CXString clang_TargetInfo_getTriple(CXTargetInfo TargetInfo) {
4319   if (!TargetInfo)
4320     return cxstring::createEmpty();
4321 
4322   CXTranslationUnit CTUnit = TargetInfo->TranslationUnit;
4323   assert(!isNotUsableTU(CTUnit) &&
4324          "Unexpected unusable translation unit in TargetInfo");
4325 
4326   ASTUnit *CXXUnit = cxtu::getASTUnit(CTUnit);
4327   std::string Triple =
4328       CXXUnit->getASTContext().getTargetInfo().getTriple().normalize();
4329   return cxstring::createDup(Triple);
4330 }
4331 
4332 int clang_TargetInfo_getPointerWidth(CXTargetInfo TargetInfo) {
4333   if (!TargetInfo)
4334     return -1;
4335 
4336   CXTranslationUnit CTUnit = TargetInfo->TranslationUnit;
4337   assert(!isNotUsableTU(CTUnit) &&
4338          "Unexpected unusable translation unit in TargetInfo");
4339 
4340   ASTUnit *CXXUnit = cxtu::getASTUnit(CTUnit);
4341   return CXXUnit->getASTContext().getTargetInfo().getMaxPointerWidth();
4342 }
4343 
4344 void clang_TargetInfo_dispose(CXTargetInfo TargetInfo) {
4345   if (!TargetInfo)
4346     return;
4347 
4348   delete TargetInfo;
4349 }
4350 
4351 //===----------------------------------------------------------------------===//
4352 // CXFile Operations.
4353 //===----------------------------------------------------------------------===//
4354 
4355 CXString clang_getFileName(CXFile SFile) {
4356   if (!SFile)
4357     return cxstring::createNull();
4358 
4359   FileEntry *FEnt = static_cast<FileEntry *>(SFile);
4360   return cxstring::createRef(FEnt->getName());
4361 }
4362 
4363 time_t clang_getFileTime(CXFile SFile) {
4364   if (!SFile)
4365     return 0;
4366 
4367   FileEntry *FEnt = static_cast<FileEntry *>(SFile);
4368   return FEnt->getModificationTime();
4369 }
4370 
4371 CXFile clang_getFile(CXTranslationUnit TU, const char *file_name) {
4372   if (isNotUsableTU(TU)) {
4373     LOG_BAD_TU(TU);
4374     return nullptr;
4375   }
4376 
4377   ASTUnit *CXXUnit = cxtu::getASTUnit(TU);
4378 
4379   FileManager &FMgr = CXXUnit->getFileManager();
4380   auto File = FMgr.getFile(file_name);
4381   if (!File)
4382     return nullptr;
4383   return const_cast<FileEntry *>(*File);
4384 }
4385 
4386 const char *clang_getFileContents(CXTranslationUnit TU, CXFile file,
4387                                   size_t *size) {
4388   if (isNotUsableTU(TU)) {
4389     LOG_BAD_TU(TU);
4390     return nullptr;
4391   }
4392 
4393   const SourceManager &SM = cxtu::getASTUnit(TU)->getSourceManager();
4394   FileID fid = SM.translateFile(static_cast<FileEntry *>(file));
4395   llvm::Optional<llvm::MemoryBufferRef> buf = SM.getBufferOrNone(fid);
4396   if (!buf) {
4397     if (size)
4398       *size = 0;
4399     return nullptr;
4400   }
4401   if (size)
4402     *size = buf->getBufferSize();
4403   return buf->getBufferStart();
4404 }
4405 
4406 unsigned clang_isFileMultipleIncludeGuarded(CXTranslationUnit TU, CXFile file) {
4407   if (isNotUsableTU(TU)) {
4408     LOG_BAD_TU(TU);
4409     return 0;
4410   }
4411 
4412   if (!file)
4413     return 0;
4414 
4415   ASTUnit *CXXUnit = cxtu::getASTUnit(TU);
4416   FileEntry *FEnt = static_cast<FileEntry *>(file);
4417   return CXXUnit->getPreprocessor()
4418       .getHeaderSearchInfo()
4419       .isFileMultipleIncludeGuarded(FEnt);
4420 }
4421 
4422 int clang_getFileUniqueID(CXFile file, CXFileUniqueID *outID) {
4423   if (!file || !outID)
4424     return 1;
4425 
4426   FileEntry *FEnt = static_cast<FileEntry *>(file);
4427   const llvm::sys::fs::UniqueID &ID = FEnt->getUniqueID();
4428   outID->data[0] = ID.getDevice();
4429   outID->data[1] = ID.getFile();
4430   outID->data[2] = FEnt->getModificationTime();
4431   return 0;
4432 }
4433 
4434 int clang_File_isEqual(CXFile file1, CXFile file2) {
4435   if (file1 == file2)
4436     return true;
4437 
4438   if (!file1 || !file2)
4439     return false;
4440 
4441   FileEntry *FEnt1 = static_cast<FileEntry *>(file1);
4442   FileEntry *FEnt2 = static_cast<FileEntry *>(file2);
4443   return FEnt1->getUniqueID() == FEnt2->getUniqueID();
4444 }
4445 
4446 CXString clang_File_tryGetRealPathName(CXFile SFile) {
4447   if (!SFile)
4448     return cxstring::createNull();
4449 
4450   FileEntry *FEnt = static_cast<FileEntry *>(SFile);
4451   return cxstring::createRef(FEnt->tryGetRealPathName());
4452 }
4453 
4454 //===----------------------------------------------------------------------===//
4455 // CXCursor Operations.
4456 //===----------------------------------------------------------------------===//
4457 
4458 static const Decl *getDeclFromExpr(const Stmt *E) {
4459   if (const ImplicitCastExpr *CE = dyn_cast<ImplicitCastExpr>(E))
4460     return getDeclFromExpr(CE->getSubExpr());
4461 
4462   if (const DeclRefExpr *RefExpr = dyn_cast<DeclRefExpr>(E))
4463     return RefExpr->getDecl();
4464   if (const MemberExpr *ME = dyn_cast<MemberExpr>(E))
4465     return ME->getMemberDecl();
4466   if (const ObjCIvarRefExpr *RE = dyn_cast<ObjCIvarRefExpr>(E))
4467     return RE->getDecl();
4468   if (const ObjCPropertyRefExpr *PRE = dyn_cast<ObjCPropertyRefExpr>(E)) {
4469     if (PRE->isExplicitProperty())
4470       return PRE->getExplicitProperty();
4471     // It could be messaging both getter and setter as in:
4472     // ++myobj.myprop;
4473     // in which case prefer to associate the setter since it is less obvious
4474     // from inspecting the source that the setter is going to get called.
4475     if (PRE->isMessagingSetter())
4476       return PRE->getImplicitPropertySetter();
4477     return PRE->getImplicitPropertyGetter();
4478   }
4479   if (const PseudoObjectExpr *POE = dyn_cast<PseudoObjectExpr>(E))
4480     return getDeclFromExpr(POE->getSyntacticForm());
4481   if (const OpaqueValueExpr *OVE = dyn_cast<OpaqueValueExpr>(E))
4482     if (Expr *Src = OVE->getSourceExpr())
4483       return getDeclFromExpr(Src);
4484 
4485   if (const CallExpr *CE = dyn_cast<CallExpr>(E))
4486     return getDeclFromExpr(CE->getCallee());
4487   if (const CXXConstructExpr *CE = dyn_cast<CXXConstructExpr>(E))
4488     if (!CE->isElidable())
4489       return CE->getConstructor();
4490   if (const CXXInheritedCtorInitExpr *CE =
4491           dyn_cast<CXXInheritedCtorInitExpr>(E))
4492     return CE->getConstructor();
4493   if (const ObjCMessageExpr *OME = dyn_cast<ObjCMessageExpr>(E))
4494     return OME->getMethodDecl();
4495 
4496   if (const ObjCProtocolExpr *PE = dyn_cast<ObjCProtocolExpr>(E))
4497     return PE->getProtocol();
4498   if (const SubstNonTypeTemplateParmPackExpr *NTTP =
4499           dyn_cast<SubstNonTypeTemplateParmPackExpr>(E))
4500     return NTTP->getParameterPack();
4501   if (const SizeOfPackExpr *SizeOfPack = dyn_cast<SizeOfPackExpr>(E))
4502     if (isa<NonTypeTemplateParmDecl>(SizeOfPack->getPack()) ||
4503         isa<ParmVarDecl>(SizeOfPack->getPack()))
4504       return SizeOfPack->getPack();
4505 
4506   return nullptr;
4507 }
4508 
4509 static SourceLocation getLocationFromExpr(const Expr *E) {
4510   if (const ImplicitCastExpr *CE = dyn_cast<ImplicitCastExpr>(E))
4511     return getLocationFromExpr(CE->getSubExpr());
4512 
4513   if (const ObjCMessageExpr *Msg = dyn_cast<ObjCMessageExpr>(E))
4514     return /*FIXME:*/ Msg->getLeftLoc();
4515   if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E))
4516     return DRE->getLocation();
4517   if (const MemberExpr *Member = dyn_cast<MemberExpr>(E))
4518     return Member->getMemberLoc();
4519   if (const ObjCIvarRefExpr *Ivar = dyn_cast<ObjCIvarRefExpr>(E))
4520     return Ivar->getLocation();
4521   if (const SizeOfPackExpr *SizeOfPack = dyn_cast<SizeOfPackExpr>(E))
4522     return SizeOfPack->getPackLoc();
4523   if (const ObjCPropertyRefExpr *PropRef = dyn_cast<ObjCPropertyRefExpr>(E))
4524     return PropRef->getLocation();
4525 
4526   return E->getBeginLoc();
4527 }
4528 
4529 extern "C" {
4530 
4531 unsigned clang_visitChildren(CXCursor parent, CXCursorVisitor visitor,
4532                              CXClientData client_data) {
4533   CursorVisitor CursorVis(getCursorTU(parent), visitor, client_data,
4534                           /*VisitPreprocessorLast=*/false);
4535   return CursorVis.VisitChildren(parent);
4536 }
4537 
4538 #ifndef __has_feature
4539 #define __has_feature(x) 0
4540 #endif
4541 #if __has_feature(blocks)
4542 typedef enum CXChildVisitResult (^CXCursorVisitorBlock)(CXCursor cursor,
4543                                                         CXCursor parent);
4544 
4545 static enum CXChildVisitResult visitWithBlock(CXCursor cursor, CXCursor parent,
4546                                               CXClientData client_data) {
4547   CXCursorVisitorBlock block = (CXCursorVisitorBlock)client_data;
4548   return block(cursor, parent);
4549 }
4550 #else
4551 // If we are compiled with a compiler that doesn't have native blocks support,
4552 // define and call the block manually, so the
4553 typedef struct _CXChildVisitResult {
4554   void *isa;
4555   int flags;
4556   int reserved;
4557   enum CXChildVisitResult (*invoke)(struct _CXChildVisitResult *, CXCursor,
4558                                     CXCursor);
4559 } * CXCursorVisitorBlock;
4560 
4561 static enum CXChildVisitResult visitWithBlock(CXCursor cursor, CXCursor parent,
4562                                               CXClientData client_data) {
4563   CXCursorVisitorBlock block = (CXCursorVisitorBlock)client_data;
4564   return block->invoke(block, cursor, parent);
4565 }
4566 #endif
4567 
4568 unsigned clang_visitChildrenWithBlock(CXCursor parent,
4569                                       CXCursorVisitorBlock block) {
4570   return clang_visitChildren(parent, visitWithBlock, block);
4571 }
4572 
4573 static CXString getDeclSpelling(const Decl *D) {
4574   if (!D)
4575     return cxstring::createEmpty();
4576 
4577   const NamedDecl *ND = dyn_cast<NamedDecl>(D);
4578   if (!ND) {
4579     if (const ObjCPropertyImplDecl *PropImpl =
4580             dyn_cast<ObjCPropertyImplDecl>(D))
4581       if (ObjCPropertyDecl *Property = PropImpl->getPropertyDecl())
4582         return cxstring::createDup(Property->getIdentifier()->getName());
4583 
4584     if (const ImportDecl *ImportD = dyn_cast<ImportDecl>(D))
4585       if (Module *Mod = ImportD->getImportedModule())
4586         return cxstring::createDup(Mod->getFullModuleName());
4587 
4588     return cxstring::createEmpty();
4589   }
4590 
4591   if (const ObjCMethodDecl *OMD = dyn_cast<ObjCMethodDecl>(ND))
4592     return cxstring::createDup(OMD->getSelector().getAsString());
4593 
4594   if (const ObjCCategoryImplDecl *CIMP = dyn_cast<ObjCCategoryImplDecl>(ND))
4595     // No, this isn't the same as the code below. getIdentifier() is non-virtual
4596     // and returns different names. NamedDecl returns the class name and
4597     // ObjCCategoryImplDecl returns the category name.
4598     return cxstring::createRef(CIMP->getIdentifier()->getNameStart());
4599 
4600   if (isa<UsingDirectiveDecl>(D))
4601     return cxstring::createEmpty();
4602 
4603   SmallString<1024> S;
4604   llvm::raw_svector_ostream os(S);
4605   ND->printName(os);
4606 
4607   return cxstring::createDup(os.str());
4608 }
4609 
4610 CXString clang_getCursorSpelling(CXCursor C) {
4611   if (clang_isTranslationUnit(C.kind))
4612     return clang_getTranslationUnitSpelling(getCursorTU(C));
4613 
4614   if (clang_isReference(C.kind)) {
4615     switch (C.kind) {
4616     case CXCursor_ObjCSuperClassRef: {
4617       const ObjCInterfaceDecl *Super = getCursorObjCSuperClassRef(C).first;
4618       return cxstring::createRef(Super->getIdentifier()->getNameStart());
4619     }
4620     case CXCursor_ObjCClassRef: {
4621       const ObjCInterfaceDecl *Class = getCursorObjCClassRef(C).first;
4622       return cxstring::createRef(Class->getIdentifier()->getNameStart());
4623     }
4624     case CXCursor_ObjCProtocolRef: {
4625       const ObjCProtocolDecl *OID = getCursorObjCProtocolRef(C).first;
4626       assert(OID && "getCursorSpelling(): Missing protocol decl");
4627       return cxstring::createRef(OID->getIdentifier()->getNameStart());
4628     }
4629     case CXCursor_CXXBaseSpecifier: {
4630       const CXXBaseSpecifier *B = getCursorCXXBaseSpecifier(C);
4631       return cxstring::createDup(B->getType().getAsString());
4632     }
4633     case CXCursor_TypeRef: {
4634       const TypeDecl *Type = getCursorTypeRef(C).first;
4635       assert(Type && "Missing type decl");
4636 
4637       return cxstring::createDup(
4638           getCursorContext(C).getTypeDeclType(Type).getAsString());
4639     }
4640     case CXCursor_TemplateRef: {
4641       const TemplateDecl *Template = getCursorTemplateRef(C).first;
4642       assert(Template && "Missing template decl");
4643 
4644       return cxstring::createDup(Template->getNameAsString());
4645     }
4646 
4647     case CXCursor_NamespaceRef: {
4648       const NamedDecl *NS = getCursorNamespaceRef(C).first;
4649       assert(NS && "Missing namespace decl");
4650 
4651       return cxstring::createDup(NS->getNameAsString());
4652     }
4653 
4654     case CXCursor_MemberRef: {
4655       const FieldDecl *Field = getCursorMemberRef(C).first;
4656       assert(Field && "Missing member decl");
4657 
4658       return cxstring::createDup(Field->getNameAsString());
4659     }
4660 
4661     case CXCursor_LabelRef: {
4662       const LabelStmt *Label = getCursorLabelRef(C).first;
4663       assert(Label && "Missing label");
4664 
4665       return cxstring::createRef(Label->getName());
4666     }
4667 
4668     case CXCursor_OverloadedDeclRef: {
4669       OverloadedDeclRefStorage Storage = getCursorOverloadedDeclRef(C).first;
4670       if (const Decl *D = Storage.dyn_cast<const Decl *>()) {
4671         if (const NamedDecl *ND = dyn_cast<NamedDecl>(D))
4672           return cxstring::createDup(ND->getNameAsString());
4673         return cxstring::createEmpty();
4674       }
4675       if (const OverloadExpr *E = Storage.dyn_cast<const OverloadExpr *>())
4676         return cxstring::createDup(E->getName().getAsString());
4677       OverloadedTemplateStorage *Ovl =
4678           Storage.get<OverloadedTemplateStorage *>();
4679       if (Ovl->size() == 0)
4680         return cxstring::createEmpty();
4681       return cxstring::createDup((*Ovl->begin())->getNameAsString());
4682     }
4683 
4684     case CXCursor_VariableRef: {
4685       const VarDecl *Var = getCursorVariableRef(C).first;
4686       assert(Var && "Missing variable decl");
4687 
4688       return cxstring::createDup(Var->getNameAsString());
4689     }
4690 
4691     default:
4692       return cxstring::createRef("<not implemented>");
4693     }
4694   }
4695 
4696   if (clang_isExpression(C.kind)) {
4697     const Expr *E = getCursorExpr(C);
4698 
4699     if (C.kind == CXCursor_ObjCStringLiteral ||
4700         C.kind == CXCursor_StringLiteral) {
4701       const StringLiteral *SLit;
4702       if (const ObjCStringLiteral *OSL = dyn_cast<ObjCStringLiteral>(E)) {
4703         SLit = OSL->getString();
4704       } else {
4705         SLit = cast<StringLiteral>(E);
4706       }
4707       SmallString<256> Buf;
4708       llvm::raw_svector_ostream OS(Buf);
4709       SLit->outputString(OS);
4710       return cxstring::createDup(OS.str());
4711     }
4712 
4713     const Decl *D = getDeclFromExpr(getCursorExpr(C));
4714     if (D)
4715       return getDeclSpelling(D);
4716     return cxstring::createEmpty();
4717   }
4718 
4719   if (clang_isStatement(C.kind)) {
4720     const Stmt *S = getCursorStmt(C);
4721     if (const LabelStmt *Label = dyn_cast_or_null<LabelStmt>(S))
4722       return cxstring::createRef(Label->getName());
4723 
4724     return cxstring::createEmpty();
4725   }
4726 
4727   if (C.kind == CXCursor_MacroExpansion)
4728     return cxstring::createRef(
4729         getCursorMacroExpansion(C).getName()->getNameStart());
4730 
4731   if (C.kind == CXCursor_MacroDefinition)
4732     return cxstring::createRef(
4733         getCursorMacroDefinition(C)->getName()->getNameStart());
4734 
4735   if (C.kind == CXCursor_InclusionDirective)
4736     return cxstring::createDup(getCursorInclusionDirective(C)->getFileName());
4737 
4738   if (clang_isDeclaration(C.kind))
4739     return getDeclSpelling(getCursorDecl(C));
4740 
4741   if (C.kind == CXCursor_AnnotateAttr) {
4742     const AnnotateAttr *AA = cast<AnnotateAttr>(cxcursor::getCursorAttr(C));
4743     return cxstring::createDup(AA->getAnnotation());
4744   }
4745 
4746   if (C.kind == CXCursor_AsmLabelAttr) {
4747     const AsmLabelAttr *AA = cast<AsmLabelAttr>(cxcursor::getCursorAttr(C));
4748     return cxstring::createDup(AA->getLabel());
4749   }
4750 
4751   if (C.kind == CXCursor_PackedAttr) {
4752     return cxstring::createRef("packed");
4753   }
4754 
4755   if (C.kind == CXCursor_VisibilityAttr) {
4756     const VisibilityAttr *AA = cast<VisibilityAttr>(cxcursor::getCursorAttr(C));
4757     switch (AA->getVisibility()) {
4758     case VisibilityAttr::VisibilityType::Default:
4759       return cxstring::createRef("default");
4760     case VisibilityAttr::VisibilityType::Hidden:
4761       return cxstring::createRef("hidden");
4762     case VisibilityAttr::VisibilityType::Protected:
4763       return cxstring::createRef("protected");
4764     }
4765     llvm_unreachable("unknown visibility type");
4766   }
4767 
4768   return cxstring::createEmpty();
4769 }
4770 
4771 CXSourceRange clang_Cursor_getSpellingNameRange(CXCursor C, unsigned pieceIndex,
4772                                                 unsigned options) {
4773   if (clang_Cursor_isNull(C))
4774     return clang_getNullRange();
4775 
4776   ASTContext &Ctx = getCursorContext(C);
4777 
4778   if (clang_isStatement(C.kind)) {
4779     const Stmt *S = getCursorStmt(C);
4780     if (const LabelStmt *Label = dyn_cast_or_null<LabelStmt>(S)) {
4781       if (pieceIndex > 0)
4782         return clang_getNullRange();
4783       return cxloc::translateSourceRange(Ctx, Label->getIdentLoc());
4784     }
4785 
4786     return clang_getNullRange();
4787   }
4788 
4789   if (C.kind == CXCursor_ObjCMessageExpr) {
4790     if (const ObjCMessageExpr *ME =
4791             dyn_cast_or_null<ObjCMessageExpr>(getCursorExpr(C))) {
4792       if (pieceIndex >= ME->getNumSelectorLocs())
4793         return clang_getNullRange();
4794       return cxloc::translateSourceRange(Ctx, ME->getSelectorLoc(pieceIndex));
4795     }
4796   }
4797 
4798   if (C.kind == CXCursor_ObjCInstanceMethodDecl ||
4799       C.kind == CXCursor_ObjCClassMethodDecl) {
4800     if (const ObjCMethodDecl *MD =
4801             dyn_cast_or_null<ObjCMethodDecl>(getCursorDecl(C))) {
4802       if (pieceIndex >= MD->getNumSelectorLocs())
4803         return clang_getNullRange();
4804       return cxloc::translateSourceRange(Ctx, MD->getSelectorLoc(pieceIndex));
4805     }
4806   }
4807 
4808   if (C.kind == CXCursor_ObjCCategoryDecl ||
4809       C.kind == CXCursor_ObjCCategoryImplDecl) {
4810     if (pieceIndex > 0)
4811       return clang_getNullRange();
4812     if (const ObjCCategoryDecl *CD =
4813             dyn_cast_or_null<ObjCCategoryDecl>(getCursorDecl(C)))
4814       return cxloc::translateSourceRange(Ctx, CD->getCategoryNameLoc());
4815     if (const ObjCCategoryImplDecl *CID =
4816             dyn_cast_or_null<ObjCCategoryImplDecl>(getCursorDecl(C)))
4817       return cxloc::translateSourceRange(Ctx, CID->getCategoryNameLoc());
4818   }
4819 
4820   if (C.kind == CXCursor_ModuleImportDecl) {
4821     if (pieceIndex > 0)
4822       return clang_getNullRange();
4823     if (const ImportDecl *ImportD =
4824             dyn_cast_or_null<ImportDecl>(getCursorDecl(C))) {
4825       ArrayRef<SourceLocation> Locs = ImportD->getIdentifierLocs();
4826       if (!Locs.empty())
4827         return cxloc::translateSourceRange(
4828             Ctx, SourceRange(Locs.front(), Locs.back()));
4829     }
4830     return clang_getNullRange();
4831   }
4832 
4833   if (C.kind == CXCursor_CXXMethod || C.kind == CXCursor_Destructor ||
4834       C.kind == CXCursor_ConversionFunction ||
4835       C.kind == CXCursor_FunctionDecl) {
4836     if (pieceIndex > 0)
4837       return clang_getNullRange();
4838     if (const FunctionDecl *FD =
4839             dyn_cast_or_null<FunctionDecl>(getCursorDecl(C))) {
4840       DeclarationNameInfo FunctionName = FD->getNameInfo();
4841       return cxloc::translateSourceRange(Ctx, FunctionName.getSourceRange());
4842     }
4843     return clang_getNullRange();
4844   }
4845 
4846   // FIXME: A CXCursor_InclusionDirective should give the location of the
4847   // filename, but we don't keep track of this.
4848 
4849   // FIXME: A CXCursor_AnnotateAttr should give the location of the annotation
4850   // but we don't keep track of this.
4851 
4852   // FIXME: A CXCursor_AsmLabelAttr should give the location of the label
4853   // but we don't keep track of this.
4854 
4855   // Default handling, give the location of the cursor.
4856 
4857   if (pieceIndex > 0)
4858     return clang_getNullRange();
4859 
4860   CXSourceLocation CXLoc = clang_getCursorLocation(C);
4861   SourceLocation Loc = cxloc::translateSourceLocation(CXLoc);
4862   return cxloc::translateSourceRange(Ctx, Loc);
4863 }
4864 
4865 CXString clang_Cursor_getMangling(CXCursor C) {
4866   if (clang_isInvalid(C.kind) || !clang_isDeclaration(C.kind))
4867     return cxstring::createEmpty();
4868 
4869   // Mangling only works for functions and variables.
4870   const Decl *D = getCursorDecl(C);
4871   if (!D || !(isa<FunctionDecl>(D) || isa<VarDecl>(D)))
4872     return cxstring::createEmpty();
4873 
4874   ASTContext &Ctx = D->getASTContext();
4875   ASTNameGenerator ASTNameGen(Ctx);
4876   return cxstring::createDup(ASTNameGen.getName(D));
4877 }
4878 
4879 CXStringSet *clang_Cursor_getCXXManglings(CXCursor C) {
4880   if (clang_isInvalid(C.kind) || !clang_isDeclaration(C.kind))
4881     return nullptr;
4882 
4883   const Decl *D = getCursorDecl(C);
4884   if (!(isa<CXXRecordDecl>(D) || isa<CXXMethodDecl>(D)))
4885     return nullptr;
4886 
4887   ASTContext &Ctx = D->getASTContext();
4888   ASTNameGenerator ASTNameGen(Ctx);
4889   std::vector<std::string> Manglings = ASTNameGen.getAllManglings(D);
4890   return cxstring::createSet(Manglings);
4891 }
4892 
4893 CXStringSet *clang_Cursor_getObjCManglings(CXCursor C) {
4894   if (clang_isInvalid(C.kind) || !clang_isDeclaration(C.kind))
4895     return nullptr;
4896 
4897   const Decl *D = getCursorDecl(C);
4898   if (!(isa<ObjCInterfaceDecl>(D) || isa<ObjCImplementationDecl>(D)))
4899     return nullptr;
4900 
4901   ASTContext &Ctx = D->getASTContext();
4902   ASTNameGenerator ASTNameGen(Ctx);
4903   std::vector<std::string> Manglings = ASTNameGen.getAllManglings(D);
4904   return cxstring::createSet(Manglings);
4905 }
4906 
4907 CXPrintingPolicy clang_getCursorPrintingPolicy(CXCursor C) {
4908   if (clang_Cursor_isNull(C))
4909     return 0;
4910   return new PrintingPolicy(getCursorContext(C).getPrintingPolicy());
4911 }
4912 
4913 void clang_PrintingPolicy_dispose(CXPrintingPolicy Policy) {
4914   if (Policy)
4915     delete static_cast<PrintingPolicy *>(Policy);
4916 }
4917 
4918 unsigned
4919 clang_PrintingPolicy_getProperty(CXPrintingPolicy Policy,
4920                                  enum CXPrintingPolicyProperty Property) {
4921   if (!Policy)
4922     return 0;
4923 
4924   PrintingPolicy *P = static_cast<PrintingPolicy *>(Policy);
4925   switch (Property) {
4926   case CXPrintingPolicy_Indentation:
4927     return P->Indentation;
4928   case CXPrintingPolicy_SuppressSpecifiers:
4929     return P->SuppressSpecifiers;
4930   case CXPrintingPolicy_SuppressTagKeyword:
4931     return P->SuppressTagKeyword;
4932   case CXPrintingPolicy_IncludeTagDefinition:
4933     return P->IncludeTagDefinition;
4934   case CXPrintingPolicy_SuppressScope:
4935     return P->SuppressScope;
4936   case CXPrintingPolicy_SuppressUnwrittenScope:
4937     return P->SuppressUnwrittenScope;
4938   case CXPrintingPolicy_SuppressInitializers:
4939     return P->SuppressInitializers;
4940   case CXPrintingPolicy_ConstantArraySizeAsWritten:
4941     return P->ConstantArraySizeAsWritten;
4942   case CXPrintingPolicy_AnonymousTagLocations:
4943     return P->AnonymousTagLocations;
4944   case CXPrintingPolicy_SuppressStrongLifetime:
4945     return P->SuppressStrongLifetime;
4946   case CXPrintingPolicy_SuppressLifetimeQualifiers:
4947     return P->SuppressLifetimeQualifiers;
4948   case CXPrintingPolicy_SuppressTemplateArgsInCXXConstructors:
4949     return P->SuppressTemplateArgsInCXXConstructors;
4950   case CXPrintingPolicy_Bool:
4951     return P->Bool;
4952   case CXPrintingPolicy_Restrict:
4953     return P->Restrict;
4954   case CXPrintingPolicy_Alignof:
4955     return P->Alignof;
4956   case CXPrintingPolicy_UnderscoreAlignof:
4957     return P->UnderscoreAlignof;
4958   case CXPrintingPolicy_UseVoidForZeroParams:
4959     return P->UseVoidForZeroParams;
4960   case CXPrintingPolicy_TerseOutput:
4961     return P->TerseOutput;
4962   case CXPrintingPolicy_PolishForDeclaration:
4963     return P->PolishForDeclaration;
4964   case CXPrintingPolicy_Half:
4965     return P->Half;
4966   case CXPrintingPolicy_MSWChar:
4967     return P->MSWChar;
4968   case CXPrintingPolicy_IncludeNewlines:
4969     return P->IncludeNewlines;
4970   case CXPrintingPolicy_MSVCFormatting:
4971     return P->MSVCFormatting;
4972   case CXPrintingPolicy_ConstantsAsWritten:
4973     return P->ConstantsAsWritten;
4974   case CXPrintingPolicy_SuppressImplicitBase:
4975     return P->SuppressImplicitBase;
4976   case CXPrintingPolicy_FullyQualifiedName:
4977     return P->FullyQualifiedName;
4978   }
4979 
4980   assert(false && "Invalid CXPrintingPolicyProperty");
4981   return 0;
4982 }
4983 
4984 void clang_PrintingPolicy_setProperty(CXPrintingPolicy Policy,
4985                                       enum CXPrintingPolicyProperty Property,
4986                                       unsigned Value) {
4987   if (!Policy)
4988     return;
4989 
4990   PrintingPolicy *P = static_cast<PrintingPolicy *>(Policy);
4991   switch (Property) {
4992   case CXPrintingPolicy_Indentation:
4993     P->Indentation = Value;
4994     return;
4995   case CXPrintingPolicy_SuppressSpecifiers:
4996     P->SuppressSpecifiers = Value;
4997     return;
4998   case CXPrintingPolicy_SuppressTagKeyword:
4999     P->SuppressTagKeyword = Value;
5000     return;
5001   case CXPrintingPolicy_IncludeTagDefinition:
5002     P->IncludeTagDefinition = Value;
5003     return;
5004   case CXPrintingPolicy_SuppressScope:
5005     P->SuppressScope = Value;
5006     return;
5007   case CXPrintingPolicy_SuppressUnwrittenScope:
5008     P->SuppressUnwrittenScope = Value;
5009     return;
5010   case CXPrintingPolicy_SuppressInitializers:
5011     P->SuppressInitializers = Value;
5012     return;
5013   case CXPrintingPolicy_ConstantArraySizeAsWritten:
5014     P->ConstantArraySizeAsWritten = Value;
5015     return;
5016   case CXPrintingPolicy_AnonymousTagLocations:
5017     P->AnonymousTagLocations = Value;
5018     return;
5019   case CXPrintingPolicy_SuppressStrongLifetime:
5020     P->SuppressStrongLifetime = Value;
5021     return;
5022   case CXPrintingPolicy_SuppressLifetimeQualifiers:
5023     P->SuppressLifetimeQualifiers = Value;
5024     return;
5025   case CXPrintingPolicy_SuppressTemplateArgsInCXXConstructors:
5026     P->SuppressTemplateArgsInCXXConstructors = Value;
5027     return;
5028   case CXPrintingPolicy_Bool:
5029     P->Bool = Value;
5030     return;
5031   case CXPrintingPolicy_Restrict:
5032     P->Restrict = Value;
5033     return;
5034   case CXPrintingPolicy_Alignof:
5035     P->Alignof = Value;
5036     return;
5037   case CXPrintingPolicy_UnderscoreAlignof:
5038     P->UnderscoreAlignof = Value;
5039     return;
5040   case CXPrintingPolicy_UseVoidForZeroParams:
5041     P->UseVoidForZeroParams = Value;
5042     return;
5043   case CXPrintingPolicy_TerseOutput:
5044     P->TerseOutput = Value;
5045     return;
5046   case CXPrintingPolicy_PolishForDeclaration:
5047     P->PolishForDeclaration = Value;
5048     return;
5049   case CXPrintingPolicy_Half:
5050     P->Half = Value;
5051     return;
5052   case CXPrintingPolicy_MSWChar:
5053     P->MSWChar = Value;
5054     return;
5055   case CXPrintingPolicy_IncludeNewlines:
5056     P->IncludeNewlines = Value;
5057     return;
5058   case CXPrintingPolicy_MSVCFormatting:
5059     P->MSVCFormatting = Value;
5060     return;
5061   case CXPrintingPolicy_ConstantsAsWritten:
5062     P->ConstantsAsWritten = Value;
5063     return;
5064   case CXPrintingPolicy_SuppressImplicitBase:
5065     P->SuppressImplicitBase = Value;
5066     return;
5067   case CXPrintingPolicy_FullyQualifiedName:
5068     P->FullyQualifiedName = Value;
5069     return;
5070   }
5071 
5072   assert(false && "Invalid CXPrintingPolicyProperty");
5073 }
5074 
5075 CXString clang_getCursorPrettyPrinted(CXCursor C, CXPrintingPolicy cxPolicy) {
5076   if (clang_Cursor_isNull(C))
5077     return cxstring::createEmpty();
5078 
5079   if (clang_isDeclaration(C.kind)) {
5080     const Decl *D = getCursorDecl(C);
5081     if (!D)
5082       return cxstring::createEmpty();
5083 
5084     SmallString<128> Str;
5085     llvm::raw_svector_ostream OS(Str);
5086     PrintingPolicy *UserPolicy = static_cast<PrintingPolicy *>(cxPolicy);
5087     D->print(OS, UserPolicy ? *UserPolicy
5088                             : getCursorContext(C).getPrintingPolicy());
5089 
5090     return cxstring::createDup(OS.str());
5091   }
5092 
5093   return cxstring::createEmpty();
5094 }
5095 
5096 CXString clang_getCursorDisplayName(CXCursor C) {
5097   if (!clang_isDeclaration(C.kind))
5098     return clang_getCursorSpelling(C);
5099 
5100   const Decl *D = getCursorDecl(C);
5101   if (!D)
5102     return cxstring::createEmpty();
5103 
5104   PrintingPolicy Policy = getCursorContext(C).getPrintingPolicy();
5105   if (const FunctionTemplateDecl *FunTmpl = dyn_cast<FunctionTemplateDecl>(D))
5106     D = FunTmpl->getTemplatedDecl();
5107 
5108   if (const FunctionDecl *Function = dyn_cast<FunctionDecl>(D)) {
5109     SmallString<64> Str;
5110     llvm::raw_svector_ostream OS(Str);
5111     OS << *Function;
5112     if (Function->getPrimaryTemplate())
5113       OS << "<>";
5114     OS << "(";
5115     for (unsigned I = 0, N = Function->getNumParams(); I != N; ++I) {
5116       if (I)
5117         OS << ", ";
5118       OS << Function->getParamDecl(I)->getType().getAsString(Policy);
5119     }
5120 
5121     if (Function->isVariadic()) {
5122       if (Function->getNumParams())
5123         OS << ", ";
5124       OS << "...";
5125     }
5126     OS << ")";
5127     return cxstring::createDup(OS.str());
5128   }
5129 
5130   if (const ClassTemplateDecl *ClassTemplate = dyn_cast<ClassTemplateDecl>(D)) {
5131     SmallString<64> Str;
5132     llvm::raw_svector_ostream OS(Str);
5133     OS << *ClassTemplate;
5134     OS << "<";
5135     TemplateParameterList *Params = ClassTemplate->getTemplateParameters();
5136     for (unsigned I = 0, N = Params->size(); I != N; ++I) {
5137       if (I)
5138         OS << ", ";
5139 
5140       NamedDecl *Param = Params->getParam(I);
5141       if (Param->getIdentifier()) {
5142         OS << Param->getIdentifier()->getName();
5143         continue;
5144       }
5145 
5146       // There is no parameter name, which makes this tricky. Try to come up
5147       // with something useful that isn't too long.
5148       if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(Param))
5149         if (const auto *TC = TTP->getTypeConstraint()) {
5150           TC->getConceptNameInfo().printName(OS, Policy);
5151           if (TC->hasExplicitTemplateArgs())
5152             OS << "<...>";
5153         } else
5154           OS << (TTP->wasDeclaredWithTypename() ? "typename" : "class");
5155       else if (NonTypeTemplateParmDecl *NTTP =
5156                    dyn_cast<NonTypeTemplateParmDecl>(Param))
5157         OS << NTTP->getType().getAsString(Policy);
5158       else
5159         OS << "template<...> class";
5160     }
5161 
5162     OS << ">";
5163     return cxstring::createDup(OS.str());
5164   }
5165 
5166   if (const ClassTemplateSpecializationDecl *ClassSpec =
5167           dyn_cast<ClassTemplateSpecializationDecl>(D)) {
5168     // If the type was explicitly written, use that.
5169     if (TypeSourceInfo *TSInfo = ClassSpec->getTypeAsWritten())
5170       return cxstring::createDup(TSInfo->getType().getAsString(Policy));
5171 
5172     SmallString<128> Str;
5173     llvm::raw_svector_ostream OS(Str);
5174     OS << *ClassSpec;
5175     printTemplateArgumentList(OS, ClassSpec->getTemplateArgs().asArray(),
5176                               Policy);
5177     return cxstring::createDup(OS.str());
5178   }
5179 
5180   return clang_getCursorSpelling(C);
5181 }
5182 
5183 CXString clang_getCursorKindSpelling(enum CXCursorKind Kind) {
5184   switch (Kind) {
5185   case CXCursor_FunctionDecl:
5186     return cxstring::createRef("FunctionDecl");
5187   case CXCursor_TypedefDecl:
5188     return cxstring::createRef("TypedefDecl");
5189   case CXCursor_EnumDecl:
5190     return cxstring::createRef("EnumDecl");
5191   case CXCursor_EnumConstantDecl:
5192     return cxstring::createRef("EnumConstantDecl");
5193   case CXCursor_StructDecl:
5194     return cxstring::createRef("StructDecl");
5195   case CXCursor_UnionDecl:
5196     return cxstring::createRef("UnionDecl");
5197   case CXCursor_ClassDecl:
5198     return cxstring::createRef("ClassDecl");
5199   case CXCursor_FieldDecl:
5200     return cxstring::createRef("FieldDecl");
5201   case CXCursor_VarDecl:
5202     return cxstring::createRef("VarDecl");
5203   case CXCursor_ParmDecl:
5204     return cxstring::createRef("ParmDecl");
5205   case CXCursor_ObjCInterfaceDecl:
5206     return cxstring::createRef("ObjCInterfaceDecl");
5207   case CXCursor_ObjCCategoryDecl:
5208     return cxstring::createRef("ObjCCategoryDecl");
5209   case CXCursor_ObjCProtocolDecl:
5210     return cxstring::createRef("ObjCProtocolDecl");
5211   case CXCursor_ObjCPropertyDecl:
5212     return cxstring::createRef("ObjCPropertyDecl");
5213   case CXCursor_ObjCIvarDecl:
5214     return cxstring::createRef("ObjCIvarDecl");
5215   case CXCursor_ObjCInstanceMethodDecl:
5216     return cxstring::createRef("ObjCInstanceMethodDecl");
5217   case CXCursor_ObjCClassMethodDecl:
5218     return cxstring::createRef("ObjCClassMethodDecl");
5219   case CXCursor_ObjCImplementationDecl:
5220     return cxstring::createRef("ObjCImplementationDecl");
5221   case CXCursor_ObjCCategoryImplDecl:
5222     return cxstring::createRef("ObjCCategoryImplDecl");
5223   case CXCursor_CXXMethod:
5224     return cxstring::createRef("CXXMethod");
5225   case CXCursor_UnexposedDecl:
5226     return cxstring::createRef("UnexposedDecl");
5227   case CXCursor_ObjCSuperClassRef:
5228     return cxstring::createRef("ObjCSuperClassRef");
5229   case CXCursor_ObjCProtocolRef:
5230     return cxstring::createRef("ObjCProtocolRef");
5231   case CXCursor_ObjCClassRef:
5232     return cxstring::createRef("ObjCClassRef");
5233   case CXCursor_TypeRef:
5234     return cxstring::createRef("TypeRef");
5235   case CXCursor_TemplateRef:
5236     return cxstring::createRef("TemplateRef");
5237   case CXCursor_NamespaceRef:
5238     return cxstring::createRef("NamespaceRef");
5239   case CXCursor_MemberRef:
5240     return cxstring::createRef("MemberRef");
5241   case CXCursor_LabelRef:
5242     return cxstring::createRef("LabelRef");
5243   case CXCursor_OverloadedDeclRef:
5244     return cxstring::createRef("OverloadedDeclRef");
5245   case CXCursor_VariableRef:
5246     return cxstring::createRef("VariableRef");
5247   case CXCursor_IntegerLiteral:
5248     return cxstring::createRef("IntegerLiteral");
5249   case CXCursor_FixedPointLiteral:
5250     return cxstring::createRef("FixedPointLiteral");
5251   case CXCursor_FloatingLiteral:
5252     return cxstring::createRef("FloatingLiteral");
5253   case CXCursor_ImaginaryLiteral:
5254     return cxstring::createRef("ImaginaryLiteral");
5255   case CXCursor_StringLiteral:
5256     return cxstring::createRef("StringLiteral");
5257   case CXCursor_CharacterLiteral:
5258     return cxstring::createRef("CharacterLiteral");
5259   case CXCursor_ParenExpr:
5260     return cxstring::createRef("ParenExpr");
5261   case CXCursor_UnaryOperator:
5262     return cxstring::createRef("UnaryOperator");
5263   case CXCursor_ArraySubscriptExpr:
5264     return cxstring::createRef("ArraySubscriptExpr");
5265   case CXCursor_OMPArraySectionExpr:
5266     return cxstring::createRef("OMPArraySectionExpr");
5267   case CXCursor_OMPArrayShapingExpr:
5268     return cxstring::createRef("OMPArrayShapingExpr");
5269   case CXCursor_OMPIteratorExpr:
5270     return cxstring::createRef("OMPIteratorExpr");
5271   case CXCursor_BinaryOperator:
5272     return cxstring::createRef("BinaryOperator");
5273   case CXCursor_CompoundAssignOperator:
5274     return cxstring::createRef("CompoundAssignOperator");
5275   case CXCursor_ConditionalOperator:
5276     return cxstring::createRef("ConditionalOperator");
5277   case CXCursor_CStyleCastExpr:
5278     return cxstring::createRef("CStyleCastExpr");
5279   case CXCursor_CompoundLiteralExpr:
5280     return cxstring::createRef("CompoundLiteralExpr");
5281   case CXCursor_InitListExpr:
5282     return cxstring::createRef("InitListExpr");
5283   case CXCursor_AddrLabelExpr:
5284     return cxstring::createRef("AddrLabelExpr");
5285   case CXCursor_StmtExpr:
5286     return cxstring::createRef("StmtExpr");
5287   case CXCursor_GenericSelectionExpr:
5288     return cxstring::createRef("GenericSelectionExpr");
5289   case CXCursor_GNUNullExpr:
5290     return cxstring::createRef("GNUNullExpr");
5291   case CXCursor_CXXStaticCastExpr:
5292     return cxstring::createRef("CXXStaticCastExpr");
5293   case CXCursor_CXXDynamicCastExpr:
5294     return cxstring::createRef("CXXDynamicCastExpr");
5295   case CXCursor_CXXReinterpretCastExpr:
5296     return cxstring::createRef("CXXReinterpretCastExpr");
5297   case CXCursor_CXXConstCastExpr:
5298     return cxstring::createRef("CXXConstCastExpr");
5299   case CXCursor_CXXFunctionalCastExpr:
5300     return cxstring::createRef("CXXFunctionalCastExpr");
5301   case CXCursor_CXXAddrspaceCastExpr:
5302     return cxstring::createRef("CXXAddrspaceCastExpr");
5303   case CXCursor_CXXTypeidExpr:
5304     return cxstring::createRef("CXXTypeidExpr");
5305   case CXCursor_CXXBoolLiteralExpr:
5306     return cxstring::createRef("CXXBoolLiteralExpr");
5307   case CXCursor_CXXNullPtrLiteralExpr:
5308     return cxstring::createRef("CXXNullPtrLiteralExpr");
5309   case CXCursor_CXXThisExpr:
5310     return cxstring::createRef("CXXThisExpr");
5311   case CXCursor_CXXThrowExpr:
5312     return cxstring::createRef("CXXThrowExpr");
5313   case CXCursor_CXXNewExpr:
5314     return cxstring::createRef("CXXNewExpr");
5315   case CXCursor_CXXDeleteExpr:
5316     return cxstring::createRef("CXXDeleteExpr");
5317   case CXCursor_UnaryExpr:
5318     return cxstring::createRef("UnaryExpr");
5319   case CXCursor_ObjCStringLiteral:
5320     return cxstring::createRef("ObjCStringLiteral");
5321   case CXCursor_ObjCBoolLiteralExpr:
5322     return cxstring::createRef("ObjCBoolLiteralExpr");
5323   case CXCursor_ObjCAvailabilityCheckExpr:
5324     return cxstring::createRef("ObjCAvailabilityCheckExpr");
5325   case CXCursor_ObjCSelfExpr:
5326     return cxstring::createRef("ObjCSelfExpr");
5327   case CXCursor_ObjCEncodeExpr:
5328     return cxstring::createRef("ObjCEncodeExpr");
5329   case CXCursor_ObjCSelectorExpr:
5330     return cxstring::createRef("ObjCSelectorExpr");
5331   case CXCursor_ObjCProtocolExpr:
5332     return cxstring::createRef("ObjCProtocolExpr");
5333   case CXCursor_ObjCBridgedCastExpr:
5334     return cxstring::createRef("ObjCBridgedCastExpr");
5335   case CXCursor_BlockExpr:
5336     return cxstring::createRef("BlockExpr");
5337   case CXCursor_PackExpansionExpr:
5338     return cxstring::createRef("PackExpansionExpr");
5339   case CXCursor_SizeOfPackExpr:
5340     return cxstring::createRef("SizeOfPackExpr");
5341   case CXCursor_LambdaExpr:
5342     return cxstring::createRef("LambdaExpr");
5343   case CXCursor_UnexposedExpr:
5344     return cxstring::createRef("UnexposedExpr");
5345   case CXCursor_DeclRefExpr:
5346     return cxstring::createRef("DeclRefExpr");
5347   case CXCursor_MemberRefExpr:
5348     return cxstring::createRef("MemberRefExpr");
5349   case CXCursor_CallExpr:
5350     return cxstring::createRef("CallExpr");
5351   case CXCursor_ObjCMessageExpr:
5352     return cxstring::createRef("ObjCMessageExpr");
5353   case CXCursor_BuiltinBitCastExpr:
5354     return cxstring::createRef("BuiltinBitCastExpr");
5355   case CXCursor_UnexposedStmt:
5356     return cxstring::createRef("UnexposedStmt");
5357   case CXCursor_DeclStmt:
5358     return cxstring::createRef("DeclStmt");
5359   case CXCursor_LabelStmt:
5360     return cxstring::createRef("LabelStmt");
5361   case CXCursor_CompoundStmt:
5362     return cxstring::createRef("CompoundStmt");
5363   case CXCursor_CaseStmt:
5364     return cxstring::createRef("CaseStmt");
5365   case CXCursor_DefaultStmt:
5366     return cxstring::createRef("DefaultStmt");
5367   case CXCursor_IfStmt:
5368     return cxstring::createRef("IfStmt");
5369   case CXCursor_SwitchStmt:
5370     return cxstring::createRef("SwitchStmt");
5371   case CXCursor_WhileStmt:
5372     return cxstring::createRef("WhileStmt");
5373   case CXCursor_DoStmt:
5374     return cxstring::createRef("DoStmt");
5375   case CXCursor_ForStmt:
5376     return cxstring::createRef("ForStmt");
5377   case CXCursor_GotoStmt:
5378     return cxstring::createRef("GotoStmt");
5379   case CXCursor_IndirectGotoStmt:
5380     return cxstring::createRef("IndirectGotoStmt");
5381   case CXCursor_ContinueStmt:
5382     return cxstring::createRef("ContinueStmt");
5383   case CXCursor_BreakStmt:
5384     return cxstring::createRef("BreakStmt");
5385   case CXCursor_ReturnStmt:
5386     return cxstring::createRef("ReturnStmt");
5387   case CXCursor_GCCAsmStmt:
5388     return cxstring::createRef("GCCAsmStmt");
5389   case CXCursor_MSAsmStmt:
5390     return cxstring::createRef("MSAsmStmt");
5391   case CXCursor_ObjCAtTryStmt:
5392     return cxstring::createRef("ObjCAtTryStmt");
5393   case CXCursor_ObjCAtCatchStmt:
5394     return cxstring::createRef("ObjCAtCatchStmt");
5395   case CXCursor_ObjCAtFinallyStmt:
5396     return cxstring::createRef("ObjCAtFinallyStmt");
5397   case CXCursor_ObjCAtThrowStmt:
5398     return cxstring::createRef("ObjCAtThrowStmt");
5399   case CXCursor_ObjCAtSynchronizedStmt:
5400     return cxstring::createRef("ObjCAtSynchronizedStmt");
5401   case CXCursor_ObjCAutoreleasePoolStmt:
5402     return cxstring::createRef("ObjCAutoreleasePoolStmt");
5403   case CXCursor_ObjCForCollectionStmt:
5404     return cxstring::createRef("ObjCForCollectionStmt");
5405   case CXCursor_CXXCatchStmt:
5406     return cxstring::createRef("CXXCatchStmt");
5407   case CXCursor_CXXTryStmt:
5408     return cxstring::createRef("CXXTryStmt");
5409   case CXCursor_CXXForRangeStmt:
5410     return cxstring::createRef("CXXForRangeStmt");
5411   case CXCursor_SEHTryStmt:
5412     return cxstring::createRef("SEHTryStmt");
5413   case CXCursor_SEHExceptStmt:
5414     return cxstring::createRef("SEHExceptStmt");
5415   case CXCursor_SEHFinallyStmt:
5416     return cxstring::createRef("SEHFinallyStmt");
5417   case CXCursor_SEHLeaveStmt:
5418     return cxstring::createRef("SEHLeaveStmt");
5419   case CXCursor_NullStmt:
5420     return cxstring::createRef("NullStmt");
5421   case CXCursor_InvalidFile:
5422     return cxstring::createRef("InvalidFile");
5423   case CXCursor_InvalidCode:
5424     return cxstring::createRef("InvalidCode");
5425   case CXCursor_NoDeclFound:
5426     return cxstring::createRef("NoDeclFound");
5427   case CXCursor_NotImplemented:
5428     return cxstring::createRef("NotImplemented");
5429   case CXCursor_TranslationUnit:
5430     return cxstring::createRef("TranslationUnit");
5431   case CXCursor_UnexposedAttr:
5432     return cxstring::createRef("UnexposedAttr");
5433   case CXCursor_IBActionAttr:
5434     return cxstring::createRef("attribute(ibaction)");
5435   case CXCursor_IBOutletAttr:
5436     return cxstring::createRef("attribute(iboutlet)");
5437   case CXCursor_IBOutletCollectionAttr:
5438     return cxstring::createRef("attribute(iboutletcollection)");
5439   case CXCursor_CXXFinalAttr:
5440     return cxstring::createRef("attribute(final)");
5441   case CXCursor_CXXOverrideAttr:
5442     return cxstring::createRef("attribute(override)");
5443   case CXCursor_AnnotateAttr:
5444     return cxstring::createRef("attribute(annotate)");
5445   case CXCursor_AsmLabelAttr:
5446     return cxstring::createRef("asm label");
5447   case CXCursor_PackedAttr:
5448     return cxstring::createRef("attribute(packed)");
5449   case CXCursor_PureAttr:
5450     return cxstring::createRef("attribute(pure)");
5451   case CXCursor_ConstAttr:
5452     return cxstring::createRef("attribute(const)");
5453   case CXCursor_NoDuplicateAttr:
5454     return cxstring::createRef("attribute(noduplicate)");
5455   case CXCursor_CUDAConstantAttr:
5456     return cxstring::createRef("attribute(constant)");
5457   case CXCursor_CUDADeviceAttr:
5458     return cxstring::createRef("attribute(device)");
5459   case CXCursor_CUDAGlobalAttr:
5460     return cxstring::createRef("attribute(global)");
5461   case CXCursor_CUDAHostAttr:
5462     return cxstring::createRef("attribute(host)");
5463   case CXCursor_CUDASharedAttr:
5464     return cxstring::createRef("attribute(shared)");
5465   case CXCursor_VisibilityAttr:
5466     return cxstring::createRef("attribute(visibility)");
5467   case CXCursor_DLLExport:
5468     return cxstring::createRef("attribute(dllexport)");
5469   case CXCursor_DLLImport:
5470     return cxstring::createRef("attribute(dllimport)");
5471   case CXCursor_NSReturnsRetained:
5472     return cxstring::createRef("attribute(ns_returns_retained)");
5473   case CXCursor_NSReturnsNotRetained:
5474     return cxstring::createRef("attribute(ns_returns_not_retained)");
5475   case CXCursor_NSReturnsAutoreleased:
5476     return cxstring::createRef("attribute(ns_returns_autoreleased)");
5477   case CXCursor_NSConsumesSelf:
5478     return cxstring::createRef("attribute(ns_consumes_self)");
5479   case CXCursor_NSConsumed:
5480     return cxstring::createRef("attribute(ns_consumed)");
5481   case CXCursor_ObjCException:
5482     return cxstring::createRef("attribute(objc_exception)");
5483   case CXCursor_ObjCNSObject:
5484     return cxstring::createRef("attribute(NSObject)");
5485   case CXCursor_ObjCIndependentClass:
5486     return cxstring::createRef("attribute(objc_independent_class)");
5487   case CXCursor_ObjCPreciseLifetime:
5488     return cxstring::createRef("attribute(objc_precise_lifetime)");
5489   case CXCursor_ObjCReturnsInnerPointer:
5490     return cxstring::createRef("attribute(objc_returns_inner_pointer)");
5491   case CXCursor_ObjCRequiresSuper:
5492     return cxstring::createRef("attribute(objc_requires_super)");
5493   case CXCursor_ObjCRootClass:
5494     return cxstring::createRef("attribute(objc_root_class)");
5495   case CXCursor_ObjCSubclassingRestricted:
5496     return cxstring::createRef("attribute(objc_subclassing_restricted)");
5497   case CXCursor_ObjCExplicitProtocolImpl:
5498     return cxstring::createRef(
5499         "attribute(objc_protocol_requires_explicit_implementation)");
5500   case CXCursor_ObjCDesignatedInitializer:
5501     return cxstring::createRef("attribute(objc_designated_initializer)");
5502   case CXCursor_ObjCRuntimeVisible:
5503     return cxstring::createRef("attribute(objc_runtime_visible)");
5504   case CXCursor_ObjCBoxable:
5505     return cxstring::createRef("attribute(objc_boxable)");
5506   case CXCursor_FlagEnum:
5507     return cxstring::createRef("attribute(flag_enum)");
5508   case CXCursor_PreprocessingDirective:
5509     return cxstring::createRef("preprocessing directive");
5510   case CXCursor_MacroDefinition:
5511     return cxstring::createRef("macro definition");
5512   case CXCursor_MacroExpansion:
5513     return cxstring::createRef("macro expansion");
5514   case CXCursor_InclusionDirective:
5515     return cxstring::createRef("inclusion directive");
5516   case CXCursor_Namespace:
5517     return cxstring::createRef("Namespace");
5518   case CXCursor_LinkageSpec:
5519     return cxstring::createRef("LinkageSpec");
5520   case CXCursor_CXXBaseSpecifier:
5521     return cxstring::createRef("C++ base class specifier");
5522   case CXCursor_Constructor:
5523     return cxstring::createRef("CXXConstructor");
5524   case CXCursor_Destructor:
5525     return cxstring::createRef("CXXDestructor");
5526   case CXCursor_ConversionFunction:
5527     return cxstring::createRef("CXXConversion");
5528   case CXCursor_TemplateTypeParameter:
5529     return cxstring::createRef("TemplateTypeParameter");
5530   case CXCursor_NonTypeTemplateParameter:
5531     return cxstring::createRef("NonTypeTemplateParameter");
5532   case CXCursor_TemplateTemplateParameter:
5533     return cxstring::createRef("TemplateTemplateParameter");
5534   case CXCursor_FunctionTemplate:
5535     return cxstring::createRef("FunctionTemplate");
5536   case CXCursor_ClassTemplate:
5537     return cxstring::createRef("ClassTemplate");
5538   case CXCursor_ClassTemplatePartialSpecialization:
5539     return cxstring::createRef("ClassTemplatePartialSpecialization");
5540   case CXCursor_NamespaceAlias:
5541     return cxstring::createRef("NamespaceAlias");
5542   case CXCursor_UsingDirective:
5543     return cxstring::createRef("UsingDirective");
5544   case CXCursor_UsingDeclaration:
5545     return cxstring::createRef("UsingDeclaration");
5546   case CXCursor_TypeAliasDecl:
5547     return cxstring::createRef("TypeAliasDecl");
5548   case CXCursor_ObjCSynthesizeDecl:
5549     return cxstring::createRef("ObjCSynthesizeDecl");
5550   case CXCursor_ObjCDynamicDecl:
5551     return cxstring::createRef("ObjCDynamicDecl");
5552   case CXCursor_CXXAccessSpecifier:
5553     return cxstring::createRef("CXXAccessSpecifier");
5554   case CXCursor_ModuleImportDecl:
5555     return cxstring::createRef("ModuleImport");
5556   case CXCursor_OMPCanonicalLoop:
5557     return cxstring::createRef("OMPCanonicalLoop");
5558   case CXCursor_OMPParallelDirective:
5559     return cxstring::createRef("OMPParallelDirective");
5560   case CXCursor_OMPSimdDirective:
5561     return cxstring::createRef("OMPSimdDirective");
5562   case CXCursor_OMPTileDirective:
5563     return cxstring::createRef("OMPTileDirective");
5564   case CXCursor_OMPForDirective:
5565     return cxstring::createRef("OMPForDirective");
5566   case CXCursor_OMPForSimdDirective:
5567     return cxstring::createRef("OMPForSimdDirective");
5568   case CXCursor_OMPSectionsDirective:
5569     return cxstring::createRef("OMPSectionsDirective");
5570   case CXCursor_OMPSectionDirective:
5571     return cxstring::createRef("OMPSectionDirective");
5572   case CXCursor_OMPSingleDirective:
5573     return cxstring::createRef("OMPSingleDirective");
5574   case CXCursor_OMPMasterDirective:
5575     return cxstring::createRef("OMPMasterDirective");
5576   case CXCursor_OMPCriticalDirective:
5577     return cxstring::createRef("OMPCriticalDirective");
5578   case CXCursor_OMPParallelForDirective:
5579     return cxstring::createRef("OMPParallelForDirective");
5580   case CXCursor_OMPParallelForSimdDirective:
5581     return cxstring::createRef("OMPParallelForSimdDirective");
5582   case CXCursor_OMPParallelMasterDirective:
5583     return cxstring::createRef("OMPParallelMasterDirective");
5584   case CXCursor_OMPParallelSectionsDirective:
5585     return cxstring::createRef("OMPParallelSectionsDirective");
5586   case CXCursor_OMPTaskDirective:
5587     return cxstring::createRef("OMPTaskDirective");
5588   case CXCursor_OMPTaskyieldDirective:
5589     return cxstring::createRef("OMPTaskyieldDirective");
5590   case CXCursor_OMPBarrierDirective:
5591     return cxstring::createRef("OMPBarrierDirective");
5592   case CXCursor_OMPTaskwaitDirective:
5593     return cxstring::createRef("OMPTaskwaitDirective");
5594   case CXCursor_OMPTaskgroupDirective:
5595     return cxstring::createRef("OMPTaskgroupDirective");
5596   case CXCursor_OMPFlushDirective:
5597     return cxstring::createRef("OMPFlushDirective");
5598   case CXCursor_OMPDepobjDirective:
5599     return cxstring::createRef("OMPDepobjDirective");
5600   case CXCursor_OMPScanDirective:
5601     return cxstring::createRef("OMPScanDirective");
5602   case CXCursor_OMPOrderedDirective:
5603     return cxstring::createRef("OMPOrderedDirective");
5604   case CXCursor_OMPAtomicDirective:
5605     return cxstring::createRef("OMPAtomicDirective");
5606   case CXCursor_OMPTargetDirective:
5607     return cxstring::createRef("OMPTargetDirective");
5608   case CXCursor_OMPTargetDataDirective:
5609     return cxstring::createRef("OMPTargetDataDirective");
5610   case CXCursor_OMPTargetEnterDataDirective:
5611     return cxstring::createRef("OMPTargetEnterDataDirective");
5612   case CXCursor_OMPTargetExitDataDirective:
5613     return cxstring::createRef("OMPTargetExitDataDirective");
5614   case CXCursor_OMPTargetParallelDirective:
5615     return cxstring::createRef("OMPTargetParallelDirective");
5616   case CXCursor_OMPTargetParallelForDirective:
5617     return cxstring::createRef("OMPTargetParallelForDirective");
5618   case CXCursor_OMPTargetUpdateDirective:
5619     return cxstring::createRef("OMPTargetUpdateDirective");
5620   case CXCursor_OMPTeamsDirective:
5621     return cxstring::createRef("OMPTeamsDirective");
5622   case CXCursor_OMPCancellationPointDirective:
5623     return cxstring::createRef("OMPCancellationPointDirective");
5624   case CXCursor_OMPCancelDirective:
5625     return cxstring::createRef("OMPCancelDirective");
5626   case CXCursor_OMPTaskLoopDirective:
5627     return cxstring::createRef("OMPTaskLoopDirective");
5628   case CXCursor_OMPTaskLoopSimdDirective:
5629     return cxstring::createRef("OMPTaskLoopSimdDirective");
5630   case CXCursor_OMPMasterTaskLoopDirective:
5631     return cxstring::createRef("OMPMasterTaskLoopDirective");
5632   case CXCursor_OMPMasterTaskLoopSimdDirective:
5633     return cxstring::createRef("OMPMasterTaskLoopSimdDirective");
5634   case CXCursor_OMPParallelMasterTaskLoopDirective:
5635     return cxstring::createRef("OMPParallelMasterTaskLoopDirective");
5636   case CXCursor_OMPParallelMasterTaskLoopSimdDirective:
5637     return cxstring::createRef("OMPParallelMasterTaskLoopSimdDirective");
5638   case CXCursor_OMPDistributeDirective:
5639     return cxstring::createRef("OMPDistributeDirective");
5640   case CXCursor_OMPDistributeParallelForDirective:
5641     return cxstring::createRef("OMPDistributeParallelForDirective");
5642   case CXCursor_OMPDistributeParallelForSimdDirective:
5643     return cxstring::createRef("OMPDistributeParallelForSimdDirective");
5644   case CXCursor_OMPDistributeSimdDirective:
5645     return cxstring::createRef("OMPDistributeSimdDirective");
5646   case CXCursor_OMPTargetParallelForSimdDirective:
5647     return cxstring::createRef("OMPTargetParallelForSimdDirective");
5648   case CXCursor_OMPTargetSimdDirective:
5649     return cxstring::createRef("OMPTargetSimdDirective");
5650   case CXCursor_OMPTeamsDistributeDirective:
5651     return cxstring::createRef("OMPTeamsDistributeDirective");
5652   case CXCursor_OMPTeamsDistributeSimdDirective:
5653     return cxstring::createRef("OMPTeamsDistributeSimdDirective");
5654   case CXCursor_OMPTeamsDistributeParallelForSimdDirective:
5655     return cxstring::createRef("OMPTeamsDistributeParallelForSimdDirective");
5656   case CXCursor_OMPTeamsDistributeParallelForDirective:
5657     return cxstring::createRef("OMPTeamsDistributeParallelForDirective");
5658   case CXCursor_OMPTargetTeamsDirective:
5659     return cxstring::createRef("OMPTargetTeamsDirective");
5660   case CXCursor_OMPTargetTeamsDistributeDirective:
5661     return cxstring::createRef("OMPTargetTeamsDistributeDirective");
5662   case CXCursor_OMPTargetTeamsDistributeParallelForDirective:
5663     return cxstring::createRef("OMPTargetTeamsDistributeParallelForDirective");
5664   case CXCursor_OMPTargetTeamsDistributeParallelForSimdDirective:
5665     return cxstring::createRef(
5666         "OMPTargetTeamsDistributeParallelForSimdDirective");
5667   case CXCursor_OMPTargetTeamsDistributeSimdDirective:
5668     return cxstring::createRef("OMPTargetTeamsDistributeSimdDirective");
5669   case CXCursor_OMPInteropDirective:
5670     return cxstring::createRef("OMPInteropDirective");
5671   case CXCursor_OverloadCandidate:
5672     return cxstring::createRef("OverloadCandidate");
5673   case CXCursor_TypeAliasTemplateDecl:
5674     return cxstring::createRef("TypeAliasTemplateDecl");
5675   case CXCursor_StaticAssert:
5676     return cxstring::createRef("StaticAssert");
5677   case CXCursor_FriendDecl:
5678     return cxstring::createRef("FriendDecl");
5679   case CXCursor_ConvergentAttr:
5680     return cxstring::createRef("attribute(convergent)");
5681   case CXCursor_WarnUnusedAttr:
5682     return cxstring::createRef("attribute(warn_unused)");
5683   case CXCursor_WarnUnusedResultAttr:
5684     return cxstring::createRef("attribute(warn_unused_result)");
5685   case CXCursor_AlignedAttr:
5686     return cxstring::createRef("attribute(aligned)");
5687   }
5688 
5689   llvm_unreachable("Unhandled CXCursorKind");
5690 }
5691 
5692 struct GetCursorData {
5693   SourceLocation TokenBeginLoc;
5694   bool PointsAtMacroArgExpansion;
5695   bool VisitedObjCPropertyImplDecl;
5696   SourceLocation VisitedDeclaratorDeclStartLoc;
5697   CXCursor &BestCursor;
5698 
5699   GetCursorData(SourceManager &SM, SourceLocation tokenBegin,
5700                 CXCursor &outputCursor)
5701       : TokenBeginLoc(tokenBegin), BestCursor(outputCursor) {
5702     PointsAtMacroArgExpansion = SM.isMacroArgExpansion(tokenBegin);
5703     VisitedObjCPropertyImplDecl = false;
5704   }
5705 };
5706 
5707 static enum CXChildVisitResult
5708 GetCursorVisitor(CXCursor cursor, CXCursor parent, CXClientData client_data) {
5709   GetCursorData *Data = static_cast<GetCursorData *>(client_data);
5710   CXCursor *BestCursor = &Data->BestCursor;
5711 
5712   // If we point inside a macro argument we should provide info of what the
5713   // token is so use the actual cursor, don't replace it with a macro expansion
5714   // cursor.
5715   if (cursor.kind == CXCursor_MacroExpansion && Data->PointsAtMacroArgExpansion)
5716     return CXChildVisit_Recurse;
5717 
5718   if (clang_isDeclaration(cursor.kind)) {
5719     // Avoid having the implicit methods override the property decls.
5720     if (const ObjCMethodDecl *MD =
5721             dyn_cast_or_null<ObjCMethodDecl>(getCursorDecl(cursor))) {
5722       if (MD->isImplicit())
5723         return CXChildVisit_Break;
5724 
5725     } else if (const ObjCInterfaceDecl *ID =
5726                    dyn_cast_or_null<ObjCInterfaceDecl>(getCursorDecl(cursor))) {
5727       // Check that when we have multiple @class references in the same line,
5728       // that later ones do not override the previous ones.
5729       // If we have:
5730       // @class Foo, Bar;
5731       // source ranges for both start at '@', so 'Bar' will end up overriding
5732       // 'Foo' even though the cursor location was at 'Foo'.
5733       if (BestCursor->kind == CXCursor_ObjCInterfaceDecl ||
5734           BestCursor->kind == CXCursor_ObjCClassRef)
5735         if (const ObjCInterfaceDecl *PrevID =
5736                 dyn_cast_or_null<ObjCInterfaceDecl>(
5737                     getCursorDecl(*BestCursor))) {
5738           if (PrevID != ID && !PrevID->isThisDeclarationADefinition() &&
5739               !ID->isThisDeclarationADefinition())
5740             return CXChildVisit_Break;
5741         }
5742 
5743     } else if (const DeclaratorDecl *DD =
5744                    dyn_cast_or_null<DeclaratorDecl>(getCursorDecl(cursor))) {
5745       SourceLocation StartLoc = DD->getSourceRange().getBegin();
5746       // Check that when we have multiple declarators in the same line,
5747       // that later ones do not override the previous ones.
5748       // If we have:
5749       // int Foo, Bar;
5750       // source ranges for both start at 'int', so 'Bar' will end up overriding
5751       // 'Foo' even though the cursor location was at 'Foo'.
5752       if (Data->VisitedDeclaratorDeclStartLoc == StartLoc)
5753         return CXChildVisit_Break;
5754       Data->VisitedDeclaratorDeclStartLoc = StartLoc;
5755 
5756     } else if (const ObjCPropertyImplDecl *PropImp =
5757                    dyn_cast_or_null<ObjCPropertyImplDecl>(
5758                        getCursorDecl(cursor))) {
5759       (void)PropImp;
5760       // Check that when we have multiple @synthesize in the same line,
5761       // that later ones do not override the previous ones.
5762       // If we have:
5763       // @synthesize Foo, Bar;
5764       // source ranges for both start at '@', so 'Bar' will end up overriding
5765       // 'Foo' even though the cursor location was at 'Foo'.
5766       if (Data->VisitedObjCPropertyImplDecl)
5767         return CXChildVisit_Break;
5768       Data->VisitedObjCPropertyImplDecl = true;
5769     }
5770   }
5771 
5772   if (clang_isExpression(cursor.kind) &&
5773       clang_isDeclaration(BestCursor->kind)) {
5774     if (const Decl *D = getCursorDecl(*BestCursor)) {
5775       // Avoid having the cursor of an expression replace the declaration cursor
5776       // when the expression source range overlaps the declaration range.
5777       // This can happen for C++ constructor expressions whose range generally
5778       // include the variable declaration, e.g.:
5779       //  MyCXXClass foo; // Make sure pointing at 'foo' returns a VarDecl
5780       //  cursor.
5781       if (D->getLocation().isValid() && Data->TokenBeginLoc.isValid() &&
5782           D->getLocation() == Data->TokenBeginLoc)
5783         return CXChildVisit_Break;
5784     }
5785   }
5786 
5787   // If our current best cursor is the construction of a temporary object,
5788   // don't replace that cursor with a type reference, because we want
5789   // clang_getCursor() to point at the constructor.
5790   if (clang_isExpression(BestCursor->kind) &&
5791       isa<CXXTemporaryObjectExpr>(getCursorExpr(*BestCursor)) &&
5792       cursor.kind == CXCursor_TypeRef) {
5793     // Keep the cursor pointing at CXXTemporaryObjectExpr but also mark it
5794     // as having the actual point on the type reference.
5795     *BestCursor = getTypeRefedCallExprCursor(*BestCursor);
5796     return CXChildVisit_Recurse;
5797   }
5798 
5799   // If we already have an Objective-C superclass reference, don't
5800   // update it further.
5801   if (BestCursor->kind == CXCursor_ObjCSuperClassRef)
5802     return CXChildVisit_Break;
5803 
5804   *BestCursor = cursor;
5805   return CXChildVisit_Recurse;
5806 }
5807 
5808 CXCursor clang_getCursor(CXTranslationUnit TU, CXSourceLocation Loc) {
5809   if (isNotUsableTU(TU)) {
5810     LOG_BAD_TU(TU);
5811     return clang_getNullCursor();
5812   }
5813 
5814   ASTUnit *CXXUnit = cxtu::getASTUnit(TU);
5815   ASTUnit::ConcurrencyCheck Check(*CXXUnit);
5816 
5817   SourceLocation SLoc = cxloc::translateSourceLocation(Loc);
5818   CXCursor Result = cxcursor::getCursor(TU, SLoc);
5819 
5820   LOG_FUNC_SECTION {
5821     CXFile SearchFile;
5822     unsigned SearchLine, SearchColumn;
5823     CXFile ResultFile;
5824     unsigned ResultLine, ResultColumn;
5825     CXString SearchFileName, ResultFileName, KindSpelling, USR;
5826     const char *IsDef = clang_isCursorDefinition(Result) ? " (Definition)" : "";
5827     CXSourceLocation ResultLoc = clang_getCursorLocation(Result);
5828 
5829     clang_getFileLocation(Loc, &SearchFile, &SearchLine, &SearchColumn,
5830                           nullptr);
5831     clang_getFileLocation(ResultLoc, &ResultFile, &ResultLine, &ResultColumn,
5832                           nullptr);
5833     SearchFileName = clang_getFileName(SearchFile);
5834     ResultFileName = clang_getFileName(ResultFile);
5835     KindSpelling = clang_getCursorKindSpelling(Result.kind);
5836     USR = clang_getCursorUSR(Result);
5837     *Log << llvm::format("(%s:%d:%d) = %s", clang_getCString(SearchFileName),
5838                          SearchLine, SearchColumn,
5839                          clang_getCString(KindSpelling))
5840          << llvm::format("(%s:%d:%d):%s%s", clang_getCString(ResultFileName),
5841                          ResultLine, ResultColumn, clang_getCString(USR),
5842                          IsDef);
5843     clang_disposeString(SearchFileName);
5844     clang_disposeString(ResultFileName);
5845     clang_disposeString(KindSpelling);
5846     clang_disposeString(USR);
5847 
5848     CXCursor Definition = clang_getCursorDefinition(Result);
5849     if (!clang_equalCursors(Definition, clang_getNullCursor())) {
5850       CXSourceLocation DefinitionLoc = clang_getCursorLocation(Definition);
5851       CXString DefinitionKindSpelling =
5852           clang_getCursorKindSpelling(Definition.kind);
5853       CXFile DefinitionFile;
5854       unsigned DefinitionLine, DefinitionColumn;
5855       clang_getFileLocation(DefinitionLoc, &DefinitionFile, &DefinitionLine,
5856                             &DefinitionColumn, nullptr);
5857       CXString DefinitionFileName = clang_getFileName(DefinitionFile);
5858       *Log << llvm::format("  -> %s(%s:%d:%d)",
5859                            clang_getCString(DefinitionKindSpelling),
5860                            clang_getCString(DefinitionFileName), DefinitionLine,
5861                            DefinitionColumn);
5862       clang_disposeString(DefinitionFileName);
5863       clang_disposeString(DefinitionKindSpelling);
5864     }
5865   }
5866 
5867   return Result;
5868 }
5869 
5870 CXCursor clang_getNullCursor(void) {
5871   return MakeCXCursorInvalid(CXCursor_InvalidFile);
5872 }
5873 
5874 unsigned clang_equalCursors(CXCursor X, CXCursor Y) {
5875   // Clear out the "FirstInDeclGroup" part in a declaration cursor, since we
5876   // can't set consistently. For example, when visiting a DeclStmt we will set
5877   // it but we don't set it on the result of clang_getCursorDefinition for
5878   // a reference of the same declaration.
5879   // FIXME: Setting "FirstInDeclGroup" in CXCursors is a hack that only works
5880   // when visiting a DeclStmt currently, the AST should be enhanced to be able
5881   // to provide that kind of info.
5882   if (clang_isDeclaration(X.kind))
5883     X.data[1] = nullptr;
5884   if (clang_isDeclaration(Y.kind))
5885     Y.data[1] = nullptr;
5886 
5887   return X == Y;
5888 }
5889 
5890 unsigned clang_hashCursor(CXCursor C) {
5891   unsigned Index = 0;
5892   if (clang_isExpression(C.kind) || clang_isStatement(C.kind))
5893     Index = 1;
5894 
5895   return llvm::DenseMapInfo<std::pair<unsigned, const void *>>::getHashValue(
5896       std::make_pair(C.kind, C.data[Index]));
5897 }
5898 
5899 unsigned clang_isInvalid(enum CXCursorKind K) {
5900   return K >= CXCursor_FirstInvalid && K <= CXCursor_LastInvalid;
5901 }
5902 
5903 unsigned clang_isDeclaration(enum CXCursorKind K) {
5904   return (K >= CXCursor_FirstDecl && K <= CXCursor_LastDecl) ||
5905          (K >= CXCursor_FirstExtraDecl && K <= CXCursor_LastExtraDecl);
5906 }
5907 
5908 unsigned clang_isInvalidDeclaration(CXCursor C) {
5909   if (clang_isDeclaration(C.kind)) {
5910     if (const Decl *D = getCursorDecl(C))
5911       return D->isInvalidDecl();
5912   }
5913 
5914   return 0;
5915 }
5916 
5917 unsigned clang_isReference(enum CXCursorKind K) {
5918   return K >= CXCursor_FirstRef && K <= CXCursor_LastRef;
5919 }
5920 
5921 unsigned clang_isExpression(enum CXCursorKind K) {
5922   return K >= CXCursor_FirstExpr && K <= CXCursor_LastExpr;
5923 }
5924 
5925 unsigned clang_isStatement(enum CXCursorKind K) {
5926   return K >= CXCursor_FirstStmt && K <= CXCursor_LastStmt;
5927 }
5928 
5929 unsigned clang_isAttribute(enum CXCursorKind K) {
5930   return K >= CXCursor_FirstAttr && K <= CXCursor_LastAttr;
5931 }
5932 
5933 unsigned clang_isTranslationUnit(enum CXCursorKind K) {
5934   return K == CXCursor_TranslationUnit;
5935 }
5936 
5937 unsigned clang_isPreprocessing(enum CXCursorKind K) {
5938   return K >= CXCursor_FirstPreprocessing && K <= CXCursor_LastPreprocessing;
5939 }
5940 
5941 unsigned clang_isUnexposed(enum CXCursorKind K) {
5942   switch (K) {
5943   case CXCursor_UnexposedDecl:
5944   case CXCursor_UnexposedExpr:
5945   case CXCursor_UnexposedStmt:
5946   case CXCursor_UnexposedAttr:
5947     return true;
5948   default:
5949     return false;
5950   }
5951 }
5952 
5953 CXCursorKind clang_getCursorKind(CXCursor C) { return C.kind; }
5954 
5955 CXSourceLocation clang_getCursorLocation(CXCursor C) {
5956   if (clang_isReference(C.kind)) {
5957     switch (C.kind) {
5958     case CXCursor_ObjCSuperClassRef: {
5959       std::pair<const ObjCInterfaceDecl *, SourceLocation> P =
5960           getCursorObjCSuperClassRef(C);
5961       return cxloc::translateSourceLocation(P.first->getASTContext(), P.second);
5962     }
5963 
5964     case CXCursor_ObjCProtocolRef: {
5965       std::pair<const ObjCProtocolDecl *, SourceLocation> P =
5966           getCursorObjCProtocolRef(C);
5967       return cxloc::translateSourceLocation(P.first->getASTContext(), P.second);
5968     }
5969 
5970     case CXCursor_ObjCClassRef: {
5971       std::pair<const ObjCInterfaceDecl *, SourceLocation> P =
5972           getCursorObjCClassRef(C);
5973       return cxloc::translateSourceLocation(P.first->getASTContext(), P.second);
5974     }
5975 
5976     case CXCursor_TypeRef: {
5977       std::pair<const TypeDecl *, SourceLocation> P = getCursorTypeRef(C);
5978       return cxloc::translateSourceLocation(P.first->getASTContext(), P.second);
5979     }
5980 
5981     case CXCursor_TemplateRef: {
5982       std::pair<const TemplateDecl *, SourceLocation> P =
5983           getCursorTemplateRef(C);
5984       return cxloc::translateSourceLocation(P.first->getASTContext(), P.second);
5985     }
5986 
5987     case CXCursor_NamespaceRef: {
5988       std::pair<const NamedDecl *, SourceLocation> P = getCursorNamespaceRef(C);
5989       return cxloc::translateSourceLocation(P.first->getASTContext(), P.second);
5990     }
5991 
5992     case CXCursor_MemberRef: {
5993       std::pair<const FieldDecl *, SourceLocation> P = getCursorMemberRef(C);
5994       return cxloc::translateSourceLocation(P.first->getASTContext(), P.second);
5995     }
5996 
5997     case CXCursor_VariableRef: {
5998       std::pair<const VarDecl *, SourceLocation> P = getCursorVariableRef(C);
5999       return cxloc::translateSourceLocation(P.first->getASTContext(), P.second);
6000     }
6001 
6002     case CXCursor_CXXBaseSpecifier: {
6003       const CXXBaseSpecifier *BaseSpec = getCursorCXXBaseSpecifier(C);
6004       if (!BaseSpec)
6005         return clang_getNullLocation();
6006 
6007       if (TypeSourceInfo *TSInfo = BaseSpec->getTypeSourceInfo())
6008         return cxloc::translateSourceLocation(
6009             getCursorContext(C), TSInfo->getTypeLoc().getBeginLoc());
6010 
6011       return cxloc::translateSourceLocation(getCursorContext(C),
6012                                             BaseSpec->getBeginLoc());
6013     }
6014 
6015     case CXCursor_LabelRef: {
6016       std::pair<const LabelStmt *, SourceLocation> P = getCursorLabelRef(C);
6017       return cxloc::translateSourceLocation(getCursorContext(C), P.second);
6018     }
6019 
6020     case CXCursor_OverloadedDeclRef:
6021       return cxloc::translateSourceLocation(
6022           getCursorContext(C), getCursorOverloadedDeclRef(C).second);
6023 
6024     default:
6025       // FIXME: Need a way to enumerate all non-reference cases.
6026       llvm_unreachable("Missed a reference kind");
6027     }
6028   }
6029 
6030   if (clang_isExpression(C.kind))
6031     return cxloc::translateSourceLocation(
6032         getCursorContext(C), getLocationFromExpr(getCursorExpr(C)));
6033 
6034   if (clang_isStatement(C.kind))
6035     return cxloc::translateSourceLocation(getCursorContext(C),
6036                                           getCursorStmt(C)->getBeginLoc());
6037 
6038   if (C.kind == CXCursor_PreprocessingDirective) {
6039     SourceLocation L = cxcursor::getCursorPreprocessingDirective(C).getBegin();
6040     return cxloc::translateSourceLocation(getCursorContext(C), L);
6041   }
6042 
6043   if (C.kind == CXCursor_MacroExpansion) {
6044     SourceLocation L =
6045         cxcursor::getCursorMacroExpansion(C).getSourceRange().getBegin();
6046     return cxloc::translateSourceLocation(getCursorContext(C), L);
6047   }
6048 
6049   if (C.kind == CXCursor_MacroDefinition) {
6050     SourceLocation L = cxcursor::getCursorMacroDefinition(C)->getLocation();
6051     return cxloc::translateSourceLocation(getCursorContext(C), L);
6052   }
6053 
6054   if (C.kind == CXCursor_InclusionDirective) {
6055     SourceLocation L =
6056         cxcursor::getCursorInclusionDirective(C)->getSourceRange().getBegin();
6057     return cxloc::translateSourceLocation(getCursorContext(C), L);
6058   }
6059 
6060   if (clang_isAttribute(C.kind)) {
6061     SourceLocation L = cxcursor::getCursorAttr(C)->getLocation();
6062     return cxloc::translateSourceLocation(getCursorContext(C), L);
6063   }
6064 
6065   if (!clang_isDeclaration(C.kind))
6066     return clang_getNullLocation();
6067 
6068   const Decl *D = getCursorDecl(C);
6069   if (!D)
6070     return clang_getNullLocation();
6071 
6072   SourceLocation Loc = D->getLocation();
6073   // FIXME: Multiple variables declared in a single declaration
6074   // currently lack the information needed to correctly determine their
6075   // ranges when accounting for the type-specifier.  We use context
6076   // stored in the CXCursor to determine if the VarDecl is in a DeclGroup,
6077   // and if so, whether it is the first decl.
6078   if (const VarDecl *VD = dyn_cast<VarDecl>(D)) {
6079     if (!cxcursor::isFirstInDeclGroup(C))
6080       Loc = VD->getLocation();
6081   }
6082 
6083   // For ObjC methods, give the start location of the method name.
6084   if (const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(D))
6085     Loc = MD->getSelectorStartLoc();
6086 
6087   return cxloc::translateSourceLocation(getCursorContext(C), Loc);
6088 }
6089 
6090 } // end extern "C"
6091 
6092 CXCursor cxcursor::getCursor(CXTranslationUnit TU, SourceLocation SLoc) {
6093   assert(TU);
6094 
6095   // Guard against an invalid SourceLocation, or we may assert in one
6096   // of the following calls.
6097   if (SLoc.isInvalid())
6098     return clang_getNullCursor();
6099 
6100   ASTUnit *CXXUnit = cxtu::getASTUnit(TU);
6101 
6102   // Translate the given source location to make it point at the beginning of
6103   // the token under the cursor.
6104   SLoc = Lexer::GetBeginningOfToken(SLoc, CXXUnit->getSourceManager(),
6105                                     CXXUnit->getASTContext().getLangOpts());
6106 
6107   CXCursor Result = MakeCXCursorInvalid(CXCursor_NoDeclFound);
6108   if (SLoc.isValid()) {
6109     GetCursorData ResultData(CXXUnit->getSourceManager(), SLoc, Result);
6110     CursorVisitor CursorVis(TU, GetCursorVisitor, &ResultData,
6111                             /*VisitPreprocessorLast=*/true,
6112                             /*VisitIncludedEntities=*/false,
6113                             SourceLocation(SLoc));
6114     CursorVis.visitFileRegion();
6115   }
6116 
6117   return Result;
6118 }
6119 
6120 static SourceRange getRawCursorExtent(CXCursor C) {
6121   if (clang_isReference(C.kind)) {
6122     switch (C.kind) {
6123     case CXCursor_ObjCSuperClassRef:
6124       return getCursorObjCSuperClassRef(C).second;
6125 
6126     case CXCursor_ObjCProtocolRef:
6127       return getCursorObjCProtocolRef(C).second;
6128 
6129     case CXCursor_ObjCClassRef:
6130       return getCursorObjCClassRef(C).second;
6131 
6132     case CXCursor_TypeRef:
6133       return getCursorTypeRef(C).second;
6134 
6135     case CXCursor_TemplateRef:
6136       return getCursorTemplateRef(C).second;
6137 
6138     case CXCursor_NamespaceRef:
6139       return getCursorNamespaceRef(C).second;
6140 
6141     case CXCursor_MemberRef:
6142       return getCursorMemberRef(C).second;
6143 
6144     case CXCursor_CXXBaseSpecifier:
6145       return getCursorCXXBaseSpecifier(C)->getSourceRange();
6146 
6147     case CXCursor_LabelRef:
6148       return getCursorLabelRef(C).second;
6149 
6150     case CXCursor_OverloadedDeclRef:
6151       return getCursorOverloadedDeclRef(C).second;
6152 
6153     case CXCursor_VariableRef:
6154       return getCursorVariableRef(C).second;
6155 
6156     default:
6157       // FIXME: Need a way to enumerate all non-reference cases.
6158       llvm_unreachable("Missed a reference kind");
6159     }
6160   }
6161 
6162   if (clang_isExpression(C.kind))
6163     return getCursorExpr(C)->getSourceRange();
6164 
6165   if (clang_isStatement(C.kind))
6166     return getCursorStmt(C)->getSourceRange();
6167 
6168   if (clang_isAttribute(C.kind))
6169     return getCursorAttr(C)->getRange();
6170 
6171   if (C.kind == CXCursor_PreprocessingDirective)
6172     return cxcursor::getCursorPreprocessingDirective(C);
6173 
6174   if (C.kind == CXCursor_MacroExpansion) {
6175     ASTUnit *TU = getCursorASTUnit(C);
6176     SourceRange Range = cxcursor::getCursorMacroExpansion(C).getSourceRange();
6177     return TU->mapRangeFromPreamble(Range);
6178   }
6179 
6180   if (C.kind == CXCursor_MacroDefinition) {
6181     ASTUnit *TU = getCursorASTUnit(C);
6182     SourceRange Range = cxcursor::getCursorMacroDefinition(C)->getSourceRange();
6183     return TU->mapRangeFromPreamble(Range);
6184   }
6185 
6186   if (C.kind == CXCursor_InclusionDirective) {
6187     ASTUnit *TU = getCursorASTUnit(C);
6188     SourceRange Range =
6189         cxcursor::getCursorInclusionDirective(C)->getSourceRange();
6190     return TU->mapRangeFromPreamble(Range);
6191   }
6192 
6193   if (C.kind == CXCursor_TranslationUnit) {
6194     ASTUnit *TU = getCursorASTUnit(C);
6195     FileID MainID = TU->getSourceManager().getMainFileID();
6196     SourceLocation Start = TU->getSourceManager().getLocForStartOfFile(MainID);
6197     SourceLocation End = TU->getSourceManager().getLocForEndOfFile(MainID);
6198     return SourceRange(Start, End);
6199   }
6200 
6201   if (clang_isDeclaration(C.kind)) {
6202     const Decl *D = cxcursor::getCursorDecl(C);
6203     if (!D)
6204       return SourceRange();
6205 
6206     SourceRange R = D->getSourceRange();
6207     // FIXME: Multiple variables declared in a single declaration
6208     // currently lack the information needed to correctly determine their
6209     // ranges when accounting for the type-specifier.  We use context
6210     // stored in the CXCursor to determine if the VarDecl is in a DeclGroup,
6211     // and if so, whether it is the first decl.
6212     if (const VarDecl *VD = dyn_cast<VarDecl>(D)) {
6213       if (!cxcursor::isFirstInDeclGroup(C))
6214         R.setBegin(VD->getLocation());
6215     }
6216     return R;
6217   }
6218   return SourceRange();
6219 }
6220 
6221 /// Retrieves the "raw" cursor extent, which is then extended to include
6222 /// the decl-specifier-seq for declarations.
6223 static SourceRange getFullCursorExtent(CXCursor C, SourceManager &SrcMgr) {
6224   if (clang_isDeclaration(C.kind)) {
6225     const Decl *D = cxcursor::getCursorDecl(C);
6226     if (!D)
6227       return SourceRange();
6228 
6229     SourceRange R = D->getSourceRange();
6230 
6231     // Adjust the start of the location for declarations preceded by
6232     // declaration specifiers.
6233     SourceLocation StartLoc;
6234     if (const DeclaratorDecl *DD = dyn_cast<DeclaratorDecl>(D)) {
6235       if (TypeSourceInfo *TI = DD->getTypeSourceInfo())
6236         StartLoc = TI->getTypeLoc().getBeginLoc();
6237     } else if (const TypedefDecl *Typedef = dyn_cast<TypedefDecl>(D)) {
6238       if (TypeSourceInfo *TI = Typedef->getTypeSourceInfo())
6239         StartLoc = TI->getTypeLoc().getBeginLoc();
6240     }
6241 
6242     if (StartLoc.isValid() && R.getBegin().isValid() &&
6243         SrcMgr.isBeforeInTranslationUnit(StartLoc, R.getBegin()))
6244       R.setBegin(StartLoc);
6245 
6246     // FIXME: Multiple variables declared in a single declaration
6247     // currently lack the information needed to correctly determine their
6248     // ranges when accounting for the type-specifier.  We use context
6249     // stored in the CXCursor to determine if the VarDecl is in a DeclGroup,
6250     // and if so, whether it is the first decl.
6251     if (const VarDecl *VD = dyn_cast<VarDecl>(D)) {
6252       if (!cxcursor::isFirstInDeclGroup(C))
6253         R.setBegin(VD->getLocation());
6254     }
6255 
6256     return R;
6257   }
6258 
6259   return getRawCursorExtent(C);
6260 }
6261 
6262 CXSourceRange clang_getCursorExtent(CXCursor C) {
6263   SourceRange R = getRawCursorExtent(C);
6264   if (R.isInvalid())
6265     return clang_getNullRange();
6266 
6267   return cxloc::translateSourceRange(getCursorContext(C), R);
6268 }
6269 
6270 CXCursor clang_getCursorReferenced(CXCursor C) {
6271   if (clang_isInvalid(C.kind))
6272     return clang_getNullCursor();
6273 
6274   CXTranslationUnit tu = getCursorTU(C);
6275   if (clang_isDeclaration(C.kind)) {
6276     const Decl *D = getCursorDecl(C);
6277     if (!D)
6278       return clang_getNullCursor();
6279     if (const UsingDecl *Using = dyn_cast<UsingDecl>(D))
6280       return MakeCursorOverloadedDeclRef(Using, D->getLocation(), tu);
6281     if (const ObjCPropertyImplDecl *PropImpl =
6282             dyn_cast<ObjCPropertyImplDecl>(D))
6283       if (ObjCPropertyDecl *Property = PropImpl->getPropertyDecl())
6284         return MakeCXCursor(Property, tu);
6285 
6286     return C;
6287   }
6288 
6289   if (clang_isExpression(C.kind)) {
6290     const Expr *E = getCursorExpr(C);
6291     const Decl *D = getDeclFromExpr(E);
6292     if (D) {
6293       CXCursor declCursor = MakeCXCursor(D, tu);
6294       declCursor = getSelectorIdentifierCursor(getSelectorIdentifierIndex(C),
6295                                                declCursor);
6296       return declCursor;
6297     }
6298 
6299     if (const OverloadExpr *Ovl = dyn_cast_or_null<OverloadExpr>(E))
6300       return MakeCursorOverloadedDeclRef(Ovl, tu);
6301 
6302     return clang_getNullCursor();
6303   }
6304 
6305   if (clang_isStatement(C.kind)) {
6306     const Stmt *S = getCursorStmt(C);
6307     if (const GotoStmt *Goto = dyn_cast_or_null<GotoStmt>(S))
6308       if (LabelDecl *label = Goto->getLabel())
6309         if (LabelStmt *labelS = label->getStmt())
6310           return MakeCXCursor(labelS, getCursorDecl(C), tu);
6311 
6312     return clang_getNullCursor();
6313   }
6314 
6315   if (C.kind == CXCursor_MacroExpansion) {
6316     if (const MacroDefinitionRecord *Def =
6317             getCursorMacroExpansion(C).getDefinition())
6318       return MakeMacroDefinitionCursor(Def, tu);
6319   }
6320 
6321   if (!clang_isReference(C.kind))
6322     return clang_getNullCursor();
6323 
6324   switch (C.kind) {
6325   case CXCursor_ObjCSuperClassRef:
6326     return MakeCXCursor(getCursorObjCSuperClassRef(C).first, tu);
6327 
6328   case CXCursor_ObjCProtocolRef: {
6329     const ObjCProtocolDecl *Prot = getCursorObjCProtocolRef(C).first;
6330     if (const ObjCProtocolDecl *Def = Prot->getDefinition())
6331       return MakeCXCursor(Def, tu);
6332 
6333     return MakeCXCursor(Prot, tu);
6334   }
6335 
6336   case CXCursor_ObjCClassRef: {
6337     const ObjCInterfaceDecl *Class = getCursorObjCClassRef(C).first;
6338     if (const ObjCInterfaceDecl *Def = Class->getDefinition())
6339       return MakeCXCursor(Def, tu);
6340 
6341     return MakeCXCursor(Class, tu);
6342   }
6343 
6344   case CXCursor_TypeRef:
6345     return MakeCXCursor(getCursorTypeRef(C).first, tu);
6346 
6347   case CXCursor_TemplateRef:
6348     return MakeCXCursor(getCursorTemplateRef(C).first, tu);
6349 
6350   case CXCursor_NamespaceRef:
6351     return MakeCXCursor(getCursorNamespaceRef(C).first, tu);
6352 
6353   case CXCursor_MemberRef:
6354     return MakeCXCursor(getCursorMemberRef(C).first, tu);
6355 
6356   case CXCursor_CXXBaseSpecifier: {
6357     const CXXBaseSpecifier *B = cxcursor::getCursorCXXBaseSpecifier(C);
6358     return clang_getTypeDeclaration(cxtype::MakeCXType(B->getType(), tu));
6359   }
6360 
6361   case CXCursor_LabelRef:
6362     // FIXME: We end up faking the "parent" declaration here because we
6363     // don't want to make CXCursor larger.
6364     return MakeCXCursor(
6365         getCursorLabelRef(C).first,
6366         cxtu::getASTUnit(tu)->getASTContext().getTranslationUnitDecl(), tu);
6367 
6368   case CXCursor_OverloadedDeclRef:
6369     return C;
6370 
6371   case CXCursor_VariableRef:
6372     return MakeCXCursor(getCursorVariableRef(C).first, tu);
6373 
6374   default:
6375     // We would prefer to enumerate all non-reference cursor kinds here.
6376     llvm_unreachable("Unhandled reference cursor kind");
6377   }
6378 }
6379 
6380 CXCursor clang_getCursorDefinition(CXCursor C) {
6381   if (clang_isInvalid(C.kind))
6382     return clang_getNullCursor();
6383 
6384   CXTranslationUnit TU = getCursorTU(C);
6385 
6386   bool WasReference = false;
6387   if (clang_isReference(C.kind) || clang_isExpression(C.kind)) {
6388     C = clang_getCursorReferenced(C);
6389     WasReference = true;
6390   }
6391 
6392   if (C.kind == CXCursor_MacroExpansion)
6393     return clang_getCursorReferenced(C);
6394 
6395   if (!clang_isDeclaration(C.kind))
6396     return clang_getNullCursor();
6397 
6398   const Decl *D = getCursorDecl(C);
6399   if (!D)
6400     return clang_getNullCursor();
6401 
6402   switch (D->getKind()) {
6403   // Declaration kinds that don't really separate the notions of
6404   // declaration and definition.
6405   case Decl::Namespace:
6406   case Decl::Typedef:
6407   case Decl::TypeAlias:
6408   case Decl::TypeAliasTemplate:
6409   case Decl::TemplateTypeParm:
6410   case Decl::EnumConstant:
6411   case Decl::Field:
6412   case Decl::Binding:
6413   case Decl::MSProperty:
6414   case Decl::MSGuid:
6415   case Decl::TemplateParamObject:
6416   case Decl::IndirectField:
6417   case Decl::ObjCIvar:
6418   case Decl::ObjCAtDefsField:
6419   case Decl::ImplicitParam:
6420   case Decl::ParmVar:
6421   case Decl::NonTypeTemplateParm:
6422   case Decl::TemplateTemplateParm:
6423   case Decl::ObjCCategoryImpl:
6424   case Decl::ObjCImplementation:
6425   case Decl::AccessSpec:
6426   case Decl::LinkageSpec:
6427   case Decl::Export:
6428   case Decl::ObjCPropertyImpl:
6429   case Decl::FileScopeAsm:
6430   case Decl::StaticAssert:
6431   case Decl::Block:
6432   case Decl::Captured:
6433   case Decl::OMPCapturedExpr:
6434   case Decl::Label: // FIXME: Is this right??
6435   case Decl::ClassScopeFunctionSpecialization:
6436   case Decl::CXXDeductionGuide:
6437   case Decl::Import:
6438   case Decl::OMPThreadPrivate:
6439   case Decl::OMPAllocate:
6440   case Decl::OMPDeclareReduction:
6441   case Decl::OMPDeclareMapper:
6442   case Decl::OMPRequires:
6443   case Decl::ObjCTypeParam:
6444   case Decl::BuiltinTemplate:
6445   case Decl::PragmaComment:
6446   case Decl::PragmaDetectMismatch:
6447   case Decl::UsingPack:
6448   case Decl::Concept:
6449   case Decl::LifetimeExtendedTemporary:
6450   case Decl::RequiresExprBody:
6451     return C;
6452 
6453   // Declaration kinds that don't make any sense here, but are
6454   // nonetheless harmless.
6455   case Decl::Empty:
6456   case Decl::TranslationUnit:
6457   case Decl::ExternCContext:
6458     break;
6459 
6460   // Declaration kinds for which the definition is not resolvable.
6461   case Decl::UnresolvedUsingTypename:
6462   case Decl::UnresolvedUsingValue:
6463     break;
6464 
6465   case Decl::UsingDirective:
6466     return MakeCXCursor(cast<UsingDirectiveDecl>(D)->getNominatedNamespace(),
6467                         TU);
6468 
6469   case Decl::NamespaceAlias:
6470     return MakeCXCursor(cast<NamespaceAliasDecl>(D)->getNamespace(), TU);
6471 
6472   case Decl::Enum:
6473   case Decl::Record:
6474   case Decl::CXXRecord:
6475   case Decl::ClassTemplateSpecialization:
6476   case Decl::ClassTemplatePartialSpecialization:
6477     if (TagDecl *Def = cast<TagDecl>(D)->getDefinition())
6478       return MakeCXCursor(Def, TU);
6479     return clang_getNullCursor();
6480 
6481   case Decl::Function:
6482   case Decl::CXXMethod:
6483   case Decl::CXXConstructor:
6484   case Decl::CXXDestructor:
6485   case Decl::CXXConversion: {
6486     const FunctionDecl *Def = nullptr;
6487     if (cast<FunctionDecl>(D)->getBody(Def))
6488       return MakeCXCursor(Def, TU);
6489     return clang_getNullCursor();
6490   }
6491 
6492   case Decl::Var:
6493   case Decl::VarTemplateSpecialization:
6494   case Decl::VarTemplatePartialSpecialization:
6495   case Decl::Decomposition: {
6496     // Ask the variable if it has a definition.
6497     if (const VarDecl *Def = cast<VarDecl>(D)->getDefinition())
6498       return MakeCXCursor(Def, TU);
6499     return clang_getNullCursor();
6500   }
6501 
6502   case Decl::FunctionTemplate: {
6503     const FunctionDecl *Def = nullptr;
6504     if (cast<FunctionTemplateDecl>(D)->getTemplatedDecl()->getBody(Def))
6505       return MakeCXCursor(Def->getDescribedFunctionTemplate(), TU);
6506     return clang_getNullCursor();
6507   }
6508 
6509   case Decl::ClassTemplate: {
6510     if (RecordDecl *Def =
6511             cast<ClassTemplateDecl>(D)->getTemplatedDecl()->getDefinition())
6512       return MakeCXCursor(cast<CXXRecordDecl>(Def)->getDescribedClassTemplate(),
6513                           TU);
6514     return clang_getNullCursor();
6515   }
6516 
6517   case Decl::VarTemplate: {
6518     if (VarDecl *Def =
6519             cast<VarTemplateDecl>(D)->getTemplatedDecl()->getDefinition())
6520       return MakeCXCursor(cast<VarDecl>(Def)->getDescribedVarTemplate(), TU);
6521     return clang_getNullCursor();
6522   }
6523 
6524   case Decl::Using:
6525     return MakeCursorOverloadedDeclRef(cast<UsingDecl>(D), D->getLocation(),
6526                                        TU);
6527 
6528   case Decl::UsingShadow:
6529   case Decl::ConstructorUsingShadow:
6530     return clang_getCursorDefinition(
6531         MakeCXCursor(cast<UsingShadowDecl>(D)->getTargetDecl(), TU));
6532 
6533   case Decl::ObjCMethod: {
6534     const ObjCMethodDecl *Method = cast<ObjCMethodDecl>(D);
6535     if (Method->isThisDeclarationADefinition())
6536       return C;
6537 
6538     // Dig out the method definition in the associated
6539     // @implementation, if we have it.
6540     // FIXME: The ASTs should make finding the definition easier.
6541     if (const ObjCInterfaceDecl *Class =
6542             dyn_cast<ObjCInterfaceDecl>(Method->getDeclContext()))
6543       if (ObjCImplementationDecl *ClassImpl = Class->getImplementation())
6544         if (ObjCMethodDecl *Def = ClassImpl->getMethod(
6545                 Method->getSelector(), Method->isInstanceMethod()))
6546           if (Def->isThisDeclarationADefinition())
6547             return MakeCXCursor(Def, TU);
6548 
6549     return clang_getNullCursor();
6550   }
6551 
6552   case Decl::ObjCCategory:
6553     if (ObjCCategoryImplDecl *Impl =
6554             cast<ObjCCategoryDecl>(D)->getImplementation())
6555       return MakeCXCursor(Impl, TU);
6556     return clang_getNullCursor();
6557 
6558   case Decl::ObjCProtocol:
6559     if (const ObjCProtocolDecl *Def =
6560             cast<ObjCProtocolDecl>(D)->getDefinition())
6561       return MakeCXCursor(Def, TU);
6562     return clang_getNullCursor();
6563 
6564   case Decl::ObjCInterface: {
6565     // There are two notions of a "definition" for an Objective-C
6566     // class: the interface and its implementation. When we resolved a
6567     // reference to an Objective-C class, produce the @interface as
6568     // the definition; when we were provided with the interface,
6569     // produce the @implementation as the definition.
6570     const ObjCInterfaceDecl *IFace = cast<ObjCInterfaceDecl>(D);
6571     if (WasReference) {
6572       if (const ObjCInterfaceDecl *Def = IFace->getDefinition())
6573         return MakeCXCursor(Def, TU);
6574     } else if (ObjCImplementationDecl *Impl = IFace->getImplementation())
6575       return MakeCXCursor(Impl, TU);
6576     return clang_getNullCursor();
6577   }
6578 
6579   case Decl::ObjCProperty:
6580     // FIXME: We don't really know where to find the
6581     // ObjCPropertyImplDecls that implement this property.
6582     return clang_getNullCursor();
6583 
6584   case Decl::ObjCCompatibleAlias:
6585     if (const ObjCInterfaceDecl *Class =
6586             cast<ObjCCompatibleAliasDecl>(D)->getClassInterface())
6587       if (const ObjCInterfaceDecl *Def = Class->getDefinition())
6588         return MakeCXCursor(Def, TU);
6589 
6590     return clang_getNullCursor();
6591 
6592   case Decl::Friend:
6593     if (NamedDecl *Friend = cast<FriendDecl>(D)->getFriendDecl())
6594       return clang_getCursorDefinition(MakeCXCursor(Friend, TU));
6595     return clang_getNullCursor();
6596 
6597   case Decl::FriendTemplate:
6598     if (NamedDecl *Friend = cast<FriendTemplateDecl>(D)->getFriendDecl())
6599       return clang_getCursorDefinition(MakeCXCursor(Friend, TU));
6600     return clang_getNullCursor();
6601   }
6602 
6603   return clang_getNullCursor();
6604 }
6605 
6606 unsigned clang_isCursorDefinition(CXCursor C) {
6607   if (!clang_isDeclaration(C.kind))
6608     return 0;
6609 
6610   return clang_getCursorDefinition(C) == C;
6611 }
6612 
6613 CXCursor clang_getCanonicalCursor(CXCursor C) {
6614   if (!clang_isDeclaration(C.kind))
6615     return C;
6616 
6617   if (const Decl *D = getCursorDecl(C)) {
6618     if (const ObjCCategoryImplDecl *CatImplD =
6619             dyn_cast<ObjCCategoryImplDecl>(D))
6620       if (ObjCCategoryDecl *CatD = CatImplD->getCategoryDecl())
6621         return MakeCXCursor(CatD, getCursorTU(C));
6622 
6623     if (const ObjCImplDecl *ImplD = dyn_cast<ObjCImplDecl>(D))
6624       if (const ObjCInterfaceDecl *IFD = ImplD->getClassInterface())
6625         return MakeCXCursor(IFD, getCursorTU(C));
6626 
6627     return MakeCXCursor(D->getCanonicalDecl(), getCursorTU(C));
6628   }
6629 
6630   return C;
6631 }
6632 
6633 int clang_Cursor_getObjCSelectorIndex(CXCursor cursor) {
6634   return cxcursor::getSelectorIdentifierIndexAndLoc(cursor).first;
6635 }
6636 
6637 unsigned clang_getNumOverloadedDecls(CXCursor C) {
6638   if (C.kind != CXCursor_OverloadedDeclRef)
6639     return 0;
6640 
6641   OverloadedDeclRefStorage Storage = getCursorOverloadedDeclRef(C).first;
6642   if (const OverloadExpr *E = Storage.dyn_cast<const OverloadExpr *>())
6643     return E->getNumDecls();
6644 
6645   if (OverloadedTemplateStorage *S =
6646           Storage.dyn_cast<OverloadedTemplateStorage *>())
6647     return S->size();
6648 
6649   const Decl *D = Storage.get<const Decl *>();
6650   if (const UsingDecl *Using = dyn_cast<UsingDecl>(D))
6651     return Using->shadow_size();
6652 
6653   return 0;
6654 }
6655 
6656 CXCursor clang_getOverloadedDecl(CXCursor cursor, unsigned index) {
6657   if (cursor.kind != CXCursor_OverloadedDeclRef)
6658     return clang_getNullCursor();
6659 
6660   if (index >= clang_getNumOverloadedDecls(cursor))
6661     return clang_getNullCursor();
6662 
6663   CXTranslationUnit TU = getCursorTU(cursor);
6664   OverloadedDeclRefStorage Storage = getCursorOverloadedDeclRef(cursor).first;
6665   if (const OverloadExpr *E = Storage.dyn_cast<const OverloadExpr *>())
6666     return MakeCXCursor(E->decls_begin()[index], TU);
6667 
6668   if (OverloadedTemplateStorage *S =
6669           Storage.dyn_cast<OverloadedTemplateStorage *>())
6670     return MakeCXCursor(S->begin()[index], TU);
6671 
6672   const Decl *D = Storage.get<const Decl *>();
6673   if (const UsingDecl *Using = dyn_cast<UsingDecl>(D)) {
6674     // FIXME: This is, unfortunately, linear time.
6675     UsingDecl::shadow_iterator Pos = Using->shadow_begin();
6676     std::advance(Pos, index);
6677     return MakeCXCursor(cast<UsingShadowDecl>(*Pos)->getTargetDecl(), TU);
6678   }
6679 
6680   return clang_getNullCursor();
6681 }
6682 
6683 void clang_getDefinitionSpellingAndExtent(
6684     CXCursor C, const char **startBuf, const char **endBuf, unsigned *startLine,
6685     unsigned *startColumn, unsigned *endLine, unsigned *endColumn) {
6686   assert(getCursorDecl(C) && "CXCursor has null decl");
6687   const FunctionDecl *FD = dyn_cast<FunctionDecl>(getCursorDecl(C));
6688   CompoundStmt *Body = dyn_cast<CompoundStmt>(FD->getBody());
6689 
6690   SourceManager &SM = FD->getASTContext().getSourceManager();
6691   *startBuf = SM.getCharacterData(Body->getLBracLoc());
6692   *endBuf = SM.getCharacterData(Body->getRBracLoc());
6693   *startLine = SM.getSpellingLineNumber(Body->getLBracLoc());
6694   *startColumn = SM.getSpellingColumnNumber(Body->getLBracLoc());
6695   *endLine = SM.getSpellingLineNumber(Body->getRBracLoc());
6696   *endColumn = SM.getSpellingColumnNumber(Body->getRBracLoc());
6697 }
6698 
6699 CXSourceRange clang_getCursorReferenceNameRange(CXCursor C, unsigned NameFlags,
6700                                                 unsigned PieceIndex) {
6701   RefNamePieces Pieces;
6702 
6703   switch (C.kind) {
6704   case CXCursor_MemberRefExpr:
6705     if (const MemberExpr *E = dyn_cast<MemberExpr>(getCursorExpr(C)))
6706       Pieces = buildPieces(NameFlags, true, E->getMemberNameInfo(),
6707                            E->getQualifierLoc().getSourceRange());
6708     break;
6709 
6710   case CXCursor_DeclRefExpr:
6711     if (const DeclRefExpr *E = dyn_cast<DeclRefExpr>(getCursorExpr(C))) {
6712       SourceRange TemplateArgLoc(E->getLAngleLoc(), E->getRAngleLoc());
6713       Pieces =
6714           buildPieces(NameFlags, false, E->getNameInfo(),
6715                       E->getQualifierLoc().getSourceRange(), &TemplateArgLoc);
6716     }
6717     break;
6718 
6719   case CXCursor_CallExpr:
6720     if (const CXXOperatorCallExpr *OCE =
6721             dyn_cast<CXXOperatorCallExpr>(getCursorExpr(C))) {
6722       const Expr *Callee = OCE->getCallee();
6723       if (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Callee))
6724         Callee = ICE->getSubExpr();
6725 
6726       if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee))
6727         Pieces = buildPieces(NameFlags, false, DRE->getNameInfo(),
6728                              DRE->getQualifierLoc().getSourceRange());
6729     }
6730     break;
6731 
6732   default:
6733     break;
6734   }
6735 
6736   if (Pieces.empty()) {
6737     if (PieceIndex == 0)
6738       return clang_getCursorExtent(C);
6739   } else if (PieceIndex < Pieces.size()) {
6740     SourceRange R = Pieces[PieceIndex];
6741     if (R.isValid())
6742       return cxloc::translateSourceRange(getCursorContext(C), R);
6743   }
6744 
6745   return clang_getNullRange();
6746 }
6747 
6748 void clang_enableStackTraces(void) {
6749   // FIXME: Provide an argv0 here so we can find llvm-symbolizer.
6750   llvm::sys::PrintStackTraceOnErrorSignal(StringRef());
6751 }
6752 
6753 void clang_executeOnThread(void (*fn)(void *), void *user_data,
6754                            unsigned stack_size) {
6755   llvm::llvm_execute_on_thread(fn, user_data,
6756                                stack_size == 0
6757                                    ? clang::DesiredStackSize
6758                                    : llvm::Optional<unsigned>(stack_size));
6759 }
6760 
6761 //===----------------------------------------------------------------------===//
6762 // Token-based Operations.
6763 //===----------------------------------------------------------------------===//
6764 
6765 /* CXToken layout:
6766  *   int_data[0]: a CXTokenKind
6767  *   int_data[1]: starting token location
6768  *   int_data[2]: token length
6769  *   int_data[3]: reserved
6770  *   ptr_data: for identifiers and keywords, an IdentifierInfo*.
6771  *   otherwise unused.
6772  */
6773 CXTokenKind clang_getTokenKind(CXToken CXTok) {
6774   return static_cast<CXTokenKind>(CXTok.int_data[0]);
6775 }
6776 
6777 CXString clang_getTokenSpelling(CXTranslationUnit TU, CXToken CXTok) {
6778   switch (clang_getTokenKind(CXTok)) {
6779   case CXToken_Identifier:
6780   case CXToken_Keyword:
6781     // We know we have an IdentifierInfo*, so use that.
6782     return cxstring::createRef(
6783         static_cast<IdentifierInfo *>(CXTok.ptr_data)->getNameStart());
6784 
6785   case CXToken_Literal: {
6786     // We have stashed the starting pointer in the ptr_data field. Use it.
6787     const char *Text = static_cast<const char *>(CXTok.ptr_data);
6788     return cxstring::createDup(StringRef(Text, CXTok.int_data[2]));
6789   }
6790 
6791   case CXToken_Punctuation:
6792   case CXToken_Comment:
6793     break;
6794   }
6795 
6796   if (isNotUsableTU(TU)) {
6797     LOG_BAD_TU(TU);
6798     return cxstring::createEmpty();
6799   }
6800 
6801   // We have to find the starting buffer pointer the hard way, by
6802   // deconstructing the source location.
6803   ASTUnit *CXXUnit = cxtu::getASTUnit(TU);
6804   if (!CXXUnit)
6805     return cxstring::createEmpty();
6806 
6807   SourceLocation Loc = SourceLocation::getFromRawEncoding(CXTok.int_data[1]);
6808   std::pair<FileID, unsigned> LocInfo =
6809       CXXUnit->getSourceManager().getDecomposedSpellingLoc(Loc);
6810   bool Invalid = false;
6811   StringRef Buffer =
6812       CXXUnit->getSourceManager().getBufferData(LocInfo.first, &Invalid);
6813   if (Invalid)
6814     return cxstring::createEmpty();
6815 
6816   return cxstring::createDup(Buffer.substr(LocInfo.second, CXTok.int_data[2]));
6817 }
6818 
6819 CXSourceLocation clang_getTokenLocation(CXTranslationUnit TU, CXToken CXTok) {
6820   if (isNotUsableTU(TU)) {
6821     LOG_BAD_TU(TU);
6822     return clang_getNullLocation();
6823   }
6824 
6825   ASTUnit *CXXUnit = cxtu::getASTUnit(TU);
6826   if (!CXXUnit)
6827     return clang_getNullLocation();
6828 
6829   return cxloc::translateSourceLocation(
6830       CXXUnit->getASTContext(),
6831       SourceLocation::getFromRawEncoding(CXTok.int_data[1]));
6832 }
6833 
6834 CXSourceRange clang_getTokenExtent(CXTranslationUnit TU, CXToken CXTok) {
6835   if (isNotUsableTU(TU)) {
6836     LOG_BAD_TU(TU);
6837     return clang_getNullRange();
6838   }
6839 
6840   ASTUnit *CXXUnit = cxtu::getASTUnit(TU);
6841   if (!CXXUnit)
6842     return clang_getNullRange();
6843 
6844   return cxloc::translateSourceRange(
6845       CXXUnit->getASTContext(),
6846       SourceLocation::getFromRawEncoding(CXTok.int_data[1]));
6847 }
6848 
6849 static void getTokens(ASTUnit *CXXUnit, SourceRange Range,
6850                       SmallVectorImpl<CXToken> &CXTokens) {
6851   SourceManager &SourceMgr = CXXUnit->getSourceManager();
6852   std::pair<FileID, unsigned> BeginLocInfo =
6853       SourceMgr.getDecomposedSpellingLoc(Range.getBegin());
6854   std::pair<FileID, unsigned> EndLocInfo =
6855       SourceMgr.getDecomposedSpellingLoc(Range.getEnd());
6856 
6857   // Cannot tokenize across files.
6858   if (BeginLocInfo.first != EndLocInfo.first)
6859     return;
6860 
6861   // Create a lexer
6862   bool Invalid = false;
6863   StringRef Buffer = SourceMgr.getBufferData(BeginLocInfo.first, &Invalid);
6864   if (Invalid)
6865     return;
6866 
6867   Lexer Lex(SourceMgr.getLocForStartOfFile(BeginLocInfo.first),
6868             CXXUnit->getASTContext().getLangOpts(), Buffer.begin(),
6869             Buffer.data() + BeginLocInfo.second, Buffer.end());
6870   Lex.SetCommentRetentionState(true);
6871 
6872   // Lex tokens until we hit the end of the range.
6873   const char *EffectiveBufferEnd = Buffer.data() + EndLocInfo.second;
6874   Token Tok;
6875   bool previousWasAt = false;
6876   do {
6877     // Lex the next token
6878     Lex.LexFromRawLexer(Tok);
6879     if (Tok.is(tok::eof))
6880       break;
6881 
6882     // Initialize the CXToken.
6883     CXToken CXTok;
6884 
6885     //   - Common fields
6886     CXTok.int_data[1] = Tok.getLocation().getRawEncoding();
6887     CXTok.int_data[2] = Tok.getLength();
6888     CXTok.int_data[3] = 0;
6889 
6890     //   - Kind-specific fields
6891     if (Tok.isLiteral()) {
6892       CXTok.int_data[0] = CXToken_Literal;
6893       CXTok.ptr_data = const_cast<char *>(Tok.getLiteralData());
6894     } else if (Tok.is(tok::raw_identifier)) {
6895       // Lookup the identifier to determine whether we have a keyword.
6896       IdentifierInfo *II = CXXUnit->getPreprocessor().LookUpIdentifierInfo(Tok);
6897 
6898       if ((II->getObjCKeywordID() != tok::objc_not_keyword) && previousWasAt) {
6899         CXTok.int_data[0] = CXToken_Keyword;
6900       } else {
6901         CXTok.int_data[0] =
6902             Tok.is(tok::identifier) ? CXToken_Identifier : CXToken_Keyword;
6903       }
6904       CXTok.ptr_data = II;
6905     } else if (Tok.is(tok::comment)) {
6906       CXTok.int_data[0] = CXToken_Comment;
6907       CXTok.ptr_data = nullptr;
6908     } else {
6909       CXTok.int_data[0] = CXToken_Punctuation;
6910       CXTok.ptr_data = nullptr;
6911     }
6912     CXTokens.push_back(CXTok);
6913     previousWasAt = Tok.is(tok::at);
6914   } while (Lex.getBufferLocation() < EffectiveBufferEnd);
6915 }
6916 
6917 CXToken *clang_getToken(CXTranslationUnit TU, CXSourceLocation Location) {
6918   LOG_FUNC_SECTION { *Log << TU << ' ' << Location; }
6919 
6920   if (isNotUsableTU(TU)) {
6921     LOG_BAD_TU(TU);
6922     return NULL;
6923   }
6924 
6925   ASTUnit *CXXUnit = cxtu::getASTUnit(TU);
6926   if (!CXXUnit)
6927     return NULL;
6928 
6929   SourceLocation Begin = cxloc::translateSourceLocation(Location);
6930   if (Begin.isInvalid())
6931     return NULL;
6932   SourceManager &SM = CXXUnit->getSourceManager();
6933   std::pair<FileID, unsigned> DecomposedEnd = SM.getDecomposedLoc(Begin);
6934   DecomposedEnd.second +=
6935       Lexer::MeasureTokenLength(Begin, SM, CXXUnit->getLangOpts());
6936 
6937   SourceLocation End =
6938       SM.getComposedLoc(DecomposedEnd.first, DecomposedEnd.second);
6939 
6940   SmallVector<CXToken, 32> CXTokens;
6941   getTokens(CXXUnit, SourceRange(Begin, End), CXTokens);
6942 
6943   if (CXTokens.empty())
6944     return NULL;
6945 
6946   CXTokens.resize(1);
6947   CXToken *Token = static_cast<CXToken *>(llvm::safe_malloc(sizeof(CXToken)));
6948 
6949   memmove(Token, CXTokens.data(), sizeof(CXToken));
6950   return Token;
6951 }
6952 
6953 void clang_tokenize(CXTranslationUnit TU, CXSourceRange Range, CXToken **Tokens,
6954                     unsigned *NumTokens) {
6955   LOG_FUNC_SECTION { *Log << TU << ' ' << Range; }
6956 
6957   if (Tokens)
6958     *Tokens = nullptr;
6959   if (NumTokens)
6960     *NumTokens = 0;
6961 
6962   if (isNotUsableTU(TU)) {
6963     LOG_BAD_TU(TU);
6964     return;
6965   }
6966 
6967   ASTUnit *CXXUnit = cxtu::getASTUnit(TU);
6968   if (!CXXUnit || !Tokens || !NumTokens)
6969     return;
6970 
6971   ASTUnit::ConcurrencyCheck Check(*CXXUnit);
6972 
6973   SourceRange R = cxloc::translateCXSourceRange(Range);
6974   if (R.isInvalid())
6975     return;
6976 
6977   SmallVector<CXToken, 32> CXTokens;
6978   getTokens(CXXUnit, R, CXTokens);
6979 
6980   if (CXTokens.empty())
6981     return;
6982 
6983   *Tokens = static_cast<CXToken *>(
6984       llvm::safe_malloc(sizeof(CXToken) * CXTokens.size()));
6985   memmove(*Tokens, CXTokens.data(), sizeof(CXToken) * CXTokens.size());
6986   *NumTokens = CXTokens.size();
6987 }
6988 
6989 void clang_disposeTokens(CXTranslationUnit TU, CXToken *Tokens,
6990                          unsigned NumTokens) {
6991   free(Tokens);
6992 }
6993 
6994 //===----------------------------------------------------------------------===//
6995 // Token annotation APIs.
6996 //===----------------------------------------------------------------------===//
6997 
6998 static enum CXChildVisitResult AnnotateTokensVisitor(CXCursor cursor,
6999                                                      CXCursor parent,
7000                                                      CXClientData client_data);
7001 static bool AnnotateTokensPostChildrenVisitor(CXCursor cursor,
7002                                               CXClientData client_data);
7003 
7004 namespace {
7005 class AnnotateTokensWorker {
7006   CXToken *Tokens;
7007   CXCursor *Cursors;
7008   unsigned NumTokens;
7009   unsigned TokIdx;
7010   unsigned PreprocessingTokIdx;
7011   CursorVisitor AnnotateVis;
7012   SourceManager &SrcMgr;
7013   bool HasContextSensitiveKeywords;
7014 
7015   struct PostChildrenAction {
7016     CXCursor cursor;
7017     enum Action { Invalid, Ignore, Postpone } action;
7018   };
7019   using PostChildrenActions = SmallVector<PostChildrenAction, 0>;
7020 
7021   struct PostChildrenInfo {
7022     CXCursor Cursor;
7023     SourceRange CursorRange;
7024     unsigned BeforeReachingCursorIdx;
7025     unsigned BeforeChildrenTokenIdx;
7026     PostChildrenActions ChildActions;
7027   };
7028   SmallVector<PostChildrenInfo, 8> PostChildrenInfos;
7029 
7030   CXToken &getTok(unsigned Idx) {
7031     assert(Idx < NumTokens);
7032     return Tokens[Idx];
7033   }
7034   const CXToken &getTok(unsigned Idx) const {
7035     assert(Idx < NumTokens);
7036     return Tokens[Idx];
7037   }
7038   bool MoreTokens() const { return TokIdx < NumTokens; }
7039   unsigned NextToken() const { return TokIdx; }
7040   void AdvanceToken() { ++TokIdx; }
7041   SourceLocation GetTokenLoc(unsigned tokI) {
7042     return SourceLocation::getFromRawEncoding(getTok(tokI).int_data[1]);
7043   }
7044   bool isFunctionMacroToken(unsigned tokI) const {
7045     return getTok(tokI).int_data[3] != 0;
7046   }
7047   SourceLocation getFunctionMacroTokenLoc(unsigned tokI) const {
7048     return SourceLocation::getFromRawEncoding(getTok(tokI).int_data[3]);
7049   }
7050 
7051   void annotateAndAdvanceTokens(CXCursor, RangeComparisonResult, SourceRange);
7052   bool annotateAndAdvanceFunctionMacroTokens(CXCursor, RangeComparisonResult,
7053                                              SourceRange);
7054 
7055 public:
7056   AnnotateTokensWorker(CXToken *tokens, CXCursor *cursors, unsigned numTokens,
7057                        CXTranslationUnit TU, SourceRange RegionOfInterest)
7058       : Tokens(tokens), Cursors(cursors), NumTokens(numTokens), TokIdx(0),
7059         PreprocessingTokIdx(0),
7060         AnnotateVis(TU, AnnotateTokensVisitor, this,
7061                     /*VisitPreprocessorLast=*/true,
7062                     /*VisitIncludedEntities=*/false, RegionOfInterest,
7063                     /*VisitDeclsOnly=*/false,
7064                     AnnotateTokensPostChildrenVisitor),
7065         SrcMgr(cxtu::getASTUnit(TU)->getSourceManager()),
7066         HasContextSensitiveKeywords(false) {}
7067 
7068   void VisitChildren(CXCursor C) { AnnotateVis.VisitChildren(C); }
7069   enum CXChildVisitResult Visit(CXCursor cursor, CXCursor parent);
7070   bool IsIgnoredChildCursor(CXCursor cursor) const;
7071   PostChildrenActions DetermineChildActions(CXCursor Cursor) const;
7072 
7073   bool postVisitChildren(CXCursor cursor);
7074   void HandlePostPonedChildCursors(const PostChildrenInfo &Info);
7075   void HandlePostPonedChildCursor(CXCursor Cursor, unsigned StartTokenIndex);
7076 
7077   void AnnotateTokens();
7078 
7079   /// Determine whether the annotator saw any cursors that have
7080   /// context-sensitive keywords.
7081   bool hasContextSensitiveKeywords() const {
7082     return HasContextSensitiveKeywords;
7083   }
7084 
7085   ~AnnotateTokensWorker() { assert(PostChildrenInfos.empty()); }
7086 };
7087 } // namespace
7088 
7089 void AnnotateTokensWorker::AnnotateTokens() {
7090   // Walk the AST within the region of interest, annotating tokens
7091   // along the way.
7092   AnnotateVis.visitFileRegion();
7093 }
7094 
7095 bool AnnotateTokensWorker::IsIgnoredChildCursor(CXCursor cursor) const {
7096   if (PostChildrenInfos.empty())
7097     return false;
7098 
7099   for (const auto &ChildAction : PostChildrenInfos.back().ChildActions) {
7100     if (ChildAction.cursor == cursor &&
7101         ChildAction.action == PostChildrenAction::Ignore) {
7102       return true;
7103     }
7104   }
7105 
7106   return false;
7107 }
7108 
7109 const CXXOperatorCallExpr *GetSubscriptOrCallOperator(CXCursor Cursor) {
7110   if (!clang_isExpression(Cursor.kind))
7111     return nullptr;
7112 
7113   const Expr *E = getCursorExpr(Cursor);
7114   if (const auto *OCE = dyn_cast<CXXOperatorCallExpr>(E)) {
7115     const OverloadedOperatorKind Kind = OCE->getOperator();
7116     if (Kind == OO_Call || Kind == OO_Subscript)
7117       return OCE;
7118   }
7119 
7120   return nullptr;
7121 }
7122 
7123 AnnotateTokensWorker::PostChildrenActions
7124 AnnotateTokensWorker::DetermineChildActions(CXCursor Cursor) const {
7125   PostChildrenActions actions;
7126 
7127   // The DeclRefExpr of CXXOperatorCallExpr refering to the custom operator is
7128   // visited before the arguments to the operator call. For the Call and
7129   // Subscript operator the range of this DeclRefExpr includes the whole call
7130   // expression, so that all tokens in that range would be mapped to the
7131   // operator function, including the tokens of the arguments. To avoid that,
7132   // ensure to visit this DeclRefExpr as last node.
7133   if (const auto *OCE = GetSubscriptOrCallOperator(Cursor)) {
7134     const Expr *Callee = OCE->getCallee();
7135     if (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Callee)) {
7136       const Expr *SubExpr = ICE->getSubExpr();
7137       if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(SubExpr)) {
7138         const Decl *parentDecl = getCursorDecl(Cursor);
7139         CXTranslationUnit TU = clang_Cursor_getTranslationUnit(Cursor);
7140 
7141         // Visit the DeclRefExpr as last.
7142         CXCursor cxChild = MakeCXCursor(DRE, parentDecl, TU);
7143         actions.push_back({cxChild, PostChildrenAction::Postpone});
7144 
7145         // The parent of the DeclRefExpr, an ImplicitCastExpr, has an equally
7146         // wide range as the DeclRefExpr. We can skip visiting this entirely.
7147         cxChild = MakeCXCursor(ICE, parentDecl, TU);
7148         actions.push_back({cxChild, PostChildrenAction::Ignore});
7149       }
7150     }
7151   }
7152 
7153   return actions;
7154 }
7155 
7156 static inline void updateCursorAnnotation(CXCursor &Cursor,
7157                                           const CXCursor &updateC) {
7158   if (clang_isInvalid(updateC.kind) || !clang_isInvalid(Cursor.kind))
7159     return;
7160   Cursor = updateC;
7161 }
7162 
7163 /// It annotates and advances tokens with a cursor until the comparison
7164 //// between the cursor location and the source range is the same as
7165 /// \arg compResult.
7166 ///
7167 /// Pass RangeBefore to annotate tokens with a cursor until a range is reached.
7168 /// Pass RangeOverlap to annotate tokens inside a range.
7169 void AnnotateTokensWorker::annotateAndAdvanceTokens(
7170     CXCursor updateC, RangeComparisonResult compResult, SourceRange range) {
7171   while (MoreTokens()) {
7172     const unsigned I = NextToken();
7173     if (isFunctionMacroToken(I))
7174       if (!annotateAndAdvanceFunctionMacroTokens(updateC, compResult, range))
7175         return;
7176 
7177     SourceLocation TokLoc = GetTokenLoc(I);
7178     if (LocationCompare(SrcMgr, TokLoc, range) == compResult) {
7179       updateCursorAnnotation(Cursors[I], updateC);
7180       AdvanceToken();
7181       continue;
7182     }
7183     break;
7184   }
7185 }
7186 
7187 /// Special annotation handling for macro argument tokens.
7188 /// \returns true if it advanced beyond all macro tokens, false otherwise.
7189 bool AnnotateTokensWorker::annotateAndAdvanceFunctionMacroTokens(
7190     CXCursor updateC, RangeComparisonResult compResult, SourceRange range) {
7191   assert(MoreTokens());
7192   assert(isFunctionMacroToken(NextToken()) &&
7193          "Should be called only for macro arg tokens");
7194 
7195   // This works differently than annotateAndAdvanceTokens; because expanded
7196   // macro arguments can have arbitrary translation-unit source order, we do not
7197   // advance the token index one by one until a token fails the range test.
7198   // We only advance once past all of the macro arg tokens if all of them
7199   // pass the range test. If one of them fails we keep the token index pointing
7200   // at the start of the macro arg tokens so that the failing token will be
7201   // annotated by a subsequent annotation try.
7202 
7203   bool atLeastOneCompFail = false;
7204 
7205   unsigned I = NextToken();
7206   for (; I < NumTokens && isFunctionMacroToken(I); ++I) {
7207     SourceLocation TokLoc = getFunctionMacroTokenLoc(I);
7208     if (TokLoc.isFileID())
7209       continue; // not macro arg token, it's parens or comma.
7210     if (LocationCompare(SrcMgr, TokLoc, range) == compResult) {
7211       if (clang_isInvalid(clang_getCursorKind(Cursors[I])))
7212         Cursors[I] = updateC;
7213     } else
7214       atLeastOneCompFail = true;
7215   }
7216 
7217   if (atLeastOneCompFail)
7218     return false;
7219 
7220   TokIdx = I; // All of the tokens were handled, advance beyond all of them.
7221   return true;
7222 }
7223 
7224 enum CXChildVisitResult AnnotateTokensWorker::Visit(CXCursor cursor,
7225                                                     CXCursor parent) {
7226   SourceRange cursorRange = getRawCursorExtent(cursor);
7227   if (cursorRange.isInvalid())
7228     return CXChildVisit_Recurse;
7229 
7230   if (IsIgnoredChildCursor(cursor))
7231     return CXChildVisit_Continue;
7232 
7233   if (!HasContextSensitiveKeywords) {
7234     // Objective-C properties can have context-sensitive keywords.
7235     if (cursor.kind == CXCursor_ObjCPropertyDecl) {
7236       if (const ObjCPropertyDecl *Property =
7237               dyn_cast_or_null<ObjCPropertyDecl>(getCursorDecl(cursor)))
7238         HasContextSensitiveKeywords =
7239             Property->getPropertyAttributesAsWritten() != 0;
7240     }
7241     // Objective-C methods can have context-sensitive keywords.
7242     else if (cursor.kind == CXCursor_ObjCInstanceMethodDecl ||
7243              cursor.kind == CXCursor_ObjCClassMethodDecl) {
7244       if (const ObjCMethodDecl *Method =
7245               dyn_cast_or_null<ObjCMethodDecl>(getCursorDecl(cursor))) {
7246         if (Method->getObjCDeclQualifier())
7247           HasContextSensitiveKeywords = true;
7248         else {
7249           for (const auto *P : Method->parameters()) {
7250             if (P->getObjCDeclQualifier()) {
7251               HasContextSensitiveKeywords = true;
7252               break;
7253             }
7254           }
7255         }
7256       }
7257     }
7258     // C++ methods can have context-sensitive keywords.
7259     else if (cursor.kind == CXCursor_CXXMethod) {
7260       if (const CXXMethodDecl *Method =
7261               dyn_cast_or_null<CXXMethodDecl>(getCursorDecl(cursor))) {
7262         if (Method->hasAttr<FinalAttr>() || Method->hasAttr<OverrideAttr>())
7263           HasContextSensitiveKeywords = true;
7264       }
7265     }
7266     // C++ classes can have context-sensitive keywords.
7267     else if (cursor.kind == CXCursor_StructDecl ||
7268              cursor.kind == CXCursor_ClassDecl ||
7269              cursor.kind == CXCursor_ClassTemplate ||
7270              cursor.kind == CXCursor_ClassTemplatePartialSpecialization) {
7271       if (const Decl *D = getCursorDecl(cursor))
7272         if (D->hasAttr<FinalAttr>())
7273           HasContextSensitiveKeywords = true;
7274     }
7275   }
7276 
7277   // Don't override a property annotation with its getter/setter method.
7278   if (cursor.kind == CXCursor_ObjCInstanceMethodDecl &&
7279       parent.kind == CXCursor_ObjCPropertyDecl)
7280     return CXChildVisit_Continue;
7281 
7282   if (clang_isPreprocessing(cursor.kind)) {
7283     // Items in the preprocessing record are kept separate from items in
7284     // declarations, so we keep a separate token index.
7285     unsigned SavedTokIdx = TokIdx;
7286     TokIdx = PreprocessingTokIdx;
7287 
7288     // Skip tokens up until we catch up to the beginning of the preprocessing
7289     // entry.
7290     while (MoreTokens()) {
7291       const unsigned I = NextToken();
7292       SourceLocation TokLoc = GetTokenLoc(I);
7293       switch (LocationCompare(SrcMgr, TokLoc, cursorRange)) {
7294       case RangeBefore:
7295         AdvanceToken();
7296         continue;
7297       case RangeAfter:
7298       case RangeOverlap:
7299         break;
7300       }
7301       break;
7302     }
7303 
7304     // Look at all of the tokens within this range.
7305     while (MoreTokens()) {
7306       const unsigned I = NextToken();
7307       SourceLocation TokLoc = GetTokenLoc(I);
7308       switch (LocationCompare(SrcMgr, TokLoc, cursorRange)) {
7309       case RangeBefore:
7310         llvm_unreachable("Infeasible");
7311       case RangeAfter:
7312         break;
7313       case RangeOverlap:
7314         // For macro expansions, just note where the beginning of the macro
7315         // expansion occurs.
7316         if (cursor.kind == CXCursor_MacroExpansion) {
7317           if (TokLoc == cursorRange.getBegin())
7318             Cursors[I] = cursor;
7319           AdvanceToken();
7320           break;
7321         }
7322         // We may have already annotated macro names inside macro definitions.
7323         if (Cursors[I].kind != CXCursor_MacroExpansion)
7324           Cursors[I] = cursor;
7325         AdvanceToken();
7326         continue;
7327       }
7328       break;
7329     }
7330 
7331     // Save the preprocessing token index; restore the non-preprocessing
7332     // token index.
7333     PreprocessingTokIdx = TokIdx;
7334     TokIdx = SavedTokIdx;
7335     return CXChildVisit_Recurse;
7336   }
7337 
7338   if (cursorRange.isInvalid())
7339     return CXChildVisit_Continue;
7340 
7341   unsigned BeforeReachingCursorIdx = NextToken();
7342   const enum CXCursorKind cursorK = clang_getCursorKind(cursor);
7343   const enum CXCursorKind K = clang_getCursorKind(parent);
7344   const CXCursor updateC =
7345       (clang_isInvalid(K) || K == CXCursor_TranslationUnit ||
7346        // Attributes are annotated out-of-order, skip tokens until we reach it.
7347        clang_isAttribute(cursor.kind))
7348           ? clang_getNullCursor()
7349           : parent;
7350 
7351   annotateAndAdvanceTokens(updateC, RangeBefore, cursorRange);
7352 
7353   // Avoid having the cursor of an expression "overwrite" the annotation of the
7354   // variable declaration that it belongs to.
7355   // This can happen for C++ constructor expressions whose range generally
7356   // include the variable declaration, e.g.:
7357   //  MyCXXClass foo; // Make sure we don't annotate 'foo' as a CallExpr cursor.
7358   if (clang_isExpression(cursorK) && MoreTokens()) {
7359     const Expr *E = getCursorExpr(cursor);
7360     if (const Decl *D = getCursorDecl(cursor)) {
7361       const unsigned I = NextToken();
7362       if (E->getBeginLoc().isValid() && D->getLocation().isValid() &&
7363           E->getBeginLoc() == D->getLocation() &&
7364           E->getBeginLoc() == GetTokenLoc(I)) {
7365         updateCursorAnnotation(Cursors[I], updateC);
7366         AdvanceToken();
7367       }
7368     }
7369   }
7370 
7371   // Before recursing into the children keep some state that we are going
7372   // to use in the AnnotateTokensWorker::postVisitChildren callback to do some
7373   // extra work after the child nodes are visited.
7374   // Note that we don't call VisitChildren here to avoid traversing statements
7375   // code-recursively which can blow the stack.
7376 
7377   PostChildrenInfo Info;
7378   Info.Cursor = cursor;
7379   Info.CursorRange = cursorRange;
7380   Info.BeforeReachingCursorIdx = BeforeReachingCursorIdx;
7381   Info.BeforeChildrenTokenIdx = NextToken();
7382   Info.ChildActions = DetermineChildActions(cursor);
7383   PostChildrenInfos.push_back(Info);
7384 
7385   return CXChildVisit_Recurse;
7386 }
7387 
7388 bool AnnotateTokensWorker::postVisitChildren(CXCursor cursor) {
7389   if (PostChildrenInfos.empty())
7390     return false;
7391   const PostChildrenInfo &Info = PostChildrenInfos.back();
7392   if (!clang_equalCursors(Info.Cursor, cursor))
7393     return false;
7394 
7395   HandlePostPonedChildCursors(Info);
7396 
7397   const unsigned BeforeChildren = Info.BeforeChildrenTokenIdx;
7398   const unsigned AfterChildren = NextToken();
7399   SourceRange cursorRange = Info.CursorRange;
7400 
7401   // Scan the tokens that are at the end of the cursor, but are not captured
7402   // but the child cursors.
7403   annotateAndAdvanceTokens(cursor, RangeOverlap, cursorRange);
7404 
7405   // Scan the tokens that are at the beginning of the cursor, but are not
7406   // capture by the child cursors.
7407   for (unsigned I = BeforeChildren; I != AfterChildren; ++I) {
7408     if (!clang_isInvalid(clang_getCursorKind(Cursors[I])))
7409       break;
7410 
7411     Cursors[I] = cursor;
7412   }
7413 
7414   // Attributes are annotated out-of-order, rewind TokIdx to when we first
7415   // encountered the attribute cursor.
7416   if (clang_isAttribute(cursor.kind))
7417     TokIdx = Info.BeforeReachingCursorIdx;
7418 
7419   PostChildrenInfos.pop_back();
7420   return false;
7421 }
7422 
7423 void AnnotateTokensWorker::HandlePostPonedChildCursors(
7424     const PostChildrenInfo &Info) {
7425   for (const auto &ChildAction : Info.ChildActions) {
7426     if (ChildAction.action == PostChildrenAction::Postpone) {
7427       HandlePostPonedChildCursor(ChildAction.cursor,
7428                                  Info.BeforeChildrenTokenIdx);
7429     }
7430   }
7431 }
7432 
7433 void AnnotateTokensWorker::HandlePostPonedChildCursor(
7434     CXCursor Cursor, unsigned StartTokenIndex) {
7435   unsigned I = StartTokenIndex;
7436 
7437   // The bracket tokens of a Call or Subscript operator are mapped to
7438   // CallExpr/CXXOperatorCallExpr because we skipped visiting the corresponding
7439   // DeclRefExpr. Remap these tokens to the DeclRefExpr cursors.
7440   for (unsigned RefNameRangeNr = 0; I < NumTokens; RefNameRangeNr++) {
7441     const CXSourceRange CXRefNameRange = clang_getCursorReferenceNameRange(
7442         Cursor, CXNameRange_WantQualifier, RefNameRangeNr);
7443     if (clang_Range_isNull(CXRefNameRange))
7444       break; // All ranges handled.
7445 
7446     SourceRange RefNameRange = cxloc::translateCXSourceRange(CXRefNameRange);
7447     while (I < NumTokens) {
7448       const SourceLocation TokenLocation = GetTokenLoc(I);
7449       if (!TokenLocation.isValid())
7450         break;
7451 
7452       // Adapt the end range, because LocationCompare() reports
7453       // RangeOverlap even for the not-inclusive end location.
7454       const SourceLocation fixedEnd =
7455           RefNameRange.getEnd().getLocWithOffset(-1);
7456       RefNameRange = SourceRange(RefNameRange.getBegin(), fixedEnd);
7457 
7458       const RangeComparisonResult ComparisonResult =
7459           LocationCompare(SrcMgr, TokenLocation, RefNameRange);
7460 
7461       if (ComparisonResult == RangeOverlap) {
7462         Cursors[I++] = Cursor;
7463       } else if (ComparisonResult == RangeBefore) {
7464         ++I; // Not relevant token, check next one.
7465       } else if (ComparisonResult == RangeAfter) {
7466         break; // All tokens updated for current range, check next.
7467       }
7468     }
7469   }
7470 }
7471 
7472 static enum CXChildVisitResult AnnotateTokensVisitor(CXCursor cursor,
7473                                                      CXCursor parent,
7474                                                      CXClientData client_data) {
7475   return static_cast<AnnotateTokensWorker *>(client_data)
7476       ->Visit(cursor, parent);
7477 }
7478 
7479 static bool AnnotateTokensPostChildrenVisitor(CXCursor cursor,
7480                                               CXClientData client_data) {
7481   return static_cast<AnnotateTokensWorker *>(client_data)
7482       ->postVisitChildren(cursor);
7483 }
7484 
7485 namespace {
7486 
7487 /// Uses the macro expansions in the preprocessing record to find
7488 /// and mark tokens that are macro arguments. This info is used by the
7489 /// AnnotateTokensWorker.
7490 class MarkMacroArgTokensVisitor {
7491   SourceManager &SM;
7492   CXToken *Tokens;
7493   unsigned NumTokens;
7494   unsigned CurIdx;
7495 
7496 public:
7497   MarkMacroArgTokensVisitor(SourceManager &SM, CXToken *tokens,
7498                             unsigned numTokens)
7499       : SM(SM), Tokens(tokens), NumTokens(numTokens), CurIdx(0) {}
7500 
7501   CXChildVisitResult visit(CXCursor cursor, CXCursor parent) {
7502     if (cursor.kind != CXCursor_MacroExpansion)
7503       return CXChildVisit_Continue;
7504 
7505     SourceRange macroRange = getCursorMacroExpansion(cursor).getSourceRange();
7506     if (macroRange.getBegin() == macroRange.getEnd())
7507       return CXChildVisit_Continue; // it's not a function macro.
7508 
7509     for (; CurIdx < NumTokens; ++CurIdx) {
7510       if (!SM.isBeforeInTranslationUnit(getTokenLoc(CurIdx),
7511                                         macroRange.getBegin()))
7512         break;
7513     }
7514 
7515     if (CurIdx == NumTokens)
7516       return CXChildVisit_Break;
7517 
7518     for (; CurIdx < NumTokens; ++CurIdx) {
7519       SourceLocation tokLoc = getTokenLoc(CurIdx);
7520       if (!SM.isBeforeInTranslationUnit(tokLoc, macroRange.getEnd()))
7521         break;
7522 
7523       setFunctionMacroTokenLoc(CurIdx, SM.getMacroArgExpandedLocation(tokLoc));
7524     }
7525 
7526     if (CurIdx == NumTokens)
7527       return CXChildVisit_Break;
7528 
7529     return CXChildVisit_Continue;
7530   }
7531 
7532 private:
7533   CXToken &getTok(unsigned Idx) {
7534     assert(Idx < NumTokens);
7535     return Tokens[Idx];
7536   }
7537   const CXToken &getTok(unsigned Idx) const {
7538     assert(Idx < NumTokens);
7539     return Tokens[Idx];
7540   }
7541 
7542   SourceLocation getTokenLoc(unsigned tokI) {
7543     return SourceLocation::getFromRawEncoding(getTok(tokI).int_data[1]);
7544   }
7545 
7546   void setFunctionMacroTokenLoc(unsigned tokI, SourceLocation loc) {
7547     // The third field is reserved and currently not used. Use it here
7548     // to mark macro arg expanded tokens with their expanded locations.
7549     getTok(tokI).int_data[3] = loc.getRawEncoding();
7550   }
7551 };
7552 
7553 } // end anonymous namespace
7554 
7555 static CXChildVisitResult
7556 MarkMacroArgTokensVisitorDelegate(CXCursor cursor, CXCursor parent,
7557                                   CXClientData client_data) {
7558   return static_cast<MarkMacroArgTokensVisitor *>(client_data)
7559       ->visit(cursor, parent);
7560 }
7561 
7562 /// Used by \c annotatePreprocessorTokens.
7563 /// \returns true if lexing was finished, false otherwise.
7564 static bool lexNext(Lexer &Lex, Token &Tok, unsigned &NextIdx,
7565                     unsigned NumTokens) {
7566   if (NextIdx >= NumTokens)
7567     return true;
7568 
7569   ++NextIdx;
7570   Lex.LexFromRawLexer(Tok);
7571   return Tok.is(tok::eof);
7572 }
7573 
7574 static void annotatePreprocessorTokens(CXTranslationUnit TU,
7575                                        SourceRange RegionOfInterest,
7576                                        CXCursor *Cursors, CXToken *Tokens,
7577                                        unsigned NumTokens) {
7578   ASTUnit *CXXUnit = cxtu::getASTUnit(TU);
7579 
7580   Preprocessor &PP = CXXUnit->getPreprocessor();
7581   SourceManager &SourceMgr = CXXUnit->getSourceManager();
7582   std::pair<FileID, unsigned> BeginLocInfo =
7583       SourceMgr.getDecomposedSpellingLoc(RegionOfInterest.getBegin());
7584   std::pair<FileID, unsigned> EndLocInfo =
7585       SourceMgr.getDecomposedSpellingLoc(RegionOfInterest.getEnd());
7586 
7587   if (BeginLocInfo.first != EndLocInfo.first)
7588     return;
7589 
7590   StringRef Buffer;
7591   bool Invalid = false;
7592   Buffer = SourceMgr.getBufferData(BeginLocInfo.first, &Invalid);
7593   if (Buffer.empty() || Invalid)
7594     return;
7595 
7596   Lexer Lex(SourceMgr.getLocForStartOfFile(BeginLocInfo.first),
7597             CXXUnit->getASTContext().getLangOpts(), Buffer.begin(),
7598             Buffer.data() + BeginLocInfo.second, Buffer.end());
7599   Lex.SetCommentRetentionState(true);
7600 
7601   unsigned NextIdx = 0;
7602   // Lex tokens in raw mode until we hit the end of the range, to avoid
7603   // entering #includes or expanding macros.
7604   while (true) {
7605     Token Tok;
7606     if (lexNext(Lex, Tok, NextIdx, NumTokens))
7607       break;
7608     unsigned TokIdx = NextIdx - 1;
7609     assert(Tok.getLocation() ==
7610            SourceLocation::getFromRawEncoding(Tokens[TokIdx].int_data[1]));
7611 
7612   reprocess:
7613     if (Tok.is(tok::hash) && Tok.isAtStartOfLine()) {
7614       // We have found a preprocessing directive. Annotate the tokens
7615       // appropriately.
7616       //
7617       // FIXME: Some simple tests here could identify macro definitions and
7618       // #undefs, to provide specific cursor kinds for those.
7619 
7620       SourceLocation BeginLoc = Tok.getLocation();
7621       if (lexNext(Lex, Tok, NextIdx, NumTokens))
7622         break;
7623 
7624       MacroInfo *MI = nullptr;
7625       if (Tok.is(tok::raw_identifier) && Tok.getRawIdentifier() == "define") {
7626         if (lexNext(Lex, Tok, NextIdx, NumTokens))
7627           break;
7628 
7629         if (Tok.is(tok::raw_identifier)) {
7630           IdentifierInfo &II =
7631               PP.getIdentifierTable().get(Tok.getRawIdentifier());
7632           SourceLocation MappedTokLoc =
7633               CXXUnit->mapLocationToPreamble(Tok.getLocation());
7634           MI = getMacroInfo(II, MappedTokLoc, TU);
7635         }
7636       }
7637 
7638       bool finished = false;
7639       do {
7640         if (lexNext(Lex, Tok, NextIdx, NumTokens)) {
7641           finished = true;
7642           break;
7643         }
7644         // If we are in a macro definition, check if the token was ever a
7645         // macro name and annotate it if that's the case.
7646         if (MI) {
7647           SourceLocation SaveLoc = Tok.getLocation();
7648           Tok.setLocation(CXXUnit->mapLocationToPreamble(SaveLoc));
7649           MacroDefinitionRecord *MacroDef =
7650               checkForMacroInMacroDefinition(MI, Tok, TU);
7651           Tok.setLocation(SaveLoc);
7652           if (MacroDef)
7653             Cursors[NextIdx - 1] =
7654                 MakeMacroExpansionCursor(MacroDef, Tok.getLocation(), TU);
7655         }
7656       } while (!Tok.isAtStartOfLine());
7657 
7658       unsigned LastIdx = finished ? NextIdx - 1 : NextIdx - 2;
7659       assert(TokIdx <= LastIdx);
7660       SourceLocation EndLoc =
7661           SourceLocation::getFromRawEncoding(Tokens[LastIdx].int_data[1]);
7662       CXCursor Cursor =
7663           MakePreprocessingDirectiveCursor(SourceRange(BeginLoc, EndLoc), TU);
7664 
7665       for (; TokIdx <= LastIdx; ++TokIdx)
7666         updateCursorAnnotation(Cursors[TokIdx], Cursor);
7667 
7668       if (finished)
7669         break;
7670       goto reprocess;
7671     }
7672   }
7673 }
7674 
7675 // This gets run a separate thread to avoid stack blowout.
7676 static void clang_annotateTokensImpl(CXTranslationUnit TU, ASTUnit *CXXUnit,
7677                                      CXToken *Tokens, unsigned NumTokens,
7678                                      CXCursor *Cursors) {
7679   CIndexer *CXXIdx = TU->CIdx;
7680   if (CXXIdx->isOptEnabled(CXGlobalOpt_ThreadBackgroundPriorityForEditing))
7681     setThreadBackgroundPriority();
7682 
7683   // Determine the region of interest, which contains all of the tokens.
7684   SourceRange RegionOfInterest;
7685   RegionOfInterest.setBegin(
7686       cxloc::translateSourceLocation(clang_getTokenLocation(TU, Tokens[0])));
7687   RegionOfInterest.setEnd(cxloc::translateSourceLocation(
7688       clang_getTokenLocation(TU, Tokens[NumTokens - 1])));
7689 
7690   // Relex the tokens within the source range to look for preprocessing
7691   // directives.
7692   annotatePreprocessorTokens(TU, RegionOfInterest, Cursors, Tokens, NumTokens);
7693 
7694   // If begin location points inside a macro argument, set it to the expansion
7695   // location so we can have the full context when annotating semantically.
7696   {
7697     SourceManager &SM = CXXUnit->getSourceManager();
7698     SourceLocation Loc =
7699         SM.getMacroArgExpandedLocation(RegionOfInterest.getBegin());
7700     if (Loc.isMacroID())
7701       RegionOfInterest.setBegin(SM.getExpansionLoc(Loc));
7702   }
7703 
7704   if (CXXUnit->getPreprocessor().getPreprocessingRecord()) {
7705     // Search and mark tokens that are macro argument expansions.
7706     MarkMacroArgTokensVisitor Visitor(CXXUnit->getSourceManager(), Tokens,
7707                                       NumTokens);
7708     CursorVisitor MacroArgMarker(
7709         TU, MarkMacroArgTokensVisitorDelegate, &Visitor,
7710         /*VisitPreprocessorLast=*/true,
7711         /*VisitIncludedEntities=*/false, RegionOfInterest);
7712     MacroArgMarker.visitPreprocessedEntitiesInRegion();
7713   }
7714 
7715   // Annotate all of the source locations in the region of interest that map to
7716   // a specific cursor.
7717   AnnotateTokensWorker W(Tokens, Cursors, NumTokens, TU, RegionOfInterest);
7718 
7719   // FIXME: We use a ridiculous stack size here because the data-recursion
7720   // algorithm uses a large stack frame than the non-data recursive version,
7721   // and AnnotationTokensWorker currently transforms the data-recursion
7722   // algorithm back into a traditional recursion by explicitly calling
7723   // VisitChildren().  We will need to remove this explicit recursive call.
7724   W.AnnotateTokens();
7725 
7726   // If we ran into any entities that involve context-sensitive keywords,
7727   // take another pass through the tokens to mark them as such.
7728   if (W.hasContextSensitiveKeywords()) {
7729     for (unsigned I = 0; I != NumTokens; ++I) {
7730       if (clang_getTokenKind(Tokens[I]) != CXToken_Identifier)
7731         continue;
7732 
7733       if (Cursors[I].kind == CXCursor_ObjCPropertyDecl) {
7734         IdentifierInfo *II = static_cast<IdentifierInfo *>(Tokens[I].ptr_data);
7735         if (const ObjCPropertyDecl *Property =
7736                 dyn_cast_or_null<ObjCPropertyDecl>(getCursorDecl(Cursors[I]))) {
7737           if (Property->getPropertyAttributesAsWritten() != 0 &&
7738               llvm::StringSwitch<bool>(II->getName())
7739                   .Case("readonly", true)
7740                   .Case("assign", true)
7741                   .Case("unsafe_unretained", true)
7742                   .Case("readwrite", true)
7743                   .Case("retain", true)
7744                   .Case("copy", true)
7745                   .Case("nonatomic", true)
7746                   .Case("atomic", true)
7747                   .Case("getter", true)
7748                   .Case("setter", true)
7749                   .Case("strong", true)
7750                   .Case("weak", true)
7751                   .Case("class", true)
7752                   .Default(false))
7753             Tokens[I].int_data[0] = CXToken_Keyword;
7754         }
7755         continue;
7756       }
7757 
7758       if (Cursors[I].kind == CXCursor_ObjCInstanceMethodDecl ||
7759           Cursors[I].kind == CXCursor_ObjCClassMethodDecl) {
7760         IdentifierInfo *II = static_cast<IdentifierInfo *>(Tokens[I].ptr_data);
7761         if (llvm::StringSwitch<bool>(II->getName())
7762                 .Case("in", true)
7763                 .Case("out", true)
7764                 .Case("inout", true)
7765                 .Case("oneway", true)
7766                 .Case("bycopy", true)
7767                 .Case("byref", true)
7768                 .Default(false))
7769           Tokens[I].int_data[0] = CXToken_Keyword;
7770         continue;
7771       }
7772 
7773       if (Cursors[I].kind == CXCursor_CXXFinalAttr ||
7774           Cursors[I].kind == CXCursor_CXXOverrideAttr) {
7775         Tokens[I].int_data[0] = CXToken_Keyword;
7776         continue;
7777       }
7778     }
7779   }
7780 }
7781 
7782 void clang_annotateTokens(CXTranslationUnit TU, CXToken *Tokens,
7783                           unsigned NumTokens, CXCursor *Cursors) {
7784   if (isNotUsableTU(TU)) {
7785     LOG_BAD_TU(TU);
7786     return;
7787   }
7788   if (NumTokens == 0 || !Tokens || !Cursors) {
7789     LOG_FUNC_SECTION { *Log << "<null input>"; }
7790     return;
7791   }
7792 
7793   LOG_FUNC_SECTION {
7794     *Log << TU << ' ';
7795     CXSourceLocation bloc = clang_getTokenLocation(TU, Tokens[0]);
7796     CXSourceLocation eloc = clang_getTokenLocation(TU, Tokens[NumTokens - 1]);
7797     *Log << clang_getRange(bloc, eloc);
7798   }
7799 
7800   // Any token we don't specifically annotate will have a NULL cursor.
7801   CXCursor C = clang_getNullCursor();
7802   for (unsigned I = 0; I != NumTokens; ++I)
7803     Cursors[I] = C;
7804 
7805   ASTUnit *CXXUnit = cxtu::getASTUnit(TU);
7806   if (!CXXUnit)
7807     return;
7808 
7809   ASTUnit::ConcurrencyCheck Check(*CXXUnit);
7810 
7811   auto AnnotateTokensImpl = [=]() {
7812     clang_annotateTokensImpl(TU, CXXUnit, Tokens, NumTokens, Cursors);
7813   };
7814   llvm::CrashRecoveryContext CRC;
7815   if (!RunSafely(CRC, AnnotateTokensImpl, GetSafetyThreadStackSize() * 2)) {
7816     fprintf(stderr, "libclang: crash detected while annotating tokens\n");
7817   }
7818 }
7819 
7820 //===----------------------------------------------------------------------===//
7821 // Operations for querying linkage of a cursor.
7822 //===----------------------------------------------------------------------===//
7823 
7824 CXLinkageKind clang_getCursorLinkage(CXCursor cursor) {
7825   if (!clang_isDeclaration(cursor.kind))
7826     return CXLinkage_Invalid;
7827 
7828   const Decl *D = cxcursor::getCursorDecl(cursor);
7829   if (const NamedDecl *ND = dyn_cast_or_null<NamedDecl>(D))
7830     switch (ND->getLinkageInternal()) {
7831     case NoLinkage:
7832     case VisibleNoLinkage:
7833       return CXLinkage_NoLinkage;
7834     case ModuleInternalLinkage:
7835     case InternalLinkage:
7836       return CXLinkage_Internal;
7837     case UniqueExternalLinkage:
7838       return CXLinkage_UniqueExternal;
7839     case ModuleLinkage:
7840     case ExternalLinkage:
7841       return CXLinkage_External;
7842     };
7843 
7844   return CXLinkage_Invalid;
7845 }
7846 
7847 //===----------------------------------------------------------------------===//
7848 // Operations for querying visibility of a cursor.
7849 //===----------------------------------------------------------------------===//
7850 
7851 CXVisibilityKind clang_getCursorVisibility(CXCursor cursor) {
7852   if (!clang_isDeclaration(cursor.kind))
7853     return CXVisibility_Invalid;
7854 
7855   const Decl *D = cxcursor::getCursorDecl(cursor);
7856   if (const NamedDecl *ND = dyn_cast_or_null<NamedDecl>(D))
7857     switch (ND->getVisibility()) {
7858     case HiddenVisibility:
7859       return CXVisibility_Hidden;
7860     case ProtectedVisibility:
7861       return CXVisibility_Protected;
7862     case DefaultVisibility:
7863       return CXVisibility_Default;
7864     };
7865 
7866   return CXVisibility_Invalid;
7867 }
7868 
7869 //===----------------------------------------------------------------------===//
7870 // Operations for querying language of a cursor.
7871 //===----------------------------------------------------------------------===//
7872 
7873 static CXLanguageKind getDeclLanguage(const Decl *D) {
7874   if (!D)
7875     return CXLanguage_C;
7876 
7877   switch (D->getKind()) {
7878   default:
7879     break;
7880   case Decl::ImplicitParam:
7881   case Decl::ObjCAtDefsField:
7882   case Decl::ObjCCategory:
7883   case Decl::ObjCCategoryImpl:
7884   case Decl::ObjCCompatibleAlias:
7885   case Decl::ObjCImplementation:
7886   case Decl::ObjCInterface:
7887   case Decl::ObjCIvar:
7888   case Decl::ObjCMethod:
7889   case Decl::ObjCProperty:
7890   case Decl::ObjCPropertyImpl:
7891   case Decl::ObjCProtocol:
7892   case Decl::ObjCTypeParam:
7893     return CXLanguage_ObjC;
7894   case Decl::CXXConstructor:
7895   case Decl::CXXConversion:
7896   case Decl::CXXDestructor:
7897   case Decl::CXXMethod:
7898   case Decl::CXXRecord:
7899   case Decl::ClassTemplate:
7900   case Decl::ClassTemplatePartialSpecialization:
7901   case Decl::ClassTemplateSpecialization:
7902   case Decl::Friend:
7903   case Decl::FriendTemplate:
7904   case Decl::FunctionTemplate:
7905   case Decl::LinkageSpec:
7906   case Decl::Namespace:
7907   case Decl::NamespaceAlias:
7908   case Decl::NonTypeTemplateParm:
7909   case Decl::StaticAssert:
7910   case Decl::TemplateTemplateParm:
7911   case Decl::TemplateTypeParm:
7912   case Decl::UnresolvedUsingTypename:
7913   case Decl::UnresolvedUsingValue:
7914   case Decl::Using:
7915   case Decl::UsingDirective:
7916   case Decl::UsingShadow:
7917     return CXLanguage_CPlusPlus;
7918   }
7919 
7920   return CXLanguage_C;
7921 }
7922 
7923 static CXAvailabilityKind getCursorAvailabilityForDecl(const Decl *D) {
7924   if (isa<FunctionDecl>(D) && cast<FunctionDecl>(D)->isDeleted())
7925     return CXAvailability_NotAvailable;
7926 
7927   switch (D->getAvailability()) {
7928   case AR_Available:
7929   case AR_NotYetIntroduced:
7930     if (const EnumConstantDecl *EnumConst = dyn_cast<EnumConstantDecl>(D))
7931       return getCursorAvailabilityForDecl(
7932           cast<Decl>(EnumConst->getDeclContext()));
7933     return CXAvailability_Available;
7934 
7935   case AR_Deprecated:
7936     return CXAvailability_Deprecated;
7937 
7938   case AR_Unavailable:
7939     return CXAvailability_NotAvailable;
7940   }
7941 
7942   llvm_unreachable("Unknown availability kind!");
7943 }
7944 
7945 enum CXAvailabilityKind clang_getCursorAvailability(CXCursor cursor) {
7946   if (clang_isDeclaration(cursor.kind))
7947     if (const Decl *D = cxcursor::getCursorDecl(cursor))
7948       return getCursorAvailabilityForDecl(D);
7949 
7950   return CXAvailability_Available;
7951 }
7952 
7953 static CXVersion convertVersion(VersionTuple In) {
7954   CXVersion Out = {-1, -1, -1};
7955   if (In.empty())
7956     return Out;
7957 
7958   Out.Major = In.getMajor();
7959 
7960   Optional<unsigned> Minor = In.getMinor();
7961   if (Minor.hasValue())
7962     Out.Minor = *Minor;
7963   else
7964     return Out;
7965 
7966   Optional<unsigned> Subminor = In.getSubminor();
7967   if (Subminor.hasValue())
7968     Out.Subminor = *Subminor;
7969 
7970   return Out;
7971 }
7972 
7973 static void getCursorPlatformAvailabilityForDecl(
7974     const Decl *D, int *always_deprecated, CXString *deprecated_message,
7975     int *always_unavailable, CXString *unavailable_message,
7976     SmallVectorImpl<AvailabilityAttr *> &AvailabilityAttrs) {
7977   bool HadAvailAttr = false;
7978   for (auto A : D->attrs()) {
7979     if (DeprecatedAttr *Deprecated = dyn_cast<DeprecatedAttr>(A)) {
7980       HadAvailAttr = true;
7981       if (always_deprecated)
7982         *always_deprecated = 1;
7983       if (deprecated_message) {
7984         clang_disposeString(*deprecated_message);
7985         *deprecated_message = cxstring::createDup(Deprecated->getMessage());
7986       }
7987       continue;
7988     }
7989 
7990     if (UnavailableAttr *Unavailable = dyn_cast<UnavailableAttr>(A)) {
7991       HadAvailAttr = true;
7992       if (always_unavailable)
7993         *always_unavailable = 1;
7994       if (unavailable_message) {
7995         clang_disposeString(*unavailable_message);
7996         *unavailable_message = cxstring::createDup(Unavailable->getMessage());
7997       }
7998       continue;
7999     }
8000 
8001     if (AvailabilityAttr *Avail = dyn_cast<AvailabilityAttr>(A)) {
8002       AvailabilityAttrs.push_back(Avail);
8003       HadAvailAttr = true;
8004     }
8005   }
8006 
8007   if (!HadAvailAttr)
8008     if (const EnumConstantDecl *EnumConst = dyn_cast<EnumConstantDecl>(D))
8009       return getCursorPlatformAvailabilityForDecl(
8010           cast<Decl>(EnumConst->getDeclContext()), always_deprecated,
8011           deprecated_message, always_unavailable, unavailable_message,
8012           AvailabilityAttrs);
8013 
8014   if (AvailabilityAttrs.empty())
8015     return;
8016 
8017   llvm::sort(
8018       AvailabilityAttrs, [](AvailabilityAttr *LHS, AvailabilityAttr *RHS) {
8019         return LHS->getPlatform()->getName() < RHS->getPlatform()->getName();
8020       });
8021   ASTContext &Ctx = D->getASTContext();
8022   auto It = std::unique(
8023       AvailabilityAttrs.begin(), AvailabilityAttrs.end(),
8024       [&Ctx](AvailabilityAttr *LHS, AvailabilityAttr *RHS) {
8025         if (LHS->getPlatform() != RHS->getPlatform())
8026           return false;
8027 
8028         if (LHS->getIntroduced() == RHS->getIntroduced() &&
8029             LHS->getDeprecated() == RHS->getDeprecated() &&
8030             LHS->getObsoleted() == RHS->getObsoleted() &&
8031             LHS->getMessage() == RHS->getMessage() &&
8032             LHS->getReplacement() == RHS->getReplacement())
8033           return true;
8034 
8035         if ((!LHS->getIntroduced().empty() && !RHS->getIntroduced().empty()) ||
8036             (!LHS->getDeprecated().empty() && !RHS->getDeprecated().empty()) ||
8037             (!LHS->getObsoleted().empty() && !RHS->getObsoleted().empty()))
8038           return false;
8039 
8040         if (LHS->getIntroduced().empty() && !RHS->getIntroduced().empty())
8041           LHS->setIntroduced(Ctx, RHS->getIntroduced());
8042 
8043         if (LHS->getDeprecated().empty() && !RHS->getDeprecated().empty()) {
8044           LHS->setDeprecated(Ctx, RHS->getDeprecated());
8045           if (LHS->getMessage().empty())
8046             LHS->setMessage(Ctx, RHS->getMessage());
8047           if (LHS->getReplacement().empty())
8048             LHS->setReplacement(Ctx, RHS->getReplacement());
8049         }
8050 
8051         if (LHS->getObsoleted().empty() && !RHS->getObsoleted().empty()) {
8052           LHS->setObsoleted(Ctx, RHS->getObsoleted());
8053           if (LHS->getMessage().empty())
8054             LHS->setMessage(Ctx, RHS->getMessage());
8055           if (LHS->getReplacement().empty())
8056             LHS->setReplacement(Ctx, RHS->getReplacement());
8057         }
8058 
8059         return true;
8060       });
8061   AvailabilityAttrs.erase(It, AvailabilityAttrs.end());
8062 }
8063 
8064 int clang_getCursorPlatformAvailability(CXCursor cursor, int *always_deprecated,
8065                                         CXString *deprecated_message,
8066                                         int *always_unavailable,
8067                                         CXString *unavailable_message,
8068                                         CXPlatformAvailability *availability,
8069                                         int availability_size) {
8070   if (always_deprecated)
8071     *always_deprecated = 0;
8072   if (deprecated_message)
8073     *deprecated_message = cxstring::createEmpty();
8074   if (always_unavailable)
8075     *always_unavailable = 0;
8076   if (unavailable_message)
8077     *unavailable_message = cxstring::createEmpty();
8078 
8079   if (!clang_isDeclaration(cursor.kind))
8080     return 0;
8081 
8082   const Decl *D = cxcursor::getCursorDecl(cursor);
8083   if (!D)
8084     return 0;
8085 
8086   SmallVector<AvailabilityAttr *, 8> AvailabilityAttrs;
8087   getCursorPlatformAvailabilityForDecl(D, always_deprecated, deprecated_message,
8088                                        always_unavailable, unavailable_message,
8089                                        AvailabilityAttrs);
8090   for (const auto &Avail :
8091        llvm::enumerate(llvm::makeArrayRef(AvailabilityAttrs)
8092                            .take_front(availability_size))) {
8093     availability[Avail.index()].Platform =
8094         cxstring::createDup(Avail.value()->getPlatform()->getName());
8095     availability[Avail.index()].Introduced =
8096         convertVersion(Avail.value()->getIntroduced());
8097     availability[Avail.index()].Deprecated =
8098         convertVersion(Avail.value()->getDeprecated());
8099     availability[Avail.index()].Obsoleted =
8100         convertVersion(Avail.value()->getObsoleted());
8101     availability[Avail.index()].Unavailable = Avail.value()->getUnavailable();
8102     availability[Avail.index()].Message =
8103         cxstring::createDup(Avail.value()->getMessage());
8104   }
8105 
8106   return AvailabilityAttrs.size();
8107 }
8108 
8109 void clang_disposeCXPlatformAvailability(CXPlatformAvailability *availability) {
8110   clang_disposeString(availability->Platform);
8111   clang_disposeString(availability->Message);
8112 }
8113 
8114 CXLanguageKind clang_getCursorLanguage(CXCursor cursor) {
8115   if (clang_isDeclaration(cursor.kind))
8116     return getDeclLanguage(cxcursor::getCursorDecl(cursor));
8117 
8118   return CXLanguage_Invalid;
8119 }
8120 
8121 CXTLSKind clang_getCursorTLSKind(CXCursor cursor) {
8122   const Decl *D = cxcursor::getCursorDecl(cursor);
8123   if (const VarDecl *VD = dyn_cast<VarDecl>(D)) {
8124     switch (VD->getTLSKind()) {
8125     case VarDecl::TLS_None:
8126       return CXTLS_None;
8127     case VarDecl::TLS_Dynamic:
8128       return CXTLS_Dynamic;
8129     case VarDecl::TLS_Static:
8130       return CXTLS_Static;
8131     }
8132   }
8133 
8134   return CXTLS_None;
8135 }
8136 
8137 /// If the given cursor is the "templated" declaration
8138 /// describing a class or function template, return the class or
8139 /// function template.
8140 static const Decl *maybeGetTemplateCursor(const Decl *D) {
8141   if (!D)
8142     return nullptr;
8143 
8144   if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D))
8145     if (FunctionTemplateDecl *FunTmpl = FD->getDescribedFunctionTemplate())
8146       return FunTmpl;
8147 
8148   if (const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(D))
8149     if (ClassTemplateDecl *ClassTmpl = RD->getDescribedClassTemplate())
8150       return ClassTmpl;
8151 
8152   return D;
8153 }
8154 
8155 enum CX_StorageClass clang_Cursor_getStorageClass(CXCursor C) {
8156   StorageClass sc = SC_None;
8157   const Decl *D = getCursorDecl(C);
8158   if (D) {
8159     if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
8160       sc = FD->getStorageClass();
8161     } else if (const VarDecl *VD = dyn_cast<VarDecl>(D)) {
8162       sc = VD->getStorageClass();
8163     } else {
8164       return CX_SC_Invalid;
8165     }
8166   } else {
8167     return CX_SC_Invalid;
8168   }
8169   switch (sc) {
8170   case SC_None:
8171     return CX_SC_None;
8172   case SC_Extern:
8173     return CX_SC_Extern;
8174   case SC_Static:
8175     return CX_SC_Static;
8176   case SC_PrivateExtern:
8177     return CX_SC_PrivateExtern;
8178   case SC_Auto:
8179     return CX_SC_Auto;
8180   case SC_Register:
8181     return CX_SC_Register;
8182   }
8183   llvm_unreachable("Unhandled storage class!");
8184 }
8185 
8186 CXCursor clang_getCursorSemanticParent(CXCursor cursor) {
8187   if (clang_isDeclaration(cursor.kind)) {
8188     if (const Decl *D = getCursorDecl(cursor)) {
8189       const DeclContext *DC = D->getDeclContext();
8190       if (!DC)
8191         return clang_getNullCursor();
8192 
8193       return MakeCXCursor(maybeGetTemplateCursor(cast<Decl>(DC)),
8194                           getCursorTU(cursor));
8195     }
8196   }
8197 
8198   if (clang_isStatement(cursor.kind) || clang_isExpression(cursor.kind)) {
8199     if (const Decl *D = getCursorDecl(cursor))
8200       return MakeCXCursor(D, getCursorTU(cursor));
8201   }
8202 
8203   return clang_getNullCursor();
8204 }
8205 
8206 CXCursor clang_getCursorLexicalParent(CXCursor cursor) {
8207   if (clang_isDeclaration(cursor.kind)) {
8208     if (const Decl *D = getCursorDecl(cursor)) {
8209       const DeclContext *DC = D->getLexicalDeclContext();
8210       if (!DC)
8211         return clang_getNullCursor();
8212 
8213       return MakeCXCursor(maybeGetTemplateCursor(cast<Decl>(DC)),
8214                           getCursorTU(cursor));
8215     }
8216   }
8217 
8218   // FIXME: Note that we can't easily compute the lexical context of a
8219   // statement or expression, so we return nothing.
8220   return clang_getNullCursor();
8221 }
8222 
8223 CXFile clang_getIncludedFile(CXCursor cursor) {
8224   if (cursor.kind != CXCursor_InclusionDirective)
8225     return nullptr;
8226 
8227   const InclusionDirective *ID = getCursorInclusionDirective(cursor);
8228   return const_cast<FileEntry *>(ID->getFile());
8229 }
8230 
8231 unsigned clang_Cursor_getObjCPropertyAttributes(CXCursor C, unsigned reserved) {
8232   if (C.kind != CXCursor_ObjCPropertyDecl)
8233     return CXObjCPropertyAttr_noattr;
8234 
8235   unsigned Result = CXObjCPropertyAttr_noattr;
8236   const ObjCPropertyDecl *PD = dyn_cast<ObjCPropertyDecl>(getCursorDecl(C));
8237   ObjCPropertyAttribute::Kind Attr = PD->getPropertyAttributesAsWritten();
8238 
8239 #define SET_CXOBJCPROP_ATTR(A)                                                 \
8240   if (Attr & ObjCPropertyAttribute::kind_##A)                                  \
8241   Result |= CXObjCPropertyAttr_##A
8242   SET_CXOBJCPROP_ATTR(readonly);
8243   SET_CXOBJCPROP_ATTR(getter);
8244   SET_CXOBJCPROP_ATTR(assign);
8245   SET_CXOBJCPROP_ATTR(readwrite);
8246   SET_CXOBJCPROP_ATTR(retain);
8247   SET_CXOBJCPROP_ATTR(copy);
8248   SET_CXOBJCPROP_ATTR(nonatomic);
8249   SET_CXOBJCPROP_ATTR(setter);
8250   SET_CXOBJCPROP_ATTR(atomic);
8251   SET_CXOBJCPROP_ATTR(weak);
8252   SET_CXOBJCPROP_ATTR(strong);
8253   SET_CXOBJCPROP_ATTR(unsafe_unretained);
8254   SET_CXOBJCPROP_ATTR(class);
8255 #undef SET_CXOBJCPROP_ATTR
8256 
8257   return Result;
8258 }
8259 
8260 CXString clang_Cursor_getObjCPropertyGetterName(CXCursor C) {
8261   if (C.kind != CXCursor_ObjCPropertyDecl)
8262     return cxstring::createNull();
8263 
8264   const ObjCPropertyDecl *PD = dyn_cast<ObjCPropertyDecl>(getCursorDecl(C));
8265   Selector sel = PD->getGetterName();
8266   if (sel.isNull())
8267     return cxstring::createNull();
8268 
8269   return cxstring::createDup(sel.getAsString());
8270 }
8271 
8272 CXString clang_Cursor_getObjCPropertySetterName(CXCursor C) {
8273   if (C.kind != CXCursor_ObjCPropertyDecl)
8274     return cxstring::createNull();
8275 
8276   const ObjCPropertyDecl *PD = dyn_cast<ObjCPropertyDecl>(getCursorDecl(C));
8277   Selector sel = PD->getSetterName();
8278   if (sel.isNull())
8279     return cxstring::createNull();
8280 
8281   return cxstring::createDup(sel.getAsString());
8282 }
8283 
8284 unsigned clang_Cursor_getObjCDeclQualifiers(CXCursor C) {
8285   if (!clang_isDeclaration(C.kind))
8286     return CXObjCDeclQualifier_None;
8287 
8288   Decl::ObjCDeclQualifier QT = Decl::OBJC_TQ_None;
8289   const Decl *D = getCursorDecl(C);
8290   if (const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(D))
8291     QT = MD->getObjCDeclQualifier();
8292   else if (const ParmVarDecl *PD = dyn_cast<ParmVarDecl>(D))
8293     QT = PD->getObjCDeclQualifier();
8294   if (QT == Decl::OBJC_TQ_None)
8295     return CXObjCDeclQualifier_None;
8296 
8297   unsigned Result = CXObjCDeclQualifier_None;
8298   if (QT & Decl::OBJC_TQ_In)
8299     Result |= CXObjCDeclQualifier_In;
8300   if (QT & Decl::OBJC_TQ_Inout)
8301     Result |= CXObjCDeclQualifier_Inout;
8302   if (QT & Decl::OBJC_TQ_Out)
8303     Result |= CXObjCDeclQualifier_Out;
8304   if (QT & Decl::OBJC_TQ_Bycopy)
8305     Result |= CXObjCDeclQualifier_Bycopy;
8306   if (QT & Decl::OBJC_TQ_Byref)
8307     Result |= CXObjCDeclQualifier_Byref;
8308   if (QT & Decl::OBJC_TQ_Oneway)
8309     Result |= CXObjCDeclQualifier_Oneway;
8310 
8311   return Result;
8312 }
8313 
8314 unsigned clang_Cursor_isObjCOptional(CXCursor C) {
8315   if (!clang_isDeclaration(C.kind))
8316     return 0;
8317 
8318   const Decl *D = getCursorDecl(C);
8319   if (const ObjCPropertyDecl *PD = dyn_cast<ObjCPropertyDecl>(D))
8320     return PD->getPropertyImplementation() == ObjCPropertyDecl::Optional;
8321   if (const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(D))
8322     return MD->getImplementationControl() == ObjCMethodDecl::Optional;
8323 
8324   return 0;
8325 }
8326 
8327 unsigned clang_Cursor_isVariadic(CXCursor C) {
8328   if (!clang_isDeclaration(C.kind))
8329     return 0;
8330 
8331   const Decl *D = getCursorDecl(C);
8332   if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D))
8333     return FD->isVariadic();
8334   if (const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(D))
8335     return MD->isVariadic();
8336 
8337   return 0;
8338 }
8339 
8340 unsigned clang_Cursor_isExternalSymbol(CXCursor C, CXString *language,
8341                                        CXString *definedIn,
8342                                        unsigned *isGenerated) {
8343   if (!clang_isDeclaration(C.kind))
8344     return 0;
8345 
8346   const Decl *D = getCursorDecl(C);
8347 
8348   if (auto *attr = D->getExternalSourceSymbolAttr()) {
8349     if (language)
8350       *language = cxstring::createDup(attr->getLanguage());
8351     if (definedIn)
8352       *definedIn = cxstring::createDup(attr->getDefinedIn());
8353     if (isGenerated)
8354       *isGenerated = attr->getGeneratedDeclaration();
8355     return 1;
8356   }
8357   return 0;
8358 }
8359 
8360 CXSourceRange clang_Cursor_getCommentRange(CXCursor C) {
8361   if (!clang_isDeclaration(C.kind))
8362     return clang_getNullRange();
8363 
8364   const Decl *D = getCursorDecl(C);
8365   ASTContext &Context = getCursorContext(C);
8366   const RawComment *RC = Context.getRawCommentForAnyRedecl(D);
8367   if (!RC)
8368     return clang_getNullRange();
8369 
8370   return cxloc::translateSourceRange(Context, RC->getSourceRange());
8371 }
8372 
8373 CXString clang_Cursor_getRawCommentText(CXCursor C) {
8374   if (!clang_isDeclaration(C.kind))
8375     return cxstring::createNull();
8376 
8377   const Decl *D = getCursorDecl(C);
8378   ASTContext &Context = getCursorContext(C);
8379   const RawComment *RC = Context.getRawCommentForAnyRedecl(D);
8380   StringRef RawText =
8381       RC ? RC->getRawText(Context.getSourceManager()) : StringRef();
8382 
8383   // Don't duplicate the string because RawText points directly into source
8384   // code.
8385   return cxstring::createRef(RawText);
8386 }
8387 
8388 CXString clang_Cursor_getBriefCommentText(CXCursor C) {
8389   if (!clang_isDeclaration(C.kind))
8390     return cxstring::createNull();
8391 
8392   const Decl *D = getCursorDecl(C);
8393   const ASTContext &Context = getCursorContext(C);
8394   const RawComment *RC = Context.getRawCommentForAnyRedecl(D);
8395 
8396   if (RC) {
8397     StringRef BriefText = RC->getBriefText(Context);
8398 
8399     // Don't duplicate the string because RawComment ensures that this memory
8400     // will not go away.
8401     return cxstring::createRef(BriefText);
8402   }
8403 
8404   return cxstring::createNull();
8405 }
8406 
8407 CXModule clang_Cursor_getModule(CXCursor C) {
8408   if (C.kind == CXCursor_ModuleImportDecl) {
8409     if (const ImportDecl *ImportD =
8410             dyn_cast_or_null<ImportDecl>(getCursorDecl(C)))
8411       return ImportD->getImportedModule();
8412   }
8413 
8414   return nullptr;
8415 }
8416 
8417 CXModule clang_getModuleForFile(CXTranslationUnit TU, CXFile File) {
8418   if (isNotUsableTU(TU)) {
8419     LOG_BAD_TU(TU);
8420     return nullptr;
8421   }
8422   if (!File)
8423     return nullptr;
8424   FileEntry *FE = static_cast<FileEntry *>(File);
8425 
8426   ASTUnit &Unit = *cxtu::getASTUnit(TU);
8427   HeaderSearch &HS = Unit.getPreprocessor().getHeaderSearchInfo();
8428   ModuleMap::KnownHeader Header = HS.findModuleForHeader(FE);
8429 
8430   return Header.getModule();
8431 }
8432 
8433 CXFile clang_Module_getASTFile(CXModule CXMod) {
8434   if (!CXMod)
8435     return nullptr;
8436   Module *Mod = static_cast<Module *>(CXMod);
8437   if (auto File = Mod->getASTFile())
8438     return const_cast<FileEntry *>(&File->getFileEntry());
8439   return nullptr;
8440 }
8441 
8442 CXModule clang_Module_getParent(CXModule CXMod) {
8443   if (!CXMod)
8444     return nullptr;
8445   Module *Mod = static_cast<Module *>(CXMod);
8446   return Mod->Parent;
8447 }
8448 
8449 CXString clang_Module_getName(CXModule CXMod) {
8450   if (!CXMod)
8451     return cxstring::createEmpty();
8452   Module *Mod = static_cast<Module *>(CXMod);
8453   return cxstring::createDup(Mod->Name);
8454 }
8455 
8456 CXString clang_Module_getFullName(CXModule CXMod) {
8457   if (!CXMod)
8458     return cxstring::createEmpty();
8459   Module *Mod = static_cast<Module *>(CXMod);
8460   return cxstring::createDup(Mod->getFullModuleName());
8461 }
8462 
8463 int clang_Module_isSystem(CXModule CXMod) {
8464   if (!CXMod)
8465     return 0;
8466   Module *Mod = static_cast<Module *>(CXMod);
8467   return Mod->IsSystem;
8468 }
8469 
8470 unsigned clang_Module_getNumTopLevelHeaders(CXTranslationUnit TU,
8471                                             CXModule CXMod) {
8472   if (isNotUsableTU(TU)) {
8473     LOG_BAD_TU(TU);
8474     return 0;
8475   }
8476   if (!CXMod)
8477     return 0;
8478   Module *Mod = static_cast<Module *>(CXMod);
8479   FileManager &FileMgr = cxtu::getASTUnit(TU)->getFileManager();
8480   ArrayRef<const FileEntry *> TopHeaders = Mod->getTopHeaders(FileMgr);
8481   return TopHeaders.size();
8482 }
8483 
8484 CXFile clang_Module_getTopLevelHeader(CXTranslationUnit TU, CXModule CXMod,
8485                                       unsigned Index) {
8486   if (isNotUsableTU(TU)) {
8487     LOG_BAD_TU(TU);
8488     return nullptr;
8489   }
8490   if (!CXMod)
8491     return nullptr;
8492   Module *Mod = static_cast<Module *>(CXMod);
8493   FileManager &FileMgr = cxtu::getASTUnit(TU)->getFileManager();
8494 
8495   ArrayRef<const FileEntry *> TopHeaders = Mod->getTopHeaders(FileMgr);
8496   if (Index < TopHeaders.size())
8497     return const_cast<FileEntry *>(TopHeaders[Index]);
8498 
8499   return nullptr;
8500 }
8501 
8502 //===----------------------------------------------------------------------===//
8503 // C++ AST instrospection.
8504 //===----------------------------------------------------------------------===//
8505 
8506 unsigned clang_CXXConstructor_isDefaultConstructor(CXCursor C) {
8507   if (!clang_isDeclaration(C.kind))
8508     return 0;
8509 
8510   const Decl *D = cxcursor::getCursorDecl(C);
8511   const CXXConstructorDecl *Constructor =
8512       D ? dyn_cast_or_null<CXXConstructorDecl>(D->getAsFunction()) : nullptr;
8513   return (Constructor && Constructor->isDefaultConstructor()) ? 1 : 0;
8514 }
8515 
8516 unsigned clang_CXXConstructor_isCopyConstructor(CXCursor C) {
8517   if (!clang_isDeclaration(C.kind))
8518     return 0;
8519 
8520   const Decl *D = cxcursor::getCursorDecl(C);
8521   const CXXConstructorDecl *Constructor =
8522       D ? dyn_cast_or_null<CXXConstructorDecl>(D->getAsFunction()) : nullptr;
8523   return (Constructor && Constructor->isCopyConstructor()) ? 1 : 0;
8524 }
8525 
8526 unsigned clang_CXXConstructor_isMoveConstructor(CXCursor C) {
8527   if (!clang_isDeclaration(C.kind))
8528     return 0;
8529 
8530   const Decl *D = cxcursor::getCursorDecl(C);
8531   const CXXConstructorDecl *Constructor =
8532       D ? dyn_cast_or_null<CXXConstructorDecl>(D->getAsFunction()) : nullptr;
8533   return (Constructor && Constructor->isMoveConstructor()) ? 1 : 0;
8534 }
8535 
8536 unsigned clang_CXXConstructor_isConvertingConstructor(CXCursor C) {
8537   if (!clang_isDeclaration(C.kind))
8538     return 0;
8539 
8540   const Decl *D = cxcursor::getCursorDecl(C);
8541   const CXXConstructorDecl *Constructor =
8542       D ? dyn_cast_or_null<CXXConstructorDecl>(D->getAsFunction()) : nullptr;
8543   // Passing 'false' excludes constructors marked 'explicit'.
8544   return (Constructor && Constructor->isConvertingConstructor(false)) ? 1 : 0;
8545 }
8546 
8547 unsigned clang_CXXField_isMutable(CXCursor C) {
8548   if (!clang_isDeclaration(C.kind))
8549     return 0;
8550 
8551   if (const auto D = cxcursor::getCursorDecl(C))
8552     if (const auto FD = dyn_cast_or_null<FieldDecl>(D))
8553       return FD->isMutable() ? 1 : 0;
8554   return 0;
8555 }
8556 
8557 unsigned clang_CXXMethod_isPureVirtual(CXCursor C) {
8558   if (!clang_isDeclaration(C.kind))
8559     return 0;
8560 
8561   const Decl *D = cxcursor::getCursorDecl(C);
8562   const CXXMethodDecl *Method =
8563       D ? dyn_cast_or_null<CXXMethodDecl>(D->getAsFunction()) : nullptr;
8564   return (Method && Method->isVirtual() && Method->isPure()) ? 1 : 0;
8565 }
8566 
8567 unsigned clang_CXXMethod_isConst(CXCursor C) {
8568   if (!clang_isDeclaration(C.kind))
8569     return 0;
8570 
8571   const Decl *D = cxcursor::getCursorDecl(C);
8572   const CXXMethodDecl *Method =
8573       D ? dyn_cast_or_null<CXXMethodDecl>(D->getAsFunction()) : nullptr;
8574   return (Method && Method->getMethodQualifiers().hasConst()) ? 1 : 0;
8575 }
8576 
8577 unsigned clang_CXXMethod_isDefaulted(CXCursor C) {
8578   if (!clang_isDeclaration(C.kind))
8579     return 0;
8580 
8581   const Decl *D = cxcursor::getCursorDecl(C);
8582   const CXXMethodDecl *Method =
8583       D ? dyn_cast_or_null<CXXMethodDecl>(D->getAsFunction()) : nullptr;
8584   return (Method && Method->isDefaulted()) ? 1 : 0;
8585 }
8586 
8587 unsigned clang_CXXMethod_isStatic(CXCursor C) {
8588   if (!clang_isDeclaration(C.kind))
8589     return 0;
8590 
8591   const Decl *D = cxcursor::getCursorDecl(C);
8592   const CXXMethodDecl *Method =
8593       D ? dyn_cast_or_null<CXXMethodDecl>(D->getAsFunction()) : nullptr;
8594   return (Method && Method->isStatic()) ? 1 : 0;
8595 }
8596 
8597 unsigned clang_CXXMethod_isVirtual(CXCursor C) {
8598   if (!clang_isDeclaration(C.kind))
8599     return 0;
8600 
8601   const Decl *D = cxcursor::getCursorDecl(C);
8602   const CXXMethodDecl *Method =
8603       D ? dyn_cast_or_null<CXXMethodDecl>(D->getAsFunction()) : nullptr;
8604   return (Method && Method->isVirtual()) ? 1 : 0;
8605 }
8606 
8607 unsigned clang_CXXRecord_isAbstract(CXCursor C) {
8608   if (!clang_isDeclaration(C.kind))
8609     return 0;
8610 
8611   const auto *D = cxcursor::getCursorDecl(C);
8612   const auto *RD = dyn_cast_or_null<CXXRecordDecl>(D);
8613   if (RD)
8614     RD = RD->getDefinition();
8615   return (RD && RD->isAbstract()) ? 1 : 0;
8616 }
8617 
8618 unsigned clang_EnumDecl_isScoped(CXCursor C) {
8619   if (!clang_isDeclaration(C.kind))
8620     return 0;
8621 
8622   const Decl *D = cxcursor::getCursorDecl(C);
8623   auto *Enum = dyn_cast_or_null<EnumDecl>(D);
8624   return (Enum && Enum->isScoped()) ? 1 : 0;
8625 }
8626 
8627 //===----------------------------------------------------------------------===//
8628 // Attribute introspection.
8629 //===----------------------------------------------------------------------===//
8630 
8631 CXType clang_getIBOutletCollectionType(CXCursor C) {
8632   if (C.kind != CXCursor_IBOutletCollectionAttr)
8633     return cxtype::MakeCXType(QualType(), cxcursor::getCursorTU(C));
8634 
8635   const IBOutletCollectionAttr *A =
8636       cast<IBOutletCollectionAttr>(cxcursor::getCursorAttr(C));
8637 
8638   return cxtype::MakeCXType(A->getInterface(), cxcursor::getCursorTU(C));
8639 }
8640 
8641 //===----------------------------------------------------------------------===//
8642 // Inspecting memory usage.
8643 //===----------------------------------------------------------------------===//
8644 
8645 typedef std::vector<CXTUResourceUsageEntry> MemUsageEntries;
8646 
8647 static inline void createCXTUResourceUsageEntry(MemUsageEntries &entries,
8648                                                 enum CXTUResourceUsageKind k,
8649                                                 unsigned long amount) {
8650   CXTUResourceUsageEntry entry = {k, amount};
8651   entries.push_back(entry);
8652 }
8653 
8654 const char *clang_getTUResourceUsageName(CXTUResourceUsageKind kind) {
8655   const char *str = "";
8656   switch (kind) {
8657   case CXTUResourceUsage_AST:
8658     str = "ASTContext: expressions, declarations, and types";
8659     break;
8660   case CXTUResourceUsage_Identifiers:
8661     str = "ASTContext: identifiers";
8662     break;
8663   case CXTUResourceUsage_Selectors:
8664     str = "ASTContext: selectors";
8665     break;
8666   case CXTUResourceUsage_GlobalCompletionResults:
8667     str = "Code completion: cached global results";
8668     break;
8669   case CXTUResourceUsage_SourceManagerContentCache:
8670     str = "SourceManager: content cache allocator";
8671     break;
8672   case CXTUResourceUsage_AST_SideTables:
8673     str = "ASTContext: side tables";
8674     break;
8675   case CXTUResourceUsage_SourceManager_Membuffer_Malloc:
8676     str = "SourceManager: malloc'ed memory buffers";
8677     break;
8678   case CXTUResourceUsage_SourceManager_Membuffer_MMap:
8679     str = "SourceManager: mmap'ed memory buffers";
8680     break;
8681   case CXTUResourceUsage_ExternalASTSource_Membuffer_Malloc:
8682     str = "ExternalASTSource: malloc'ed memory buffers";
8683     break;
8684   case CXTUResourceUsage_ExternalASTSource_Membuffer_MMap:
8685     str = "ExternalASTSource: mmap'ed memory buffers";
8686     break;
8687   case CXTUResourceUsage_Preprocessor:
8688     str = "Preprocessor: malloc'ed memory";
8689     break;
8690   case CXTUResourceUsage_PreprocessingRecord:
8691     str = "Preprocessor: PreprocessingRecord";
8692     break;
8693   case CXTUResourceUsage_SourceManager_DataStructures:
8694     str = "SourceManager: data structures and tables";
8695     break;
8696   case CXTUResourceUsage_Preprocessor_HeaderSearch:
8697     str = "Preprocessor: header search tables";
8698     break;
8699   }
8700   return str;
8701 }
8702 
8703 CXTUResourceUsage clang_getCXTUResourceUsage(CXTranslationUnit TU) {
8704   if (isNotUsableTU(TU)) {
8705     LOG_BAD_TU(TU);
8706     CXTUResourceUsage usage = {(void *)nullptr, 0, nullptr};
8707     return usage;
8708   }
8709 
8710   ASTUnit *astUnit = cxtu::getASTUnit(TU);
8711   std::unique_ptr<MemUsageEntries> entries(new MemUsageEntries());
8712   ASTContext &astContext = astUnit->getASTContext();
8713 
8714   // How much memory is used by AST nodes and types?
8715   createCXTUResourceUsageEntry(
8716       *entries, CXTUResourceUsage_AST,
8717       (unsigned long)astContext.getASTAllocatedMemory());
8718 
8719   // How much memory is used by identifiers?
8720   createCXTUResourceUsageEntry(
8721       *entries, CXTUResourceUsage_Identifiers,
8722       (unsigned long)astContext.Idents.getAllocator().getTotalMemory());
8723 
8724   // How much memory is used for selectors?
8725   createCXTUResourceUsageEntry(
8726       *entries, CXTUResourceUsage_Selectors,
8727       (unsigned long)astContext.Selectors.getTotalMemory());
8728 
8729   // How much memory is used by ASTContext's side tables?
8730   createCXTUResourceUsageEntry(
8731       *entries, CXTUResourceUsage_AST_SideTables,
8732       (unsigned long)astContext.getSideTableAllocatedMemory());
8733 
8734   // How much memory is used for caching global code completion results?
8735   unsigned long completionBytes = 0;
8736   if (GlobalCodeCompletionAllocator *completionAllocator =
8737           astUnit->getCachedCompletionAllocator().get()) {
8738     completionBytes = completionAllocator->getTotalMemory();
8739   }
8740   createCXTUResourceUsageEntry(
8741       *entries, CXTUResourceUsage_GlobalCompletionResults, completionBytes);
8742 
8743   // How much memory is being used by SourceManager's content cache?
8744   createCXTUResourceUsageEntry(
8745       *entries, CXTUResourceUsage_SourceManagerContentCache,
8746       (unsigned long)astContext.getSourceManager().getContentCacheSize());
8747 
8748   // How much memory is being used by the MemoryBuffer's in SourceManager?
8749   const SourceManager::MemoryBufferSizes &srcBufs =
8750       astUnit->getSourceManager().getMemoryBufferSizes();
8751 
8752   createCXTUResourceUsageEntry(*entries,
8753                                CXTUResourceUsage_SourceManager_Membuffer_Malloc,
8754                                (unsigned long)srcBufs.malloc_bytes);
8755   createCXTUResourceUsageEntry(*entries,
8756                                CXTUResourceUsage_SourceManager_Membuffer_MMap,
8757                                (unsigned long)srcBufs.mmap_bytes);
8758   createCXTUResourceUsageEntry(
8759       *entries, CXTUResourceUsage_SourceManager_DataStructures,
8760       (unsigned long)astContext.getSourceManager().getDataStructureSizes());
8761 
8762   // How much memory is being used by the ExternalASTSource?
8763   if (ExternalASTSource *esrc = astContext.getExternalSource()) {
8764     const ExternalASTSource::MemoryBufferSizes &sizes =
8765         esrc->getMemoryBufferSizes();
8766 
8767     createCXTUResourceUsageEntry(
8768         *entries, CXTUResourceUsage_ExternalASTSource_Membuffer_Malloc,
8769         (unsigned long)sizes.malloc_bytes);
8770     createCXTUResourceUsageEntry(
8771         *entries, CXTUResourceUsage_ExternalASTSource_Membuffer_MMap,
8772         (unsigned long)sizes.mmap_bytes);
8773   }
8774 
8775   // How much memory is being used by the Preprocessor?
8776   Preprocessor &pp = astUnit->getPreprocessor();
8777   createCXTUResourceUsageEntry(*entries, CXTUResourceUsage_Preprocessor,
8778                                pp.getTotalMemory());
8779 
8780   if (PreprocessingRecord *pRec = pp.getPreprocessingRecord()) {
8781     createCXTUResourceUsageEntry(*entries,
8782                                  CXTUResourceUsage_PreprocessingRecord,
8783                                  pRec->getTotalMemory());
8784   }
8785 
8786   createCXTUResourceUsageEntry(*entries,
8787                                CXTUResourceUsage_Preprocessor_HeaderSearch,
8788                                pp.getHeaderSearchInfo().getTotalMemory());
8789 
8790   CXTUResourceUsage usage = {(void *)entries.get(), (unsigned)entries->size(),
8791                              !entries->empty() ? &(*entries)[0] : nullptr};
8792   (void)entries.release();
8793   return usage;
8794 }
8795 
8796 void clang_disposeCXTUResourceUsage(CXTUResourceUsage usage) {
8797   if (usage.data)
8798     delete (MemUsageEntries *)usage.data;
8799 }
8800 
8801 CXSourceRangeList *clang_getSkippedRanges(CXTranslationUnit TU, CXFile file) {
8802   CXSourceRangeList *skipped = new CXSourceRangeList;
8803   skipped->count = 0;
8804   skipped->ranges = nullptr;
8805 
8806   if (isNotUsableTU(TU)) {
8807     LOG_BAD_TU(TU);
8808     return skipped;
8809   }
8810 
8811   if (!file)
8812     return skipped;
8813 
8814   ASTUnit *astUnit = cxtu::getASTUnit(TU);
8815   PreprocessingRecord *ppRec =
8816       astUnit->getPreprocessor().getPreprocessingRecord();
8817   if (!ppRec)
8818     return skipped;
8819 
8820   ASTContext &Ctx = astUnit->getASTContext();
8821   SourceManager &sm = Ctx.getSourceManager();
8822   FileEntry *fileEntry = static_cast<FileEntry *>(file);
8823   FileID wantedFileID = sm.translateFile(fileEntry);
8824   bool isMainFile = wantedFileID == sm.getMainFileID();
8825 
8826   const std::vector<SourceRange> &SkippedRanges = ppRec->getSkippedRanges();
8827   std::vector<SourceRange> wantedRanges;
8828   for (std::vector<SourceRange>::const_iterator i = SkippedRanges.begin(),
8829                                                 ei = SkippedRanges.end();
8830        i != ei; ++i) {
8831     if (sm.getFileID(i->getBegin()) == wantedFileID ||
8832         sm.getFileID(i->getEnd()) == wantedFileID)
8833       wantedRanges.push_back(*i);
8834     else if (isMainFile && (astUnit->isInPreambleFileID(i->getBegin()) ||
8835                             astUnit->isInPreambleFileID(i->getEnd())))
8836       wantedRanges.push_back(*i);
8837   }
8838 
8839   skipped->count = wantedRanges.size();
8840   skipped->ranges = new CXSourceRange[skipped->count];
8841   for (unsigned i = 0, ei = skipped->count; i != ei; ++i)
8842     skipped->ranges[i] = cxloc::translateSourceRange(Ctx, wantedRanges[i]);
8843 
8844   return skipped;
8845 }
8846 
8847 CXSourceRangeList *clang_getAllSkippedRanges(CXTranslationUnit TU) {
8848   CXSourceRangeList *skipped = new CXSourceRangeList;
8849   skipped->count = 0;
8850   skipped->ranges = nullptr;
8851 
8852   if (isNotUsableTU(TU)) {
8853     LOG_BAD_TU(TU);
8854     return skipped;
8855   }
8856 
8857   ASTUnit *astUnit = cxtu::getASTUnit(TU);
8858   PreprocessingRecord *ppRec =
8859       astUnit->getPreprocessor().getPreprocessingRecord();
8860   if (!ppRec)
8861     return skipped;
8862 
8863   ASTContext &Ctx = astUnit->getASTContext();
8864 
8865   const std::vector<SourceRange> &SkippedRanges = ppRec->getSkippedRanges();
8866 
8867   skipped->count = SkippedRanges.size();
8868   skipped->ranges = new CXSourceRange[skipped->count];
8869   for (unsigned i = 0, ei = skipped->count; i != ei; ++i)
8870     skipped->ranges[i] = cxloc::translateSourceRange(Ctx, SkippedRanges[i]);
8871 
8872   return skipped;
8873 }
8874 
8875 void clang_disposeSourceRangeList(CXSourceRangeList *ranges) {
8876   if (ranges) {
8877     delete[] ranges->ranges;
8878     delete ranges;
8879   }
8880 }
8881 
8882 void clang::PrintLibclangResourceUsage(CXTranslationUnit TU) {
8883   CXTUResourceUsage Usage = clang_getCXTUResourceUsage(TU);
8884   for (unsigned I = 0; I != Usage.numEntries; ++I)
8885     fprintf(stderr, "  %s: %lu\n",
8886             clang_getTUResourceUsageName(Usage.entries[I].kind),
8887             Usage.entries[I].amount);
8888 
8889   clang_disposeCXTUResourceUsage(Usage);
8890 }
8891 
8892 CXCursor clang_Cursor_getVarDeclInitializer(CXCursor cursor) {
8893   const Decl *const D = getCursorDecl(cursor);
8894   if (!D)
8895     return clang_getNullCursor();
8896   const auto *const VD = dyn_cast<VarDecl>(D);
8897   if (!VD)
8898     return clang_getNullCursor();
8899   const Expr *const Init = VD->getInit();
8900   if (!Init)
8901     return clang_getNullCursor();
8902 
8903   return cxcursor::MakeCXCursor(Init, VD, cxcursor::getCursorTU(cursor));
8904 }
8905 
8906 int clang_Cursor_hasVarDeclGlobalStorage(CXCursor cursor) {
8907   const Decl *const D = getCursorDecl(cursor);
8908   if (!D)
8909     return -1;
8910   const auto *const VD = dyn_cast<VarDecl>(D);
8911   if (!VD)
8912     return -1;
8913 
8914   return VD->hasGlobalStorage();
8915 }
8916 
8917 int clang_Cursor_hasVarDeclExternalStorage(CXCursor cursor) {
8918   const Decl *const D = getCursorDecl(cursor);
8919   if (!D)
8920     return -1;
8921   const auto *const VD = dyn_cast<VarDecl>(D);
8922   if (!VD)
8923     return -1;
8924 
8925   return VD->hasExternalStorage();
8926 }
8927 
8928 //===----------------------------------------------------------------------===//
8929 // Misc. utility functions.
8930 //===----------------------------------------------------------------------===//
8931 
8932 /// Default to using our desired 8 MB stack size on "safety" threads.
8933 static unsigned SafetyStackThreadSize = DesiredStackSize;
8934 
8935 namespace clang {
8936 
8937 bool RunSafely(llvm::CrashRecoveryContext &CRC, llvm::function_ref<void()> Fn,
8938                unsigned Size) {
8939   if (!Size)
8940     Size = GetSafetyThreadStackSize();
8941   if (Size && !getenv("LIBCLANG_NOTHREADS"))
8942     return CRC.RunSafelyOnThread(Fn, Size);
8943   return CRC.RunSafely(Fn);
8944 }
8945 
8946 unsigned GetSafetyThreadStackSize() { return SafetyStackThreadSize; }
8947 
8948 void SetSafetyThreadStackSize(unsigned Value) { SafetyStackThreadSize = Value; }
8949 
8950 } // namespace clang
8951 
8952 void clang::setThreadBackgroundPriority() {
8953   if (getenv("LIBCLANG_BGPRIO_DISABLE"))
8954     return;
8955 
8956 #if LLVM_ENABLE_THREADS
8957   llvm::set_thread_priority(llvm::ThreadPriority::Background);
8958 #endif
8959 }
8960 
8961 void cxindex::printDiagsToStderr(ASTUnit *Unit) {
8962   if (!Unit)
8963     return;
8964 
8965   for (ASTUnit::stored_diag_iterator D = Unit->stored_diag_begin(),
8966                                      DEnd = Unit->stored_diag_end();
8967        D != DEnd; ++D) {
8968     CXStoredDiagnostic Diag(*D, Unit->getLangOpts());
8969     CXString Msg =
8970         clang_formatDiagnostic(&Diag, clang_defaultDiagnosticDisplayOptions());
8971     fprintf(stderr, "%s\n", clang_getCString(Msg));
8972     clang_disposeString(Msg);
8973   }
8974 #ifdef _WIN32
8975   // On Windows, force a flush, since there may be multiple copies of
8976   // stderr and stdout in the file system, all with different buffers
8977   // but writing to the same device.
8978   fflush(stderr);
8979 #endif
8980 }
8981 
8982 MacroInfo *cxindex::getMacroInfo(const IdentifierInfo &II,
8983                                  SourceLocation MacroDefLoc,
8984                                  CXTranslationUnit TU) {
8985   if (MacroDefLoc.isInvalid() || !TU)
8986     return nullptr;
8987   if (!II.hadMacroDefinition())
8988     return nullptr;
8989 
8990   ASTUnit *Unit = cxtu::getASTUnit(TU);
8991   Preprocessor &PP = Unit->getPreprocessor();
8992   MacroDirective *MD = PP.getLocalMacroDirectiveHistory(&II);
8993   if (MD) {
8994     for (MacroDirective::DefInfo Def = MD->getDefinition(); Def;
8995          Def = Def.getPreviousDefinition()) {
8996       if (MacroDefLoc == Def.getMacroInfo()->getDefinitionLoc())
8997         return Def.getMacroInfo();
8998     }
8999   }
9000 
9001   return nullptr;
9002 }
9003 
9004 const MacroInfo *cxindex::getMacroInfo(const MacroDefinitionRecord *MacroDef,
9005                                        CXTranslationUnit TU) {
9006   if (!MacroDef || !TU)
9007     return nullptr;
9008   const IdentifierInfo *II = MacroDef->getName();
9009   if (!II)
9010     return nullptr;
9011 
9012   return getMacroInfo(*II, MacroDef->getLocation(), TU);
9013 }
9014 
9015 MacroDefinitionRecord *
9016 cxindex::checkForMacroInMacroDefinition(const MacroInfo *MI, const Token &Tok,
9017                                         CXTranslationUnit TU) {
9018   if (!MI || !TU)
9019     return nullptr;
9020   if (Tok.isNot(tok::raw_identifier))
9021     return nullptr;
9022 
9023   if (MI->getNumTokens() == 0)
9024     return nullptr;
9025   SourceRange DefRange(MI->getReplacementToken(0).getLocation(),
9026                        MI->getDefinitionEndLoc());
9027   ASTUnit *Unit = cxtu::getASTUnit(TU);
9028 
9029   // Check that the token is inside the definition and not its argument list.
9030   SourceManager &SM = Unit->getSourceManager();
9031   if (SM.isBeforeInTranslationUnit(Tok.getLocation(), DefRange.getBegin()))
9032     return nullptr;
9033   if (SM.isBeforeInTranslationUnit(DefRange.getEnd(), Tok.getLocation()))
9034     return nullptr;
9035 
9036   Preprocessor &PP = Unit->getPreprocessor();
9037   PreprocessingRecord *PPRec = PP.getPreprocessingRecord();
9038   if (!PPRec)
9039     return nullptr;
9040 
9041   IdentifierInfo &II = PP.getIdentifierTable().get(Tok.getRawIdentifier());
9042   if (!II.hadMacroDefinition())
9043     return nullptr;
9044 
9045   // Check that the identifier is not one of the macro arguments.
9046   if (std::find(MI->param_begin(), MI->param_end(), &II) != MI->param_end())
9047     return nullptr;
9048 
9049   MacroDirective *InnerMD = PP.getLocalMacroDirectiveHistory(&II);
9050   if (!InnerMD)
9051     return nullptr;
9052 
9053   return PPRec->findMacroDefinition(InnerMD->getMacroInfo());
9054 }
9055 
9056 MacroDefinitionRecord *
9057 cxindex::checkForMacroInMacroDefinition(const MacroInfo *MI, SourceLocation Loc,
9058                                         CXTranslationUnit TU) {
9059   if (Loc.isInvalid() || !MI || !TU)
9060     return nullptr;
9061 
9062   if (MI->getNumTokens() == 0)
9063     return nullptr;
9064   ASTUnit *Unit = cxtu::getASTUnit(TU);
9065   Preprocessor &PP = Unit->getPreprocessor();
9066   if (!PP.getPreprocessingRecord())
9067     return nullptr;
9068   Loc = Unit->getSourceManager().getSpellingLoc(Loc);
9069   Token Tok;
9070   if (PP.getRawToken(Loc, Tok))
9071     return nullptr;
9072 
9073   return checkForMacroInMacroDefinition(MI, Tok, TU);
9074 }
9075 
9076 CXString clang_getClangVersion() {
9077   return cxstring::createDup(getClangFullVersion());
9078 }
9079 
9080 Logger &cxindex::Logger::operator<<(CXTranslationUnit TU) {
9081   if (TU) {
9082     if (ASTUnit *Unit = cxtu::getASTUnit(TU)) {
9083       LogOS << '<' << Unit->getMainFileName() << '>';
9084       if (Unit->isMainFileAST())
9085         LogOS << " (" << Unit->getASTFileName() << ')';
9086       return *this;
9087     }
9088   } else {
9089     LogOS << "<NULL TU>";
9090   }
9091   return *this;
9092 }
9093 
9094 Logger &cxindex::Logger::operator<<(const FileEntry *FE) {
9095   *this << FE->getName();
9096   return *this;
9097 }
9098 
9099 Logger &cxindex::Logger::operator<<(CXCursor cursor) {
9100   CXString cursorName = clang_getCursorDisplayName(cursor);
9101   *this << cursorName << "@" << clang_getCursorLocation(cursor);
9102   clang_disposeString(cursorName);
9103   return *this;
9104 }
9105 
9106 Logger &cxindex::Logger::operator<<(CXSourceLocation Loc) {
9107   CXFile File;
9108   unsigned Line, Column;
9109   clang_getFileLocation(Loc, &File, &Line, &Column, nullptr);
9110   CXString FileName = clang_getFileName(File);
9111   *this << llvm::format("(%s:%d:%d)", clang_getCString(FileName), Line, Column);
9112   clang_disposeString(FileName);
9113   return *this;
9114 }
9115 
9116 Logger &cxindex::Logger::operator<<(CXSourceRange range) {
9117   CXSourceLocation BLoc = clang_getRangeStart(range);
9118   CXSourceLocation ELoc = clang_getRangeEnd(range);
9119 
9120   CXFile BFile;
9121   unsigned BLine, BColumn;
9122   clang_getFileLocation(BLoc, &BFile, &BLine, &BColumn, nullptr);
9123 
9124   CXFile EFile;
9125   unsigned ELine, EColumn;
9126   clang_getFileLocation(ELoc, &EFile, &ELine, &EColumn, nullptr);
9127 
9128   CXString BFileName = clang_getFileName(BFile);
9129   if (BFile == EFile) {
9130     *this << llvm::format("[%s %d:%d-%d:%d]", clang_getCString(BFileName),
9131                           BLine, BColumn, ELine, EColumn);
9132   } else {
9133     CXString EFileName = clang_getFileName(EFile);
9134     *this << llvm::format("[%s:%d:%d - ", clang_getCString(BFileName), BLine,
9135                           BColumn)
9136           << llvm::format("%s:%d:%d]", clang_getCString(EFileName), ELine,
9137                           EColumn);
9138     clang_disposeString(EFileName);
9139   }
9140   clang_disposeString(BFileName);
9141   return *this;
9142 }
9143 
9144 Logger &cxindex::Logger::operator<<(CXString Str) {
9145   *this << clang_getCString(Str);
9146   return *this;
9147 }
9148 
9149 Logger &cxindex::Logger::operator<<(const llvm::format_object_base &Fmt) {
9150   LogOS << Fmt;
9151   return *this;
9152 }
9153 
9154 static llvm::ManagedStatic<std::mutex> LoggingMutex;
9155 
9156 cxindex::Logger::~Logger() {
9157   std::lock_guard<std::mutex> L(*LoggingMutex);
9158 
9159   static llvm::TimeRecord sBeginTR = llvm::TimeRecord::getCurrentTime();
9160 
9161   raw_ostream &OS = llvm::errs();
9162   OS << "[libclang:" << Name << ':';
9163 
9164 #ifdef USE_DARWIN_THREADS
9165   // TODO: Portability.
9166   mach_port_t tid = pthread_mach_thread_np(pthread_self());
9167   OS << tid << ':';
9168 #endif
9169 
9170   llvm::TimeRecord TR = llvm::TimeRecord::getCurrentTime();
9171   OS << llvm::format("%7.4f] ", TR.getWallTime() - sBeginTR.getWallTime());
9172   OS << Msg << '\n';
9173 
9174   if (Trace) {
9175     llvm::sys::PrintStackTrace(OS);
9176     OS << "--------------------------------------------------\n";
9177   }
9178 }
9179