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