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