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