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