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