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