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