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