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