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