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