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