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