CIndex.cpp revision d99ef536b241071b6f4c01db6525dc03242ac30b
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 IncludeBriefCommentsInCodeCompletion
2527    = options & CXTranslationUnit_IncludeBriefCommentsInCodeCompletion;
2528  bool SkipFunctionBodies = options & CXTranslationUnit_SkipFunctionBodies;
2529
2530  // Configure the diagnostics.
2531  DiagnosticOptions DiagOpts;
2532  IntrusiveRefCntPtr<DiagnosticsEngine>
2533    Diags(CompilerInstance::createDiagnostics(DiagOpts, num_command_line_args,
2534                                                command_line_args));
2535
2536  // Recover resources if we crash before exiting this function.
2537  llvm::CrashRecoveryContextCleanupRegistrar<DiagnosticsEngine,
2538    llvm::CrashRecoveryContextReleaseRefCleanup<DiagnosticsEngine> >
2539    DiagCleanup(Diags.getPtr());
2540
2541  OwningPtr<std::vector<ASTUnit::RemappedFile> >
2542    RemappedFiles(new std::vector<ASTUnit::RemappedFile>());
2543
2544  // Recover resources if we crash before exiting this function.
2545  llvm::CrashRecoveryContextCleanupRegistrar<
2546    std::vector<ASTUnit::RemappedFile> > RemappedCleanup(RemappedFiles.get());
2547
2548  for (unsigned I = 0; I != num_unsaved_files; ++I) {
2549    StringRef Data(unsaved_files[I].Contents, unsaved_files[I].Length);
2550    const llvm::MemoryBuffer *Buffer
2551      = llvm::MemoryBuffer::getMemBufferCopy(Data, unsaved_files[I].Filename);
2552    RemappedFiles->push_back(std::make_pair(unsaved_files[I].Filename,
2553                                            Buffer));
2554  }
2555
2556  OwningPtr<std::vector<const char *> >
2557    Args(new std::vector<const char*>());
2558
2559  // Recover resources if we crash before exiting this method.
2560  llvm::CrashRecoveryContextCleanupRegistrar<std::vector<const char*> >
2561    ArgsCleanup(Args.get());
2562
2563  // Since the Clang C library is primarily used by batch tools dealing with
2564  // (often very broken) source code, where spell-checking can have a
2565  // significant negative impact on performance (particularly when
2566  // precompiled headers are involved), we disable it by default.
2567  // Only do this if we haven't found a spell-checking-related argument.
2568  bool FoundSpellCheckingArgument = false;
2569  for (int I = 0; I != num_command_line_args; ++I) {
2570    if (strcmp(command_line_args[I], "-fno-spell-checking") == 0 ||
2571        strcmp(command_line_args[I], "-fspell-checking") == 0) {
2572      FoundSpellCheckingArgument = true;
2573      break;
2574    }
2575  }
2576  if (!FoundSpellCheckingArgument)
2577    Args->push_back("-fno-spell-checking");
2578
2579  Args->insert(Args->end(), command_line_args,
2580               command_line_args + num_command_line_args);
2581
2582  // The 'source_filename' argument is optional.  If the caller does not
2583  // specify it then it is assumed that the source file is specified
2584  // in the actual argument list.
2585  // Put the source file after command_line_args otherwise if '-x' flag is
2586  // present it will be unused.
2587  if (source_filename)
2588    Args->push_back(source_filename);
2589
2590  // Do we need the detailed preprocessing record?
2591  if (options & CXTranslationUnit_DetailedPreprocessingRecord) {
2592    Args->push_back("-Xclang");
2593    Args->push_back("-detailed-preprocessing-record");
2594  }
2595
2596  unsigned NumErrors = Diags->getClient()->getNumErrors();
2597  OwningPtr<ASTUnit> ErrUnit;
2598  OwningPtr<ASTUnit> Unit(
2599    ASTUnit::LoadFromCommandLine(Args->size() ? &(*Args)[0] : 0
2600                                 /* vector::data() not portable */,
2601                                 Args->size() ? (&(*Args)[0] + Args->size()) :0,
2602                                 Diags,
2603                                 CXXIdx->getClangResourcesPath(),
2604                                 CXXIdx->getOnlyLocalDecls(),
2605                                 /*CaptureDiagnostics=*/true,
2606                                 RemappedFiles->size() ? &(*RemappedFiles)[0]:0,
2607                                 RemappedFiles->size(),
2608                                 /*RemappedFilesKeepOriginalName=*/true,
2609                                 PrecompilePreamble,
2610                                 TUKind,
2611                                 CacheCodeCompetionResults,
2612                                 IncludeBriefCommentsInCodeCompletion,
2613                                 /*AllowPCHWithCompilerErrors=*/true,
2614                                 SkipFunctionBodies,
2615                                 &ErrUnit));
2616
2617  if (NumErrors != Diags->getClient()->getNumErrors()) {
2618    // Make sure to check that 'Unit' is non-NULL.
2619    if (CXXIdx->getDisplayDiagnostics())
2620      printDiagsToStderr(Unit ? Unit.get() : ErrUnit.get());
2621  }
2622
2623  PTUI->result = MakeCXTranslationUnit(CXXIdx, Unit.take());
2624}
2625CXTranslationUnit clang_parseTranslationUnit(CXIndex CIdx,
2626                                             const char *source_filename,
2627                                         const char * const *command_line_args,
2628                                             int num_command_line_args,
2629                                            struct CXUnsavedFile *unsaved_files,
2630                                             unsigned num_unsaved_files,
2631                                             unsigned options) {
2632  ParseTranslationUnitInfo PTUI = { CIdx, source_filename, command_line_args,
2633                                    num_command_line_args, unsaved_files,
2634                                    num_unsaved_files, options, 0 };
2635  llvm::CrashRecoveryContext CRC;
2636
2637  if (!RunSafely(CRC, clang_parseTranslationUnit_Impl, &PTUI)) {
2638    fprintf(stderr, "libclang: crash detected during parsing: {\n");
2639    fprintf(stderr, "  'source_filename' : '%s'\n", source_filename);
2640    fprintf(stderr, "  'command_line_args' : [");
2641    for (int i = 0; i != num_command_line_args; ++i) {
2642      if (i)
2643        fprintf(stderr, ", ");
2644      fprintf(stderr, "'%s'", command_line_args[i]);
2645    }
2646    fprintf(stderr, "],\n");
2647    fprintf(stderr, "  'unsaved_files' : [");
2648    for (unsigned i = 0; i != num_unsaved_files; ++i) {
2649      if (i)
2650        fprintf(stderr, ", ");
2651      fprintf(stderr, "('%s', '...', %ld)", unsaved_files[i].Filename,
2652              unsaved_files[i].Length);
2653    }
2654    fprintf(stderr, "],\n");
2655    fprintf(stderr, "  'options' : %d,\n", options);
2656    fprintf(stderr, "}\n");
2657
2658    return 0;
2659  } else if (getenv("LIBCLANG_RESOURCE_USAGE")) {
2660    PrintLibclangResourceUsage(PTUI.result);
2661  }
2662
2663  return PTUI.result;
2664}
2665
2666unsigned clang_defaultSaveOptions(CXTranslationUnit TU) {
2667  return CXSaveTranslationUnit_None;
2668}
2669
2670namespace {
2671
2672struct SaveTranslationUnitInfo {
2673  CXTranslationUnit TU;
2674  const char *FileName;
2675  unsigned options;
2676  CXSaveError result;
2677};
2678
2679}
2680
2681static void clang_saveTranslationUnit_Impl(void *UserData) {
2682  SaveTranslationUnitInfo *STUI =
2683    static_cast<SaveTranslationUnitInfo*>(UserData);
2684
2685  CIndexer *CXXIdx = (CIndexer*)STUI->TU->CIdx;
2686  if (CXXIdx->isOptEnabled(CXGlobalOpt_ThreadBackgroundPriorityForIndexing))
2687    setThreadBackgroundPriority();
2688
2689  STUI->result = static_cast<ASTUnit *>(STUI->TU->TUData)->Save(STUI->FileName);
2690}
2691
2692int clang_saveTranslationUnit(CXTranslationUnit TU, const char *FileName,
2693                              unsigned options) {
2694  if (!TU)
2695    return CXSaveError_InvalidTU;
2696
2697  ASTUnit *CXXUnit = static_cast<ASTUnit *>(TU->TUData);
2698  ASTUnit::ConcurrencyCheck Check(*CXXUnit);
2699  if (!CXXUnit->hasSema())
2700    return CXSaveError_InvalidTU;
2701
2702  SaveTranslationUnitInfo STUI = { TU, FileName, options, CXSaveError_None };
2703
2704  if (!CXXUnit->getDiagnostics().hasUnrecoverableErrorOccurred() ||
2705      getenv("LIBCLANG_NOTHREADS")) {
2706    clang_saveTranslationUnit_Impl(&STUI);
2707
2708    if (getenv("LIBCLANG_RESOURCE_USAGE"))
2709      PrintLibclangResourceUsage(TU);
2710
2711    return STUI.result;
2712  }
2713
2714  // We have an AST that has invalid nodes due to compiler errors.
2715  // Use a crash recovery thread for protection.
2716
2717  llvm::CrashRecoveryContext CRC;
2718
2719  if (!RunSafely(CRC, clang_saveTranslationUnit_Impl, &STUI)) {
2720    fprintf(stderr, "libclang: crash detected during AST saving: {\n");
2721    fprintf(stderr, "  'filename' : '%s'\n", FileName);
2722    fprintf(stderr, "  'options' : %d,\n", options);
2723    fprintf(stderr, "}\n");
2724
2725    return CXSaveError_Unknown;
2726
2727  } else if (getenv("LIBCLANG_RESOURCE_USAGE")) {
2728    PrintLibclangResourceUsage(TU);
2729  }
2730
2731  return STUI.result;
2732}
2733
2734void clang_disposeTranslationUnit(CXTranslationUnit CTUnit) {
2735  if (CTUnit) {
2736    // If the translation unit has been marked as unsafe to free, just discard
2737    // it.
2738    if (static_cast<ASTUnit *>(CTUnit->TUData)->isUnsafeToFree())
2739      return;
2740
2741    delete static_cast<ASTUnit *>(CTUnit->TUData);
2742    disposeCXStringPool(CTUnit->StringPool);
2743    delete static_cast<CXDiagnosticSetImpl *>(CTUnit->Diagnostics);
2744    disposeOverridenCXCursorsPool(CTUnit->OverridenCursorsPool);
2745    delete CTUnit;
2746  }
2747}
2748
2749unsigned clang_defaultReparseOptions(CXTranslationUnit TU) {
2750  return CXReparse_None;
2751}
2752
2753struct ReparseTranslationUnitInfo {
2754  CXTranslationUnit TU;
2755  unsigned num_unsaved_files;
2756  struct CXUnsavedFile *unsaved_files;
2757  unsigned options;
2758  int result;
2759};
2760
2761static void clang_reparseTranslationUnit_Impl(void *UserData) {
2762  ReparseTranslationUnitInfo *RTUI =
2763    static_cast<ReparseTranslationUnitInfo*>(UserData);
2764  CXTranslationUnit TU = RTUI->TU;
2765
2766  // Reset the associated diagnostics.
2767  delete static_cast<CXDiagnosticSetImpl*>(TU->Diagnostics);
2768  TU->Diagnostics = 0;
2769
2770  unsigned num_unsaved_files = RTUI->num_unsaved_files;
2771  struct CXUnsavedFile *unsaved_files = RTUI->unsaved_files;
2772  unsigned options = RTUI->options;
2773  (void) options;
2774  RTUI->result = 1;
2775
2776  if (!TU)
2777    return;
2778
2779  CIndexer *CXXIdx = (CIndexer*)TU->CIdx;
2780  if (CXXIdx->isOptEnabled(CXGlobalOpt_ThreadBackgroundPriorityForEditing))
2781    setThreadBackgroundPriority();
2782
2783  ASTUnit *CXXUnit = static_cast<ASTUnit *>(TU->TUData);
2784  ASTUnit::ConcurrencyCheck Check(*CXXUnit);
2785
2786  OwningPtr<std::vector<ASTUnit::RemappedFile> >
2787    RemappedFiles(new std::vector<ASTUnit::RemappedFile>());
2788
2789  // Recover resources if we crash before exiting this function.
2790  llvm::CrashRecoveryContextCleanupRegistrar<
2791    std::vector<ASTUnit::RemappedFile> > RemappedCleanup(RemappedFiles.get());
2792
2793  for (unsigned I = 0; I != num_unsaved_files; ++I) {
2794    StringRef Data(unsaved_files[I].Contents, unsaved_files[I].Length);
2795    const llvm::MemoryBuffer *Buffer
2796      = llvm::MemoryBuffer::getMemBufferCopy(Data, unsaved_files[I].Filename);
2797    RemappedFiles->push_back(std::make_pair(unsaved_files[I].Filename,
2798                                            Buffer));
2799  }
2800
2801  if (!CXXUnit->Reparse(RemappedFiles->size() ? &(*RemappedFiles)[0] : 0,
2802                        RemappedFiles->size()))
2803    RTUI->result = 0;
2804}
2805
2806int clang_reparseTranslationUnit(CXTranslationUnit TU,
2807                                 unsigned num_unsaved_files,
2808                                 struct CXUnsavedFile *unsaved_files,
2809                                 unsigned options) {
2810  ReparseTranslationUnitInfo RTUI = { TU, num_unsaved_files, unsaved_files,
2811                                      options, 0 };
2812
2813  if (getenv("LIBCLANG_NOTHREADS")) {
2814    clang_reparseTranslationUnit_Impl(&RTUI);
2815    return RTUI.result;
2816  }
2817
2818  llvm::CrashRecoveryContext CRC;
2819
2820  if (!RunSafely(CRC, clang_reparseTranslationUnit_Impl, &RTUI)) {
2821    fprintf(stderr, "libclang: crash detected during reparsing\n");
2822    static_cast<ASTUnit *>(TU->TUData)->setUnsafeToFree(true);
2823    return 1;
2824  } else if (getenv("LIBCLANG_RESOURCE_USAGE"))
2825    PrintLibclangResourceUsage(TU);
2826
2827  return RTUI.result;
2828}
2829
2830
2831CXString clang_getTranslationUnitSpelling(CXTranslationUnit CTUnit) {
2832  if (!CTUnit)
2833    return createCXString("");
2834
2835  ASTUnit *CXXUnit = static_cast<ASTUnit *>(CTUnit->TUData);
2836  return createCXString(CXXUnit->getOriginalSourceFileName(), true);
2837}
2838
2839CXCursor clang_getTranslationUnitCursor(CXTranslationUnit TU) {
2840  ASTUnit *CXXUnit = static_cast<ASTUnit*>(TU->TUData);
2841  return MakeCXCursor(CXXUnit->getASTContext().getTranslationUnitDecl(), TU);
2842}
2843
2844} // end: extern "C"
2845
2846//===----------------------------------------------------------------------===//
2847// CXFile Operations.
2848//===----------------------------------------------------------------------===//
2849
2850extern "C" {
2851CXString clang_getFileName(CXFile SFile) {
2852  if (!SFile)
2853    return createCXString((const char*)NULL);
2854
2855  FileEntry *FEnt = static_cast<FileEntry *>(SFile);
2856  return createCXString(FEnt->getName());
2857}
2858
2859time_t clang_getFileTime(CXFile SFile) {
2860  if (!SFile)
2861    return 0;
2862
2863  FileEntry *FEnt = static_cast<FileEntry *>(SFile);
2864  return FEnt->getModificationTime();
2865}
2866
2867CXFile clang_getFile(CXTranslationUnit tu, const char *file_name) {
2868  if (!tu)
2869    return 0;
2870
2871  ASTUnit *CXXUnit = static_cast<ASTUnit *>(tu->TUData);
2872
2873  FileManager &FMgr = CXXUnit->getFileManager();
2874  return const_cast<FileEntry *>(FMgr.getFile(file_name));
2875}
2876
2877unsigned clang_isFileMultipleIncludeGuarded(CXTranslationUnit tu, CXFile file) {
2878  if (!tu || !file)
2879    return 0;
2880
2881  ASTUnit *CXXUnit = static_cast<ASTUnit *>(tu->TUData);
2882  FileEntry *FEnt = static_cast<FileEntry *>(file);
2883  return CXXUnit->getPreprocessor().getHeaderSearchInfo()
2884                                          .isFileMultipleIncludeGuarded(FEnt);
2885}
2886
2887} // end: extern "C"
2888
2889//===----------------------------------------------------------------------===//
2890// CXCursor Operations.
2891//===----------------------------------------------------------------------===//
2892
2893static Decl *getDeclFromExpr(Stmt *E) {
2894  if (ImplicitCastExpr *CE = dyn_cast<ImplicitCastExpr>(E))
2895    return getDeclFromExpr(CE->getSubExpr());
2896
2897  if (DeclRefExpr *RefExpr = dyn_cast<DeclRefExpr>(E))
2898    return RefExpr->getDecl();
2899  if (MemberExpr *ME = dyn_cast<MemberExpr>(E))
2900    return ME->getMemberDecl();
2901  if (ObjCIvarRefExpr *RE = dyn_cast<ObjCIvarRefExpr>(E))
2902    return RE->getDecl();
2903  if (ObjCPropertyRefExpr *PRE = dyn_cast<ObjCPropertyRefExpr>(E)) {
2904    if (PRE->isExplicitProperty())
2905      return PRE->getExplicitProperty();
2906    // It could be messaging both getter and setter as in:
2907    // ++myobj.myprop;
2908    // in which case prefer to associate the setter since it is less obvious
2909    // from inspecting the source that the setter is going to get called.
2910    if (PRE->isMessagingSetter())
2911      return PRE->getImplicitPropertySetter();
2912    return PRE->getImplicitPropertyGetter();
2913  }
2914  if (PseudoObjectExpr *POE = dyn_cast<PseudoObjectExpr>(E))
2915    return getDeclFromExpr(POE->getSyntacticForm());
2916  if (OpaqueValueExpr *OVE = dyn_cast<OpaqueValueExpr>(E))
2917    if (Expr *Src = OVE->getSourceExpr())
2918      return getDeclFromExpr(Src);
2919
2920  if (CallExpr *CE = dyn_cast<CallExpr>(E))
2921    return getDeclFromExpr(CE->getCallee());
2922  if (CXXConstructExpr *CE = dyn_cast<CXXConstructExpr>(E))
2923    if (!CE->isElidable())
2924    return CE->getConstructor();
2925  if (ObjCMessageExpr *OME = dyn_cast<ObjCMessageExpr>(E))
2926    return OME->getMethodDecl();
2927
2928  if (ObjCProtocolExpr *PE = dyn_cast<ObjCProtocolExpr>(E))
2929    return PE->getProtocol();
2930  if (SubstNonTypeTemplateParmPackExpr *NTTP
2931                              = dyn_cast<SubstNonTypeTemplateParmPackExpr>(E))
2932    return NTTP->getParameterPack();
2933  if (SizeOfPackExpr *SizeOfPack = dyn_cast<SizeOfPackExpr>(E))
2934    if (isa<NonTypeTemplateParmDecl>(SizeOfPack->getPack()) ||
2935        isa<ParmVarDecl>(SizeOfPack->getPack()))
2936      return SizeOfPack->getPack();
2937
2938  return 0;
2939}
2940
2941static SourceLocation getLocationFromExpr(Expr *E) {
2942  if (ImplicitCastExpr *CE = dyn_cast<ImplicitCastExpr>(E))
2943    return getLocationFromExpr(CE->getSubExpr());
2944
2945  if (ObjCMessageExpr *Msg = dyn_cast<ObjCMessageExpr>(E))
2946    return /*FIXME:*/Msg->getLeftLoc();
2947  if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E))
2948    return DRE->getLocation();
2949  if (MemberExpr *Member = dyn_cast<MemberExpr>(E))
2950    return Member->getMemberLoc();
2951  if (ObjCIvarRefExpr *Ivar = dyn_cast<ObjCIvarRefExpr>(E))
2952    return Ivar->getLocation();
2953  if (SizeOfPackExpr *SizeOfPack = dyn_cast<SizeOfPackExpr>(E))
2954    return SizeOfPack->getPackLoc();
2955  if (ObjCPropertyRefExpr *PropRef = dyn_cast<ObjCPropertyRefExpr>(E))
2956    return PropRef->getLocation();
2957
2958  return E->getLocStart();
2959}
2960
2961extern "C" {
2962
2963unsigned clang_visitChildren(CXCursor parent,
2964                             CXCursorVisitor visitor,
2965                             CXClientData client_data) {
2966  CursorVisitor CursorVis(getCursorTU(parent), visitor, client_data,
2967                          /*VisitPreprocessorLast=*/false);
2968  return CursorVis.VisitChildren(parent);
2969}
2970
2971#ifndef __has_feature
2972#define __has_feature(x) 0
2973#endif
2974#if __has_feature(blocks)
2975typedef enum CXChildVisitResult
2976     (^CXCursorVisitorBlock)(CXCursor cursor, CXCursor parent);
2977
2978static enum CXChildVisitResult visitWithBlock(CXCursor cursor, CXCursor parent,
2979    CXClientData client_data) {
2980  CXCursorVisitorBlock block = (CXCursorVisitorBlock)client_data;
2981  return block(cursor, parent);
2982}
2983#else
2984// If we are compiled with a compiler that doesn't have native blocks support,
2985// define and call the block manually, so the
2986typedef struct _CXChildVisitResult
2987{
2988	void *isa;
2989	int flags;
2990	int reserved;
2991	enum CXChildVisitResult(*invoke)(struct _CXChildVisitResult*, CXCursor,
2992                                         CXCursor);
2993} *CXCursorVisitorBlock;
2994
2995static enum CXChildVisitResult visitWithBlock(CXCursor cursor, CXCursor parent,
2996    CXClientData client_data) {
2997  CXCursorVisitorBlock block = (CXCursorVisitorBlock)client_data;
2998  return block->invoke(block, cursor, parent);
2999}
3000#endif
3001
3002
3003unsigned clang_visitChildrenWithBlock(CXCursor parent,
3004                                      CXCursorVisitorBlock block) {
3005  return clang_visitChildren(parent, visitWithBlock, block);
3006}
3007
3008static CXString getDeclSpelling(Decl *D) {
3009  if (!D)
3010    return createCXString("");
3011
3012  NamedDecl *ND = dyn_cast<NamedDecl>(D);
3013  if (!ND) {
3014    if (ObjCPropertyImplDecl *PropImpl =dyn_cast<ObjCPropertyImplDecl>(D))
3015      if (ObjCPropertyDecl *Property = PropImpl->getPropertyDecl())
3016        return createCXString(Property->getIdentifier()->getName());
3017
3018    return createCXString("");
3019  }
3020
3021  if (ObjCMethodDecl *OMD = dyn_cast<ObjCMethodDecl>(ND))
3022    return createCXString(OMD->getSelector().getAsString());
3023
3024  if (ObjCCategoryImplDecl *CIMP = dyn_cast<ObjCCategoryImplDecl>(ND))
3025    // No, this isn't the same as the code below. getIdentifier() is non-virtual
3026    // and returns different names. NamedDecl returns the class name and
3027    // ObjCCategoryImplDecl returns the category name.
3028    return createCXString(CIMP->getIdentifier()->getNameStart());
3029
3030  if (isa<UsingDirectiveDecl>(D))
3031    return createCXString("");
3032
3033  SmallString<1024> S;
3034  llvm::raw_svector_ostream os(S);
3035  ND->printName(os);
3036
3037  return createCXString(os.str());
3038}
3039
3040CXString clang_getCursorSpelling(CXCursor C) {
3041  if (clang_isTranslationUnit(C.kind))
3042    return clang_getTranslationUnitSpelling(
3043                            static_cast<CXTranslationUnit>(C.data[2]));
3044
3045  if (clang_isReference(C.kind)) {
3046    switch (C.kind) {
3047    case CXCursor_ObjCSuperClassRef: {
3048      ObjCInterfaceDecl *Super = getCursorObjCSuperClassRef(C).first;
3049      return createCXString(Super->getIdentifier()->getNameStart());
3050    }
3051    case CXCursor_ObjCClassRef: {
3052      ObjCInterfaceDecl *Class = getCursorObjCClassRef(C).first;
3053      return createCXString(Class->getIdentifier()->getNameStart());
3054    }
3055    case CXCursor_ObjCProtocolRef: {
3056      ObjCProtocolDecl *OID = getCursorObjCProtocolRef(C).first;
3057      assert(OID && "getCursorSpelling(): Missing protocol decl");
3058      return createCXString(OID->getIdentifier()->getNameStart());
3059    }
3060    case CXCursor_CXXBaseSpecifier: {
3061      CXXBaseSpecifier *B = getCursorCXXBaseSpecifier(C);
3062      return createCXString(B->getType().getAsString());
3063    }
3064    case CXCursor_TypeRef: {
3065      TypeDecl *Type = getCursorTypeRef(C).first;
3066      assert(Type && "Missing type decl");
3067
3068      return createCXString(getCursorContext(C).getTypeDeclType(Type).
3069                              getAsString());
3070    }
3071    case CXCursor_TemplateRef: {
3072      TemplateDecl *Template = getCursorTemplateRef(C).first;
3073      assert(Template && "Missing template decl");
3074
3075      return createCXString(Template->getNameAsString());
3076    }
3077
3078    case CXCursor_NamespaceRef: {
3079      NamedDecl *NS = getCursorNamespaceRef(C).first;
3080      assert(NS && "Missing namespace decl");
3081
3082      return createCXString(NS->getNameAsString());
3083    }
3084
3085    case CXCursor_MemberRef: {
3086      FieldDecl *Field = getCursorMemberRef(C).first;
3087      assert(Field && "Missing member decl");
3088
3089      return createCXString(Field->getNameAsString());
3090    }
3091
3092    case CXCursor_LabelRef: {
3093      LabelStmt *Label = getCursorLabelRef(C).first;
3094      assert(Label && "Missing label");
3095
3096      return createCXString(Label->getName());
3097    }
3098
3099    case CXCursor_OverloadedDeclRef: {
3100      OverloadedDeclRefStorage Storage = getCursorOverloadedDeclRef(C).first;
3101      if (Decl *D = Storage.dyn_cast<Decl *>()) {
3102        if (NamedDecl *ND = dyn_cast<NamedDecl>(D))
3103          return createCXString(ND->getNameAsString());
3104        return createCXString("");
3105      }
3106      if (OverloadExpr *E = Storage.dyn_cast<OverloadExpr *>())
3107        return createCXString(E->getName().getAsString());
3108      OverloadedTemplateStorage *Ovl
3109        = Storage.get<OverloadedTemplateStorage*>();
3110      if (Ovl->size() == 0)
3111        return createCXString("");
3112      return createCXString((*Ovl->begin())->getNameAsString());
3113    }
3114
3115    case CXCursor_VariableRef: {
3116      VarDecl *Var = getCursorVariableRef(C).first;
3117      assert(Var && "Missing variable decl");
3118
3119      return createCXString(Var->getNameAsString());
3120    }
3121
3122    default:
3123      return createCXString("<not implemented>");
3124    }
3125  }
3126
3127  if (clang_isExpression(C.kind)) {
3128    Decl *D = getDeclFromExpr(getCursorExpr(C));
3129    if (D)
3130      return getDeclSpelling(D);
3131    return createCXString("");
3132  }
3133
3134  if (clang_isStatement(C.kind)) {
3135    Stmt *S = getCursorStmt(C);
3136    if (LabelStmt *Label = dyn_cast_or_null<LabelStmt>(S))
3137      return createCXString(Label->getName());
3138
3139    return createCXString("");
3140  }
3141
3142  if (C.kind == CXCursor_MacroExpansion)
3143    return createCXString(getCursorMacroExpansion(C)->getName()
3144                                                           ->getNameStart());
3145
3146  if (C.kind == CXCursor_MacroDefinition)
3147    return createCXString(getCursorMacroDefinition(C)->getName()
3148                                                           ->getNameStart());
3149
3150  if (C.kind == CXCursor_InclusionDirective)
3151    return createCXString(getCursorInclusionDirective(C)->getFileName());
3152
3153  if (clang_isDeclaration(C.kind))
3154    return getDeclSpelling(getCursorDecl(C));
3155
3156  if (C.kind == CXCursor_AnnotateAttr) {
3157    AnnotateAttr *AA = cast<AnnotateAttr>(cxcursor::getCursorAttr(C));
3158    return createCXString(AA->getAnnotation());
3159  }
3160
3161  if (C.kind == CXCursor_AsmLabelAttr) {
3162    AsmLabelAttr *AA = cast<AsmLabelAttr>(cxcursor::getCursorAttr(C));
3163    return createCXString(AA->getLabel());
3164  }
3165
3166  return createCXString("");
3167}
3168
3169CXSourceRange clang_Cursor_getSpellingNameRange(CXCursor C,
3170                                                unsigned pieceIndex,
3171                                                unsigned options) {
3172  if (clang_Cursor_isNull(C))
3173    return clang_getNullRange();
3174
3175  ASTContext &Ctx = getCursorContext(C);
3176
3177  if (clang_isStatement(C.kind)) {
3178    Stmt *S = getCursorStmt(C);
3179    if (LabelStmt *Label = dyn_cast_or_null<LabelStmt>(S)) {
3180      if (pieceIndex > 0)
3181        return clang_getNullRange();
3182      return cxloc::translateSourceRange(Ctx, Label->getIdentLoc());
3183    }
3184
3185    return clang_getNullRange();
3186  }
3187
3188  if (C.kind == CXCursor_ObjCMessageExpr) {
3189    if (ObjCMessageExpr *
3190          ME = dyn_cast_or_null<ObjCMessageExpr>(getCursorExpr(C))) {
3191      if (pieceIndex >= ME->getNumSelectorLocs())
3192        return clang_getNullRange();
3193      return cxloc::translateSourceRange(Ctx, ME->getSelectorLoc(pieceIndex));
3194    }
3195  }
3196
3197  if (C.kind == CXCursor_ObjCInstanceMethodDecl ||
3198      C.kind == CXCursor_ObjCClassMethodDecl) {
3199    if (ObjCMethodDecl *
3200          MD = dyn_cast_or_null<ObjCMethodDecl>(getCursorDecl(C))) {
3201      if (pieceIndex >= MD->getNumSelectorLocs())
3202        return clang_getNullRange();
3203      return cxloc::translateSourceRange(Ctx, MD->getSelectorLoc(pieceIndex));
3204    }
3205  }
3206
3207  if (C.kind == CXCursor_ObjCCategoryDecl ||
3208      C.kind == CXCursor_ObjCCategoryImplDecl) {
3209    if (pieceIndex > 0)
3210      return clang_getNullRange();
3211    if (ObjCCategoryDecl *
3212          CD = dyn_cast_or_null<ObjCCategoryDecl>(getCursorDecl(C)))
3213      return cxloc::translateSourceRange(Ctx, CD->getCategoryNameLoc());
3214    if (ObjCCategoryImplDecl *
3215          CID = dyn_cast_or_null<ObjCCategoryImplDecl>(getCursorDecl(C)))
3216      return cxloc::translateSourceRange(Ctx, CID->getCategoryNameLoc());
3217  }
3218
3219  // FIXME: A CXCursor_InclusionDirective should give the location of the
3220  // filename, but we don't keep track of this.
3221
3222  // FIXME: A CXCursor_AnnotateAttr should give the location of the annotation
3223  // but we don't keep track of this.
3224
3225  // FIXME: A CXCursor_AsmLabelAttr should give the location of the label
3226  // but we don't keep track of this.
3227
3228  // Default handling, give the location of the cursor.
3229
3230  if (pieceIndex > 0)
3231    return clang_getNullRange();
3232
3233  CXSourceLocation CXLoc = clang_getCursorLocation(C);
3234  SourceLocation Loc = cxloc::translateSourceLocation(CXLoc);
3235  return cxloc::translateSourceRange(Ctx, Loc);
3236}
3237
3238CXString clang_getCursorDisplayName(CXCursor C) {
3239  if (!clang_isDeclaration(C.kind))
3240    return clang_getCursorSpelling(C);
3241
3242  Decl *D = getCursorDecl(C);
3243  if (!D)
3244    return createCXString("");
3245
3246  PrintingPolicy Policy = getCursorContext(C).getPrintingPolicy();
3247  if (FunctionTemplateDecl *FunTmpl = dyn_cast<FunctionTemplateDecl>(D))
3248    D = FunTmpl->getTemplatedDecl();
3249
3250  if (FunctionDecl *Function = dyn_cast<FunctionDecl>(D)) {
3251    SmallString<64> Str;
3252    llvm::raw_svector_ostream OS(Str);
3253    OS << *Function;
3254    if (Function->getPrimaryTemplate())
3255      OS << "<>";
3256    OS << "(";
3257    for (unsigned I = 0, N = Function->getNumParams(); I != N; ++I) {
3258      if (I)
3259        OS << ", ";
3260      OS << Function->getParamDecl(I)->getType().getAsString(Policy);
3261    }
3262
3263    if (Function->isVariadic()) {
3264      if (Function->getNumParams())
3265        OS << ", ";
3266      OS << "...";
3267    }
3268    OS << ")";
3269    return createCXString(OS.str());
3270  }
3271
3272  if (ClassTemplateDecl *ClassTemplate = dyn_cast<ClassTemplateDecl>(D)) {
3273    SmallString<64> Str;
3274    llvm::raw_svector_ostream OS(Str);
3275    OS << *ClassTemplate;
3276    OS << "<";
3277    TemplateParameterList *Params = ClassTemplate->getTemplateParameters();
3278    for (unsigned I = 0, N = Params->size(); I != N; ++I) {
3279      if (I)
3280        OS << ", ";
3281
3282      NamedDecl *Param = Params->getParam(I);
3283      if (Param->getIdentifier()) {
3284        OS << Param->getIdentifier()->getName();
3285        continue;
3286      }
3287
3288      // There is no parameter name, which makes this tricky. Try to come up
3289      // with something useful that isn't too long.
3290      if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(Param))
3291        OS << (TTP->wasDeclaredWithTypename()? "typename" : "class");
3292      else if (NonTypeTemplateParmDecl *NTTP
3293                                    = dyn_cast<NonTypeTemplateParmDecl>(Param))
3294        OS << NTTP->getType().getAsString(Policy);
3295      else
3296        OS << "template<...> class";
3297    }
3298
3299    OS << ">";
3300    return createCXString(OS.str());
3301  }
3302
3303  if (ClassTemplateSpecializationDecl *ClassSpec
3304                              = dyn_cast<ClassTemplateSpecializationDecl>(D)) {
3305    // If the type was explicitly written, use that.
3306    if (TypeSourceInfo *TSInfo = ClassSpec->getTypeAsWritten())
3307      return createCXString(TSInfo->getType().getAsString(Policy));
3308
3309    SmallString<64> Str;
3310    llvm::raw_svector_ostream OS(Str);
3311    OS << *ClassSpec;
3312    OS << TemplateSpecializationType::PrintTemplateArgumentList(
3313                                      ClassSpec->getTemplateArgs().data(),
3314                                      ClassSpec->getTemplateArgs().size(),
3315                                                                Policy);
3316    return createCXString(OS.str());
3317  }
3318
3319  return clang_getCursorSpelling(C);
3320}
3321
3322CXString clang_getCursorKindSpelling(enum CXCursorKind Kind) {
3323  switch (Kind) {
3324  case CXCursor_FunctionDecl:
3325      return createCXString("FunctionDecl");
3326  case CXCursor_TypedefDecl:
3327      return createCXString("TypedefDecl");
3328  case CXCursor_EnumDecl:
3329      return createCXString("EnumDecl");
3330  case CXCursor_EnumConstantDecl:
3331      return createCXString("EnumConstantDecl");
3332  case CXCursor_StructDecl:
3333      return createCXString("StructDecl");
3334  case CXCursor_UnionDecl:
3335      return createCXString("UnionDecl");
3336  case CXCursor_ClassDecl:
3337      return createCXString("ClassDecl");
3338  case CXCursor_FieldDecl:
3339      return createCXString("FieldDecl");
3340  case CXCursor_VarDecl:
3341      return createCXString("VarDecl");
3342  case CXCursor_ParmDecl:
3343      return createCXString("ParmDecl");
3344  case CXCursor_ObjCInterfaceDecl:
3345      return createCXString("ObjCInterfaceDecl");
3346  case CXCursor_ObjCCategoryDecl:
3347      return createCXString("ObjCCategoryDecl");
3348  case CXCursor_ObjCProtocolDecl:
3349      return createCXString("ObjCProtocolDecl");
3350  case CXCursor_ObjCPropertyDecl:
3351      return createCXString("ObjCPropertyDecl");
3352  case CXCursor_ObjCIvarDecl:
3353      return createCXString("ObjCIvarDecl");
3354  case CXCursor_ObjCInstanceMethodDecl:
3355      return createCXString("ObjCInstanceMethodDecl");
3356  case CXCursor_ObjCClassMethodDecl:
3357      return createCXString("ObjCClassMethodDecl");
3358  case CXCursor_ObjCImplementationDecl:
3359      return createCXString("ObjCImplementationDecl");
3360  case CXCursor_ObjCCategoryImplDecl:
3361      return createCXString("ObjCCategoryImplDecl");
3362  case CXCursor_CXXMethod:
3363      return createCXString("CXXMethod");
3364  case CXCursor_UnexposedDecl:
3365      return createCXString("UnexposedDecl");
3366  case CXCursor_ObjCSuperClassRef:
3367      return createCXString("ObjCSuperClassRef");
3368  case CXCursor_ObjCProtocolRef:
3369      return createCXString("ObjCProtocolRef");
3370  case CXCursor_ObjCClassRef:
3371      return createCXString("ObjCClassRef");
3372  case CXCursor_TypeRef:
3373      return createCXString("TypeRef");
3374  case CXCursor_TemplateRef:
3375      return createCXString("TemplateRef");
3376  case CXCursor_NamespaceRef:
3377    return createCXString("NamespaceRef");
3378  case CXCursor_MemberRef:
3379    return createCXString("MemberRef");
3380  case CXCursor_LabelRef:
3381    return createCXString("LabelRef");
3382  case CXCursor_OverloadedDeclRef:
3383    return createCXString("OverloadedDeclRef");
3384  case CXCursor_VariableRef:
3385    return createCXString("VariableRef");
3386  case CXCursor_IntegerLiteral:
3387      return createCXString("IntegerLiteral");
3388  case CXCursor_FloatingLiteral:
3389      return createCXString("FloatingLiteral");
3390  case CXCursor_ImaginaryLiteral:
3391      return createCXString("ImaginaryLiteral");
3392  case CXCursor_StringLiteral:
3393      return createCXString("StringLiteral");
3394  case CXCursor_CharacterLiteral:
3395      return createCXString("CharacterLiteral");
3396  case CXCursor_ParenExpr:
3397      return createCXString("ParenExpr");
3398  case CXCursor_UnaryOperator:
3399      return createCXString("UnaryOperator");
3400  case CXCursor_ArraySubscriptExpr:
3401      return createCXString("ArraySubscriptExpr");
3402  case CXCursor_BinaryOperator:
3403      return createCXString("BinaryOperator");
3404  case CXCursor_CompoundAssignOperator:
3405      return createCXString("CompoundAssignOperator");
3406  case CXCursor_ConditionalOperator:
3407      return createCXString("ConditionalOperator");
3408  case CXCursor_CStyleCastExpr:
3409      return createCXString("CStyleCastExpr");
3410  case CXCursor_CompoundLiteralExpr:
3411      return createCXString("CompoundLiteralExpr");
3412  case CXCursor_InitListExpr:
3413      return createCXString("InitListExpr");
3414  case CXCursor_AddrLabelExpr:
3415      return createCXString("AddrLabelExpr");
3416  case CXCursor_StmtExpr:
3417      return createCXString("StmtExpr");
3418  case CXCursor_GenericSelectionExpr:
3419      return createCXString("GenericSelectionExpr");
3420  case CXCursor_GNUNullExpr:
3421      return createCXString("GNUNullExpr");
3422  case CXCursor_CXXStaticCastExpr:
3423      return createCXString("CXXStaticCastExpr");
3424  case CXCursor_CXXDynamicCastExpr:
3425      return createCXString("CXXDynamicCastExpr");
3426  case CXCursor_CXXReinterpretCastExpr:
3427      return createCXString("CXXReinterpretCastExpr");
3428  case CXCursor_CXXConstCastExpr:
3429      return createCXString("CXXConstCastExpr");
3430  case CXCursor_CXXFunctionalCastExpr:
3431      return createCXString("CXXFunctionalCastExpr");
3432  case CXCursor_CXXTypeidExpr:
3433      return createCXString("CXXTypeidExpr");
3434  case CXCursor_CXXBoolLiteralExpr:
3435      return createCXString("CXXBoolLiteralExpr");
3436  case CXCursor_CXXNullPtrLiteralExpr:
3437      return createCXString("CXXNullPtrLiteralExpr");
3438  case CXCursor_CXXThisExpr:
3439      return createCXString("CXXThisExpr");
3440  case CXCursor_CXXThrowExpr:
3441      return createCXString("CXXThrowExpr");
3442  case CXCursor_CXXNewExpr:
3443      return createCXString("CXXNewExpr");
3444  case CXCursor_CXXDeleteExpr:
3445      return createCXString("CXXDeleteExpr");
3446  case CXCursor_UnaryExpr:
3447      return createCXString("UnaryExpr");
3448  case CXCursor_ObjCStringLiteral:
3449      return createCXString("ObjCStringLiteral");
3450  case CXCursor_ObjCBoolLiteralExpr:
3451      return createCXString("ObjCBoolLiteralExpr");
3452  case CXCursor_ObjCEncodeExpr:
3453      return createCXString("ObjCEncodeExpr");
3454  case CXCursor_ObjCSelectorExpr:
3455      return createCXString("ObjCSelectorExpr");
3456  case CXCursor_ObjCProtocolExpr:
3457      return createCXString("ObjCProtocolExpr");
3458  case CXCursor_ObjCBridgedCastExpr:
3459      return createCXString("ObjCBridgedCastExpr");
3460  case CXCursor_BlockExpr:
3461      return createCXString("BlockExpr");
3462  case CXCursor_PackExpansionExpr:
3463      return createCXString("PackExpansionExpr");
3464  case CXCursor_SizeOfPackExpr:
3465      return createCXString("SizeOfPackExpr");
3466  case CXCursor_LambdaExpr:
3467    return createCXString("LambdaExpr");
3468  case CXCursor_UnexposedExpr:
3469      return createCXString("UnexposedExpr");
3470  case CXCursor_DeclRefExpr:
3471      return createCXString("DeclRefExpr");
3472  case CXCursor_MemberRefExpr:
3473      return createCXString("MemberRefExpr");
3474  case CXCursor_CallExpr:
3475      return createCXString("CallExpr");
3476  case CXCursor_ObjCMessageExpr:
3477      return createCXString("ObjCMessageExpr");
3478  case CXCursor_UnexposedStmt:
3479      return createCXString("UnexposedStmt");
3480  case CXCursor_DeclStmt:
3481      return createCXString("DeclStmt");
3482  case CXCursor_LabelStmt:
3483      return createCXString("LabelStmt");
3484  case CXCursor_CompoundStmt:
3485      return createCXString("CompoundStmt");
3486  case CXCursor_CaseStmt:
3487      return createCXString("CaseStmt");
3488  case CXCursor_DefaultStmt:
3489      return createCXString("DefaultStmt");
3490  case CXCursor_IfStmt:
3491      return createCXString("IfStmt");
3492  case CXCursor_SwitchStmt:
3493      return createCXString("SwitchStmt");
3494  case CXCursor_WhileStmt:
3495      return createCXString("WhileStmt");
3496  case CXCursor_DoStmt:
3497      return createCXString("DoStmt");
3498  case CXCursor_ForStmt:
3499      return createCXString("ForStmt");
3500  case CXCursor_GotoStmt:
3501      return createCXString("GotoStmt");
3502  case CXCursor_IndirectGotoStmt:
3503      return createCXString("IndirectGotoStmt");
3504  case CXCursor_ContinueStmt:
3505      return createCXString("ContinueStmt");
3506  case CXCursor_BreakStmt:
3507      return createCXString("BreakStmt");
3508  case CXCursor_ReturnStmt:
3509      return createCXString("ReturnStmt");
3510  case CXCursor_AsmStmt:
3511      return createCXString("AsmStmt");
3512  case CXCursor_MSAsmStmt:
3513      return createCXString("MSAsmStmt");
3514  case CXCursor_ObjCAtTryStmt:
3515      return createCXString("ObjCAtTryStmt");
3516  case CXCursor_ObjCAtCatchStmt:
3517      return createCXString("ObjCAtCatchStmt");
3518  case CXCursor_ObjCAtFinallyStmt:
3519      return createCXString("ObjCAtFinallyStmt");
3520  case CXCursor_ObjCAtThrowStmt:
3521      return createCXString("ObjCAtThrowStmt");
3522  case CXCursor_ObjCAtSynchronizedStmt:
3523      return createCXString("ObjCAtSynchronizedStmt");
3524  case CXCursor_ObjCAutoreleasePoolStmt:
3525      return createCXString("ObjCAutoreleasePoolStmt");
3526  case CXCursor_ObjCForCollectionStmt:
3527      return createCXString("ObjCForCollectionStmt");
3528  case CXCursor_CXXCatchStmt:
3529      return createCXString("CXXCatchStmt");
3530  case CXCursor_CXXTryStmt:
3531      return createCXString("CXXTryStmt");
3532  case CXCursor_CXXForRangeStmt:
3533      return createCXString("CXXForRangeStmt");
3534  case CXCursor_SEHTryStmt:
3535      return createCXString("SEHTryStmt");
3536  case CXCursor_SEHExceptStmt:
3537      return createCXString("SEHExceptStmt");
3538  case CXCursor_SEHFinallyStmt:
3539      return createCXString("SEHFinallyStmt");
3540  case CXCursor_NullStmt:
3541      return createCXString("NullStmt");
3542  case CXCursor_InvalidFile:
3543      return createCXString("InvalidFile");
3544  case CXCursor_InvalidCode:
3545    return createCXString("InvalidCode");
3546  case CXCursor_NoDeclFound:
3547      return createCXString("NoDeclFound");
3548  case CXCursor_NotImplemented:
3549      return createCXString("NotImplemented");
3550  case CXCursor_TranslationUnit:
3551      return createCXString("TranslationUnit");
3552  case CXCursor_UnexposedAttr:
3553      return createCXString("UnexposedAttr");
3554  case CXCursor_IBActionAttr:
3555      return createCXString("attribute(ibaction)");
3556  case CXCursor_IBOutletAttr:
3557     return createCXString("attribute(iboutlet)");
3558  case CXCursor_IBOutletCollectionAttr:
3559      return createCXString("attribute(iboutletcollection)");
3560  case CXCursor_CXXFinalAttr:
3561      return createCXString("attribute(final)");
3562  case CXCursor_CXXOverrideAttr:
3563      return createCXString("attribute(override)");
3564  case CXCursor_AnnotateAttr:
3565    return createCXString("attribute(annotate)");
3566  case CXCursor_AsmLabelAttr:
3567    return createCXString("asm label");
3568  case CXCursor_PreprocessingDirective:
3569    return createCXString("preprocessing directive");
3570  case CXCursor_MacroDefinition:
3571    return createCXString("macro definition");
3572  case CXCursor_MacroExpansion:
3573    return createCXString("macro expansion");
3574  case CXCursor_InclusionDirective:
3575    return createCXString("inclusion directive");
3576  case CXCursor_Namespace:
3577    return createCXString("Namespace");
3578  case CXCursor_LinkageSpec:
3579    return createCXString("LinkageSpec");
3580  case CXCursor_CXXBaseSpecifier:
3581    return createCXString("C++ base class specifier");
3582  case CXCursor_Constructor:
3583    return createCXString("CXXConstructor");
3584  case CXCursor_Destructor:
3585    return createCXString("CXXDestructor");
3586  case CXCursor_ConversionFunction:
3587    return createCXString("CXXConversion");
3588  case CXCursor_TemplateTypeParameter:
3589    return createCXString("TemplateTypeParameter");
3590  case CXCursor_NonTypeTemplateParameter:
3591    return createCXString("NonTypeTemplateParameter");
3592  case CXCursor_TemplateTemplateParameter:
3593    return createCXString("TemplateTemplateParameter");
3594  case CXCursor_FunctionTemplate:
3595    return createCXString("FunctionTemplate");
3596  case CXCursor_ClassTemplate:
3597    return createCXString("ClassTemplate");
3598  case CXCursor_ClassTemplatePartialSpecialization:
3599    return createCXString("ClassTemplatePartialSpecialization");
3600  case CXCursor_NamespaceAlias:
3601    return createCXString("NamespaceAlias");
3602  case CXCursor_UsingDirective:
3603    return createCXString("UsingDirective");
3604  case CXCursor_UsingDeclaration:
3605    return createCXString("UsingDeclaration");
3606  case CXCursor_TypeAliasDecl:
3607    return createCXString("TypeAliasDecl");
3608  case CXCursor_ObjCSynthesizeDecl:
3609    return createCXString("ObjCSynthesizeDecl");
3610  case CXCursor_ObjCDynamicDecl:
3611    return createCXString("ObjCDynamicDecl");
3612  case CXCursor_CXXAccessSpecifier:
3613    return createCXString("CXXAccessSpecifier");
3614  }
3615
3616  llvm_unreachable("Unhandled CXCursorKind");
3617}
3618
3619struct GetCursorData {
3620  SourceLocation TokenBeginLoc;
3621  bool PointsAtMacroArgExpansion;
3622  bool VisitedObjCPropertyImplDecl;
3623  SourceLocation VisitedDeclaratorDeclStartLoc;
3624  CXCursor &BestCursor;
3625
3626  GetCursorData(SourceManager &SM,
3627                SourceLocation tokenBegin, CXCursor &outputCursor)
3628    : TokenBeginLoc(tokenBegin), BestCursor(outputCursor) {
3629    PointsAtMacroArgExpansion = SM.isMacroArgExpansion(tokenBegin);
3630    VisitedObjCPropertyImplDecl = false;
3631  }
3632};
3633
3634static enum CXChildVisitResult GetCursorVisitor(CXCursor cursor,
3635                                                CXCursor parent,
3636                                                CXClientData client_data) {
3637  GetCursorData *Data = static_cast<GetCursorData *>(client_data);
3638  CXCursor *BestCursor = &Data->BestCursor;
3639
3640  // If we point inside a macro argument we should provide info of what the
3641  // token is so use the actual cursor, don't replace it with a macro expansion
3642  // cursor.
3643  if (cursor.kind == CXCursor_MacroExpansion && Data->PointsAtMacroArgExpansion)
3644    return CXChildVisit_Recurse;
3645
3646  if (clang_isDeclaration(cursor.kind)) {
3647    // Avoid having the implicit methods override the property decls.
3648    if (ObjCMethodDecl *MD
3649          = dyn_cast_or_null<ObjCMethodDecl>(getCursorDecl(cursor))) {
3650      if (MD->isImplicit())
3651        return CXChildVisit_Break;
3652
3653    } else if (ObjCInterfaceDecl *ID
3654                 = dyn_cast_or_null<ObjCInterfaceDecl>(getCursorDecl(cursor))) {
3655      // Check that when we have multiple @class references in the same line,
3656      // that later ones do not override the previous ones.
3657      // If we have:
3658      // @class Foo, Bar;
3659      // source ranges for both start at '@', so 'Bar' will end up overriding
3660      // 'Foo' even though the cursor location was at 'Foo'.
3661      if (BestCursor->kind == CXCursor_ObjCInterfaceDecl ||
3662          BestCursor->kind == CXCursor_ObjCClassRef)
3663        if (ObjCInterfaceDecl *PrevID
3664             = dyn_cast_or_null<ObjCInterfaceDecl>(getCursorDecl(*BestCursor))){
3665         if (PrevID != ID &&
3666             !PrevID->isThisDeclarationADefinition() &&
3667             !ID->isThisDeclarationADefinition())
3668           return CXChildVisit_Break;
3669        }
3670
3671    } else if (DeclaratorDecl *DD
3672                    = dyn_cast_or_null<DeclaratorDecl>(getCursorDecl(cursor))) {
3673      SourceLocation StartLoc = DD->getSourceRange().getBegin();
3674      // Check that when we have multiple declarators in the same line,
3675      // that later ones do not override the previous ones.
3676      // If we have:
3677      // int Foo, Bar;
3678      // source ranges for both start at 'int', so 'Bar' will end up overriding
3679      // 'Foo' even though the cursor location was at 'Foo'.
3680      if (Data->VisitedDeclaratorDeclStartLoc == StartLoc)
3681        return CXChildVisit_Break;
3682      Data->VisitedDeclaratorDeclStartLoc = StartLoc;
3683
3684    } else if (ObjCPropertyImplDecl *PropImp
3685              = dyn_cast_or_null<ObjCPropertyImplDecl>(getCursorDecl(cursor))) {
3686      (void)PropImp;
3687      // Check that when we have multiple @synthesize in the same line,
3688      // that later ones do not override the previous ones.
3689      // If we have:
3690      // @synthesize Foo, Bar;
3691      // source ranges for both start at '@', so 'Bar' will end up overriding
3692      // 'Foo' even though the cursor location was at 'Foo'.
3693      if (Data->VisitedObjCPropertyImplDecl)
3694        return CXChildVisit_Break;
3695      Data->VisitedObjCPropertyImplDecl = true;
3696    }
3697  }
3698
3699  if (clang_isExpression(cursor.kind) &&
3700      clang_isDeclaration(BestCursor->kind)) {
3701    if (Decl *D = getCursorDecl(*BestCursor)) {
3702      // Avoid having the cursor of an expression replace the declaration cursor
3703      // when the expression source range overlaps the declaration range.
3704      // This can happen for C++ constructor expressions whose range generally
3705      // include the variable declaration, e.g.:
3706      //  MyCXXClass foo; // Make sure pointing at 'foo' returns a VarDecl cursor.
3707      if (D->getLocation().isValid() && Data->TokenBeginLoc.isValid() &&
3708          D->getLocation() == Data->TokenBeginLoc)
3709        return CXChildVisit_Break;
3710    }
3711  }
3712
3713  // If our current best cursor is the construction of a temporary object,
3714  // don't replace that cursor with a type reference, because we want
3715  // clang_getCursor() to point at the constructor.
3716  if (clang_isExpression(BestCursor->kind) &&
3717      isa<CXXTemporaryObjectExpr>(getCursorExpr(*BestCursor)) &&
3718      cursor.kind == CXCursor_TypeRef) {
3719    // Keep the cursor pointing at CXXTemporaryObjectExpr but also mark it
3720    // as having the actual point on the type reference.
3721    *BestCursor = getTypeRefedCallExprCursor(*BestCursor);
3722    return CXChildVisit_Recurse;
3723  }
3724
3725  *BestCursor = cursor;
3726  return CXChildVisit_Recurse;
3727}
3728
3729CXCursor clang_getCursor(CXTranslationUnit TU, CXSourceLocation Loc) {
3730  if (!TU)
3731    return clang_getNullCursor();
3732
3733  ASTUnit *CXXUnit = static_cast<ASTUnit *>(TU->TUData);
3734  ASTUnit::ConcurrencyCheck Check(*CXXUnit);
3735
3736  SourceLocation SLoc = cxloc::translateSourceLocation(Loc);
3737  CXCursor Result = cxcursor::getCursor(TU, SLoc);
3738
3739  bool Logging = getenv("LIBCLANG_LOGGING");
3740  if (Logging) {
3741    CXFile SearchFile;
3742    unsigned SearchLine, SearchColumn;
3743    CXFile ResultFile;
3744    unsigned ResultLine, ResultColumn;
3745    CXString SearchFileName, ResultFileName, KindSpelling, USR;
3746    const char *IsDef = clang_isCursorDefinition(Result)? " (Definition)" : "";
3747    CXSourceLocation ResultLoc = clang_getCursorLocation(Result);
3748
3749    clang_getExpansionLocation(Loc, &SearchFile, &SearchLine, &SearchColumn, 0);
3750    clang_getExpansionLocation(ResultLoc, &ResultFile, &ResultLine,
3751                               &ResultColumn, 0);
3752    SearchFileName = clang_getFileName(SearchFile);
3753    ResultFileName = clang_getFileName(ResultFile);
3754    KindSpelling = clang_getCursorKindSpelling(Result.kind);
3755    USR = clang_getCursorUSR(Result);
3756    fprintf(stderr, "clang_getCursor(%s:%d:%d) = %s(%s:%d:%d):%s%s\n",
3757            clang_getCString(SearchFileName), SearchLine, SearchColumn,
3758            clang_getCString(KindSpelling),
3759            clang_getCString(ResultFileName), ResultLine, ResultColumn,
3760            clang_getCString(USR), IsDef);
3761    clang_disposeString(SearchFileName);
3762    clang_disposeString(ResultFileName);
3763    clang_disposeString(KindSpelling);
3764    clang_disposeString(USR);
3765
3766    CXCursor Definition = clang_getCursorDefinition(Result);
3767    if (!clang_equalCursors(Definition, clang_getNullCursor())) {
3768      CXSourceLocation DefinitionLoc = clang_getCursorLocation(Definition);
3769      CXString DefinitionKindSpelling
3770                                = clang_getCursorKindSpelling(Definition.kind);
3771      CXFile DefinitionFile;
3772      unsigned DefinitionLine, DefinitionColumn;
3773      clang_getExpansionLocation(DefinitionLoc, &DefinitionFile,
3774                                 &DefinitionLine, &DefinitionColumn, 0);
3775      CXString DefinitionFileName = clang_getFileName(DefinitionFile);
3776      fprintf(stderr, "  -> %s(%s:%d:%d)\n",
3777              clang_getCString(DefinitionKindSpelling),
3778              clang_getCString(DefinitionFileName),
3779              DefinitionLine, DefinitionColumn);
3780      clang_disposeString(DefinitionFileName);
3781      clang_disposeString(DefinitionKindSpelling);
3782    }
3783  }
3784
3785  return Result;
3786}
3787
3788CXCursor clang_getNullCursor(void) {
3789  return MakeCXCursorInvalid(CXCursor_InvalidFile);
3790}
3791
3792unsigned clang_equalCursors(CXCursor X, CXCursor Y) {
3793  return X == Y;
3794}
3795
3796unsigned clang_hashCursor(CXCursor C) {
3797  unsigned Index = 0;
3798  if (clang_isExpression(C.kind) || clang_isStatement(C.kind))
3799    Index = 1;
3800
3801  return llvm::DenseMapInfo<std::pair<unsigned, void*> >::getHashValue(
3802                                        std::make_pair(C.kind, C.data[Index]));
3803}
3804
3805unsigned clang_isInvalid(enum CXCursorKind K) {
3806  return K >= CXCursor_FirstInvalid && K <= CXCursor_LastInvalid;
3807}
3808
3809unsigned clang_isDeclaration(enum CXCursorKind K) {
3810  return K >= CXCursor_FirstDecl && K <= CXCursor_LastDecl;
3811}
3812
3813unsigned clang_isReference(enum CXCursorKind K) {
3814  return K >= CXCursor_FirstRef && K <= CXCursor_LastRef;
3815}
3816
3817unsigned clang_isExpression(enum CXCursorKind K) {
3818  return K >= CXCursor_FirstExpr && K <= CXCursor_LastExpr;
3819}
3820
3821unsigned clang_isStatement(enum CXCursorKind K) {
3822  return K >= CXCursor_FirstStmt && K <= CXCursor_LastStmt;
3823}
3824
3825unsigned clang_isAttribute(enum CXCursorKind K) {
3826    return K >= CXCursor_FirstAttr && K <= CXCursor_LastAttr;
3827}
3828
3829unsigned clang_isTranslationUnit(enum CXCursorKind K) {
3830  return K == CXCursor_TranslationUnit;
3831}
3832
3833unsigned clang_isPreprocessing(enum CXCursorKind K) {
3834  return K >= CXCursor_FirstPreprocessing && K <= CXCursor_LastPreprocessing;
3835}
3836
3837unsigned clang_isUnexposed(enum CXCursorKind K) {
3838  switch (K) {
3839    case CXCursor_UnexposedDecl:
3840    case CXCursor_UnexposedExpr:
3841    case CXCursor_UnexposedStmt:
3842    case CXCursor_UnexposedAttr:
3843      return true;
3844    default:
3845      return false;
3846  }
3847}
3848
3849CXCursorKind clang_getCursorKind(CXCursor C) {
3850  return C.kind;
3851}
3852
3853CXSourceLocation clang_getCursorLocation(CXCursor C) {
3854  if (clang_isReference(C.kind)) {
3855    switch (C.kind) {
3856    case CXCursor_ObjCSuperClassRef: {
3857      std::pair<ObjCInterfaceDecl *, SourceLocation> P
3858        = getCursorObjCSuperClassRef(C);
3859      return cxloc::translateSourceLocation(P.first->getASTContext(), P.second);
3860    }
3861
3862    case CXCursor_ObjCProtocolRef: {
3863      std::pair<ObjCProtocolDecl *, SourceLocation> P
3864        = getCursorObjCProtocolRef(C);
3865      return cxloc::translateSourceLocation(P.first->getASTContext(), P.second);
3866    }
3867
3868    case CXCursor_ObjCClassRef: {
3869      std::pair<ObjCInterfaceDecl *, SourceLocation> P
3870        = getCursorObjCClassRef(C);
3871      return cxloc::translateSourceLocation(P.first->getASTContext(), P.second);
3872    }
3873
3874    case CXCursor_TypeRef: {
3875      std::pair<TypeDecl *, SourceLocation> P = getCursorTypeRef(C);
3876      return cxloc::translateSourceLocation(P.first->getASTContext(), P.second);
3877    }
3878
3879    case CXCursor_TemplateRef: {
3880      std::pair<TemplateDecl *, SourceLocation> P = getCursorTemplateRef(C);
3881      return cxloc::translateSourceLocation(P.first->getASTContext(), P.second);
3882    }
3883
3884    case CXCursor_NamespaceRef: {
3885      std::pair<NamedDecl *, SourceLocation> P = getCursorNamespaceRef(C);
3886      return cxloc::translateSourceLocation(P.first->getASTContext(), P.second);
3887    }
3888
3889    case CXCursor_MemberRef: {
3890      std::pair<FieldDecl *, SourceLocation> P = getCursorMemberRef(C);
3891      return cxloc::translateSourceLocation(P.first->getASTContext(), P.second);
3892    }
3893
3894    case CXCursor_VariableRef: {
3895      std::pair<VarDecl *, SourceLocation> P = getCursorVariableRef(C);
3896      return cxloc::translateSourceLocation(P.first->getASTContext(), P.second);
3897    }
3898
3899    case CXCursor_CXXBaseSpecifier: {
3900      CXXBaseSpecifier *BaseSpec = getCursorCXXBaseSpecifier(C);
3901      if (!BaseSpec)
3902        return clang_getNullLocation();
3903
3904      if (TypeSourceInfo *TSInfo = BaseSpec->getTypeSourceInfo())
3905        return cxloc::translateSourceLocation(getCursorContext(C),
3906                                            TSInfo->getTypeLoc().getBeginLoc());
3907
3908      return cxloc::translateSourceLocation(getCursorContext(C),
3909                                        BaseSpec->getLocStart());
3910    }
3911
3912    case CXCursor_LabelRef: {
3913      std::pair<LabelStmt *, SourceLocation> P = getCursorLabelRef(C);
3914      return cxloc::translateSourceLocation(getCursorContext(C), P.second);
3915    }
3916
3917    case CXCursor_OverloadedDeclRef:
3918      return cxloc::translateSourceLocation(getCursorContext(C),
3919                                          getCursorOverloadedDeclRef(C).second);
3920
3921    default:
3922      // FIXME: Need a way to enumerate all non-reference cases.
3923      llvm_unreachable("Missed a reference kind");
3924    }
3925  }
3926
3927  if (clang_isExpression(C.kind))
3928    return cxloc::translateSourceLocation(getCursorContext(C),
3929                                   getLocationFromExpr(getCursorExpr(C)));
3930
3931  if (clang_isStatement(C.kind))
3932    return cxloc::translateSourceLocation(getCursorContext(C),
3933                                          getCursorStmt(C)->getLocStart());
3934
3935  if (C.kind == CXCursor_PreprocessingDirective) {
3936    SourceLocation L = cxcursor::getCursorPreprocessingDirective(C).getBegin();
3937    return cxloc::translateSourceLocation(getCursorContext(C), L);
3938  }
3939
3940  if (C.kind == CXCursor_MacroExpansion) {
3941    SourceLocation L
3942      = cxcursor::getCursorMacroExpansion(C)->getSourceRange().getBegin();
3943    return cxloc::translateSourceLocation(getCursorContext(C), L);
3944  }
3945
3946  if (C.kind == CXCursor_MacroDefinition) {
3947    SourceLocation L = cxcursor::getCursorMacroDefinition(C)->getLocation();
3948    return cxloc::translateSourceLocation(getCursorContext(C), L);
3949  }
3950
3951  if (C.kind == CXCursor_InclusionDirective) {
3952    SourceLocation L
3953      = cxcursor::getCursorInclusionDirective(C)->getSourceRange().getBegin();
3954    return cxloc::translateSourceLocation(getCursorContext(C), L);
3955  }
3956
3957  if (C.kind < CXCursor_FirstDecl || C.kind > CXCursor_LastDecl)
3958    return clang_getNullLocation();
3959
3960  Decl *D = getCursorDecl(C);
3961  if (!D)
3962    return clang_getNullLocation();
3963
3964  SourceLocation Loc = D->getLocation();
3965  // FIXME: Multiple variables declared in a single declaration
3966  // currently lack the information needed to correctly determine their
3967  // ranges when accounting for the type-specifier.  We use context
3968  // stored in the CXCursor to determine if the VarDecl is in a DeclGroup,
3969  // and if so, whether it is the first decl.
3970  if (VarDecl *VD = dyn_cast<VarDecl>(D)) {
3971    if (!cxcursor::isFirstInDeclGroup(C))
3972      Loc = VD->getLocation();
3973  }
3974
3975  // For ObjC methods, give the start location of the method name.
3976  if (ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(D))
3977    Loc = MD->getSelectorStartLoc();
3978
3979  return cxloc::translateSourceLocation(getCursorContext(C), Loc);
3980}
3981
3982} // end extern "C"
3983
3984CXCursor cxcursor::getCursor(CXTranslationUnit TU, SourceLocation SLoc) {
3985  assert(TU);
3986
3987  // Guard against an invalid SourceLocation, or we may assert in one
3988  // of the following calls.
3989  if (SLoc.isInvalid())
3990    return clang_getNullCursor();
3991
3992  ASTUnit *CXXUnit = static_cast<ASTUnit *>(TU->TUData);
3993
3994  // Translate the given source location to make it point at the beginning of
3995  // the token under the cursor.
3996  SLoc = Lexer::GetBeginningOfToken(SLoc, CXXUnit->getSourceManager(),
3997                                    CXXUnit->getASTContext().getLangOpts());
3998
3999  CXCursor Result = MakeCXCursorInvalid(CXCursor_NoDeclFound);
4000  if (SLoc.isValid()) {
4001    GetCursorData ResultData(CXXUnit->getSourceManager(), SLoc, Result);
4002    CursorVisitor CursorVis(TU, GetCursorVisitor, &ResultData,
4003                            /*VisitPreprocessorLast=*/true,
4004                            /*VisitIncludedEntities=*/false,
4005                            SourceLocation(SLoc));
4006    CursorVis.visitFileRegion();
4007  }
4008
4009  return Result;
4010}
4011
4012static SourceRange getRawCursorExtent(CXCursor C) {
4013  if (clang_isReference(C.kind)) {
4014    switch (C.kind) {
4015    case CXCursor_ObjCSuperClassRef:
4016      return  getCursorObjCSuperClassRef(C).second;
4017
4018    case CXCursor_ObjCProtocolRef:
4019      return getCursorObjCProtocolRef(C).second;
4020
4021    case CXCursor_ObjCClassRef:
4022      return getCursorObjCClassRef(C).second;
4023
4024    case CXCursor_TypeRef:
4025      return getCursorTypeRef(C).second;
4026
4027    case CXCursor_TemplateRef:
4028      return getCursorTemplateRef(C).second;
4029
4030    case CXCursor_NamespaceRef:
4031      return getCursorNamespaceRef(C).second;
4032
4033    case CXCursor_MemberRef:
4034      return getCursorMemberRef(C).second;
4035
4036    case CXCursor_CXXBaseSpecifier:
4037      return getCursorCXXBaseSpecifier(C)->getSourceRange();
4038
4039    case CXCursor_LabelRef:
4040      return getCursorLabelRef(C).second;
4041
4042    case CXCursor_OverloadedDeclRef:
4043      return getCursorOverloadedDeclRef(C).second;
4044
4045    case CXCursor_VariableRef:
4046      return getCursorVariableRef(C).second;
4047
4048    default:
4049      // FIXME: Need a way to enumerate all non-reference cases.
4050      llvm_unreachable("Missed a reference kind");
4051    }
4052  }
4053
4054  if (clang_isExpression(C.kind))
4055    return getCursorExpr(C)->getSourceRange();
4056
4057  if (clang_isStatement(C.kind))
4058    return getCursorStmt(C)->getSourceRange();
4059
4060  if (clang_isAttribute(C.kind))
4061    return getCursorAttr(C)->getRange();
4062
4063  if (C.kind == CXCursor_PreprocessingDirective)
4064    return cxcursor::getCursorPreprocessingDirective(C);
4065
4066  if (C.kind == CXCursor_MacroExpansion) {
4067    ASTUnit *TU = getCursorASTUnit(C);
4068    SourceRange Range = cxcursor::getCursorMacroExpansion(C)->getSourceRange();
4069    return TU->mapRangeFromPreamble(Range);
4070  }
4071
4072  if (C.kind == CXCursor_MacroDefinition) {
4073    ASTUnit *TU = getCursorASTUnit(C);
4074    SourceRange Range = cxcursor::getCursorMacroDefinition(C)->getSourceRange();
4075    return TU->mapRangeFromPreamble(Range);
4076  }
4077
4078  if (C.kind == CXCursor_InclusionDirective) {
4079    ASTUnit *TU = getCursorASTUnit(C);
4080    SourceRange Range = cxcursor::getCursorInclusionDirective(C)->getSourceRange();
4081    return TU->mapRangeFromPreamble(Range);
4082  }
4083
4084  if (C.kind == CXCursor_TranslationUnit) {
4085    ASTUnit *TU = getCursorASTUnit(C);
4086    FileID MainID = TU->getSourceManager().getMainFileID();
4087    SourceLocation Start = TU->getSourceManager().getLocForStartOfFile(MainID);
4088    SourceLocation End = TU->getSourceManager().getLocForEndOfFile(MainID);
4089    return SourceRange(Start, End);
4090  }
4091
4092  if (C.kind >= CXCursor_FirstDecl && C.kind <= CXCursor_LastDecl) {
4093    Decl *D = cxcursor::getCursorDecl(C);
4094    if (!D)
4095      return SourceRange();
4096
4097    SourceRange R = D->getSourceRange();
4098    // FIXME: Multiple variables declared in a single declaration
4099    // currently lack the information needed to correctly determine their
4100    // ranges when accounting for the type-specifier.  We use context
4101    // stored in the CXCursor to determine if the VarDecl is in a DeclGroup,
4102    // and if so, whether it is the first decl.
4103    if (VarDecl *VD = dyn_cast<VarDecl>(D)) {
4104      if (!cxcursor::isFirstInDeclGroup(C))
4105        R.setBegin(VD->getLocation());
4106    }
4107    return R;
4108  }
4109  return SourceRange();
4110}
4111
4112/// \brief Retrieves the "raw" cursor extent, which is then extended to include
4113/// the decl-specifier-seq for declarations.
4114static SourceRange getFullCursorExtent(CXCursor C, SourceManager &SrcMgr) {
4115  if (C.kind >= CXCursor_FirstDecl && C.kind <= CXCursor_LastDecl) {
4116    Decl *D = cxcursor::getCursorDecl(C);
4117    if (!D)
4118      return SourceRange();
4119
4120    SourceRange R = D->getSourceRange();
4121
4122    // Adjust the start of the location for declarations preceded by
4123    // declaration specifiers.
4124    SourceLocation StartLoc;
4125    if (const DeclaratorDecl *DD = dyn_cast<DeclaratorDecl>(D)) {
4126      if (TypeSourceInfo *TI = DD->getTypeSourceInfo())
4127        StartLoc = TI->getTypeLoc().getLocStart();
4128    } else if (TypedefDecl *Typedef = dyn_cast<TypedefDecl>(D)) {
4129      if (TypeSourceInfo *TI = Typedef->getTypeSourceInfo())
4130        StartLoc = TI->getTypeLoc().getLocStart();
4131    }
4132
4133    if (StartLoc.isValid() && R.getBegin().isValid() &&
4134        SrcMgr.isBeforeInTranslationUnit(StartLoc, R.getBegin()))
4135      R.setBegin(StartLoc);
4136
4137    // FIXME: Multiple variables declared in a single declaration
4138    // currently lack the information needed to correctly determine their
4139    // ranges when accounting for the type-specifier.  We use context
4140    // stored in the CXCursor to determine if the VarDecl is in a DeclGroup,
4141    // and if so, whether it is the first decl.
4142    if (VarDecl *VD = dyn_cast<VarDecl>(D)) {
4143      if (!cxcursor::isFirstInDeclGroup(C))
4144        R.setBegin(VD->getLocation());
4145    }
4146
4147    return R;
4148  }
4149
4150  return getRawCursorExtent(C);
4151}
4152
4153extern "C" {
4154
4155CXSourceRange clang_getCursorExtent(CXCursor C) {
4156  SourceRange R = getRawCursorExtent(C);
4157  if (R.isInvalid())
4158    return clang_getNullRange();
4159
4160  return cxloc::translateSourceRange(getCursorContext(C), R);
4161}
4162
4163CXCursor clang_getCursorReferenced(CXCursor C) {
4164  if (clang_isInvalid(C.kind))
4165    return clang_getNullCursor();
4166
4167  CXTranslationUnit tu = getCursorTU(C);
4168  if (clang_isDeclaration(C.kind)) {
4169    Decl *D = getCursorDecl(C);
4170    if (!D)
4171      return clang_getNullCursor();
4172    if (UsingDecl *Using = dyn_cast<UsingDecl>(D))
4173      return MakeCursorOverloadedDeclRef(Using, D->getLocation(), tu);
4174    if (ObjCPropertyImplDecl *PropImpl =dyn_cast<ObjCPropertyImplDecl>(D))
4175      if (ObjCPropertyDecl *Property = PropImpl->getPropertyDecl())
4176        return MakeCXCursor(Property, tu);
4177
4178    return C;
4179  }
4180
4181  if (clang_isExpression(C.kind)) {
4182    Expr *E = getCursorExpr(C);
4183    Decl *D = getDeclFromExpr(E);
4184    if (D) {
4185      CXCursor declCursor = MakeCXCursor(D, tu);
4186      declCursor = getSelectorIdentifierCursor(getSelectorIdentifierIndex(C),
4187                                               declCursor);
4188      return declCursor;
4189    }
4190
4191    if (OverloadExpr *Ovl = dyn_cast_or_null<OverloadExpr>(E))
4192      return MakeCursorOverloadedDeclRef(Ovl, tu);
4193
4194    return clang_getNullCursor();
4195  }
4196
4197  if (clang_isStatement(C.kind)) {
4198    Stmt *S = getCursorStmt(C);
4199    if (GotoStmt *Goto = dyn_cast_or_null<GotoStmt>(S))
4200      if (LabelDecl *label = Goto->getLabel())
4201        if (LabelStmt *labelS = label->getStmt())
4202        return MakeCXCursor(labelS, getCursorDecl(C), tu);
4203
4204    return clang_getNullCursor();
4205  }
4206
4207  if (C.kind == CXCursor_MacroExpansion) {
4208    if (MacroDefinition *Def = getCursorMacroExpansion(C)->getDefinition())
4209      return MakeMacroDefinitionCursor(Def, tu);
4210  }
4211
4212  if (!clang_isReference(C.kind))
4213    return clang_getNullCursor();
4214
4215  switch (C.kind) {
4216    case CXCursor_ObjCSuperClassRef:
4217      return MakeCXCursor(getCursorObjCSuperClassRef(C).first, tu);
4218
4219    case CXCursor_ObjCProtocolRef: {
4220      ObjCProtocolDecl *Prot = getCursorObjCProtocolRef(C).first;
4221      if (ObjCProtocolDecl *Def = Prot->getDefinition())
4222        return MakeCXCursor(Def, tu);
4223
4224      return MakeCXCursor(Prot, tu);
4225    }
4226
4227    case CXCursor_ObjCClassRef: {
4228      ObjCInterfaceDecl *Class = getCursorObjCClassRef(C).first;
4229      if (ObjCInterfaceDecl *Def = Class->getDefinition())
4230        return MakeCXCursor(Def, tu);
4231
4232      return MakeCXCursor(Class, tu);
4233    }
4234
4235    case CXCursor_TypeRef:
4236      return MakeCXCursor(getCursorTypeRef(C).first, tu );
4237
4238    case CXCursor_TemplateRef:
4239      return MakeCXCursor(getCursorTemplateRef(C).first, tu );
4240
4241    case CXCursor_NamespaceRef:
4242      return MakeCXCursor(getCursorNamespaceRef(C).first, tu );
4243
4244    case CXCursor_MemberRef:
4245      return MakeCXCursor(getCursorMemberRef(C).first, tu );
4246
4247    case CXCursor_CXXBaseSpecifier: {
4248      CXXBaseSpecifier *B = cxcursor::getCursorCXXBaseSpecifier(C);
4249      return clang_getTypeDeclaration(cxtype::MakeCXType(B->getType(),
4250                                                         tu ));
4251    }
4252
4253    case CXCursor_LabelRef:
4254      // FIXME: We end up faking the "parent" declaration here because we
4255      // don't want to make CXCursor larger.
4256      return MakeCXCursor(getCursorLabelRef(C).first,
4257               static_cast<ASTUnit*>(tu->TUData)->getASTContext()
4258                          .getTranslationUnitDecl(),
4259                          tu);
4260
4261    case CXCursor_OverloadedDeclRef:
4262      return C;
4263
4264    case CXCursor_VariableRef:
4265      return MakeCXCursor(getCursorVariableRef(C).first, tu);
4266
4267    default:
4268      // We would prefer to enumerate all non-reference cursor kinds here.
4269      llvm_unreachable("Unhandled reference cursor kind");
4270  }
4271}
4272
4273CXCursor clang_getCursorDefinition(CXCursor C) {
4274  if (clang_isInvalid(C.kind))
4275    return clang_getNullCursor();
4276
4277  CXTranslationUnit TU = getCursorTU(C);
4278
4279  bool WasReference = false;
4280  if (clang_isReference(C.kind) || clang_isExpression(C.kind)) {
4281    C = clang_getCursorReferenced(C);
4282    WasReference = true;
4283  }
4284
4285  if (C.kind == CXCursor_MacroExpansion)
4286    return clang_getCursorReferenced(C);
4287
4288  if (!clang_isDeclaration(C.kind))
4289    return clang_getNullCursor();
4290
4291  Decl *D = getCursorDecl(C);
4292  if (!D)
4293    return clang_getNullCursor();
4294
4295  switch (D->getKind()) {
4296  // Declaration kinds that don't really separate the notions of
4297  // declaration and definition.
4298  case Decl::Namespace:
4299  case Decl::Typedef:
4300  case Decl::TypeAlias:
4301  case Decl::TypeAliasTemplate:
4302  case Decl::TemplateTypeParm:
4303  case Decl::EnumConstant:
4304  case Decl::Field:
4305  case Decl::IndirectField:
4306  case Decl::ObjCIvar:
4307  case Decl::ObjCAtDefsField:
4308  case Decl::ImplicitParam:
4309  case Decl::ParmVar:
4310  case Decl::NonTypeTemplateParm:
4311  case Decl::TemplateTemplateParm:
4312  case Decl::ObjCCategoryImpl:
4313  case Decl::ObjCImplementation:
4314  case Decl::AccessSpec:
4315  case Decl::LinkageSpec:
4316  case Decl::ObjCPropertyImpl:
4317  case Decl::FileScopeAsm:
4318  case Decl::StaticAssert:
4319  case Decl::Block:
4320  case Decl::Label:  // FIXME: Is this right??
4321  case Decl::ClassScopeFunctionSpecialization:
4322  case Decl::Import:
4323    return C;
4324
4325  // Declaration kinds that don't make any sense here, but are
4326  // nonetheless harmless.
4327  case Decl::TranslationUnit:
4328    break;
4329
4330  // Declaration kinds for which the definition is not resolvable.
4331  case Decl::UnresolvedUsingTypename:
4332  case Decl::UnresolvedUsingValue:
4333    break;
4334
4335  case Decl::UsingDirective:
4336    return MakeCXCursor(cast<UsingDirectiveDecl>(D)->getNominatedNamespace(),
4337                        TU);
4338
4339  case Decl::NamespaceAlias:
4340    return MakeCXCursor(cast<NamespaceAliasDecl>(D)->getNamespace(), TU);
4341
4342  case Decl::Enum:
4343  case Decl::Record:
4344  case Decl::CXXRecord:
4345  case Decl::ClassTemplateSpecialization:
4346  case Decl::ClassTemplatePartialSpecialization:
4347    if (TagDecl *Def = cast<TagDecl>(D)->getDefinition())
4348      return MakeCXCursor(Def, TU);
4349    return clang_getNullCursor();
4350
4351  case Decl::Function:
4352  case Decl::CXXMethod:
4353  case Decl::CXXConstructor:
4354  case Decl::CXXDestructor:
4355  case Decl::CXXConversion: {
4356    const FunctionDecl *Def = 0;
4357    if (cast<FunctionDecl>(D)->getBody(Def))
4358      return MakeCXCursor(const_cast<FunctionDecl *>(Def), TU);
4359    return clang_getNullCursor();
4360  }
4361
4362  case Decl::Var: {
4363    // Ask the variable if it has a definition.
4364    if (VarDecl *Def = cast<VarDecl>(D)->getDefinition())
4365      return MakeCXCursor(Def, TU);
4366    return clang_getNullCursor();
4367  }
4368
4369  case Decl::FunctionTemplate: {
4370    const FunctionDecl *Def = 0;
4371    if (cast<FunctionTemplateDecl>(D)->getTemplatedDecl()->getBody(Def))
4372      return MakeCXCursor(Def->getDescribedFunctionTemplate(), TU);
4373    return clang_getNullCursor();
4374  }
4375
4376  case Decl::ClassTemplate: {
4377    if (RecordDecl *Def = cast<ClassTemplateDecl>(D)->getTemplatedDecl()
4378                                                            ->getDefinition())
4379      return MakeCXCursor(cast<CXXRecordDecl>(Def)->getDescribedClassTemplate(),
4380                          TU);
4381    return clang_getNullCursor();
4382  }
4383
4384  case Decl::Using:
4385    return MakeCursorOverloadedDeclRef(cast<UsingDecl>(D),
4386                                       D->getLocation(), TU);
4387
4388  case Decl::UsingShadow:
4389    return clang_getCursorDefinition(
4390                       MakeCXCursor(cast<UsingShadowDecl>(D)->getTargetDecl(),
4391                                    TU));
4392
4393  case Decl::ObjCMethod: {
4394    ObjCMethodDecl *Method = cast<ObjCMethodDecl>(D);
4395    if (Method->isThisDeclarationADefinition())
4396      return C;
4397
4398    // Dig out the method definition in the associated
4399    // @implementation, if we have it.
4400    // FIXME: The ASTs should make finding the definition easier.
4401    if (ObjCInterfaceDecl *Class
4402                       = dyn_cast<ObjCInterfaceDecl>(Method->getDeclContext()))
4403      if (ObjCImplementationDecl *ClassImpl = Class->getImplementation())
4404        if (ObjCMethodDecl *Def = ClassImpl->getMethod(Method->getSelector(),
4405                                                  Method->isInstanceMethod()))
4406          if (Def->isThisDeclarationADefinition())
4407            return MakeCXCursor(Def, TU);
4408
4409    return clang_getNullCursor();
4410  }
4411
4412  case Decl::ObjCCategory:
4413    if (ObjCCategoryImplDecl *Impl
4414                               = cast<ObjCCategoryDecl>(D)->getImplementation())
4415      return MakeCXCursor(Impl, TU);
4416    return clang_getNullCursor();
4417
4418  case Decl::ObjCProtocol:
4419    if (ObjCProtocolDecl *Def = cast<ObjCProtocolDecl>(D)->getDefinition())
4420      return MakeCXCursor(Def, TU);
4421    return clang_getNullCursor();
4422
4423  case Decl::ObjCInterface: {
4424    // There are two notions of a "definition" for an Objective-C
4425    // class: the interface and its implementation. When we resolved a
4426    // reference to an Objective-C class, produce the @interface as
4427    // the definition; when we were provided with the interface,
4428    // produce the @implementation as the definition.
4429    ObjCInterfaceDecl *IFace = cast<ObjCInterfaceDecl>(D);
4430    if (WasReference) {
4431      if (ObjCInterfaceDecl *Def = IFace->getDefinition())
4432        return MakeCXCursor(Def, TU);
4433    } else if (ObjCImplementationDecl *Impl = IFace->getImplementation())
4434      return MakeCXCursor(Impl, TU);
4435    return clang_getNullCursor();
4436  }
4437
4438  case Decl::ObjCProperty:
4439    // FIXME: We don't really know where to find the
4440    // ObjCPropertyImplDecls that implement this property.
4441    return clang_getNullCursor();
4442
4443  case Decl::ObjCCompatibleAlias:
4444    if (ObjCInterfaceDecl *Class
4445          = cast<ObjCCompatibleAliasDecl>(D)->getClassInterface())
4446      if (ObjCInterfaceDecl *Def = Class->getDefinition())
4447        return MakeCXCursor(Def, TU);
4448
4449    return clang_getNullCursor();
4450
4451  case Decl::Friend:
4452    if (NamedDecl *Friend = cast<FriendDecl>(D)->getFriendDecl())
4453      return clang_getCursorDefinition(MakeCXCursor(Friend, TU));
4454    return clang_getNullCursor();
4455
4456  case Decl::FriendTemplate:
4457    if (NamedDecl *Friend = cast<FriendTemplateDecl>(D)->getFriendDecl())
4458      return clang_getCursorDefinition(MakeCXCursor(Friend, TU));
4459    return clang_getNullCursor();
4460  }
4461
4462  return clang_getNullCursor();
4463}
4464
4465unsigned clang_isCursorDefinition(CXCursor C) {
4466  if (!clang_isDeclaration(C.kind))
4467    return 0;
4468
4469  return clang_getCursorDefinition(C) == C;
4470}
4471
4472CXCursor clang_getCanonicalCursor(CXCursor C) {
4473  if (!clang_isDeclaration(C.kind))
4474    return C;
4475
4476  if (Decl *D = getCursorDecl(C)) {
4477    if (ObjCCategoryImplDecl *CatImplD = dyn_cast<ObjCCategoryImplDecl>(D))
4478      if (ObjCCategoryDecl *CatD = CatImplD->getCategoryDecl())
4479        return MakeCXCursor(CatD, getCursorTU(C));
4480
4481    if (ObjCImplDecl *ImplD = dyn_cast<ObjCImplDecl>(D))
4482      if (ObjCInterfaceDecl *IFD = ImplD->getClassInterface())
4483        return MakeCXCursor(IFD, getCursorTU(C));
4484
4485    return MakeCXCursor(D->getCanonicalDecl(), getCursorTU(C));
4486  }
4487
4488  return C;
4489}
4490
4491int clang_Cursor_getObjCSelectorIndex(CXCursor cursor) {
4492  return cxcursor::getSelectorIdentifierIndexAndLoc(cursor).first;
4493}
4494
4495unsigned clang_getNumOverloadedDecls(CXCursor C) {
4496  if (C.kind != CXCursor_OverloadedDeclRef)
4497    return 0;
4498
4499  OverloadedDeclRefStorage Storage = getCursorOverloadedDeclRef(C).first;
4500  if (OverloadExpr *E = Storage.dyn_cast<OverloadExpr *>())
4501    return E->getNumDecls();
4502
4503  if (OverloadedTemplateStorage *S
4504                              = Storage.dyn_cast<OverloadedTemplateStorage*>())
4505    return S->size();
4506
4507  Decl *D = Storage.get<Decl*>();
4508  if (UsingDecl *Using = dyn_cast<UsingDecl>(D))
4509    return Using->shadow_size();
4510
4511  return 0;
4512}
4513
4514CXCursor clang_getOverloadedDecl(CXCursor cursor, unsigned index) {
4515  if (cursor.kind != CXCursor_OverloadedDeclRef)
4516    return clang_getNullCursor();
4517
4518  if (index >= clang_getNumOverloadedDecls(cursor))
4519    return clang_getNullCursor();
4520
4521  CXTranslationUnit TU = getCursorTU(cursor);
4522  OverloadedDeclRefStorage Storage = getCursorOverloadedDeclRef(cursor).first;
4523  if (OverloadExpr *E = Storage.dyn_cast<OverloadExpr *>())
4524    return MakeCXCursor(E->decls_begin()[index], TU);
4525
4526  if (OverloadedTemplateStorage *S
4527                              = Storage.dyn_cast<OverloadedTemplateStorage*>())
4528    return MakeCXCursor(S->begin()[index], TU);
4529
4530  Decl *D = Storage.get<Decl*>();
4531  if (UsingDecl *Using = dyn_cast<UsingDecl>(D)) {
4532    // FIXME: This is, unfortunately, linear time.
4533    UsingDecl::shadow_iterator Pos = Using->shadow_begin();
4534    std::advance(Pos, index);
4535    return MakeCXCursor(cast<UsingShadowDecl>(*Pos)->getTargetDecl(), TU);
4536  }
4537
4538  return clang_getNullCursor();
4539}
4540
4541void clang_getDefinitionSpellingAndExtent(CXCursor C,
4542                                          const char **startBuf,
4543                                          const char **endBuf,
4544                                          unsigned *startLine,
4545                                          unsigned *startColumn,
4546                                          unsigned *endLine,
4547                                          unsigned *endColumn) {
4548  assert(getCursorDecl(C) && "CXCursor has null decl");
4549  NamedDecl *ND = static_cast<NamedDecl *>(getCursorDecl(C));
4550  FunctionDecl *FD = dyn_cast<FunctionDecl>(ND);
4551  CompoundStmt *Body = dyn_cast<CompoundStmt>(FD->getBody());
4552
4553  SourceManager &SM = FD->getASTContext().getSourceManager();
4554  *startBuf = SM.getCharacterData(Body->getLBracLoc());
4555  *endBuf = SM.getCharacterData(Body->getRBracLoc());
4556  *startLine = SM.getSpellingLineNumber(Body->getLBracLoc());
4557  *startColumn = SM.getSpellingColumnNumber(Body->getLBracLoc());
4558  *endLine = SM.getSpellingLineNumber(Body->getRBracLoc());
4559  *endColumn = SM.getSpellingColumnNumber(Body->getRBracLoc());
4560}
4561
4562
4563CXSourceRange clang_getCursorReferenceNameRange(CXCursor C, unsigned NameFlags,
4564                                                unsigned PieceIndex) {
4565  RefNamePieces Pieces;
4566
4567  switch (C.kind) {
4568  case CXCursor_MemberRefExpr:
4569    if (MemberExpr *E = dyn_cast<MemberExpr>(getCursorExpr(C)))
4570      Pieces = buildPieces(NameFlags, true, E->getMemberNameInfo(),
4571                           E->getQualifierLoc().getSourceRange());
4572    break;
4573
4574  case CXCursor_DeclRefExpr:
4575    if (DeclRefExpr *E = dyn_cast<DeclRefExpr>(getCursorExpr(C)))
4576      Pieces = buildPieces(NameFlags, false, E->getNameInfo(),
4577                           E->getQualifierLoc().getSourceRange(),
4578                           E->getOptionalExplicitTemplateArgs());
4579    break;
4580
4581  case CXCursor_CallExpr:
4582    if (CXXOperatorCallExpr *OCE =
4583        dyn_cast<CXXOperatorCallExpr>(getCursorExpr(C))) {
4584      Expr *Callee = OCE->getCallee();
4585      if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Callee))
4586        Callee = ICE->getSubExpr();
4587
4588      if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee))
4589        Pieces = buildPieces(NameFlags, false, DRE->getNameInfo(),
4590                             DRE->getQualifierLoc().getSourceRange());
4591    }
4592    break;
4593
4594  default:
4595    break;
4596  }
4597
4598  if (Pieces.empty()) {
4599    if (PieceIndex == 0)
4600      return clang_getCursorExtent(C);
4601  } else if (PieceIndex < Pieces.size()) {
4602      SourceRange R = Pieces[PieceIndex];
4603      if (R.isValid())
4604        return cxloc::translateSourceRange(getCursorContext(C), R);
4605  }
4606
4607  return clang_getNullRange();
4608}
4609
4610void clang_enableStackTraces(void) {
4611  llvm::sys::PrintStackTraceOnErrorSignal();
4612}
4613
4614void clang_executeOnThread(void (*fn)(void*), void *user_data,
4615                           unsigned stack_size) {
4616  llvm::llvm_execute_on_thread(fn, user_data, stack_size);
4617}
4618
4619} // end: extern "C"
4620
4621//===----------------------------------------------------------------------===//
4622// Token-based Operations.
4623//===----------------------------------------------------------------------===//
4624
4625/* CXToken layout:
4626 *   int_data[0]: a CXTokenKind
4627 *   int_data[1]: starting token location
4628 *   int_data[2]: token length
4629 *   int_data[3]: reserved
4630 *   ptr_data: for identifiers and keywords, an IdentifierInfo*.
4631 *   otherwise unused.
4632 */
4633extern "C" {
4634
4635CXTokenKind clang_getTokenKind(CXToken CXTok) {
4636  return static_cast<CXTokenKind>(CXTok.int_data[0]);
4637}
4638
4639CXString clang_getTokenSpelling(CXTranslationUnit TU, CXToken CXTok) {
4640  switch (clang_getTokenKind(CXTok)) {
4641  case CXToken_Identifier:
4642  case CXToken_Keyword:
4643    // We know we have an IdentifierInfo*, so use that.
4644    return createCXString(static_cast<IdentifierInfo *>(CXTok.ptr_data)
4645                            ->getNameStart());
4646
4647  case CXToken_Literal: {
4648    // We have stashed the starting pointer in the ptr_data field. Use it.
4649    const char *Text = static_cast<const char *>(CXTok.ptr_data);
4650    return createCXString(StringRef(Text, CXTok.int_data[2]));
4651  }
4652
4653  case CXToken_Punctuation:
4654  case CXToken_Comment:
4655    break;
4656  }
4657
4658  // We have to find the starting buffer pointer the hard way, by
4659  // deconstructing the source location.
4660  ASTUnit *CXXUnit = static_cast<ASTUnit *>(TU->TUData);
4661  if (!CXXUnit)
4662    return createCXString("");
4663
4664  SourceLocation Loc = SourceLocation::getFromRawEncoding(CXTok.int_data[1]);
4665  std::pair<FileID, unsigned> LocInfo
4666    = CXXUnit->getSourceManager().getDecomposedSpellingLoc(Loc);
4667  bool Invalid = false;
4668  StringRef Buffer
4669    = CXXUnit->getSourceManager().getBufferData(LocInfo.first, &Invalid);
4670  if (Invalid)
4671    return createCXString("");
4672
4673  return createCXString(Buffer.substr(LocInfo.second, CXTok.int_data[2]));
4674}
4675
4676CXSourceLocation clang_getTokenLocation(CXTranslationUnit TU, CXToken CXTok) {
4677  ASTUnit *CXXUnit = static_cast<ASTUnit *>(TU->TUData);
4678  if (!CXXUnit)
4679    return clang_getNullLocation();
4680
4681  return cxloc::translateSourceLocation(CXXUnit->getASTContext(),
4682                        SourceLocation::getFromRawEncoding(CXTok.int_data[1]));
4683}
4684
4685CXSourceRange clang_getTokenExtent(CXTranslationUnit TU, CXToken CXTok) {
4686  ASTUnit *CXXUnit = static_cast<ASTUnit *>(TU->TUData);
4687  if (!CXXUnit)
4688    return clang_getNullRange();
4689
4690  return cxloc::translateSourceRange(CXXUnit->getASTContext(),
4691                        SourceLocation::getFromRawEncoding(CXTok.int_data[1]));
4692}
4693
4694static void getTokens(ASTUnit *CXXUnit, SourceRange Range,
4695                      SmallVectorImpl<CXToken> &CXTokens) {
4696  SourceManager &SourceMgr = CXXUnit->getSourceManager();
4697  std::pair<FileID, unsigned> BeginLocInfo
4698    = SourceMgr.getDecomposedLoc(Range.getBegin());
4699  std::pair<FileID, unsigned> EndLocInfo
4700    = SourceMgr.getDecomposedLoc(Range.getEnd());
4701
4702  // Cannot tokenize across files.
4703  if (BeginLocInfo.first != EndLocInfo.first)
4704    return;
4705
4706  // Create a lexer
4707  bool Invalid = false;
4708  StringRef Buffer
4709    = SourceMgr.getBufferData(BeginLocInfo.first, &Invalid);
4710  if (Invalid)
4711    return;
4712
4713  Lexer Lex(SourceMgr.getLocForStartOfFile(BeginLocInfo.first),
4714            CXXUnit->getASTContext().getLangOpts(),
4715            Buffer.begin(), Buffer.data() + BeginLocInfo.second, Buffer.end());
4716  Lex.SetCommentRetentionState(true);
4717
4718  // Lex tokens until we hit the end of the range.
4719  const char *EffectiveBufferEnd = Buffer.data() + EndLocInfo.second;
4720  Token Tok;
4721  bool previousWasAt = false;
4722  do {
4723    // Lex the next token
4724    Lex.LexFromRawLexer(Tok);
4725    if (Tok.is(tok::eof))
4726      break;
4727
4728    // Initialize the CXToken.
4729    CXToken CXTok;
4730
4731    //   - Common fields
4732    CXTok.int_data[1] = Tok.getLocation().getRawEncoding();
4733    CXTok.int_data[2] = Tok.getLength();
4734    CXTok.int_data[3] = 0;
4735
4736    //   - Kind-specific fields
4737    if (Tok.isLiteral()) {
4738      CXTok.int_data[0] = CXToken_Literal;
4739      CXTok.ptr_data = (void *)Tok.getLiteralData();
4740    } else if (Tok.is(tok::raw_identifier)) {
4741      // Lookup the identifier to determine whether we have a keyword.
4742      IdentifierInfo *II
4743        = CXXUnit->getPreprocessor().LookUpIdentifierInfo(Tok);
4744
4745      if ((II->getObjCKeywordID() != tok::objc_not_keyword) && previousWasAt) {
4746        CXTok.int_data[0] = CXToken_Keyword;
4747      }
4748      else {
4749        CXTok.int_data[0] = Tok.is(tok::identifier)
4750          ? CXToken_Identifier
4751          : CXToken_Keyword;
4752      }
4753      CXTok.ptr_data = II;
4754    } else if (Tok.is(tok::comment)) {
4755      CXTok.int_data[0] = CXToken_Comment;
4756      CXTok.ptr_data = 0;
4757    } else {
4758      CXTok.int_data[0] = CXToken_Punctuation;
4759      CXTok.ptr_data = 0;
4760    }
4761    CXTokens.push_back(CXTok);
4762    previousWasAt = Tok.is(tok::at);
4763  } while (Lex.getBufferLocation() <= EffectiveBufferEnd);
4764}
4765
4766void clang_tokenize(CXTranslationUnit TU, CXSourceRange Range,
4767                    CXToken **Tokens, unsigned *NumTokens) {
4768  if (Tokens)
4769    *Tokens = 0;
4770  if (NumTokens)
4771    *NumTokens = 0;
4772
4773  ASTUnit *CXXUnit = static_cast<ASTUnit *>(TU->TUData);
4774  if (!CXXUnit || !Tokens || !NumTokens)
4775    return;
4776
4777  ASTUnit::ConcurrencyCheck Check(*CXXUnit);
4778
4779  SourceRange R = cxloc::translateCXSourceRange(Range);
4780  if (R.isInvalid())
4781    return;
4782
4783  SmallVector<CXToken, 32> CXTokens;
4784  getTokens(CXXUnit, R, CXTokens);
4785
4786  if (CXTokens.empty())
4787    return;
4788
4789  *Tokens = (CXToken *)malloc(sizeof(CXToken) * CXTokens.size());
4790  memmove(*Tokens, CXTokens.data(), sizeof(CXToken) * CXTokens.size());
4791  *NumTokens = CXTokens.size();
4792}
4793
4794void clang_disposeTokens(CXTranslationUnit TU,
4795                         CXToken *Tokens, unsigned NumTokens) {
4796  free(Tokens);
4797}
4798
4799} // end: extern "C"
4800
4801//===----------------------------------------------------------------------===//
4802// Token annotation APIs.
4803//===----------------------------------------------------------------------===//
4804
4805typedef llvm::DenseMap<unsigned, CXCursor> AnnotateTokensData;
4806static enum CXChildVisitResult AnnotateTokensVisitor(CXCursor cursor,
4807                                                     CXCursor parent,
4808                                                     CXClientData client_data);
4809namespace {
4810class AnnotateTokensWorker {
4811  AnnotateTokensData &Annotated;
4812  CXToken *Tokens;
4813  CXCursor *Cursors;
4814  unsigned NumTokens;
4815  unsigned TokIdx;
4816  unsigned PreprocessingTokIdx;
4817  CursorVisitor AnnotateVis;
4818  SourceManager &SrcMgr;
4819  bool HasContextSensitiveKeywords;
4820
4821  bool MoreTokens() const { return TokIdx < NumTokens; }
4822  unsigned NextToken() const { return TokIdx; }
4823  void AdvanceToken() { ++TokIdx; }
4824  SourceLocation GetTokenLoc(unsigned tokI) {
4825    return SourceLocation::getFromRawEncoding(Tokens[tokI].int_data[1]);
4826  }
4827  bool isFunctionMacroToken(unsigned tokI) const {
4828    return Tokens[tokI].int_data[3] != 0;
4829  }
4830  SourceLocation getFunctionMacroTokenLoc(unsigned tokI) const {
4831    return SourceLocation::getFromRawEncoding(Tokens[tokI].int_data[3]);
4832  }
4833
4834  void annotateAndAdvanceTokens(CXCursor, RangeComparisonResult, SourceRange);
4835  void annotateAndAdvanceFunctionMacroTokens(CXCursor, RangeComparisonResult,
4836                                             SourceRange);
4837
4838public:
4839  AnnotateTokensWorker(AnnotateTokensData &annotated,
4840                       CXToken *tokens, CXCursor *cursors, unsigned numTokens,
4841                       CXTranslationUnit tu, SourceRange RegionOfInterest)
4842    : Annotated(annotated), Tokens(tokens), Cursors(cursors),
4843      NumTokens(numTokens), TokIdx(0), PreprocessingTokIdx(0),
4844      AnnotateVis(tu,
4845                  AnnotateTokensVisitor, this,
4846                  /*VisitPreprocessorLast=*/true,
4847                  /*VisitIncludedEntities=*/false,
4848                  RegionOfInterest),
4849      SrcMgr(static_cast<ASTUnit*>(tu->TUData)->getSourceManager()),
4850      HasContextSensitiveKeywords(false) { }
4851
4852  void VisitChildren(CXCursor C) { AnnotateVis.VisitChildren(C); }
4853  enum CXChildVisitResult Visit(CXCursor cursor, CXCursor parent);
4854  void AnnotateTokens();
4855
4856  /// \brief Determine whether the annotator saw any cursors that have
4857  /// context-sensitive keywords.
4858  bool hasContextSensitiveKeywords() const {
4859    return HasContextSensitiveKeywords;
4860  }
4861};
4862}
4863
4864void AnnotateTokensWorker::AnnotateTokens() {
4865  // Walk the AST within the region of interest, annotating tokens
4866  // along the way.
4867  AnnotateVis.visitFileRegion();
4868
4869  for (unsigned I = 0 ; I < TokIdx ; ++I) {
4870    AnnotateTokensData::iterator Pos = Annotated.find(Tokens[I].int_data[1]);
4871    if (Pos != Annotated.end() &&
4872        (clang_isInvalid(Cursors[I].kind) ||
4873         Pos->second.kind != CXCursor_PreprocessingDirective))
4874      Cursors[I] = Pos->second;
4875  }
4876
4877  // Finish up annotating any tokens left.
4878  if (!MoreTokens())
4879    return;
4880
4881  const CXCursor &C = clang_getNullCursor();
4882  for (unsigned I = TokIdx ; I < NumTokens ; ++I) {
4883    if (I < PreprocessingTokIdx && clang_isPreprocessing(Cursors[I].kind))
4884      continue;
4885
4886    AnnotateTokensData::iterator Pos = Annotated.find(Tokens[I].int_data[1]);
4887    Cursors[I] = (Pos == Annotated.end()) ? C : Pos->second;
4888  }
4889}
4890
4891/// \brief It annotates and advances tokens with a cursor until the comparison
4892//// between the cursor location and the source range is the same as
4893/// \arg compResult.
4894///
4895/// Pass RangeBefore to annotate tokens with a cursor until a range is reached.
4896/// Pass RangeOverlap to annotate tokens inside a range.
4897void AnnotateTokensWorker::annotateAndAdvanceTokens(CXCursor updateC,
4898                                               RangeComparisonResult compResult,
4899                                               SourceRange range) {
4900  while (MoreTokens()) {
4901    const unsigned I = NextToken();
4902    if (isFunctionMacroToken(I))
4903      return annotateAndAdvanceFunctionMacroTokens(updateC, compResult, range);
4904
4905    SourceLocation TokLoc = GetTokenLoc(I);
4906    if (LocationCompare(SrcMgr, TokLoc, range) == compResult) {
4907      Cursors[I] = updateC;
4908      AdvanceToken();
4909      continue;
4910    }
4911    break;
4912  }
4913}
4914
4915/// \brief Special annotation handling for macro argument tokens.
4916void AnnotateTokensWorker::annotateAndAdvanceFunctionMacroTokens(
4917                                               CXCursor updateC,
4918                                               RangeComparisonResult compResult,
4919                                               SourceRange range) {
4920  assert(MoreTokens());
4921  assert(isFunctionMacroToken(NextToken()) &&
4922         "Should be called only for macro arg tokens");
4923
4924  // This works differently than annotateAndAdvanceTokens; because expanded
4925  // macro arguments can have arbitrary translation-unit source order, we do not
4926  // advance the token index one by one until a token fails the range test.
4927  // We only advance once past all of the macro arg tokens if all of them
4928  // pass the range test. If one of them fails we keep the token index pointing
4929  // at the start of the macro arg tokens so that the failing token will be
4930  // annotated by a subsequent annotation try.
4931
4932  bool atLeastOneCompFail = false;
4933
4934  unsigned I = NextToken();
4935  for (; I < NumTokens && isFunctionMacroToken(I); ++I) {
4936    SourceLocation TokLoc = getFunctionMacroTokenLoc(I);
4937    if (TokLoc.isFileID())
4938      continue; // not macro arg token, it's parens or comma.
4939    if (LocationCompare(SrcMgr, TokLoc, range) == compResult) {
4940      if (clang_isInvalid(clang_getCursorKind(Cursors[I])))
4941        Cursors[I] = updateC;
4942    } else
4943      atLeastOneCompFail = true;
4944  }
4945
4946  if (!atLeastOneCompFail)
4947    TokIdx = I; // All of the tokens were handled, advance beyond all of them.
4948}
4949
4950enum CXChildVisitResult
4951AnnotateTokensWorker::Visit(CXCursor cursor, CXCursor parent) {
4952  CXSourceLocation Loc = clang_getCursorLocation(cursor);
4953  SourceRange cursorRange = getRawCursorExtent(cursor);
4954  if (cursorRange.isInvalid())
4955    return CXChildVisit_Recurse;
4956
4957  if (!HasContextSensitiveKeywords) {
4958    // Objective-C properties can have context-sensitive keywords.
4959    if (cursor.kind == CXCursor_ObjCPropertyDecl) {
4960      if (ObjCPropertyDecl *Property
4961                  = dyn_cast_or_null<ObjCPropertyDecl>(getCursorDecl(cursor)))
4962        HasContextSensitiveKeywords = Property->getPropertyAttributesAsWritten() != 0;
4963    }
4964    // Objective-C methods can have context-sensitive keywords.
4965    else if (cursor.kind == CXCursor_ObjCInstanceMethodDecl ||
4966             cursor.kind == CXCursor_ObjCClassMethodDecl) {
4967      if (ObjCMethodDecl *Method
4968            = dyn_cast_or_null<ObjCMethodDecl>(getCursorDecl(cursor))) {
4969        if (Method->getObjCDeclQualifier())
4970          HasContextSensitiveKeywords = true;
4971        else {
4972          for (ObjCMethodDecl::param_iterator P = Method->param_begin(),
4973                                           PEnd = Method->param_end();
4974               P != PEnd; ++P) {
4975            if ((*P)->getObjCDeclQualifier()) {
4976              HasContextSensitiveKeywords = true;
4977              break;
4978            }
4979          }
4980        }
4981      }
4982    }
4983    // C++ methods can have context-sensitive keywords.
4984    else if (cursor.kind == CXCursor_CXXMethod) {
4985      if (CXXMethodDecl *Method
4986                  = dyn_cast_or_null<CXXMethodDecl>(getCursorDecl(cursor))) {
4987        if (Method->hasAttr<FinalAttr>() || Method->hasAttr<OverrideAttr>())
4988          HasContextSensitiveKeywords = true;
4989      }
4990    }
4991    // C++ classes can have context-sensitive keywords.
4992    else if (cursor.kind == CXCursor_StructDecl ||
4993             cursor.kind == CXCursor_ClassDecl ||
4994             cursor.kind == CXCursor_ClassTemplate ||
4995             cursor.kind == CXCursor_ClassTemplatePartialSpecialization) {
4996      if (Decl *D = getCursorDecl(cursor))
4997        if (D->hasAttr<FinalAttr>())
4998          HasContextSensitiveKeywords = true;
4999    }
5000  }
5001
5002  if (clang_isPreprocessing(cursor.kind)) {
5003    // For macro expansions, just note where the beginning of the macro
5004    // expansion occurs.
5005    if (cursor.kind == CXCursor_MacroExpansion) {
5006      Annotated[Loc.int_data] = cursor;
5007      return CXChildVisit_Recurse;
5008    }
5009
5010    // Items in the preprocessing record are kept separate from items in
5011    // declarations, so we keep a separate token index.
5012    unsigned SavedTokIdx = TokIdx;
5013    TokIdx = PreprocessingTokIdx;
5014
5015    // Skip tokens up until we catch up to the beginning of the preprocessing
5016    // entry.
5017    while (MoreTokens()) {
5018      const unsigned I = NextToken();
5019      SourceLocation TokLoc = GetTokenLoc(I);
5020      switch (LocationCompare(SrcMgr, TokLoc, cursorRange)) {
5021      case RangeBefore:
5022        AdvanceToken();
5023        continue;
5024      case RangeAfter:
5025      case RangeOverlap:
5026        break;
5027      }
5028      break;
5029    }
5030
5031    // Look at all of the tokens within this range.
5032    while (MoreTokens()) {
5033      const unsigned I = NextToken();
5034      SourceLocation TokLoc = GetTokenLoc(I);
5035      switch (LocationCompare(SrcMgr, TokLoc, cursorRange)) {
5036      case RangeBefore:
5037        llvm_unreachable("Infeasible");
5038      case RangeAfter:
5039        break;
5040      case RangeOverlap:
5041        Cursors[I] = cursor;
5042        AdvanceToken();
5043        continue;
5044      }
5045      break;
5046    }
5047
5048    // Save the preprocessing token index; restore the non-preprocessing
5049    // token index.
5050    PreprocessingTokIdx = TokIdx;
5051    TokIdx = SavedTokIdx;
5052    return CXChildVisit_Recurse;
5053  }
5054
5055  if (cursorRange.isInvalid())
5056    return CXChildVisit_Continue;
5057
5058  SourceLocation L = SourceLocation::getFromRawEncoding(Loc.int_data);
5059
5060  // Adjust the annotated range based specific declarations.
5061  const enum CXCursorKind cursorK = clang_getCursorKind(cursor);
5062  if (cursorK >= CXCursor_FirstDecl && cursorK <= CXCursor_LastDecl) {
5063    Decl *D = cxcursor::getCursorDecl(cursor);
5064
5065    SourceLocation StartLoc;
5066    if (const DeclaratorDecl *DD = dyn_cast_or_null<DeclaratorDecl>(D)) {
5067      if (TypeSourceInfo *TI = DD->getTypeSourceInfo())
5068        StartLoc = TI->getTypeLoc().getLocStart();
5069    } else if (TypedefDecl *Typedef = dyn_cast_or_null<TypedefDecl>(D)) {
5070      if (TypeSourceInfo *TI = Typedef->getTypeSourceInfo())
5071        StartLoc = TI->getTypeLoc().getLocStart();
5072    }
5073
5074    if (StartLoc.isValid() && L.isValid() &&
5075        SrcMgr.isBeforeInTranslationUnit(StartLoc, L))
5076      cursorRange.setBegin(StartLoc);
5077  }
5078
5079  // If the location of the cursor occurs within a macro instantiation, record
5080  // the spelling location of the cursor in our annotation map.  We can then
5081  // paper over the token labelings during a post-processing step to try and
5082  // get cursor mappings for tokens that are the *arguments* of a macro
5083  // instantiation.
5084  if (L.isMacroID()) {
5085    unsigned rawEncoding = SrcMgr.getSpellingLoc(L).getRawEncoding();
5086    // Only invalidate the old annotation if it isn't part of a preprocessing
5087    // directive.  Here we assume that the default construction of CXCursor
5088    // results in CXCursor.kind being an initialized value (i.e., 0).  If
5089    // this isn't the case, we can fix by doing lookup + insertion.
5090
5091    CXCursor &oldC = Annotated[rawEncoding];
5092    if (!clang_isPreprocessing(oldC.kind))
5093      oldC = cursor;
5094  }
5095
5096  const enum CXCursorKind K = clang_getCursorKind(parent);
5097  const CXCursor updateC =
5098    (clang_isInvalid(K) || K == CXCursor_TranslationUnit)
5099     ? clang_getNullCursor() : parent;
5100
5101  annotateAndAdvanceTokens(updateC, RangeBefore, cursorRange);
5102
5103  // Avoid having the cursor of an expression "overwrite" the annotation of the
5104  // variable declaration that it belongs to.
5105  // This can happen for C++ constructor expressions whose range generally
5106  // include the variable declaration, e.g.:
5107  //  MyCXXClass foo; // Make sure we don't annotate 'foo' as a CallExpr cursor.
5108  if (clang_isExpression(cursorK)) {
5109    Expr *E = getCursorExpr(cursor);
5110    if (Decl *D = getCursorParentDecl(cursor)) {
5111      const unsigned I = NextToken();
5112      if (E->getLocStart().isValid() && D->getLocation().isValid() &&
5113          E->getLocStart() == D->getLocation() &&
5114          E->getLocStart() == GetTokenLoc(I)) {
5115        Cursors[I] = updateC;
5116        AdvanceToken();
5117      }
5118    }
5119  }
5120
5121  // Visit children to get their cursor information.
5122  const unsigned BeforeChildren = NextToken();
5123  VisitChildren(cursor);
5124  const unsigned AfterChildren = NextToken();
5125
5126  // Scan the tokens that are at the end of the cursor, but are not captured
5127  // but the child cursors.
5128  annotateAndAdvanceTokens(cursor, RangeOverlap, cursorRange);
5129
5130  // Scan the tokens that are at the beginning of the cursor, but are not
5131  // capture by the child cursors.
5132  for (unsigned I = BeforeChildren; I != AfterChildren; ++I) {
5133    if (!clang_isInvalid(clang_getCursorKind(Cursors[I])))
5134      break;
5135
5136    Cursors[I] = cursor;
5137  }
5138
5139  return CXChildVisit_Continue;
5140}
5141
5142static enum CXChildVisitResult AnnotateTokensVisitor(CXCursor cursor,
5143                                                     CXCursor parent,
5144                                                     CXClientData client_data) {
5145  return static_cast<AnnotateTokensWorker*>(client_data)->Visit(cursor, parent);
5146}
5147
5148namespace {
5149
5150/// \brief Uses the macro expansions in the preprocessing record to find
5151/// and mark tokens that are macro arguments. This info is used by the
5152/// AnnotateTokensWorker.
5153class MarkMacroArgTokensVisitor {
5154  SourceManager &SM;
5155  CXToken *Tokens;
5156  unsigned NumTokens;
5157  unsigned CurIdx;
5158
5159public:
5160  MarkMacroArgTokensVisitor(SourceManager &SM,
5161                            CXToken *tokens, unsigned numTokens)
5162    : SM(SM), Tokens(tokens), NumTokens(numTokens), CurIdx(0) { }
5163
5164  CXChildVisitResult visit(CXCursor cursor, CXCursor parent) {
5165    if (cursor.kind != CXCursor_MacroExpansion)
5166      return CXChildVisit_Continue;
5167
5168    SourceRange macroRange = getCursorMacroExpansion(cursor)->getSourceRange();
5169    if (macroRange.getBegin() == macroRange.getEnd())
5170      return CXChildVisit_Continue; // it's not a function macro.
5171
5172    for (; CurIdx < NumTokens; ++CurIdx) {
5173      if (!SM.isBeforeInTranslationUnit(getTokenLoc(CurIdx),
5174                                        macroRange.getBegin()))
5175        break;
5176    }
5177
5178    if (CurIdx == NumTokens)
5179      return CXChildVisit_Break;
5180
5181    for (; CurIdx < NumTokens; ++CurIdx) {
5182      SourceLocation tokLoc = getTokenLoc(CurIdx);
5183      if (!SM.isBeforeInTranslationUnit(tokLoc, macroRange.getEnd()))
5184        break;
5185
5186      setFunctionMacroTokenLoc(CurIdx, SM.getMacroArgExpandedLocation(tokLoc));
5187    }
5188
5189    if (CurIdx == NumTokens)
5190      return CXChildVisit_Break;
5191
5192    return CXChildVisit_Continue;
5193  }
5194
5195private:
5196  SourceLocation getTokenLoc(unsigned tokI) {
5197    return SourceLocation::getFromRawEncoding(Tokens[tokI].int_data[1]);
5198  }
5199
5200  void setFunctionMacroTokenLoc(unsigned tokI, SourceLocation loc) {
5201    // The third field is reserved and currently not used. Use it here
5202    // to mark macro arg expanded tokens with their expanded locations.
5203    Tokens[tokI].int_data[3] = loc.getRawEncoding();
5204  }
5205};
5206
5207} // end anonymous namespace
5208
5209static CXChildVisitResult
5210MarkMacroArgTokensVisitorDelegate(CXCursor cursor, CXCursor parent,
5211                                  CXClientData client_data) {
5212  return static_cast<MarkMacroArgTokensVisitor*>(client_data)->visit(cursor,
5213                                                                     parent);
5214}
5215
5216namespace {
5217  struct clang_annotateTokens_Data {
5218    CXTranslationUnit TU;
5219    ASTUnit *CXXUnit;
5220    CXToken *Tokens;
5221    unsigned NumTokens;
5222    CXCursor *Cursors;
5223  };
5224}
5225
5226static void annotatePreprocessorTokens(CXTranslationUnit TU,
5227                                       SourceRange RegionOfInterest,
5228                                       AnnotateTokensData &Annotated) {
5229  ASTUnit *CXXUnit = static_cast<ASTUnit *>(TU->TUData);
5230
5231  SourceManager &SourceMgr = CXXUnit->getSourceManager();
5232  std::pair<FileID, unsigned> BeginLocInfo
5233    = SourceMgr.getDecomposedLoc(RegionOfInterest.getBegin());
5234  std::pair<FileID, unsigned> EndLocInfo
5235    = SourceMgr.getDecomposedLoc(RegionOfInterest.getEnd());
5236
5237  if (BeginLocInfo.first != EndLocInfo.first)
5238    return;
5239
5240  StringRef Buffer;
5241  bool Invalid = false;
5242  Buffer = SourceMgr.getBufferData(BeginLocInfo.first, &Invalid);
5243  if (Buffer.empty() || Invalid)
5244    return;
5245
5246  Lexer Lex(SourceMgr.getLocForStartOfFile(BeginLocInfo.first),
5247            CXXUnit->getASTContext().getLangOpts(),
5248            Buffer.begin(), Buffer.data() + BeginLocInfo.second,
5249            Buffer.end());
5250  Lex.SetCommentRetentionState(true);
5251
5252  // Lex tokens in raw mode until we hit the end of the range, to avoid
5253  // entering #includes or expanding macros.
5254  while (true) {
5255    Token Tok;
5256    Lex.LexFromRawLexer(Tok);
5257
5258  reprocess:
5259    if (Tok.is(tok::hash) && Tok.isAtStartOfLine()) {
5260      // We have found a preprocessing directive. Gobble it up so that we
5261      // don't see it while preprocessing these tokens later, but keep track
5262      // of all of the token locations inside this preprocessing directive so
5263      // that we can annotate them appropriately.
5264      //
5265      // FIXME: Some simple tests here could identify macro definitions and
5266      // #undefs, to provide specific cursor kinds for those.
5267      SmallVector<SourceLocation, 32> Locations;
5268      do {
5269        Locations.push_back(Tok.getLocation());
5270        Lex.LexFromRawLexer(Tok);
5271      } while (!Tok.isAtStartOfLine() && !Tok.is(tok::eof));
5272
5273      using namespace cxcursor;
5274      CXCursor Cursor
5275      = MakePreprocessingDirectiveCursor(SourceRange(Locations.front(),
5276                                                     Locations.back()),
5277                                         TU);
5278      for (unsigned I = 0, N = Locations.size(); I != N; ++I) {
5279        Annotated[Locations[I].getRawEncoding()] = Cursor;
5280      }
5281
5282      if (Tok.isAtStartOfLine())
5283        goto reprocess;
5284
5285      continue;
5286    }
5287
5288    if (Tok.is(tok::eof))
5289      break;
5290  }
5291}
5292
5293// This gets run a separate thread to avoid stack blowout.
5294static void clang_annotateTokensImpl(void *UserData) {
5295  CXTranslationUnit TU = ((clang_annotateTokens_Data*)UserData)->TU;
5296  ASTUnit *CXXUnit = ((clang_annotateTokens_Data*)UserData)->CXXUnit;
5297  CXToken *Tokens = ((clang_annotateTokens_Data*)UserData)->Tokens;
5298  const unsigned NumTokens = ((clang_annotateTokens_Data*)UserData)->NumTokens;
5299  CXCursor *Cursors = ((clang_annotateTokens_Data*)UserData)->Cursors;
5300
5301  CIndexer *CXXIdx = (CIndexer*)TU->CIdx;
5302  if (CXXIdx->isOptEnabled(CXGlobalOpt_ThreadBackgroundPriorityForEditing))
5303    setThreadBackgroundPriority();
5304
5305  // Determine the region of interest, which contains all of the tokens.
5306  SourceRange RegionOfInterest;
5307  RegionOfInterest.setBegin(
5308    cxloc::translateSourceLocation(clang_getTokenLocation(TU, Tokens[0])));
5309  RegionOfInterest.setEnd(
5310    cxloc::translateSourceLocation(clang_getTokenLocation(TU,
5311                                                         Tokens[NumTokens-1])));
5312
5313  // A mapping from the source locations found when re-lexing or traversing the
5314  // region of interest to the corresponding cursors.
5315  AnnotateTokensData Annotated;
5316
5317  // Relex the tokens within the source range to look for preprocessing
5318  // directives.
5319  annotatePreprocessorTokens(TU, RegionOfInterest, Annotated);
5320
5321  if (CXXUnit->getPreprocessor().getPreprocessingRecord()) {
5322    // Search and mark tokens that are macro argument expansions.
5323    MarkMacroArgTokensVisitor Visitor(CXXUnit->getSourceManager(),
5324                                      Tokens, NumTokens);
5325    CursorVisitor MacroArgMarker(TU,
5326                                 MarkMacroArgTokensVisitorDelegate, &Visitor,
5327                                 /*VisitPreprocessorLast=*/true,
5328                                 /*VisitIncludedEntities=*/false,
5329                                 RegionOfInterest);
5330    MacroArgMarker.visitPreprocessedEntitiesInRegion();
5331  }
5332
5333  // Annotate all of the source locations in the region of interest that map to
5334  // a specific cursor.
5335  AnnotateTokensWorker W(Annotated, Tokens, Cursors, NumTokens,
5336                         TU, RegionOfInterest);
5337
5338  // FIXME: We use a ridiculous stack size here because the data-recursion
5339  // algorithm uses a large stack frame than the non-data recursive version,
5340  // and AnnotationTokensWorker currently transforms the data-recursion
5341  // algorithm back into a traditional recursion by explicitly calling
5342  // VisitChildren().  We will need to remove this explicit recursive call.
5343  W.AnnotateTokens();
5344
5345  // If we ran into any entities that involve context-sensitive keywords,
5346  // take another pass through the tokens to mark them as such.
5347  if (W.hasContextSensitiveKeywords()) {
5348    for (unsigned I = 0; I != NumTokens; ++I) {
5349      if (clang_getTokenKind(Tokens[I]) != CXToken_Identifier)
5350        continue;
5351
5352      if (Cursors[I].kind == CXCursor_ObjCPropertyDecl) {
5353        IdentifierInfo *II = static_cast<IdentifierInfo *>(Tokens[I].ptr_data);
5354        if (ObjCPropertyDecl *Property
5355            = dyn_cast_or_null<ObjCPropertyDecl>(getCursorDecl(Cursors[I]))) {
5356          if (Property->getPropertyAttributesAsWritten() != 0 &&
5357              llvm::StringSwitch<bool>(II->getName())
5358              .Case("readonly", true)
5359              .Case("assign", true)
5360              .Case("unsafe_unretained", true)
5361              .Case("readwrite", true)
5362              .Case("retain", true)
5363              .Case("copy", true)
5364              .Case("nonatomic", true)
5365              .Case("atomic", true)
5366              .Case("getter", true)
5367              .Case("setter", true)
5368              .Case("strong", true)
5369              .Case("weak", true)
5370              .Default(false))
5371            Tokens[I].int_data[0] = CXToken_Keyword;
5372        }
5373        continue;
5374      }
5375
5376      if (Cursors[I].kind == CXCursor_ObjCInstanceMethodDecl ||
5377          Cursors[I].kind == CXCursor_ObjCClassMethodDecl) {
5378        IdentifierInfo *II = static_cast<IdentifierInfo *>(Tokens[I].ptr_data);
5379        if (llvm::StringSwitch<bool>(II->getName())
5380            .Case("in", true)
5381            .Case("out", true)
5382            .Case("inout", true)
5383            .Case("oneway", true)
5384            .Case("bycopy", true)
5385            .Case("byref", true)
5386            .Default(false))
5387          Tokens[I].int_data[0] = CXToken_Keyword;
5388        continue;
5389      }
5390
5391      if (Cursors[I].kind == CXCursor_CXXFinalAttr ||
5392          Cursors[I].kind == CXCursor_CXXOverrideAttr) {
5393        Tokens[I].int_data[0] = CXToken_Keyword;
5394        continue;
5395      }
5396    }
5397  }
5398}
5399
5400extern "C" {
5401
5402void clang_annotateTokens(CXTranslationUnit TU,
5403                          CXToken *Tokens, unsigned NumTokens,
5404                          CXCursor *Cursors) {
5405
5406  if (NumTokens == 0 || !Tokens || !Cursors)
5407    return;
5408
5409  // Any token we don't specifically annotate will have a NULL cursor.
5410  CXCursor C = clang_getNullCursor();
5411  for (unsigned I = 0; I != NumTokens; ++I)
5412    Cursors[I] = C;
5413
5414  ASTUnit *CXXUnit = static_cast<ASTUnit *>(TU->TUData);
5415  if (!CXXUnit)
5416    return;
5417
5418  ASTUnit::ConcurrencyCheck Check(*CXXUnit);
5419
5420  clang_annotateTokens_Data data = { TU, CXXUnit, Tokens, NumTokens, Cursors };
5421  llvm::CrashRecoveryContext CRC;
5422  if (!RunSafely(CRC, clang_annotateTokensImpl, &data,
5423                 GetSafetyThreadStackSize() * 2)) {
5424    fprintf(stderr, "libclang: crash detected while annotating tokens\n");
5425  }
5426}
5427
5428} // end: extern "C"
5429
5430//===----------------------------------------------------------------------===//
5431// Operations for querying linkage of a cursor.
5432//===----------------------------------------------------------------------===//
5433
5434extern "C" {
5435CXLinkageKind clang_getCursorLinkage(CXCursor cursor) {
5436  if (!clang_isDeclaration(cursor.kind))
5437    return CXLinkage_Invalid;
5438
5439  Decl *D = cxcursor::getCursorDecl(cursor);
5440  if (NamedDecl *ND = dyn_cast_or_null<NamedDecl>(D))
5441    switch (ND->getLinkage()) {
5442      case NoLinkage: return CXLinkage_NoLinkage;
5443      case InternalLinkage: return CXLinkage_Internal;
5444      case UniqueExternalLinkage: return CXLinkage_UniqueExternal;
5445      case ExternalLinkage: return CXLinkage_External;
5446    };
5447
5448  return CXLinkage_Invalid;
5449}
5450} // end: extern "C"
5451
5452//===----------------------------------------------------------------------===//
5453// Operations for querying language of a cursor.
5454//===----------------------------------------------------------------------===//
5455
5456static CXLanguageKind getDeclLanguage(const Decl *D) {
5457  if (!D)
5458    return CXLanguage_C;
5459
5460  switch (D->getKind()) {
5461    default:
5462      break;
5463    case Decl::ImplicitParam:
5464    case Decl::ObjCAtDefsField:
5465    case Decl::ObjCCategory:
5466    case Decl::ObjCCategoryImpl:
5467    case Decl::ObjCCompatibleAlias:
5468    case Decl::ObjCImplementation:
5469    case Decl::ObjCInterface:
5470    case Decl::ObjCIvar:
5471    case Decl::ObjCMethod:
5472    case Decl::ObjCProperty:
5473    case Decl::ObjCPropertyImpl:
5474    case Decl::ObjCProtocol:
5475      return CXLanguage_ObjC;
5476    case Decl::CXXConstructor:
5477    case Decl::CXXConversion:
5478    case Decl::CXXDestructor:
5479    case Decl::CXXMethod:
5480    case Decl::CXXRecord:
5481    case Decl::ClassTemplate:
5482    case Decl::ClassTemplatePartialSpecialization:
5483    case Decl::ClassTemplateSpecialization:
5484    case Decl::Friend:
5485    case Decl::FriendTemplate:
5486    case Decl::FunctionTemplate:
5487    case Decl::LinkageSpec:
5488    case Decl::Namespace:
5489    case Decl::NamespaceAlias:
5490    case Decl::NonTypeTemplateParm:
5491    case Decl::StaticAssert:
5492    case Decl::TemplateTemplateParm:
5493    case Decl::TemplateTypeParm:
5494    case Decl::UnresolvedUsingTypename:
5495    case Decl::UnresolvedUsingValue:
5496    case Decl::Using:
5497    case Decl::UsingDirective:
5498    case Decl::UsingShadow:
5499      return CXLanguage_CPlusPlus;
5500  }
5501
5502  return CXLanguage_C;
5503}
5504
5505extern "C" {
5506
5507enum CXAvailabilityKind clang_getCursorAvailability(CXCursor cursor) {
5508  if (clang_isDeclaration(cursor.kind))
5509    if (Decl *D = cxcursor::getCursorDecl(cursor)) {
5510      if (isa<FunctionDecl>(D) && cast<FunctionDecl>(D)->isDeleted())
5511        return CXAvailability_Available;
5512
5513      switch (D->getAvailability()) {
5514      case AR_Available:
5515      case AR_NotYetIntroduced:
5516        return CXAvailability_Available;
5517
5518      case AR_Deprecated:
5519        return CXAvailability_Deprecated;
5520
5521      case AR_Unavailable:
5522        return CXAvailability_NotAvailable;
5523      }
5524    }
5525
5526  return CXAvailability_Available;
5527}
5528
5529static CXVersion convertVersion(VersionTuple In) {
5530  CXVersion Out = { -1, -1, -1 };
5531  if (In.empty())
5532    return Out;
5533
5534  Out.Major = In.getMajor();
5535
5536  if (llvm::Optional<unsigned> Minor = In.getMinor())
5537    Out.Minor = *Minor;
5538  else
5539    return Out;
5540
5541  if (llvm::Optional<unsigned> Subminor = In.getSubminor())
5542    Out.Subminor = *Subminor;
5543
5544  return Out;
5545}
5546
5547int clang_getCursorPlatformAvailability(CXCursor cursor,
5548                                        int *always_deprecated,
5549                                        CXString *deprecated_message,
5550                                        int *always_unavailable,
5551                                        CXString *unavailable_message,
5552                                        CXPlatformAvailability *availability,
5553                                        int availability_size) {
5554  if (always_deprecated)
5555    *always_deprecated = 0;
5556  if (deprecated_message)
5557    *deprecated_message = cxstring::createCXString("", /*DupString=*/false);
5558  if (always_unavailable)
5559    *always_unavailable = 0;
5560  if (unavailable_message)
5561    *unavailable_message = cxstring::createCXString("", /*DupString=*/false);
5562
5563  if (!clang_isDeclaration(cursor.kind))
5564    return 0;
5565
5566  Decl *D = cxcursor::getCursorDecl(cursor);
5567  if (!D)
5568    return 0;
5569
5570  int N = 0;
5571  for (Decl::attr_iterator A = D->attr_begin(), AEnd = D->attr_end(); A != AEnd;
5572       ++A) {
5573    if (DeprecatedAttr *Deprecated = dyn_cast<DeprecatedAttr>(*A)) {
5574      if (always_deprecated)
5575        *always_deprecated = 1;
5576      if (deprecated_message)
5577        *deprecated_message = cxstring::createCXString(Deprecated->getMessage());
5578      continue;
5579    }
5580
5581    if (UnavailableAttr *Unavailable = dyn_cast<UnavailableAttr>(*A)) {
5582      if (always_unavailable)
5583        *always_unavailable = 1;
5584      if (unavailable_message) {
5585        *unavailable_message
5586          = cxstring::createCXString(Unavailable->getMessage());
5587      }
5588      continue;
5589    }
5590
5591    if (AvailabilityAttr *Avail = dyn_cast<AvailabilityAttr>(*A)) {
5592      if (N < availability_size) {
5593        availability[N].Platform
5594          = cxstring::createCXString(Avail->getPlatform()->getName());
5595        availability[N].Introduced = convertVersion(Avail->getIntroduced());
5596        availability[N].Deprecated = convertVersion(Avail->getDeprecated());
5597        availability[N].Obsoleted = convertVersion(Avail->getObsoleted());
5598        availability[N].Unavailable = Avail->getUnavailable();
5599        availability[N].Message = cxstring::createCXString(Avail->getMessage());
5600      }
5601      ++N;
5602    }
5603  }
5604
5605  return N;
5606}
5607
5608void clang_disposeCXPlatformAvailability(CXPlatformAvailability *availability) {
5609  clang_disposeString(availability->Platform);
5610  clang_disposeString(availability->Message);
5611}
5612
5613CXLanguageKind clang_getCursorLanguage(CXCursor cursor) {
5614  if (clang_isDeclaration(cursor.kind))
5615    return getDeclLanguage(cxcursor::getCursorDecl(cursor));
5616
5617  return CXLanguage_Invalid;
5618}
5619
5620 /// \brief If the given cursor is the "templated" declaration
5621 /// descibing a class or function template, return the class or
5622 /// function template.
5623static Decl *maybeGetTemplateCursor(Decl *D) {
5624  if (!D)
5625    return 0;
5626
5627  if (FunctionDecl *FD = dyn_cast<FunctionDecl>(D))
5628    if (FunctionTemplateDecl *FunTmpl = FD->getDescribedFunctionTemplate())
5629      return FunTmpl;
5630
5631  if (CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(D))
5632    if (ClassTemplateDecl *ClassTmpl = RD->getDescribedClassTemplate())
5633      return ClassTmpl;
5634
5635  return D;
5636}
5637
5638CXCursor clang_getCursorSemanticParent(CXCursor cursor) {
5639  if (clang_isDeclaration(cursor.kind)) {
5640    if (Decl *D = getCursorDecl(cursor)) {
5641      DeclContext *DC = D->getDeclContext();
5642      if (!DC)
5643        return clang_getNullCursor();
5644
5645      return MakeCXCursor(maybeGetTemplateCursor(cast<Decl>(DC)),
5646                          getCursorTU(cursor));
5647    }
5648  }
5649
5650  if (clang_isStatement(cursor.kind) || clang_isExpression(cursor.kind)) {
5651    if (Decl *D = getCursorDecl(cursor))
5652      return MakeCXCursor(D, getCursorTU(cursor));
5653  }
5654
5655  return clang_getNullCursor();
5656}
5657
5658CXCursor clang_getCursorLexicalParent(CXCursor cursor) {
5659  if (clang_isDeclaration(cursor.kind)) {
5660    if (Decl *D = getCursorDecl(cursor)) {
5661      DeclContext *DC = D->getLexicalDeclContext();
5662      if (!DC)
5663        return clang_getNullCursor();
5664
5665      return MakeCXCursor(maybeGetTemplateCursor(cast<Decl>(DC)),
5666                          getCursorTU(cursor));
5667    }
5668  }
5669
5670  // FIXME: Note that we can't easily compute the lexical context of a
5671  // statement or expression, so we return nothing.
5672  return clang_getNullCursor();
5673}
5674
5675CXFile clang_getIncludedFile(CXCursor cursor) {
5676  if (cursor.kind != CXCursor_InclusionDirective)
5677    return 0;
5678
5679  InclusionDirective *ID = getCursorInclusionDirective(cursor);
5680  return (void *)ID->getFile();
5681}
5682
5683CXSourceRange clang_Cursor_getCommentRange(CXCursor C) {
5684  if (!clang_isDeclaration(C.kind))
5685    return clang_getNullRange();
5686
5687  const Decl *D = getCursorDecl(C);
5688  ASTContext &Context = getCursorContext(C);
5689  const RawComment *RC = Context.getRawCommentForDecl(D);
5690  if (!RC)
5691    return clang_getNullRange();
5692
5693  return cxloc::translateSourceRange(Context, RC->getSourceRange());
5694}
5695
5696CXString clang_Cursor_getRawCommentText(CXCursor C) {
5697  if (!clang_isDeclaration(C.kind))
5698    return createCXString((const char *) NULL);
5699
5700  const Decl *D = getCursorDecl(C);
5701  ASTContext &Context = getCursorContext(C);
5702  const RawComment *RC = Context.getRawCommentForDecl(D);
5703  StringRef RawText = RC ? RC->getRawText(Context.getSourceManager()) :
5704                           StringRef();
5705
5706  // Don't duplicate the string because RawText points directly into source
5707  // code.
5708  return createCXString(RawText, false);
5709}
5710
5711} // end: extern "C"
5712
5713CXString clang_Cursor_getBriefCommentText(CXCursor C) {
5714  if (!clang_isDeclaration(C.kind))
5715    return createCXString((const char *) NULL);
5716
5717  const Decl *D = getCursorDecl(C);
5718  const ASTContext &Context = getCursorContext(C);
5719  const RawComment *RC = Context.getRawCommentForDecl(D);
5720
5721  if (RC) {
5722    StringRef BriefText = RC->getBriefText(Context);
5723
5724    // Don't duplicate the string because RawComment ensures that this memory
5725    // will not go away.
5726    return createCXString(BriefText, false);
5727  }
5728
5729  return createCXString((const char *) NULL);
5730}
5731
5732//===----------------------------------------------------------------------===//
5733// C++ AST instrospection.
5734//===----------------------------------------------------------------------===//
5735
5736extern "C" {
5737unsigned clang_CXXMethod_isStatic(CXCursor C) {
5738  if (!clang_isDeclaration(C.kind))
5739    return 0;
5740
5741  CXXMethodDecl *Method = 0;
5742  Decl *D = cxcursor::getCursorDecl(C);
5743  if (FunctionTemplateDecl *FunTmpl = dyn_cast_or_null<FunctionTemplateDecl>(D))
5744    Method = dyn_cast<CXXMethodDecl>(FunTmpl->getTemplatedDecl());
5745  else
5746    Method = dyn_cast_or_null<CXXMethodDecl>(D);
5747  return (Method && Method->isStatic()) ? 1 : 0;
5748}
5749
5750unsigned clang_CXXMethod_isVirtual(CXCursor C) {
5751  if (!clang_isDeclaration(C.kind))
5752    return 0;
5753
5754  CXXMethodDecl *Method = 0;
5755  Decl *D = cxcursor::getCursorDecl(C);
5756  if (FunctionTemplateDecl *FunTmpl = dyn_cast_or_null<FunctionTemplateDecl>(D))
5757    Method = dyn_cast<CXXMethodDecl>(FunTmpl->getTemplatedDecl());
5758  else
5759    Method = dyn_cast_or_null<CXXMethodDecl>(D);
5760  return (Method && Method->isVirtual()) ? 1 : 0;
5761}
5762} // end: extern "C"
5763
5764//===----------------------------------------------------------------------===//
5765// Attribute introspection.
5766//===----------------------------------------------------------------------===//
5767
5768extern "C" {
5769CXType clang_getIBOutletCollectionType(CXCursor C) {
5770  if (C.kind != CXCursor_IBOutletCollectionAttr)
5771    return cxtype::MakeCXType(QualType(), cxcursor::getCursorTU(C));
5772
5773  IBOutletCollectionAttr *A =
5774    cast<IBOutletCollectionAttr>(cxcursor::getCursorAttr(C));
5775
5776  return cxtype::MakeCXType(A->getInterface(), cxcursor::getCursorTU(C));
5777}
5778} // end: extern "C"
5779
5780//===----------------------------------------------------------------------===//
5781// Inspecting memory usage.
5782//===----------------------------------------------------------------------===//
5783
5784typedef std::vector<CXTUResourceUsageEntry> MemUsageEntries;
5785
5786static inline void createCXTUResourceUsageEntry(MemUsageEntries &entries,
5787                                              enum CXTUResourceUsageKind k,
5788                                              unsigned long amount) {
5789  CXTUResourceUsageEntry entry = { k, amount };
5790  entries.push_back(entry);
5791}
5792
5793extern "C" {
5794
5795const char *clang_getTUResourceUsageName(CXTUResourceUsageKind kind) {
5796  const char *str = "";
5797  switch (kind) {
5798    case CXTUResourceUsage_AST:
5799      str = "ASTContext: expressions, declarations, and types";
5800      break;
5801    case CXTUResourceUsage_Identifiers:
5802      str = "ASTContext: identifiers";
5803      break;
5804    case CXTUResourceUsage_Selectors:
5805      str = "ASTContext: selectors";
5806      break;
5807    case CXTUResourceUsage_GlobalCompletionResults:
5808      str = "Code completion: cached global results";
5809      break;
5810    case CXTUResourceUsage_SourceManagerContentCache:
5811      str = "SourceManager: content cache allocator";
5812      break;
5813    case CXTUResourceUsage_AST_SideTables:
5814      str = "ASTContext: side tables";
5815      break;
5816    case CXTUResourceUsage_SourceManager_Membuffer_Malloc:
5817      str = "SourceManager: malloc'ed memory buffers";
5818      break;
5819    case CXTUResourceUsage_SourceManager_Membuffer_MMap:
5820      str = "SourceManager: mmap'ed memory buffers";
5821      break;
5822    case CXTUResourceUsage_ExternalASTSource_Membuffer_Malloc:
5823      str = "ExternalASTSource: malloc'ed memory buffers";
5824      break;
5825    case CXTUResourceUsage_ExternalASTSource_Membuffer_MMap:
5826      str = "ExternalASTSource: mmap'ed memory buffers";
5827      break;
5828    case CXTUResourceUsage_Preprocessor:
5829      str = "Preprocessor: malloc'ed memory";
5830      break;
5831    case CXTUResourceUsage_PreprocessingRecord:
5832      str = "Preprocessor: PreprocessingRecord";
5833      break;
5834    case CXTUResourceUsage_SourceManager_DataStructures:
5835      str = "SourceManager: data structures and tables";
5836      break;
5837    case CXTUResourceUsage_Preprocessor_HeaderSearch:
5838      str = "Preprocessor: header search tables";
5839      break;
5840  }
5841  return str;
5842}
5843
5844CXTUResourceUsage clang_getCXTUResourceUsage(CXTranslationUnit TU) {
5845  if (!TU) {
5846    CXTUResourceUsage usage = { (void*) 0, 0, 0 };
5847    return usage;
5848  }
5849
5850  ASTUnit *astUnit = static_cast<ASTUnit*>(TU->TUData);
5851  OwningPtr<MemUsageEntries> entries(new MemUsageEntries());
5852  ASTContext &astContext = astUnit->getASTContext();
5853
5854  // How much memory is used by AST nodes and types?
5855  createCXTUResourceUsageEntry(*entries, CXTUResourceUsage_AST,
5856    (unsigned long) astContext.getASTAllocatedMemory());
5857
5858  // How much memory is used by identifiers?
5859  createCXTUResourceUsageEntry(*entries, CXTUResourceUsage_Identifiers,
5860    (unsigned long) astContext.Idents.getAllocator().getTotalMemory());
5861
5862  // How much memory is used for selectors?
5863  createCXTUResourceUsageEntry(*entries, CXTUResourceUsage_Selectors,
5864    (unsigned long) astContext.Selectors.getTotalMemory());
5865
5866  // How much memory is used by ASTContext's side tables?
5867  createCXTUResourceUsageEntry(*entries, CXTUResourceUsage_AST_SideTables,
5868    (unsigned long) astContext.getSideTableAllocatedMemory());
5869
5870  // How much memory is used for caching global code completion results?
5871  unsigned long completionBytes = 0;
5872  if (GlobalCodeCompletionAllocator *completionAllocator =
5873      astUnit->getCachedCompletionAllocator().getPtr()) {
5874    completionBytes = completionAllocator->getTotalMemory();
5875  }
5876  createCXTUResourceUsageEntry(*entries,
5877                               CXTUResourceUsage_GlobalCompletionResults,
5878                               completionBytes);
5879
5880  // How much memory is being used by SourceManager's content cache?
5881  createCXTUResourceUsageEntry(*entries,
5882          CXTUResourceUsage_SourceManagerContentCache,
5883          (unsigned long) astContext.getSourceManager().getContentCacheSize());
5884
5885  // How much memory is being used by the MemoryBuffer's in SourceManager?
5886  const SourceManager::MemoryBufferSizes &srcBufs =
5887    astUnit->getSourceManager().getMemoryBufferSizes();
5888
5889  createCXTUResourceUsageEntry(*entries,
5890                               CXTUResourceUsage_SourceManager_Membuffer_Malloc,
5891                               (unsigned long) srcBufs.malloc_bytes);
5892  createCXTUResourceUsageEntry(*entries,
5893                               CXTUResourceUsage_SourceManager_Membuffer_MMap,
5894                               (unsigned long) srcBufs.mmap_bytes);
5895  createCXTUResourceUsageEntry(*entries,
5896                               CXTUResourceUsage_SourceManager_DataStructures,
5897                               (unsigned long) astContext.getSourceManager()
5898                                .getDataStructureSizes());
5899
5900  // How much memory is being used by the ExternalASTSource?
5901  if (ExternalASTSource *esrc = astContext.getExternalSource()) {
5902    const ExternalASTSource::MemoryBufferSizes &sizes =
5903      esrc->getMemoryBufferSizes();
5904
5905    createCXTUResourceUsageEntry(*entries,
5906      CXTUResourceUsage_ExternalASTSource_Membuffer_Malloc,
5907                                 (unsigned long) sizes.malloc_bytes);
5908    createCXTUResourceUsageEntry(*entries,
5909      CXTUResourceUsage_ExternalASTSource_Membuffer_MMap,
5910                                 (unsigned long) sizes.mmap_bytes);
5911  }
5912
5913  // How much memory is being used by the Preprocessor?
5914  Preprocessor &pp = astUnit->getPreprocessor();
5915  createCXTUResourceUsageEntry(*entries,
5916                               CXTUResourceUsage_Preprocessor,
5917                               pp.getTotalMemory());
5918
5919  if (PreprocessingRecord *pRec = pp.getPreprocessingRecord()) {
5920    createCXTUResourceUsageEntry(*entries,
5921                                 CXTUResourceUsage_PreprocessingRecord,
5922                                 pRec->getTotalMemory());
5923  }
5924
5925  createCXTUResourceUsageEntry(*entries,
5926                               CXTUResourceUsage_Preprocessor_HeaderSearch,
5927                               pp.getHeaderSearchInfo().getTotalMemory());
5928
5929  CXTUResourceUsage usage = { (void*) entries.get(),
5930                            (unsigned) entries->size(),
5931                            entries->size() ? &(*entries)[0] : 0 };
5932  entries.take();
5933  return usage;
5934}
5935
5936void clang_disposeCXTUResourceUsage(CXTUResourceUsage usage) {
5937  if (usage.data)
5938    delete (MemUsageEntries*) usage.data;
5939}
5940
5941} // end extern "C"
5942
5943void clang::PrintLibclangResourceUsage(CXTranslationUnit TU) {
5944  CXTUResourceUsage Usage = clang_getCXTUResourceUsage(TU);
5945  for (unsigned I = 0; I != Usage.numEntries; ++I)
5946    fprintf(stderr, "  %s: %lu\n",
5947            clang_getTUResourceUsageName(Usage.entries[I].kind),
5948            Usage.entries[I].amount);
5949
5950  clang_disposeCXTUResourceUsage(Usage);
5951}
5952
5953//===----------------------------------------------------------------------===//
5954// Misc. utility functions.
5955//===----------------------------------------------------------------------===//
5956
5957/// Default to using an 8 MB stack size on "safety" threads.
5958static unsigned SafetyStackThreadSize = 8 << 20;
5959
5960namespace clang {
5961
5962bool RunSafely(llvm::CrashRecoveryContext &CRC,
5963               void (*Fn)(void*), void *UserData,
5964               unsigned Size) {
5965  if (!Size)
5966    Size = GetSafetyThreadStackSize();
5967  if (Size)
5968    return CRC.RunSafelyOnThread(Fn, UserData, Size);
5969  return CRC.RunSafely(Fn, UserData);
5970}
5971
5972unsigned GetSafetyThreadStackSize() {
5973  return SafetyStackThreadSize;
5974}
5975
5976void SetSafetyThreadStackSize(unsigned Value) {
5977  SafetyStackThreadSize = Value;
5978}
5979
5980}
5981
5982void clang::setThreadBackgroundPriority() {
5983  // FIXME: Move to llvm/Support and make it cross-platform.
5984#ifdef __APPLE__
5985  setpriority(PRIO_DARWIN_THREAD, 0, PRIO_DARWIN_BG);
5986#endif
5987}
5988
5989void cxindex::printDiagsToStderr(ASTUnit *Unit) {
5990  if (!Unit)
5991    return;
5992
5993  for (ASTUnit::stored_diag_iterator D = Unit->stored_diag_begin(),
5994                                  DEnd = Unit->stored_diag_end();
5995       D != DEnd; ++D) {
5996    CXStoredDiagnostic Diag(*D, Unit->getASTContext().getLangOpts());
5997    CXString Msg = clang_formatDiagnostic(&Diag,
5998                                clang_defaultDiagnosticDisplayOptions());
5999    fprintf(stderr, "%s\n", clang_getCString(Msg));
6000    clang_disposeString(Msg);
6001  }
6002#ifdef LLVM_ON_WIN32
6003  // On Windows, force a flush, since there may be multiple copies of
6004  // stderr and stdout in the file system, all with different buffers
6005  // but writing to the same device.
6006  fflush(stderr);
6007#endif
6008}
6009
6010extern "C" {
6011
6012CXString clang_getClangVersion() {
6013  return createCXString(getClangFullVersion());
6014}
6015
6016} // end: extern "C"
6017
6018