• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1  //===- CIndex.cpp - Clang-C Source Indexing Library -----------------------===//
2  //
3  //                     The LLVM Compiler Infrastructure
4  //
5  // This file is distributed under the University of Illinois Open Source
6  // License. See LICENSE.TXT for details.
7  //
8  //===----------------------------------------------------------------------===//
9  //
10  // This file implements the main API hooks in the Clang-C Source Indexing
11  // library.
12  //
13  //===----------------------------------------------------------------------===//
14  
15  #include "CIndexer.h"
16  #include "CIndexDiagnostic.h"
17  #include "CLog.h"
18  #include "CXCursor.h"
19  #include "CXSourceLocation.h"
20  #include "CXString.h"
21  #include "CXTranslationUnit.h"
22  #include "CXType.h"
23  #include "CursorVisitor.h"
24  #include "clang/AST/Attr.h"
25  #include "clang/AST/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__anon13a6f77d0511::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