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