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