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