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