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