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