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