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