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