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