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