CIndex.cpp revision 4fa7eab771ab8212e1058bd1a91061ff120c8fbb
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  SmallVectorImpl<Decl *>::iterator DIt = Decls.begin();
312  for (SmallVectorImpl<Decl *>::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::VisitDecayedTypeLoc(DecayedTypeLoc TL) {
1550  return Visit(TL.getOriginalLoc());
1551}
1552
1553bool CursorVisitor::VisitTemplateSpecializationTypeLoc(
1554                                             TemplateSpecializationTypeLoc TL) {
1555  // Visit the template name.
1556  if (VisitTemplateName(TL.getTypePtr()->getTemplateName(),
1557                        TL.getTemplateNameLoc()))
1558    return true;
1559
1560  // Visit the template arguments.
1561  for (unsigned I = 0, N = TL.getNumArgs(); I != N; ++I)
1562    if (VisitTemplateArgumentLoc(TL.getArgLoc(I)))
1563      return true;
1564
1565  return false;
1566}
1567
1568bool CursorVisitor::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) {
1569  return Visit(MakeCXCursor(TL.getUnderlyingExpr(), StmtParent, TU));
1570}
1571
1572bool CursorVisitor::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) {
1573  if (TypeSourceInfo *TSInfo = TL.getUnderlyingTInfo())
1574    return Visit(TSInfo->getTypeLoc());
1575
1576  return false;
1577}
1578
1579bool CursorVisitor::VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) {
1580  if (TypeSourceInfo *TSInfo = TL.getUnderlyingTInfo())
1581    return Visit(TSInfo->getTypeLoc());
1582
1583  return false;
1584}
1585
1586bool CursorVisitor::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) {
1587  if (VisitNestedNameSpecifierLoc(TL.getQualifierLoc()))
1588    return true;
1589
1590  return false;
1591}
1592
1593bool CursorVisitor::VisitDependentTemplateSpecializationTypeLoc(
1594                                    DependentTemplateSpecializationTypeLoc TL) {
1595  // Visit the nested-name-specifier, if there is one.
1596  if (TL.getQualifierLoc() &&
1597      VisitNestedNameSpecifierLoc(TL.getQualifierLoc()))
1598    return true;
1599
1600  // Visit the template arguments.
1601  for (unsigned I = 0, N = TL.getNumArgs(); I != N; ++I)
1602    if (VisitTemplateArgumentLoc(TL.getArgLoc(I)))
1603      return true;
1604
1605  return false;
1606}
1607
1608bool CursorVisitor::VisitElaboratedTypeLoc(ElaboratedTypeLoc TL) {
1609  if (VisitNestedNameSpecifierLoc(TL.getQualifierLoc()))
1610    return true;
1611
1612  return Visit(TL.getNamedTypeLoc());
1613}
1614
1615bool CursorVisitor::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) {
1616  return Visit(TL.getPatternLoc());
1617}
1618
1619bool CursorVisitor::VisitDecltypeTypeLoc(DecltypeTypeLoc TL) {
1620  if (Expr *E = TL.getUnderlyingExpr())
1621    return Visit(MakeCXCursor(E, StmtParent, TU));
1622
1623  return false;
1624}
1625
1626bool CursorVisitor::VisitInjectedClassNameTypeLoc(InjectedClassNameTypeLoc TL) {
1627  return Visit(MakeCursorTypeRef(TL.getDecl(), TL.getNameLoc(), TU));
1628}
1629
1630bool CursorVisitor::VisitAtomicTypeLoc(AtomicTypeLoc TL) {
1631  return Visit(TL.getValueLoc());
1632}
1633
1634#define DEFAULT_TYPELOC_IMPL(CLASS, PARENT) \
1635bool CursorVisitor::Visit##CLASS##TypeLoc(CLASS##TypeLoc TL) { \
1636  return Visit##PARENT##Loc(TL); \
1637}
1638
1639DEFAULT_TYPELOC_IMPL(Complex, Type)
1640DEFAULT_TYPELOC_IMPL(ConstantArray, ArrayType)
1641DEFAULT_TYPELOC_IMPL(IncompleteArray, ArrayType)
1642DEFAULT_TYPELOC_IMPL(VariableArray, ArrayType)
1643DEFAULT_TYPELOC_IMPL(DependentSizedArray, ArrayType)
1644DEFAULT_TYPELOC_IMPL(DependentSizedExtVector, Type)
1645DEFAULT_TYPELOC_IMPL(Vector, Type)
1646DEFAULT_TYPELOC_IMPL(ExtVector, VectorType)
1647DEFAULT_TYPELOC_IMPL(FunctionProto, FunctionType)
1648DEFAULT_TYPELOC_IMPL(FunctionNoProto, FunctionType)
1649DEFAULT_TYPELOC_IMPL(Record, TagType)
1650DEFAULT_TYPELOC_IMPL(Enum, TagType)
1651DEFAULT_TYPELOC_IMPL(SubstTemplateTypeParm, Type)
1652DEFAULT_TYPELOC_IMPL(SubstTemplateTypeParmPack, Type)
1653DEFAULT_TYPELOC_IMPL(Auto, Type)
1654
1655bool CursorVisitor::VisitCXXRecordDecl(CXXRecordDecl *D) {
1656  // Visit the nested-name-specifier, if present.
1657  if (NestedNameSpecifierLoc QualifierLoc = D->getQualifierLoc())
1658    if (VisitNestedNameSpecifierLoc(QualifierLoc))
1659      return true;
1660
1661  if (D->isCompleteDefinition()) {
1662    for (CXXRecordDecl::base_class_iterator I = D->bases_begin(),
1663         E = D->bases_end(); I != E; ++I) {
1664      if (Visit(cxcursor::MakeCursorCXXBaseSpecifier(I, TU)))
1665        return true;
1666    }
1667  }
1668
1669  return VisitTagDecl(D);
1670}
1671
1672bool CursorVisitor::VisitAttributes(Decl *D) {
1673  for (AttrVec::const_iterator i = D->attr_begin(), e = D->attr_end();
1674       i != e; ++i)
1675    if (Visit(MakeCXCursor(*i, D, TU)))
1676        return true;
1677
1678  return false;
1679}
1680
1681//===----------------------------------------------------------------------===//
1682// Data-recursive visitor methods.
1683//===----------------------------------------------------------------------===//
1684
1685namespace {
1686#define DEF_JOB(NAME, DATA, KIND)\
1687class NAME : public VisitorJob {\
1688public:\
1689  NAME(const DATA *d, CXCursor parent) : \
1690      VisitorJob(parent, VisitorJob::KIND, d) {} \
1691  static bool classof(const VisitorJob *VJ) { return VJ->getKind() == KIND; }\
1692  const DATA *get() const { return static_cast<const DATA*>(data[0]); }\
1693};
1694
1695DEF_JOB(StmtVisit, Stmt, StmtVisitKind)
1696DEF_JOB(MemberExprParts, MemberExpr, MemberExprPartsKind)
1697DEF_JOB(DeclRefExprParts, DeclRefExpr, DeclRefExprPartsKind)
1698DEF_JOB(OverloadExprParts, OverloadExpr, OverloadExprPartsKind)
1699DEF_JOB(ExplicitTemplateArgsVisit, ASTTemplateArgumentListInfo,
1700        ExplicitTemplateArgsVisitKind)
1701DEF_JOB(SizeOfPackExprParts, SizeOfPackExpr, SizeOfPackExprPartsKind)
1702DEF_JOB(LambdaExprParts, LambdaExpr, LambdaExprPartsKind)
1703DEF_JOB(PostChildrenVisit, void, PostChildrenVisitKind)
1704#undef DEF_JOB
1705
1706class DeclVisit : public VisitorJob {
1707public:
1708  DeclVisit(const Decl *D, CXCursor parent, bool isFirst) :
1709    VisitorJob(parent, VisitorJob::DeclVisitKind,
1710               D, isFirst ? (void*) 1 : (void*) 0) {}
1711  static bool classof(const VisitorJob *VJ) {
1712    return VJ->getKind() == DeclVisitKind;
1713  }
1714  const Decl *get() const { return static_cast<const Decl *>(data[0]); }
1715  bool isFirst() const { return data[1] ? true : false; }
1716};
1717class TypeLocVisit : public VisitorJob {
1718public:
1719  TypeLocVisit(TypeLoc tl, CXCursor parent) :
1720    VisitorJob(parent, VisitorJob::TypeLocVisitKind,
1721               tl.getType().getAsOpaquePtr(), tl.getOpaqueData()) {}
1722
1723  static bool classof(const VisitorJob *VJ) {
1724    return VJ->getKind() == TypeLocVisitKind;
1725  }
1726
1727  TypeLoc get() const {
1728    QualType T = QualType::getFromOpaquePtr(data[0]);
1729    return TypeLoc(T, const_cast<void *>(data[1]));
1730  }
1731};
1732
1733class LabelRefVisit : public VisitorJob {
1734public:
1735  LabelRefVisit(LabelDecl *LD, SourceLocation labelLoc, CXCursor parent)
1736    : VisitorJob(parent, VisitorJob::LabelRefVisitKind, LD,
1737                 labelLoc.getPtrEncoding()) {}
1738
1739  static bool classof(const VisitorJob *VJ) {
1740    return VJ->getKind() == VisitorJob::LabelRefVisitKind;
1741  }
1742  const LabelDecl *get() const {
1743    return static_cast<const LabelDecl *>(data[0]);
1744  }
1745  SourceLocation getLoc() const {
1746    return SourceLocation::getFromPtrEncoding(data[1]); }
1747};
1748
1749class NestedNameSpecifierLocVisit : public VisitorJob {
1750public:
1751  NestedNameSpecifierLocVisit(NestedNameSpecifierLoc Qualifier, CXCursor parent)
1752    : VisitorJob(parent, VisitorJob::NestedNameSpecifierLocVisitKind,
1753                 Qualifier.getNestedNameSpecifier(),
1754                 Qualifier.getOpaqueData()) { }
1755
1756  static bool classof(const VisitorJob *VJ) {
1757    return VJ->getKind() == VisitorJob::NestedNameSpecifierLocVisitKind;
1758  }
1759
1760  NestedNameSpecifierLoc get() const {
1761    return NestedNameSpecifierLoc(
1762            const_cast<NestedNameSpecifier *>(
1763              static_cast<const NestedNameSpecifier *>(data[0])),
1764            const_cast<void *>(data[1]));
1765  }
1766};
1767
1768class DeclarationNameInfoVisit : public VisitorJob {
1769public:
1770  DeclarationNameInfoVisit(const Stmt *S, CXCursor parent)
1771    : VisitorJob(parent, VisitorJob::DeclarationNameInfoVisitKind, S) {}
1772  static bool classof(const VisitorJob *VJ) {
1773    return VJ->getKind() == VisitorJob::DeclarationNameInfoVisitKind;
1774  }
1775  DeclarationNameInfo get() const {
1776    const Stmt *S = static_cast<const Stmt *>(data[0]);
1777    switch (S->getStmtClass()) {
1778    default:
1779      llvm_unreachable("Unhandled Stmt");
1780    case clang::Stmt::MSDependentExistsStmtClass:
1781      return cast<MSDependentExistsStmt>(S)->getNameInfo();
1782    case Stmt::CXXDependentScopeMemberExprClass:
1783      return cast<CXXDependentScopeMemberExpr>(S)->getMemberNameInfo();
1784    case Stmt::DependentScopeDeclRefExprClass:
1785      return cast<DependentScopeDeclRefExpr>(S)->getNameInfo();
1786    }
1787  }
1788};
1789class MemberRefVisit : public VisitorJob {
1790public:
1791  MemberRefVisit(const FieldDecl *D, SourceLocation L, CXCursor parent)
1792    : VisitorJob(parent, VisitorJob::MemberRefVisitKind, D,
1793                 L.getPtrEncoding()) {}
1794  static bool classof(const VisitorJob *VJ) {
1795    return VJ->getKind() == VisitorJob::MemberRefVisitKind;
1796  }
1797  const FieldDecl *get() const {
1798    return static_cast<const FieldDecl *>(data[0]);
1799  }
1800  SourceLocation getLoc() const {
1801    return SourceLocation::getFromRawEncoding((unsigned)(uintptr_t) data[1]);
1802  }
1803};
1804class EnqueueVisitor : public ConstStmtVisitor<EnqueueVisitor, void> {
1805  friend class OMPClauseEnqueue;
1806  VisitorWorkList &WL;
1807  CXCursor Parent;
1808public:
1809  EnqueueVisitor(VisitorWorkList &wl, CXCursor parent)
1810    : WL(wl), Parent(parent) {}
1811
1812  void VisitAddrLabelExpr(const AddrLabelExpr *E);
1813  void VisitBlockExpr(const BlockExpr *B);
1814  void VisitCompoundLiteralExpr(const CompoundLiteralExpr *E);
1815  void VisitCompoundStmt(const CompoundStmt *S);
1816  void VisitCXXDefaultArgExpr(const CXXDefaultArgExpr *E) { /* Do nothing. */ }
1817  void VisitMSDependentExistsStmt(const MSDependentExistsStmt *S);
1818  void VisitCXXDependentScopeMemberExpr(const CXXDependentScopeMemberExpr *E);
1819  void VisitCXXNewExpr(const CXXNewExpr *E);
1820  void VisitCXXScalarValueInitExpr(const CXXScalarValueInitExpr *E);
1821  void VisitCXXOperatorCallExpr(const CXXOperatorCallExpr *E);
1822  void VisitCXXPseudoDestructorExpr(const CXXPseudoDestructorExpr *E);
1823  void VisitCXXTemporaryObjectExpr(const CXXTemporaryObjectExpr *E);
1824  void VisitCXXTypeidExpr(const CXXTypeidExpr *E);
1825  void VisitCXXUnresolvedConstructExpr(const CXXUnresolvedConstructExpr *E);
1826  void VisitCXXUuidofExpr(const CXXUuidofExpr *E);
1827  void VisitCXXCatchStmt(const CXXCatchStmt *S);
1828  void VisitDeclRefExpr(const DeclRefExpr *D);
1829  void VisitDeclStmt(const DeclStmt *S);
1830  void VisitDependentScopeDeclRefExpr(const DependentScopeDeclRefExpr *E);
1831  void VisitDesignatedInitExpr(const DesignatedInitExpr *E);
1832  void VisitExplicitCastExpr(const ExplicitCastExpr *E);
1833  void VisitForStmt(const ForStmt *FS);
1834  void VisitGotoStmt(const GotoStmt *GS);
1835  void VisitIfStmt(const IfStmt *If);
1836  void VisitInitListExpr(const InitListExpr *IE);
1837  void VisitMemberExpr(const MemberExpr *M);
1838  void VisitOffsetOfExpr(const OffsetOfExpr *E);
1839  void VisitObjCEncodeExpr(const ObjCEncodeExpr *E);
1840  void VisitObjCMessageExpr(const ObjCMessageExpr *M);
1841  void VisitOverloadExpr(const OverloadExpr *E);
1842  void VisitUnaryExprOrTypeTraitExpr(const UnaryExprOrTypeTraitExpr *E);
1843  void VisitStmt(const Stmt *S);
1844  void VisitSwitchStmt(const SwitchStmt *S);
1845  void VisitWhileStmt(const WhileStmt *W);
1846  void VisitUnaryTypeTraitExpr(const UnaryTypeTraitExpr *E);
1847  void VisitBinaryTypeTraitExpr(const BinaryTypeTraitExpr *E);
1848  void VisitTypeTraitExpr(const TypeTraitExpr *E);
1849  void VisitArrayTypeTraitExpr(const ArrayTypeTraitExpr *E);
1850  void VisitExpressionTraitExpr(const ExpressionTraitExpr *E);
1851  void VisitUnresolvedMemberExpr(const UnresolvedMemberExpr *U);
1852  void VisitVAArgExpr(const VAArgExpr *E);
1853  void VisitSizeOfPackExpr(const SizeOfPackExpr *E);
1854  void VisitPseudoObjectExpr(const PseudoObjectExpr *E);
1855  void VisitOpaqueValueExpr(const OpaqueValueExpr *E);
1856  void VisitLambdaExpr(const LambdaExpr *E);
1857  void VisitOMPExecutableDirective(const OMPExecutableDirective *D);
1858  void VisitOMPParallelDirective(const OMPParallelDirective *D);
1859
1860private:
1861  void AddDeclarationNameInfo(const Stmt *S);
1862  void AddNestedNameSpecifierLoc(NestedNameSpecifierLoc Qualifier);
1863  void AddExplicitTemplateArgs(const ASTTemplateArgumentListInfo *A);
1864  void AddMemberRef(const FieldDecl *D, SourceLocation L);
1865  void AddStmt(const Stmt *S);
1866  void AddDecl(const Decl *D, bool isFirst = true);
1867  void AddTypeLoc(TypeSourceInfo *TI);
1868  void EnqueueChildren(const Stmt *S);
1869  void EnqueueChildren(const OMPClause *S);
1870};
1871} // end anonyous namespace
1872
1873void EnqueueVisitor::AddDeclarationNameInfo(const Stmt *S) {
1874  // 'S' should always be non-null, since it comes from the
1875  // statement we are visiting.
1876  WL.push_back(DeclarationNameInfoVisit(S, Parent));
1877}
1878
1879void
1880EnqueueVisitor::AddNestedNameSpecifierLoc(NestedNameSpecifierLoc Qualifier) {
1881  if (Qualifier)
1882    WL.push_back(NestedNameSpecifierLocVisit(Qualifier, Parent));
1883}
1884
1885void EnqueueVisitor::AddStmt(const Stmt *S) {
1886  if (S)
1887    WL.push_back(StmtVisit(S, Parent));
1888}
1889void EnqueueVisitor::AddDecl(const Decl *D, bool isFirst) {
1890  if (D)
1891    WL.push_back(DeclVisit(D, Parent, isFirst));
1892}
1893void EnqueueVisitor::
1894  AddExplicitTemplateArgs(const ASTTemplateArgumentListInfo *A) {
1895  if (A)
1896    WL.push_back(ExplicitTemplateArgsVisit(A, Parent));
1897}
1898void EnqueueVisitor::AddMemberRef(const FieldDecl *D, SourceLocation L) {
1899  if (D)
1900    WL.push_back(MemberRefVisit(D, L, Parent));
1901}
1902void EnqueueVisitor::AddTypeLoc(TypeSourceInfo *TI) {
1903  if (TI)
1904    WL.push_back(TypeLocVisit(TI->getTypeLoc(), Parent));
1905 }
1906void EnqueueVisitor::EnqueueChildren(const Stmt *S) {
1907  unsigned size = WL.size();
1908  for (Stmt::const_child_range Child = S->children(); Child; ++Child) {
1909    AddStmt(*Child);
1910  }
1911  if (size == WL.size())
1912    return;
1913  // Now reverse the entries we just added.  This will match the DFS
1914  // ordering performed by the worklist.
1915  VisitorWorkList::iterator I = WL.begin() + size, E = WL.end();
1916  std::reverse(I, E);
1917}
1918namespace {
1919class OMPClauseEnqueue : public ConstOMPClauseVisitor<OMPClauseEnqueue> {
1920  EnqueueVisitor *Visitor;
1921public:
1922  OMPClauseEnqueue(EnqueueVisitor *Visitor) : Visitor(Visitor) { }
1923#define OPENMP_CLAUSE(Name, Class)                                             \
1924  void Visit##Class(const Class *C);
1925#include "clang/Basic/OpenMPKinds.def"
1926};
1927
1928void OMPClauseEnqueue::VisitOMPDefaultClause(const OMPDefaultClause *C) { }
1929#define PROCESS_OMP_CLAUSE_LIST(Class, Node)                                   \
1930  for (OMPVarList<Class>::varlist_const_iterator I = Node->varlist_begin(),    \
1931                                                 E = Node->varlist_end();      \
1932         I != E; ++I)                                                          \
1933    Visitor->AddStmt(*I);
1934
1935void OMPClauseEnqueue::VisitOMPPrivateClause(const OMPPrivateClause *C) {
1936  PROCESS_OMP_CLAUSE_LIST(OMPPrivateClause, C)
1937}
1938#undef PROCESS_OMP_CLAUSE_LIST
1939}
1940void EnqueueVisitor::EnqueueChildren(const OMPClause *S) {
1941  unsigned size = WL.size();
1942  OMPClauseEnqueue Visitor(this);
1943  Visitor.Visit(S);
1944  if (size == WL.size())
1945    return;
1946  // Now reverse the entries we just added.  This will match the DFS
1947  // ordering performed by the worklist.
1948  VisitorWorkList::iterator I = WL.begin() + size, E = WL.end();
1949  std::reverse(I, E);
1950}
1951void EnqueueVisitor::VisitAddrLabelExpr(const AddrLabelExpr *E) {
1952  WL.push_back(LabelRefVisit(E->getLabel(), E->getLabelLoc(), Parent));
1953}
1954void EnqueueVisitor::VisitBlockExpr(const BlockExpr *B) {
1955  AddDecl(B->getBlockDecl());
1956}
1957void EnqueueVisitor::VisitCompoundLiteralExpr(const CompoundLiteralExpr *E) {
1958  EnqueueChildren(E);
1959  AddTypeLoc(E->getTypeSourceInfo());
1960}
1961void EnqueueVisitor::VisitCompoundStmt(const CompoundStmt *S) {
1962  for (CompoundStmt::const_reverse_body_iterator I = S->body_rbegin(),
1963        E = S->body_rend(); I != E; ++I) {
1964    AddStmt(*I);
1965  }
1966}
1967void EnqueueVisitor::
1968VisitMSDependentExistsStmt(const MSDependentExistsStmt *S) {
1969  AddStmt(S->getSubStmt());
1970  AddDeclarationNameInfo(S);
1971  if (NestedNameSpecifierLoc QualifierLoc = S->getQualifierLoc())
1972    AddNestedNameSpecifierLoc(QualifierLoc);
1973}
1974
1975void EnqueueVisitor::
1976VisitCXXDependentScopeMemberExpr(const CXXDependentScopeMemberExpr *E) {
1977  AddExplicitTemplateArgs(E->getOptionalExplicitTemplateArgs());
1978  AddDeclarationNameInfo(E);
1979  if (NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc())
1980    AddNestedNameSpecifierLoc(QualifierLoc);
1981  if (!E->isImplicitAccess())
1982    AddStmt(E->getBase());
1983}
1984void EnqueueVisitor::VisitCXXNewExpr(const CXXNewExpr *E) {
1985  // Enqueue the initializer , if any.
1986  AddStmt(E->getInitializer());
1987  // Enqueue the array size, if any.
1988  AddStmt(E->getArraySize());
1989  // Enqueue the allocated type.
1990  AddTypeLoc(E->getAllocatedTypeSourceInfo());
1991  // Enqueue the placement arguments.
1992  for (unsigned I = E->getNumPlacementArgs(); I > 0; --I)
1993    AddStmt(E->getPlacementArg(I-1));
1994}
1995void EnqueueVisitor::VisitCXXOperatorCallExpr(const CXXOperatorCallExpr *CE) {
1996  for (unsigned I = CE->getNumArgs(); I > 1 /* Yes, this is 1 */; --I)
1997    AddStmt(CE->getArg(I-1));
1998  AddStmt(CE->getCallee());
1999  AddStmt(CE->getArg(0));
2000}
2001void EnqueueVisitor::VisitCXXPseudoDestructorExpr(
2002                                        const CXXPseudoDestructorExpr *E) {
2003  // Visit the name of the type being destroyed.
2004  AddTypeLoc(E->getDestroyedTypeInfo());
2005  // Visit the scope type that looks disturbingly like the nested-name-specifier
2006  // but isn't.
2007  AddTypeLoc(E->getScopeTypeInfo());
2008  // Visit the nested-name-specifier.
2009  if (NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc())
2010    AddNestedNameSpecifierLoc(QualifierLoc);
2011  // Visit base expression.
2012  AddStmt(E->getBase());
2013}
2014void EnqueueVisitor::VisitCXXScalarValueInitExpr(
2015                                        const CXXScalarValueInitExpr *E) {
2016  AddTypeLoc(E->getTypeSourceInfo());
2017}
2018void EnqueueVisitor::VisitCXXTemporaryObjectExpr(
2019                                        const CXXTemporaryObjectExpr *E) {
2020  EnqueueChildren(E);
2021  AddTypeLoc(E->getTypeSourceInfo());
2022}
2023void EnqueueVisitor::VisitCXXTypeidExpr(const CXXTypeidExpr *E) {
2024  EnqueueChildren(E);
2025  if (E->isTypeOperand())
2026    AddTypeLoc(E->getTypeOperandSourceInfo());
2027}
2028
2029void EnqueueVisitor::VisitCXXUnresolvedConstructExpr(
2030                                        const CXXUnresolvedConstructExpr *E) {
2031  EnqueueChildren(E);
2032  AddTypeLoc(E->getTypeSourceInfo());
2033}
2034void EnqueueVisitor::VisitCXXUuidofExpr(const CXXUuidofExpr *E) {
2035  EnqueueChildren(E);
2036  if (E->isTypeOperand())
2037    AddTypeLoc(E->getTypeOperandSourceInfo());
2038}
2039
2040void EnqueueVisitor::VisitCXXCatchStmt(const CXXCatchStmt *S) {
2041  EnqueueChildren(S);
2042  AddDecl(S->getExceptionDecl());
2043}
2044
2045void EnqueueVisitor::VisitDeclRefExpr(const DeclRefExpr *DR) {
2046  if (DR->hasExplicitTemplateArgs()) {
2047    AddExplicitTemplateArgs(&DR->getExplicitTemplateArgs());
2048  }
2049  WL.push_back(DeclRefExprParts(DR, Parent));
2050}
2051void EnqueueVisitor::VisitDependentScopeDeclRefExpr(
2052                                        const DependentScopeDeclRefExpr *E) {
2053  AddExplicitTemplateArgs(E->getOptionalExplicitTemplateArgs());
2054  AddDeclarationNameInfo(E);
2055  AddNestedNameSpecifierLoc(E->getQualifierLoc());
2056}
2057void EnqueueVisitor::VisitDeclStmt(const DeclStmt *S) {
2058  unsigned size = WL.size();
2059  bool isFirst = true;
2060  for (DeclStmt::const_decl_iterator D = S->decl_begin(), DEnd = S->decl_end();
2061       D != DEnd; ++D) {
2062    AddDecl(*D, isFirst);
2063    isFirst = false;
2064  }
2065  if (size == WL.size())
2066    return;
2067  // Now reverse the entries we just added.  This will match the DFS
2068  // ordering performed by the worklist.
2069  VisitorWorkList::iterator I = WL.begin() + size, E = WL.end();
2070  std::reverse(I, E);
2071}
2072void EnqueueVisitor::VisitDesignatedInitExpr(const DesignatedInitExpr *E) {
2073  AddStmt(E->getInit());
2074  typedef DesignatedInitExpr::Designator Designator;
2075  for (DesignatedInitExpr::const_reverse_designators_iterator
2076         D = E->designators_rbegin(), DEnd = E->designators_rend();
2077         D != DEnd; ++D) {
2078    if (D->isFieldDesignator()) {
2079      if (FieldDecl *Field = D->getField())
2080        AddMemberRef(Field, D->getFieldLoc());
2081      continue;
2082    }
2083    if (D->isArrayDesignator()) {
2084      AddStmt(E->getArrayIndex(*D));
2085      continue;
2086    }
2087    assert(D->isArrayRangeDesignator() && "Unknown designator kind");
2088    AddStmt(E->getArrayRangeEnd(*D));
2089    AddStmt(E->getArrayRangeStart(*D));
2090  }
2091}
2092void EnqueueVisitor::VisitExplicitCastExpr(const ExplicitCastExpr *E) {
2093  EnqueueChildren(E);
2094  AddTypeLoc(E->getTypeInfoAsWritten());
2095}
2096void EnqueueVisitor::VisitForStmt(const ForStmt *FS) {
2097  AddStmt(FS->getBody());
2098  AddStmt(FS->getInc());
2099  AddStmt(FS->getCond());
2100  AddDecl(FS->getConditionVariable());
2101  AddStmt(FS->getInit());
2102}
2103void EnqueueVisitor::VisitGotoStmt(const GotoStmt *GS) {
2104  WL.push_back(LabelRefVisit(GS->getLabel(), GS->getLabelLoc(), Parent));
2105}
2106void EnqueueVisitor::VisitIfStmt(const IfStmt *If) {
2107  AddStmt(If->getElse());
2108  AddStmt(If->getThen());
2109  AddStmt(If->getCond());
2110  AddDecl(If->getConditionVariable());
2111}
2112void EnqueueVisitor::VisitInitListExpr(const InitListExpr *IE) {
2113  // We care about the syntactic form of the initializer list, only.
2114  if (InitListExpr *Syntactic = IE->getSyntacticForm())
2115    IE = Syntactic;
2116  EnqueueChildren(IE);
2117}
2118void EnqueueVisitor::VisitMemberExpr(const MemberExpr *M) {
2119  WL.push_back(MemberExprParts(M, Parent));
2120
2121  // If the base of the member access expression is an implicit 'this', don't
2122  // visit it.
2123  // FIXME: If we ever want to show these implicit accesses, this will be
2124  // unfortunate. However, clang_getCursor() relies on this behavior.
2125  if (!M->isImplicitAccess())
2126    AddStmt(M->getBase());
2127}
2128void EnqueueVisitor::VisitObjCEncodeExpr(const ObjCEncodeExpr *E) {
2129  AddTypeLoc(E->getEncodedTypeSourceInfo());
2130}
2131void EnqueueVisitor::VisitObjCMessageExpr(const ObjCMessageExpr *M) {
2132  EnqueueChildren(M);
2133  AddTypeLoc(M->getClassReceiverTypeInfo());
2134}
2135void EnqueueVisitor::VisitOffsetOfExpr(const OffsetOfExpr *E) {
2136  // Visit the components of the offsetof expression.
2137  for (unsigned N = E->getNumComponents(), I = N; I > 0; --I) {
2138    typedef OffsetOfExpr::OffsetOfNode OffsetOfNode;
2139    const OffsetOfNode &Node = E->getComponent(I-1);
2140    switch (Node.getKind()) {
2141    case OffsetOfNode::Array:
2142      AddStmt(E->getIndexExpr(Node.getArrayExprIndex()));
2143      break;
2144    case OffsetOfNode::Field:
2145      AddMemberRef(Node.getField(), Node.getSourceRange().getEnd());
2146      break;
2147    case OffsetOfNode::Identifier:
2148    case OffsetOfNode::Base:
2149      continue;
2150    }
2151  }
2152  // Visit the type into which we're computing the offset.
2153  AddTypeLoc(E->getTypeSourceInfo());
2154}
2155void EnqueueVisitor::VisitOverloadExpr(const OverloadExpr *E) {
2156  AddExplicitTemplateArgs(E->getOptionalExplicitTemplateArgs());
2157  WL.push_back(OverloadExprParts(E, Parent));
2158}
2159void EnqueueVisitor::VisitUnaryExprOrTypeTraitExpr(
2160                                        const UnaryExprOrTypeTraitExpr *E) {
2161  EnqueueChildren(E);
2162  if (E->isArgumentType())
2163    AddTypeLoc(E->getArgumentTypeInfo());
2164}
2165void EnqueueVisitor::VisitStmt(const Stmt *S) {
2166  EnqueueChildren(S);
2167}
2168void EnqueueVisitor::VisitSwitchStmt(const SwitchStmt *S) {
2169  AddStmt(S->getBody());
2170  AddStmt(S->getCond());
2171  AddDecl(S->getConditionVariable());
2172}
2173
2174void EnqueueVisitor::VisitWhileStmt(const WhileStmt *W) {
2175  AddStmt(W->getBody());
2176  AddStmt(W->getCond());
2177  AddDecl(W->getConditionVariable());
2178}
2179
2180void EnqueueVisitor::VisitUnaryTypeTraitExpr(const UnaryTypeTraitExpr *E) {
2181  AddTypeLoc(E->getQueriedTypeSourceInfo());
2182}
2183
2184void EnqueueVisitor::VisitBinaryTypeTraitExpr(const BinaryTypeTraitExpr *E) {
2185  AddTypeLoc(E->getRhsTypeSourceInfo());
2186  AddTypeLoc(E->getLhsTypeSourceInfo());
2187}
2188
2189void EnqueueVisitor::VisitTypeTraitExpr(const TypeTraitExpr *E) {
2190  for (unsigned I = E->getNumArgs(); I > 0; --I)
2191    AddTypeLoc(E->getArg(I-1));
2192}
2193
2194void EnqueueVisitor::VisitArrayTypeTraitExpr(const ArrayTypeTraitExpr *E) {
2195  AddTypeLoc(E->getQueriedTypeSourceInfo());
2196}
2197
2198void EnqueueVisitor::VisitExpressionTraitExpr(const ExpressionTraitExpr *E) {
2199  EnqueueChildren(E);
2200}
2201
2202void EnqueueVisitor::VisitUnresolvedMemberExpr(const UnresolvedMemberExpr *U) {
2203  VisitOverloadExpr(U);
2204  if (!U->isImplicitAccess())
2205    AddStmt(U->getBase());
2206}
2207void EnqueueVisitor::VisitVAArgExpr(const VAArgExpr *E) {
2208  AddStmt(E->getSubExpr());
2209  AddTypeLoc(E->getWrittenTypeInfo());
2210}
2211void EnqueueVisitor::VisitSizeOfPackExpr(const SizeOfPackExpr *E) {
2212  WL.push_back(SizeOfPackExprParts(E, Parent));
2213}
2214void EnqueueVisitor::VisitOpaqueValueExpr(const OpaqueValueExpr *E) {
2215  // If the opaque value has a source expression, just transparently
2216  // visit that.  This is useful for (e.g.) pseudo-object expressions.
2217  if (Expr *SourceExpr = E->getSourceExpr())
2218    return Visit(SourceExpr);
2219}
2220void EnqueueVisitor::VisitLambdaExpr(const LambdaExpr *E) {
2221  AddStmt(E->getBody());
2222  WL.push_back(LambdaExprParts(E, Parent));
2223}
2224void EnqueueVisitor::VisitPseudoObjectExpr(const PseudoObjectExpr *E) {
2225  // Treat the expression like its syntactic form.
2226  Visit(E->getSyntacticForm());
2227}
2228
2229void EnqueueVisitor::VisitOMPExecutableDirective(
2230  const OMPExecutableDirective *D) {
2231  EnqueueChildren(D);
2232  for (ArrayRef<OMPClause *>::iterator I = D->clauses().begin(),
2233                                       E = D->clauses().end();
2234       I != E; ++I)
2235    EnqueueChildren(*I);
2236}
2237
2238void EnqueueVisitor::VisitOMPParallelDirective(const OMPParallelDirective *D) {
2239  VisitOMPExecutableDirective(D);
2240}
2241
2242void CursorVisitor::EnqueueWorkList(VisitorWorkList &WL, const Stmt *S) {
2243  EnqueueVisitor(WL, MakeCXCursor(S, StmtParent, TU,RegionOfInterest)).Visit(S);
2244}
2245
2246bool CursorVisitor::IsInRegionOfInterest(CXCursor C) {
2247  if (RegionOfInterest.isValid()) {
2248    SourceRange Range = getRawCursorExtent(C);
2249    if (Range.isInvalid() || CompareRegionOfInterest(Range))
2250      return false;
2251  }
2252  return true;
2253}
2254
2255bool CursorVisitor::RunVisitorWorkList(VisitorWorkList &WL) {
2256  while (!WL.empty()) {
2257    // Dequeue the worklist item.
2258    VisitorJob LI = WL.back();
2259    WL.pop_back();
2260
2261    // Set the Parent field, then back to its old value once we're done.
2262    SetParentRAII SetParent(Parent, StmtParent, LI.getParent());
2263
2264    switch (LI.getKind()) {
2265      case VisitorJob::DeclVisitKind: {
2266        const Decl *D = cast<DeclVisit>(&LI)->get();
2267        if (!D)
2268          continue;
2269
2270        // For now, perform default visitation for Decls.
2271        if (Visit(MakeCXCursor(D, TU, RegionOfInterest,
2272                               cast<DeclVisit>(&LI)->isFirst())))
2273            return true;
2274
2275        continue;
2276      }
2277      case VisitorJob::ExplicitTemplateArgsVisitKind: {
2278        const ASTTemplateArgumentListInfo *ArgList =
2279          cast<ExplicitTemplateArgsVisit>(&LI)->get();
2280        for (const TemplateArgumentLoc *Arg = ArgList->getTemplateArgs(),
2281               *ArgEnd = Arg + ArgList->NumTemplateArgs;
2282               Arg != ArgEnd; ++Arg) {
2283          if (VisitTemplateArgumentLoc(*Arg))
2284            return true;
2285        }
2286        continue;
2287      }
2288      case VisitorJob::TypeLocVisitKind: {
2289        // Perform default visitation for TypeLocs.
2290        if (Visit(cast<TypeLocVisit>(&LI)->get()))
2291          return true;
2292        continue;
2293      }
2294      case VisitorJob::LabelRefVisitKind: {
2295        const LabelDecl *LS = cast<LabelRefVisit>(&LI)->get();
2296        if (LabelStmt *stmt = LS->getStmt()) {
2297          if (Visit(MakeCursorLabelRef(stmt, cast<LabelRefVisit>(&LI)->getLoc(),
2298                                       TU))) {
2299            return true;
2300          }
2301        }
2302        continue;
2303      }
2304
2305      case VisitorJob::NestedNameSpecifierLocVisitKind: {
2306        NestedNameSpecifierLocVisit *V = cast<NestedNameSpecifierLocVisit>(&LI);
2307        if (VisitNestedNameSpecifierLoc(V->get()))
2308          return true;
2309        continue;
2310      }
2311
2312      case VisitorJob::DeclarationNameInfoVisitKind: {
2313        if (VisitDeclarationNameInfo(cast<DeclarationNameInfoVisit>(&LI)
2314                                     ->get()))
2315          return true;
2316        continue;
2317      }
2318      case VisitorJob::MemberRefVisitKind: {
2319        MemberRefVisit *V = cast<MemberRefVisit>(&LI);
2320        if (Visit(MakeCursorMemberRef(V->get(), V->getLoc(), TU)))
2321          return true;
2322        continue;
2323      }
2324      case VisitorJob::StmtVisitKind: {
2325        const Stmt *S = cast<StmtVisit>(&LI)->get();
2326        if (!S)
2327          continue;
2328
2329        // Update the current cursor.
2330        CXCursor Cursor = MakeCXCursor(S, StmtParent, TU, RegionOfInterest);
2331        if (!IsInRegionOfInterest(Cursor))
2332          continue;
2333        switch (Visitor(Cursor, Parent, ClientData)) {
2334          case CXChildVisit_Break: return true;
2335          case CXChildVisit_Continue: break;
2336          case CXChildVisit_Recurse:
2337            if (PostChildrenVisitor)
2338              WL.push_back(PostChildrenVisit(0, Cursor));
2339            EnqueueWorkList(WL, S);
2340            break;
2341        }
2342        continue;
2343      }
2344      case VisitorJob::MemberExprPartsKind: {
2345        // Handle the other pieces in the MemberExpr besides the base.
2346        const MemberExpr *M = cast<MemberExprParts>(&LI)->get();
2347
2348        // Visit the nested-name-specifier
2349        if (NestedNameSpecifierLoc QualifierLoc = M->getQualifierLoc())
2350          if (VisitNestedNameSpecifierLoc(QualifierLoc))
2351            return true;
2352
2353        // Visit the declaration name.
2354        if (VisitDeclarationNameInfo(M->getMemberNameInfo()))
2355          return true;
2356
2357        // Visit the explicitly-specified template arguments, if any.
2358        if (M->hasExplicitTemplateArgs()) {
2359          for (const TemplateArgumentLoc *Arg = M->getTemplateArgs(),
2360               *ArgEnd = Arg + M->getNumTemplateArgs();
2361               Arg != ArgEnd; ++Arg) {
2362            if (VisitTemplateArgumentLoc(*Arg))
2363              return true;
2364          }
2365        }
2366        continue;
2367      }
2368      case VisitorJob::DeclRefExprPartsKind: {
2369        const DeclRefExpr *DR = cast<DeclRefExprParts>(&LI)->get();
2370        // Visit nested-name-specifier, if present.
2371        if (NestedNameSpecifierLoc QualifierLoc = DR->getQualifierLoc())
2372          if (VisitNestedNameSpecifierLoc(QualifierLoc))
2373            return true;
2374        // Visit declaration name.
2375        if (VisitDeclarationNameInfo(DR->getNameInfo()))
2376          return true;
2377        continue;
2378      }
2379      case VisitorJob::OverloadExprPartsKind: {
2380        const OverloadExpr *O = cast<OverloadExprParts>(&LI)->get();
2381        // Visit the nested-name-specifier.
2382        if (NestedNameSpecifierLoc QualifierLoc = O->getQualifierLoc())
2383          if (VisitNestedNameSpecifierLoc(QualifierLoc))
2384            return true;
2385        // Visit the declaration name.
2386        if (VisitDeclarationNameInfo(O->getNameInfo()))
2387          return true;
2388        // Visit the overloaded declaration reference.
2389        if (Visit(MakeCursorOverloadedDeclRef(O, TU)))
2390          return true;
2391        continue;
2392      }
2393      case VisitorJob::SizeOfPackExprPartsKind: {
2394        const SizeOfPackExpr *E = cast<SizeOfPackExprParts>(&LI)->get();
2395        NamedDecl *Pack = E->getPack();
2396        if (isa<TemplateTypeParmDecl>(Pack)) {
2397          if (Visit(MakeCursorTypeRef(cast<TemplateTypeParmDecl>(Pack),
2398                                      E->getPackLoc(), TU)))
2399            return true;
2400
2401          continue;
2402        }
2403
2404        if (isa<TemplateTemplateParmDecl>(Pack)) {
2405          if (Visit(MakeCursorTemplateRef(cast<TemplateTemplateParmDecl>(Pack),
2406                                          E->getPackLoc(), TU)))
2407            return true;
2408
2409          continue;
2410        }
2411
2412        // Non-type template parameter packs and function parameter packs are
2413        // treated like DeclRefExpr cursors.
2414        continue;
2415      }
2416
2417      case VisitorJob::LambdaExprPartsKind: {
2418        // Visit captures.
2419        const LambdaExpr *E = cast<LambdaExprParts>(&LI)->get();
2420        for (LambdaExpr::capture_iterator C = E->explicit_capture_begin(),
2421                                       CEnd = E->explicit_capture_end();
2422             C != CEnd; ++C) {
2423          // FIXME: Lambda init-captures.
2424          if (!C->capturesVariable())
2425            continue;
2426
2427          if (Visit(MakeCursorVariableRef(C->getCapturedVar(),
2428                                          C->getLocation(),
2429                                          TU)))
2430            return true;
2431        }
2432
2433        // Visit parameters and return type, if present.
2434        if (E->hasExplicitParameters() || E->hasExplicitResultType()) {
2435          TypeLoc TL = E->getCallOperator()->getTypeSourceInfo()->getTypeLoc();
2436          if (E->hasExplicitParameters() && E->hasExplicitResultType()) {
2437            // Visit the whole type.
2438            if (Visit(TL))
2439              return true;
2440          } else if (FunctionProtoTypeLoc Proto =
2441                         TL.getAs<FunctionProtoTypeLoc>()) {
2442            if (E->hasExplicitParameters()) {
2443              // Visit parameters.
2444              for (unsigned I = 0, N = Proto.getNumArgs(); I != N; ++I)
2445                if (Visit(MakeCXCursor(Proto.getArg(I), TU)))
2446                  return true;
2447            } else {
2448              // Visit result type.
2449              if (Visit(Proto.getResultLoc()))
2450                return true;
2451            }
2452          }
2453        }
2454        break;
2455      }
2456
2457      case VisitorJob::PostChildrenVisitKind:
2458        if (PostChildrenVisitor(Parent, ClientData))
2459          return true;
2460        break;
2461    }
2462  }
2463  return false;
2464}
2465
2466bool CursorVisitor::Visit(const Stmt *S) {
2467  VisitorWorkList *WL = 0;
2468  if (!WorkListFreeList.empty()) {
2469    WL = WorkListFreeList.back();
2470    WL->clear();
2471    WorkListFreeList.pop_back();
2472  }
2473  else {
2474    WL = new VisitorWorkList();
2475    WorkListCache.push_back(WL);
2476  }
2477  EnqueueWorkList(*WL, S);
2478  bool result = RunVisitorWorkList(*WL);
2479  WorkListFreeList.push_back(WL);
2480  return result;
2481}
2482
2483namespace {
2484typedef SmallVector<SourceRange, 4> RefNamePieces;
2485RefNamePieces buildPieces(unsigned NameFlags, bool IsMemberRefExpr,
2486                          const DeclarationNameInfo &NI,
2487                          const SourceRange &QLoc,
2488                          const ASTTemplateArgumentListInfo *TemplateArgs = 0){
2489  const bool WantQualifier = NameFlags & CXNameRange_WantQualifier;
2490  const bool WantTemplateArgs = NameFlags & CXNameRange_WantTemplateArgs;
2491  const bool WantSinglePiece = NameFlags & CXNameRange_WantSinglePiece;
2492
2493  const DeclarationName::NameKind Kind = NI.getName().getNameKind();
2494
2495  RefNamePieces Pieces;
2496
2497  if (WantQualifier && QLoc.isValid())
2498    Pieces.push_back(QLoc);
2499
2500  if (Kind != DeclarationName::CXXOperatorName || IsMemberRefExpr)
2501    Pieces.push_back(NI.getLoc());
2502
2503  if (WantTemplateArgs && TemplateArgs)
2504    Pieces.push_back(SourceRange(TemplateArgs->LAngleLoc,
2505                                 TemplateArgs->RAngleLoc));
2506
2507  if (Kind == DeclarationName::CXXOperatorName) {
2508    Pieces.push_back(SourceLocation::getFromRawEncoding(
2509                       NI.getInfo().CXXOperatorName.BeginOpNameLoc));
2510    Pieces.push_back(SourceLocation::getFromRawEncoding(
2511                       NI.getInfo().CXXOperatorName.EndOpNameLoc));
2512  }
2513
2514  if (WantSinglePiece) {
2515    SourceRange R(Pieces.front().getBegin(), Pieces.back().getEnd());
2516    Pieces.clear();
2517    Pieces.push_back(R);
2518  }
2519
2520  return Pieces;
2521}
2522}
2523
2524//===----------------------------------------------------------------------===//
2525// Misc. API hooks.
2526//===----------------------------------------------------------------------===//
2527
2528static llvm::sys::Mutex EnableMultithreadingMutex;
2529static bool EnabledMultithreading;
2530
2531static void fatal_error_handler(void *user_data, const std::string& reason,
2532                                bool gen_crash_diag) {
2533  // Write the result out to stderr avoiding errs() because raw_ostreams can
2534  // call report_fatal_error.
2535  fprintf(stderr, "LIBCLANG FATAL ERROR: %s\n", reason.c_str());
2536  ::abort();
2537}
2538
2539extern "C" {
2540CXIndex clang_createIndex(int excludeDeclarationsFromPCH,
2541                          int displayDiagnostics) {
2542  // Disable pretty stack trace functionality, which will otherwise be a very
2543  // poor citizen of the world and set up all sorts of signal handlers.
2544  llvm::DisablePrettyStackTrace = true;
2545
2546  // We use crash recovery to make some of our APIs more reliable, implicitly
2547  // enable it.
2548  llvm::CrashRecoveryContext::Enable();
2549
2550  // Enable support for multithreading in LLVM.
2551  {
2552    llvm::sys::ScopedLock L(EnableMultithreadingMutex);
2553    if (!EnabledMultithreading) {
2554      llvm::install_fatal_error_handler(fatal_error_handler, 0);
2555      llvm::llvm_start_multithreaded();
2556      EnabledMultithreading = true;
2557    }
2558  }
2559
2560  CIndexer *CIdxr = new CIndexer();
2561  if (excludeDeclarationsFromPCH)
2562    CIdxr->setOnlyLocalDecls();
2563  if (displayDiagnostics)
2564    CIdxr->setDisplayDiagnostics();
2565
2566  if (getenv("LIBCLANG_BGPRIO_INDEX"))
2567    CIdxr->setCXGlobalOptFlags(CIdxr->getCXGlobalOptFlags() |
2568                               CXGlobalOpt_ThreadBackgroundPriorityForIndexing);
2569  if (getenv("LIBCLANG_BGPRIO_EDIT"))
2570    CIdxr->setCXGlobalOptFlags(CIdxr->getCXGlobalOptFlags() |
2571                               CXGlobalOpt_ThreadBackgroundPriorityForEditing);
2572
2573  return CIdxr;
2574}
2575
2576void clang_disposeIndex(CXIndex CIdx) {
2577  if (CIdx)
2578    delete static_cast<CIndexer *>(CIdx);
2579}
2580
2581void clang_CXIndex_setGlobalOptions(CXIndex CIdx, unsigned options) {
2582  if (CIdx)
2583    static_cast<CIndexer *>(CIdx)->setCXGlobalOptFlags(options);
2584}
2585
2586unsigned clang_CXIndex_getGlobalOptions(CXIndex CIdx) {
2587  if (CIdx)
2588    return static_cast<CIndexer *>(CIdx)->getCXGlobalOptFlags();
2589  return 0;
2590}
2591
2592void clang_toggleCrashRecovery(unsigned isEnabled) {
2593  if (isEnabled)
2594    llvm::CrashRecoveryContext::Enable();
2595  else
2596    llvm::CrashRecoveryContext::Disable();
2597}
2598
2599CXTranslationUnit clang_createTranslationUnit(CXIndex CIdx,
2600                                              const char *ast_filename) {
2601  if (!CIdx || !ast_filename)
2602    return 0;
2603
2604  LOG_FUNC_SECTION {
2605    *Log << ast_filename;
2606  }
2607
2608  CIndexer *CXXIdx = static_cast<CIndexer *>(CIdx);
2609  FileSystemOptions FileSystemOpts;
2610
2611  IntrusiveRefCntPtr<DiagnosticsEngine> Diags;
2612  ASTUnit *TU = ASTUnit::LoadFromASTFile(ast_filename, Diags, FileSystemOpts,
2613                                  CXXIdx->getOnlyLocalDecls(),
2614                                  0, 0,
2615                                  /*CaptureDiagnostics=*/true,
2616                                  /*AllowPCHWithCompilerErrors=*/true,
2617                                  /*UserFilesAreVolatile=*/true);
2618  return MakeCXTranslationUnit(CXXIdx, TU);
2619}
2620
2621unsigned clang_defaultEditingTranslationUnitOptions() {
2622  return CXTranslationUnit_PrecompiledPreamble |
2623         CXTranslationUnit_CacheCompletionResults;
2624}
2625
2626CXTranslationUnit
2627clang_createTranslationUnitFromSourceFile(CXIndex CIdx,
2628                                          const char *source_filename,
2629                                          int num_command_line_args,
2630                                          const char * const *command_line_args,
2631                                          unsigned num_unsaved_files,
2632                                          struct CXUnsavedFile *unsaved_files) {
2633  unsigned Options = CXTranslationUnit_DetailedPreprocessingRecord;
2634  return clang_parseTranslationUnit(CIdx, source_filename,
2635                                    command_line_args, num_command_line_args,
2636                                    unsaved_files, num_unsaved_files,
2637                                    Options);
2638}
2639
2640struct ParseTranslationUnitInfo {
2641  CXIndex CIdx;
2642  const char *source_filename;
2643  const char *const *command_line_args;
2644  int num_command_line_args;
2645  struct CXUnsavedFile *unsaved_files;
2646  unsigned num_unsaved_files;
2647  unsigned options;
2648  CXTranslationUnit result;
2649};
2650static void clang_parseTranslationUnit_Impl(void *UserData) {
2651  ParseTranslationUnitInfo *PTUI =
2652    static_cast<ParseTranslationUnitInfo*>(UserData);
2653  CXIndex CIdx = PTUI->CIdx;
2654  const char *source_filename = PTUI->source_filename;
2655  const char * const *command_line_args = PTUI->command_line_args;
2656  int num_command_line_args = PTUI->num_command_line_args;
2657  struct CXUnsavedFile *unsaved_files = PTUI->unsaved_files;
2658  unsigned num_unsaved_files = PTUI->num_unsaved_files;
2659  unsigned options = PTUI->options;
2660  PTUI->result = 0;
2661
2662  if (!CIdx)
2663    return;
2664
2665  CIndexer *CXXIdx = static_cast<CIndexer *>(CIdx);
2666
2667  if (CXXIdx->isOptEnabled(CXGlobalOpt_ThreadBackgroundPriorityForIndexing))
2668    setThreadBackgroundPriority();
2669
2670  bool PrecompilePreamble = options & CXTranslationUnit_PrecompiledPreamble;
2671  // FIXME: Add a flag for modules.
2672  TranslationUnitKind TUKind
2673    = (options & CXTranslationUnit_Incomplete)? TU_Prefix : TU_Complete;
2674  bool CacheCodeCompetionResults
2675    = options & CXTranslationUnit_CacheCompletionResults;
2676  bool IncludeBriefCommentsInCodeCompletion
2677    = options & CXTranslationUnit_IncludeBriefCommentsInCodeCompletion;
2678  bool SkipFunctionBodies = options & CXTranslationUnit_SkipFunctionBodies;
2679  bool ForSerialization = options & CXTranslationUnit_ForSerialization;
2680
2681  // Configure the diagnostics.
2682  IntrusiveRefCntPtr<DiagnosticsEngine>
2683    Diags(CompilerInstance::createDiagnostics(new DiagnosticOptions));
2684
2685  // Recover resources if we crash before exiting this function.
2686  llvm::CrashRecoveryContextCleanupRegistrar<DiagnosticsEngine,
2687    llvm::CrashRecoveryContextReleaseRefCleanup<DiagnosticsEngine> >
2688    DiagCleanup(Diags.getPtr());
2689
2690  OwningPtr<std::vector<ASTUnit::RemappedFile> >
2691    RemappedFiles(new std::vector<ASTUnit::RemappedFile>());
2692
2693  // Recover resources if we crash before exiting this function.
2694  llvm::CrashRecoveryContextCleanupRegistrar<
2695    std::vector<ASTUnit::RemappedFile> > RemappedCleanup(RemappedFiles.get());
2696
2697  for (unsigned I = 0; I != num_unsaved_files; ++I) {
2698    StringRef Data(unsaved_files[I].Contents, unsaved_files[I].Length);
2699    const llvm::MemoryBuffer *Buffer
2700      = llvm::MemoryBuffer::getMemBufferCopy(Data, unsaved_files[I].Filename);
2701    RemappedFiles->push_back(std::make_pair(unsaved_files[I].Filename,
2702                                            Buffer));
2703  }
2704
2705  OwningPtr<std::vector<const char *> >
2706    Args(new std::vector<const char*>());
2707
2708  // Recover resources if we crash before exiting this method.
2709  llvm::CrashRecoveryContextCleanupRegistrar<std::vector<const char*> >
2710    ArgsCleanup(Args.get());
2711
2712  // Since the Clang C library is primarily used by batch tools dealing with
2713  // (often very broken) source code, where spell-checking can have a
2714  // significant negative impact on performance (particularly when
2715  // precompiled headers are involved), we disable it by default.
2716  // Only do this if we haven't found a spell-checking-related argument.
2717  bool FoundSpellCheckingArgument = false;
2718  for (int I = 0; I != num_command_line_args; ++I) {
2719    if (strcmp(command_line_args[I], "-fno-spell-checking") == 0 ||
2720        strcmp(command_line_args[I], "-fspell-checking") == 0) {
2721      FoundSpellCheckingArgument = true;
2722      break;
2723    }
2724  }
2725  if (!FoundSpellCheckingArgument)
2726    Args->push_back("-fno-spell-checking");
2727
2728  Args->insert(Args->end(), command_line_args,
2729               command_line_args + num_command_line_args);
2730
2731  // The 'source_filename' argument is optional.  If the caller does not
2732  // specify it then it is assumed that the source file is specified
2733  // in the actual argument list.
2734  // Put the source file after command_line_args otherwise if '-x' flag is
2735  // present it will be unused.
2736  if (source_filename)
2737    Args->push_back(source_filename);
2738
2739  // Do we need the detailed preprocessing record?
2740  if (options & CXTranslationUnit_DetailedPreprocessingRecord) {
2741    Args->push_back("-Xclang");
2742    Args->push_back("-detailed-preprocessing-record");
2743  }
2744
2745  unsigned NumErrors = Diags->getClient()->getNumErrors();
2746  OwningPtr<ASTUnit> ErrUnit;
2747  OwningPtr<ASTUnit> Unit(
2748    ASTUnit::LoadFromCommandLine(Args->size() ? &(*Args)[0] : 0
2749                                 /* vector::data() not portable */,
2750                                 Args->size() ? (&(*Args)[0] + Args->size()) :0,
2751                                 Diags,
2752                                 CXXIdx->getClangResourcesPath(),
2753                                 CXXIdx->getOnlyLocalDecls(),
2754                                 /*CaptureDiagnostics=*/true,
2755                                 RemappedFiles->size() ? &(*RemappedFiles)[0]:0,
2756                                 RemappedFiles->size(),
2757                                 /*RemappedFilesKeepOriginalName=*/true,
2758                                 PrecompilePreamble,
2759                                 TUKind,
2760                                 CacheCodeCompetionResults,
2761                                 IncludeBriefCommentsInCodeCompletion,
2762                                 /*AllowPCHWithCompilerErrors=*/true,
2763                                 SkipFunctionBodies,
2764                                 /*UserFilesAreVolatile=*/true,
2765                                 ForSerialization,
2766                                 &ErrUnit));
2767
2768  if (NumErrors != Diags->getClient()->getNumErrors()) {
2769    // Make sure to check that 'Unit' is non-NULL.
2770    if (CXXIdx->getDisplayDiagnostics())
2771      printDiagsToStderr(Unit ? Unit.get() : ErrUnit.get());
2772  }
2773
2774  PTUI->result = MakeCXTranslationUnit(CXXIdx, Unit.take());
2775}
2776CXTranslationUnit clang_parseTranslationUnit(CXIndex CIdx,
2777                                             const char *source_filename,
2778                                         const char * const *command_line_args,
2779                                             int num_command_line_args,
2780                                            struct CXUnsavedFile *unsaved_files,
2781                                             unsigned num_unsaved_files,
2782                                             unsigned options) {
2783  LOG_FUNC_SECTION {
2784    *Log << source_filename << ": ";
2785    for (int i = 0; i != num_command_line_args; ++i)
2786      *Log << command_line_args[i] << " ";
2787  }
2788
2789  ParseTranslationUnitInfo PTUI = { CIdx, source_filename, command_line_args,
2790                                    num_command_line_args, unsaved_files,
2791                                    num_unsaved_files, options, 0 };
2792  llvm::CrashRecoveryContext CRC;
2793
2794  if (!RunSafely(CRC, clang_parseTranslationUnit_Impl, &PTUI)) {
2795    fprintf(stderr, "libclang: crash detected during parsing: {\n");
2796    fprintf(stderr, "  'source_filename' : '%s'\n", source_filename);
2797    fprintf(stderr, "  'command_line_args' : [");
2798    for (int i = 0; i != num_command_line_args; ++i) {
2799      if (i)
2800        fprintf(stderr, ", ");
2801      fprintf(stderr, "'%s'", command_line_args[i]);
2802    }
2803    fprintf(stderr, "],\n");
2804    fprintf(stderr, "  'unsaved_files' : [");
2805    for (unsigned i = 0; i != num_unsaved_files; ++i) {
2806      if (i)
2807        fprintf(stderr, ", ");
2808      fprintf(stderr, "('%s', '...', %ld)", unsaved_files[i].Filename,
2809              unsaved_files[i].Length);
2810    }
2811    fprintf(stderr, "],\n");
2812    fprintf(stderr, "  'options' : %d,\n", options);
2813    fprintf(stderr, "}\n");
2814
2815    return 0;
2816  } else if (getenv("LIBCLANG_RESOURCE_USAGE")) {
2817    PrintLibclangResourceUsage(PTUI.result);
2818  }
2819
2820  return PTUI.result;
2821}
2822
2823unsigned clang_defaultSaveOptions(CXTranslationUnit TU) {
2824  return CXSaveTranslationUnit_None;
2825}
2826
2827namespace {
2828
2829struct SaveTranslationUnitInfo {
2830  CXTranslationUnit TU;
2831  const char *FileName;
2832  unsigned options;
2833  CXSaveError result;
2834};
2835
2836}
2837
2838static void clang_saveTranslationUnit_Impl(void *UserData) {
2839  SaveTranslationUnitInfo *STUI =
2840    static_cast<SaveTranslationUnitInfo*>(UserData);
2841
2842  CIndexer *CXXIdx = STUI->TU->CIdx;
2843  if (CXXIdx->isOptEnabled(CXGlobalOpt_ThreadBackgroundPriorityForIndexing))
2844    setThreadBackgroundPriority();
2845
2846  bool hadError = cxtu::getASTUnit(STUI->TU)->Save(STUI->FileName);
2847  STUI->result = hadError ? CXSaveError_Unknown : CXSaveError_None;
2848}
2849
2850int clang_saveTranslationUnit(CXTranslationUnit TU, const char *FileName,
2851                              unsigned options) {
2852  LOG_FUNC_SECTION {
2853    *Log << TU << ' ' << FileName;
2854  }
2855
2856  if (!TU)
2857    return CXSaveError_InvalidTU;
2858
2859  ASTUnit *CXXUnit = cxtu::getASTUnit(TU);
2860  ASTUnit::ConcurrencyCheck Check(*CXXUnit);
2861  if (!CXXUnit->hasSema())
2862    return CXSaveError_InvalidTU;
2863
2864  SaveTranslationUnitInfo STUI = { TU, FileName, options, CXSaveError_None };
2865
2866  if (!CXXUnit->getDiagnostics().hasUnrecoverableErrorOccurred() ||
2867      getenv("LIBCLANG_NOTHREADS")) {
2868    clang_saveTranslationUnit_Impl(&STUI);
2869
2870    if (getenv("LIBCLANG_RESOURCE_USAGE"))
2871      PrintLibclangResourceUsage(TU);
2872
2873    return STUI.result;
2874  }
2875
2876  // We have an AST that has invalid nodes due to compiler errors.
2877  // Use a crash recovery thread for protection.
2878
2879  llvm::CrashRecoveryContext CRC;
2880
2881  if (!RunSafely(CRC, clang_saveTranslationUnit_Impl, &STUI)) {
2882    fprintf(stderr, "libclang: crash detected during AST saving: {\n");
2883    fprintf(stderr, "  'filename' : '%s'\n", FileName);
2884    fprintf(stderr, "  'options' : %d,\n", options);
2885    fprintf(stderr, "}\n");
2886
2887    return CXSaveError_Unknown;
2888
2889  } else if (getenv("LIBCLANG_RESOURCE_USAGE")) {
2890    PrintLibclangResourceUsage(TU);
2891  }
2892
2893  return STUI.result;
2894}
2895
2896void clang_disposeTranslationUnit(CXTranslationUnit CTUnit) {
2897  if (CTUnit) {
2898    // If the translation unit has been marked as unsafe to free, just discard
2899    // it.
2900    if (cxtu::getASTUnit(CTUnit)->isUnsafeToFree())
2901      return;
2902
2903    delete cxtu::getASTUnit(CTUnit);
2904    delete CTUnit->StringPool;
2905    delete static_cast<CXDiagnosticSetImpl *>(CTUnit->Diagnostics);
2906    disposeOverridenCXCursorsPool(CTUnit->OverridenCursorsPool);
2907    delete CTUnit->FormatContext;
2908    delete CTUnit;
2909  }
2910}
2911
2912unsigned clang_defaultReparseOptions(CXTranslationUnit TU) {
2913  return CXReparse_None;
2914}
2915
2916struct ReparseTranslationUnitInfo {
2917  CXTranslationUnit TU;
2918  unsigned num_unsaved_files;
2919  struct CXUnsavedFile *unsaved_files;
2920  unsigned options;
2921  int result;
2922};
2923
2924static void clang_reparseTranslationUnit_Impl(void *UserData) {
2925  ReparseTranslationUnitInfo *RTUI =
2926    static_cast<ReparseTranslationUnitInfo*>(UserData);
2927  CXTranslationUnit TU = RTUI->TU;
2928  if (!TU)
2929    return;
2930
2931  // Reset the associated diagnostics.
2932  delete static_cast<CXDiagnosticSetImpl*>(TU->Diagnostics);
2933  TU->Diagnostics = 0;
2934
2935  unsigned num_unsaved_files = RTUI->num_unsaved_files;
2936  struct CXUnsavedFile *unsaved_files = RTUI->unsaved_files;
2937  unsigned options = RTUI->options;
2938  (void) options;
2939  RTUI->result = 1;
2940
2941  CIndexer *CXXIdx = TU->CIdx;
2942  if (CXXIdx->isOptEnabled(CXGlobalOpt_ThreadBackgroundPriorityForEditing))
2943    setThreadBackgroundPriority();
2944
2945  ASTUnit *CXXUnit = cxtu::getASTUnit(TU);
2946  ASTUnit::ConcurrencyCheck Check(*CXXUnit);
2947
2948  OwningPtr<std::vector<ASTUnit::RemappedFile> >
2949    RemappedFiles(new std::vector<ASTUnit::RemappedFile>());
2950
2951  // Recover resources if we crash before exiting this function.
2952  llvm::CrashRecoveryContextCleanupRegistrar<
2953    std::vector<ASTUnit::RemappedFile> > RemappedCleanup(RemappedFiles.get());
2954
2955  for (unsigned I = 0; I != num_unsaved_files; ++I) {
2956    StringRef Data(unsaved_files[I].Contents, unsaved_files[I].Length);
2957    const llvm::MemoryBuffer *Buffer
2958      = llvm::MemoryBuffer::getMemBufferCopy(Data, unsaved_files[I].Filename);
2959    RemappedFiles->push_back(std::make_pair(unsaved_files[I].Filename,
2960                                            Buffer));
2961  }
2962
2963  if (!CXXUnit->Reparse(RemappedFiles->size() ? &(*RemappedFiles)[0] : 0,
2964                        RemappedFiles->size()))
2965    RTUI->result = 0;
2966}
2967
2968int clang_reparseTranslationUnit(CXTranslationUnit TU,
2969                                 unsigned num_unsaved_files,
2970                                 struct CXUnsavedFile *unsaved_files,
2971                                 unsigned options) {
2972  LOG_FUNC_SECTION {
2973    *Log << TU;
2974  }
2975
2976  ReparseTranslationUnitInfo RTUI = { TU, num_unsaved_files, unsaved_files,
2977                                      options, 0 };
2978
2979  if (getenv("LIBCLANG_NOTHREADS")) {
2980    clang_reparseTranslationUnit_Impl(&RTUI);
2981    return RTUI.result;
2982  }
2983
2984  llvm::CrashRecoveryContext CRC;
2985
2986  if (!RunSafely(CRC, clang_reparseTranslationUnit_Impl, &RTUI)) {
2987    fprintf(stderr, "libclang: crash detected during reparsing\n");
2988    cxtu::getASTUnit(TU)->setUnsafeToFree(true);
2989    return 1;
2990  } else if (getenv("LIBCLANG_RESOURCE_USAGE"))
2991    PrintLibclangResourceUsage(TU);
2992
2993  return RTUI.result;
2994}
2995
2996
2997CXString clang_getTranslationUnitSpelling(CXTranslationUnit CTUnit) {
2998  if (!CTUnit)
2999    return cxstring::createEmpty();
3000
3001  ASTUnit *CXXUnit = cxtu::getASTUnit(CTUnit);
3002  return cxstring::createDup(CXXUnit->getOriginalSourceFileName());
3003}
3004
3005CXCursor clang_getTranslationUnitCursor(CXTranslationUnit TU) {
3006  if (!TU)
3007    return clang_getNullCursor();
3008
3009  ASTUnit *CXXUnit = cxtu::getASTUnit(TU);
3010  return MakeCXCursor(CXXUnit->getASTContext().getTranslationUnitDecl(), TU);
3011}
3012
3013} // end: extern "C"
3014
3015//===----------------------------------------------------------------------===//
3016// CXFile Operations.
3017//===----------------------------------------------------------------------===//
3018
3019extern "C" {
3020CXString clang_getFileName(CXFile SFile) {
3021  if (!SFile)
3022    return cxstring::createNull();
3023
3024  FileEntry *FEnt = static_cast<FileEntry *>(SFile);
3025  return cxstring::createRef(FEnt->getName());
3026}
3027
3028time_t clang_getFileTime(CXFile SFile) {
3029  if (!SFile)
3030    return 0;
3031
3032  FileEntry *FEnt = static_cast<FileEntry *>(SFile);
3033  return FEnt->getModificationTime();
3034}
3035
3036CXFile clang_getFile(CXTranslationUnit TU, const char *file_name) {
3037  if (!TU)
3038    return 0;
3039
3040  ASTUnit *CXXUnit = cxtu::getASTUnit(TU);
3041
3042  FileManager &FMgr = CXXUnit->getFileManager();
3043  return const_cast<FileEntry *>(FMgr.getFile(file_name));
3044}
3045
3046unsigned clang_isFileMultipleIncludeGuarded(CXTranslationUnit TU, CXFile file) {
3047  if (!TU || !file)
3048    return 0;
3049
3050  ASTUnit *CXXUnit = cxtu::getASTUnit(TU);
3051  FileEntry *FEnt = static_cast<FileEntry *>(file);
3052  return CXXUnit->getPreprocessor().getHeaderSearchInfo()
3053                                          .isFileMultipleIncludeGuarded(FEnt);
3054}
3055
3056int clang_getFileUniqueID(CXFile file, CXFileUniqueID *outID) {
3057  if (!file || !outID)
3058    return 1;
3059
3060#ifdef LLVM_ON_WIN32
3061  return 1; // inodes not supported on windows.
3062#else
3063  FileEntry *FEnt = static_cast<FileEntry *>(file);
3064  outID->data[0] = FEnt->getDevice();
3065  outID->data[1] = FEnt->getInode();
3066  outID->data[2] = FEnt->getModificationTime();
3067  return 0;
3068#endif
3069}
3070
3071} // end: extern "C"
3072
3073//===----------------------------------------------------------------------===//
3074// CXCursor Operations.
3075//===----------------------------------------------------------------------===//
3076
3077static const Decl *getDeclFromExpr(const Stmt *E) {
3078  if (const ImplicitCastExpr *CE = dyn_cast<ImplicitCastExpr>(E))
3079    return getDeclFromExpr(CE->getSubExpr());
3080
3081  if (const DeclRefExpr *RefExpr = dyn_cast<DeclRefExpr>(E))
3082    return RefExpr->getDecl();
3083  if (const MemberExpr *ME = dyn_cast<MemberExpr>(E))
3084    return ME->getMemberDecl();
3085  if (const ObjCIvarRefExpr *RE = dyn_cast<ObjCIvarRefExpr>(E))
3086    return RE->getDecl();
3087  if (const ObjCPropertyRefExpr *PRE = dyn_cast<ObjCPropertyRefExpr>(E)) {
3088    if (PRE->isExplicitProperty())
3089      return PRE->getExplicitProperty();
3090    // It could be messaging both getter and setter as in:
3091    // ++myobj.myprop;
3092    // in which case prefer to associate the setter since it is less obvious
3093    // from inspecting the source that the setter is going to get called.
3094    if (PRE->isMessagingSetter())
3095      return PRE->getImplicitPropertySetter();
3096    return PRE->getImplicitPropertyGetter();
3097  }
3098  if (const PseudoObjectExpr *POE = dyn_cast<PseudoObjectExpr>(E))
3099    return getDeclFromExpr(POE->getSyntacticForm());
3100  if (const OpaqueValueExpr *OVE = dyn_cast<OpaqueValueExpr>(E))
3101    if (Expr *Src = OVE->getSourceExpr())
3102      return getDeclFromExpr(Src);
3103
3104  if (const CallExpr *CE = dyn_cast<CallExpr>(E))
3105    return getDeclFromExpr(CE->getCallee());
3106  if (const CXXConstructExpr *CE = dyn_cast<CXXConstructExpr>(E))
3107    if (!CE->isElidable())
3108    return CE->getConstructor();
3109  if (const ObjCMessageExpr *OME = dyn_cast<ObjCMessageExpr>(E))
3110    return OME->getMethodDecl();
3111
3112  if (const ObjCProtocolExpr *PE = dyn_cast<ObjCProtocolExpr>(E))
3113    return PE->getProtocol();
3114  if (const SubstNonTypeTemplateParmPackExpr *NTTP
3115                              = dyn_cast<SubstNonTypeTemplateParmPackExpr>(E))
3116    return NTTP->getParameterPack();
3117  if (const SizeOfPackExpr *SizeOfPack = dyn_cast<SizeOfPackExpr>(E))
3118    if (isa<NonTypeTemplateParmDecl>(SizeOfPack->getPack()) ||
3119        isa<ParmVarDecl>(SizeOfPack->getPack()))
3120      return SizeOfPack->getPack();
3121
3122  return 0;
3123}
3124
3125static SourceLocation getLocationFromExpr(const Expr *E) {
3126  if (const ImplicitCastExpr *CE = dyn_cast<ImplicitCastExpr>(E))
3127    return getLocationFromExpr(CE->getSubExpr());
3128
3129  if (const ObjCMessageExpr *Msg = dyn_cast<ObjCMessageExpr>(E))
3130    return /*FIXME:*/Msg->getLeftLoc();
3131  if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E))
3132    return DRE->getLocation();
3133  if (const MemberExpr *Member = dyn_cast<MemberExpr>(E))
3134    return Member->getMemberLoc();
3135  if (const ObjCIvarRefExpr *Ivar = dyn_cast<ObjCIvarRefExpr>(E))
3136    return Ivar->getLocation();
3137  if (const SizeOfPackExpr *SizeOfPack = dyn_cast<SizeOfPackExpr>(E))
3138    return SizeOfPack->getPackLoc();
3139  if (const ObjCPropertyRefExpr *PropRef = dyn_cast<ObjCPropertyRefExpr>(E))
3140    return PropRef->getLocation();
3141
3142  return E->getLocStart();
3143}
3144
3145extern "C" {
3146
3147unsigned clang_visitChildren(CXCursor parent,
3148                             CXCursorVisitor visitor,
3149                             CXClientData client_data) {
3150  CursorVisitor CursorVis(getCursorTU(parent), visitor, client_data,
3151                          /*VisitPreprocessorLast=*/false);
3152  return CursorVis.VisitChildren(parent);
3153}
3154
3155#ifndef __has_feature
3156#define __has_feature(x) 0
3157#endif
3158#if __has_feature(blocks)
3159typedef enum CXChildVisitResult
3160     (^CXCursorVisitorBlock)(CXCursor cursor, CXCursor parent);
3161
3162static enum CXChildVisitResult visitWithBlock(CXCursor cursor, CXCursor parent,
3163    CXClientData client_data) {
3164  CXCursorVisitorBlock block = (CXCursorVisitorBlock)client_data;
3165  return block(cursor, parent);
3166}
3167#else
3168// If we are compiled with a compiler that doesn't have native blocks support,
3169// define and call the block manually, so the
3170typedef struct _CXChildVisitResult
3171{
3172	void *isa;
3173	int flags;
3174	int reserved;
3175	enum CXChildVisitResult(*invoke)(struct _CXChildVisitResult*, CXCursor,
3176                                         CXCursor);
3177} *CXCursorVisitorBlock;
3178
3179static enum CXChildVisitResult visitWithBlock(CXCursor cursor, CXCursor parent,
3180    CXClientData client_data) {
3181  CXCursorVisitorBlock block = (CXCursorVisitorBlock)client_data;
3182  return block->invoke(block, cursor, parent);
3183}
3184#endif
3185
3186
3187unsigned clang_visitChildrenWithBlock(CXCursor parent,
3188                                      CXCursorVisitorBlock block) {
3189  return clang_visitChildren(parent, visitWithBlock, block);
3190}
3191
3192static CXString getDeclSpelling(const Decl *D) {
3193  if (!D)
3194    return cxstring::createEmpty();
3195
3196  const NamedDecl *ND = dyn_cast<NamedDecl>(D);
3197  if (!ND) {
3198    if (const ObjCPropertyImplDecl *PropImpl =
3199            dyn_cast<ObjCPropertyImplDecl>(D))
3200      if (ObjCPropertyDecl *Property = PropImpl->getPropertyDecl())
3201        return cxstring::createDup(Property->getIdentifier()->getName());
3202
3203    if (const ImportDecl *ImportD = dyn_cast<ImportDecl>(D))
3204      if (Module *Mod = ImportD->getImportedModule())
3205        return cxstring::createDup(Mod->getFullModuleName());
3206
3207    return cxstring::createEmpty();
3208  }
3209
3210  if (const ObjCMethodDecl *OMD = dyn_cast<ObjCMethodDecl>(ND))
3211    return cxstring::createDup(OMD->getSelector().getAsString());
3212
3213  if (const ObjCCategoryImplDecl *CIMP = dyn_cast<ObjCCategoryImplDecl>(ND))
3214    // No, this isn't the same as the code below. getIdentifier() is non-virtual
3215    // and returns different names. NamedDecl returns the class name and
3216    // ObjCCategoryImplDecl returns the category name.
3217    return cxstring::createRef(CIMP->getIdentifier()->getNameStart());
3218
3219  if (isa<UsingDirectiveDecl>(D))
3220    return cxstring::createEmpty();
3221
3222  SmallString<1024> S;
3223  llvm::raw_svector_ostream os(S);
3224  ND->printName(os);
3225
3226  return cxstring::createDup(os.str());
3227}
3228
3229CXString clang_getCursorSpelling(CXCursor C) {
3230  if (clang_isTranslationUnit(C.kind))
3231    return clang_getTranslationUnitSpelling(getCursorTU(C));
3232
3233  if (clang_isReference(C.kind)) {
3234    switch (C.kind) {
3235    case CXCursor_ObjCSuperClassRef: {
3236      const ObjCInterfaceDecl *Super = getCursorObjCSuperClassRef(C).first;
3237      return cxstring::createRef(Super->getIdentifier()->getNameStart());
3238    }
3239    case CXCursor_ObjCClassRef: {
3240      const ObjCInterfaceDecl *Class = getCursorObjCClassRef(C).first;
3241      return cxstring::createRef(Class->getIdentifier()->getNameStart());
3242    }
3243    case CXCursor_ObjCProtocolRef: {
3244      const ObjCProtocolDecl *OID = getCursorObjCProtocolRef(C).first;
3245      assert(OID && "getCursorSpelling(): Missing protocol decl");
3246      return cxstring::createRef(OID->getIdentifier()->getNameStart());
3247    }
3248    case CXCursor_CXXBaseSpecifier: {
3249      const CXXBaseSpecifier *B = getCursorCXXBaseSpecifier(C);
3250      return cxstring::createDup(B->getType().getAsString());
3251    }
3252    case CXCursor_TypeRef: {
3253      const TypeDecl *Type = getCursorTypeRef(C).first;
3254      assert(Type && "Missing type decl");
3255
3256      return cxstring::createDup(getCursorContext(C).getTypeDeclType(Type).
3257                              getAsString());
3258    }
3259    case CXCursor_TemplateRef: {
3260      const TemplateDecl *Template = getCursorTemplateRef(C).first;
3261      assert(Template && "Missing template decl");
3262
3263      return cxstring::createDup(Template->getNameAsString());
3264    }
3265
3266    case CXCursor_NamespaceRef: {
3267      const NamedDecl *NS = getCursorNamespaceRef(C).first;
3268      assert(NS && "Missing namespace decl");
3269
3270      return cxstring::createDup(NS->getNameAsString());
3271    }
3272
3273    case CXCursor_MemberRef: {
3274      const FieldDecl *Field = getCursorMemberRef(C).first;
3275      assert(Field && "Missing member decl");
3276
3277      return cxstring::createDup(Field->getNameAsString());
3278    }
3279
3280    case CXCursor_LabelRef: {
3281      const LabelStmt *Label = getCursorLabelRef(C).first;
3282      assert(Label && "Missing label");
3283
3284      return cxstring::createRef(Label->getName());
3285    }
3286
3287    case CXCursor_OverloadedDeclRef: {
3288      OverloadedDeclRefStorage Storage = getCursorOverloadedDeclRef(C).first;
3289      if (const Decl *D = Storage.dyn_cast<const Decl *>()) {
3290        if (const NamedDecl *ND = dyn_cast<NamedDecl>(D))
3291          return cxstring::createDup(ND->getNameAsString());
3292        return cxstring::createEmpty();
3293      }
3294      if (const OverloadExpr *E = Storage.dyn_cast<const OverloadExpr *>())
3295        return cxstring::createDup(E->getName().getAsString());
3296      OverloadedTemplateStorage *Ovl
3297        = Storage.get<OverloadedTemplateStorage*>();
3298      if (Ovl->size() == 0)
3299        return cxstring::createEmpty();
3300      return cxstring::createDup((*Ovl->begin())->getNameAsString());
3301    }
3302
3303    case CXCursor_VariableRef: {
3304      const VarDecl *Var = getCursorVariableRef(C).first;
3305      assert(Var && "Missing variable decl");
3306
3307      return cxstring::createDup(Var->getNameAsString());
3308    }
3309
3310    default:
3311      return cxstring::createRef("<not implemented>");
3312    }
3313  }
3314
3315  if (clang_isExpression(C.kind)) {
3316    const Decl *D = getDeclFromExpr(getCursorExpr(C));
3317    if (D)
3318      return getDeclSpelling(D);
3319    return cxstring::createEmpty();
3320  }
3321
3322  if (clang_isStatement(C.kind)) {
3323    const Stmt *S = getCursorStmt(C);
3324    if (const LabelStmt *Label = dyn_cast_or_null<LabelStmt>(S))
3325      return cxstring::createRef(Label->getName());
3326
3327    return cxstring::createEmpty();
3328  }
3329
3330  if (C.kind == CXCursor_MacroExpansion)
3331    return cxstring::createRef(getCursorMacroExpansion(C).getName()
3332                                                           ->getNameStart());
3333
3334  if (C.kind == CXCursor_MacroDefinition)
3335    return cxstring::createRef(getCursorMacroDefinition(C)->getName()
3336                                                           ->getNameStart());
3337
3338  if (C.kind == CXCursor_InclusionDirective)
3339    return cxstring::createDup(getCursorInclusionDirective(C)->getFileName());
3340
3341  if (clang_isDeclaration(C.kind))
3342    return getDeclSpelling(getCursorDecl(C));
3343
3344  if (C.kind == CXCursor_AnnotateAttr) {
3345    const AnnotateAttr *AA = cast<AnnotateAttr>(cxcursor::getCursorAttr(C));
3346    return cxstring::createDup(AA->getAnnotation());
3347  }
3348
3349  if (C.kind == CXCursor_AsmLabelAttr) {
3350    const AsmLabelAttr *AA = cast<AsmLabelAttr>(cxcursor::getCursorAttr(C));
3351    return cxstring::createDup(AA->getLabel());
3352  }
3353
3354  return cxstring::createEmpty();
3355}
3356
3357CXSourceRange clang_Cursor_getSpellingNameRange(CXCursor C,
3358                                                unsigned pieceIndex,
3359                                                unsigned options) {
3360  if (clang_Cursor_isNull(C))
3361    return clang_getNullRange();
3362
3363  ASTContext &Ctx = getCursorContext(C);
3364
3365  if (clang_isStatement(C.kind)) {
3366    const Stmt *S = getCursorStmt(C);
3367    if (const LabelStmt *Label = dyn_cast_or_null<LabelStmt>(S)) {
3368      if (pieceIndex > 0)
3369        return clang_getNullRange();
3370      return cxloc::translateSourceRange(Ctx, Label->getIdentLoc());
3371    }
3372
3373    return clang_getNullRange();
3374  }
3375
3376  if (C.kind == CXCursor_ObjCMessageExpr) {
3377    if (const ObjCMessageExpr *
3378          ME = dyn_cast_or_null<ObjCMessageExpr>(getCursorExpr(C))) {
3379      if (pieceIndex >= ME->getNumSelectorLocs())
3380        return clang_getNullRange();
3381      return cxloc::translateSourceRange(Ctx, ME->getSelectorLoc(pieceIndex));
3382    }
3383  }
3384
3385  if (C.kind == CXCursor_ObjCInstanceMethodDecl ||
3386      C.kind == CXCursor_ObjCClassMethodDecl) {
3387    if (const ObjCMethodDecl *
3388          MD = dyn_cast_or_null<ObjCMethodDecl>(getCursorDecl(C))) {
3389      if (pieceIndex >= MD->getNumSelectorLocs())
3390        return clang_getNullRange();
3391      return cxloc::translateSourceRange(Ctx, MD->getSelectorLoc(pieceIndex));
3392    }
3393  }
3394
3395  if (C.kind == CXCursor_ObjCCategoryDecl ||
3396      C.kind == CXCursor_ObjCCategoryImplDecl) {
3397    if (pieceIndex > 0)
3398      return clang_getNullRange();
3399    if (const ObjCCategoryDecl *
3400          CD = dyn_cast_or_null<ObjCCategoryDecl>(getCursorDecl(C)))
3401      return cxloc::translateSourceRange(Ctx, CD->getCategoryNameLoc());
3402    if (const ObjCCategoryImplDecl *
3403          CID = dyn_cast_or_null<ObjCCategoryImplDecl>(getCursorDecl(C)))
3404      return cxloc::translateSourceRange(Ctx, CID->getCategoryNameLoc());
3405  }
3406
3407  if (C.kind == CXCursor_ModuleImportDecl) {
3408    if (pieceIndex > 0)
3409      return clang_getNullRange();
3410    if (const ImportDecl *ImportD =
3411            dyn_cast_or_null<ImportDecl>(getCursorDecl(C))) {
3412      ArrayRef<SourceLocation> Locs = ImportD->getIdentifierLocs();
3413      if (!Locs.empty())
3414        return cxloc::translateSourceRange(Ctx,
3415                                         SourceRange(Locs.front(), Locs.back()));
3416    }
3417    return clang_getNullRange();
3418  }
3419
3420  // FIXME: A CXCursor_InclusionDirective should give the location of the
3421  // filename, but we don't keep track of this.
3422
3423  // FIXME: A CXCursor_AnnotateAttr should give the location of the annotation
3424  // but we don't keep track of this.
3425
3426  // FIXME: A CXCursor_AsmLabelAttr should give the location of the label
3427  // but we don't keep track of this.
3428
3429  // Default handling, give the location of the cursor.
3430
3431  if (pieceIndex > 0)
3432    return clang_getNullRange();
3433
3434  CXSourceLocation CXLoc = clang_getCursorLocation(C);
3435  SourceLocation Loc = cxloc::translateSourceLocation(CXLoc);
3436  return cxloc::translateSourceRange(Ctx, Loc);
3437}
3438
3439CXString clang_getCursorDisplayName(CXCursor C) {
3440  if (!clang_isDeclaration(C.kind))
3441    return clang_getCursorSpelling(C);
3442
3443  const Decl *D = getCursorDecl(C);
3444  if (!D)
3445    return cxstring::createEmpty();
3446
3447  PrintingPolicy Policy = getCursorContext(C).getPrintingPolicy();
3448  if (const FunctionTemplateDecl *FunTmpl = dyn_cast<FunctionTemplateDecl>(D))
3449    D = FunTmpl->getTemplatedDecl();
3450
3451  if (const FunctionDecl *Function = dyn_cast<FunctionDecl>(D)) {
3452    SmallString<64> Str;
3453    llvm::raw_svector_ostream OS(Str);
3454    OS << *Function;
3455    if (Function->getPrimaryTemplate())
3456      OS << "<>";
3457    OS << "(";
3458    for (unsigned I = 0, N = Function->getNumParams(); I != N; ++I) {
3459      if (I)
3460        OS << ", ";
3461      OS << Function->getParamDecl(I)->getType().getAsString(Policy);
3462    }
3463
3464    if (Function->isVariadic()) {
3465      if (Function->getNumParams())
3466        OS << ", ";
3467      OS << "...";
3468    }
3469    OS << ")";
3470    return cxstring::createDup(OS.str());
3471  }
3472
3473  if (const ClassTemplateDecl *ClassTemplate = dyn_cast<ClassTemplateDecl>(D)) {
3474    SmallString<64> Str;
3475    llvm::raw_svector_ostream OS(Str);
3476    OS << *ClassTemplate;
3477    OS << "<";
3478    TemplateParameterList *Params = ClassTemplate->getTemplateParameters();
3479    for (unsigned I = 0, N = Params->size(); I != N; ++I) {
3480      if (I)
3481        OS << ", ";
3482
3483      NamedDecl *Param = Params->getParam(I);
3484      if (Param->getIdentifier()) {
3485        OS << Param->getIdentifier()->getName();
3486        continue;
3487      }
3488
3489      // There is no parameter name, which makes this tricky. Try to come up
3490      // with something useful that isn't too long.
3491      if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(Param))
3492        OS << (TTP->wasDeclaredWithTypename()? "typename" : "class");
3493      else if (NonTypeTemplateParmDecl *NTTP
3494                                    = dyn_cast<NonTypeTemplateParmDecl>(Param))
3495        OS << NTTP->getType().getAsString(Policy);
3496      else
3497        OS << "template<...> class";
3498    }
3499
3500    OS << ">";
3501    return cxstring::createDup(OS.str());
3502  }
3503
3504  if (const ClassTemplateSpecializationDecl *ClassSpec
3505                              = dyn_cast<ClassTemplateSpecializationDecl>(D)) {
3506    // If the type was explicitly written, use that.
3507    if (TypeSourceInfo *TSInfo = ClassSpec->getTypeAsWritten())
3508      return cxstring::createDup(TSInfo->getType().getAsString(Policy));
3509
3510    SmallString<128> Str;
3511    llvm::raw_svector_ostream OS(Str);
3512    OS << *ClassSpec;
3513    TemplateSpecializationType::PrintTemplateArgumentList(OS,
3514                                      ClassSpec->getTemplateArgs().data(),
3515                                      ClassSpec->getTemplateArgs().size(),
3516                                                                Policy);
3517    return cxstring::createDup(OS.str());
3518  }
3519
3520  return clang_getCursorSpelling(C);
3521}
3522
3523CXString clang_getCursorKindSpelling(enum CXCursorKind Kind) {
3524  switch (Kind) {
3525  case CXCursor_FunctionDecl:
3526      return cxstring::createRef("FunctionDecl");
3527  case CXCursor_TypedefDecl:
3528      return cxstring::createRef("TypedefDecl");
3529  case CXCursor_EnumDecl:
3530      return cxstring::createRef("EnumDecl");
3531  case CXCursor_EnumConstantDecl:
3532      return cxstring::createRef("EnumConstantDecl");
3533  case CXCursor_StructDecl:
3534      return cxstring::createRef("StructDecl");
3535  case CXCursor_UnionDecl:
3536      return cxstring::createRef("UnionDecl");
3537  case CXCursor_ClassDecl:
3538      return cxstring::createRef("ClassDecl");
3539  case CXCursor_FieldDecl:
3540      return cxstring::createRef("FieldDecl");
3541  case CXCursor_VarDecl:
3542      return cxstring::createRef("VarDecl");
3543  case CXCursor_ParmDecl:
3544      return cxstring::createRef("ParmDecl");
3545  case CXCursor_ObjCInterfaceDecl:
3546      return cxstring::createRef("ObjCInterfaceDecl");
3547  case CXCursor_ObjCCategoryDecl:
3548      return cxstring::createRef("ObjCCategoryDecl");
3549  case CXCursor_ObjCProtocolDecl:
3550      return cxstring::createRef("ObjCProtocolDecl");
3551  case CXCursor_ObjCPropertyDecl:
3552      return cxstring::createRef("ObjCPropertyDecl");
3553  case CXCursor_ObjCIvarDecl:
3554      return cxstring::createRef("ObjCIvarDecl");
3555  case CXCursor_ObjCInstanceMethodDecl:
3556      return cxstring::createRef("ObjCInstanceMethodDecl");
3557  case CXCursor_ObjCClassMethodDecl:
3558      return cxstring::createRef("ObjCClassMethodDecl");
3559  case CXCursor_ObjCImplementationDecl:
3560      return cxstring::createRef("ObjCImplementationDecl");
3561  case CXCursor_ObjCCategoryImplDecl:
3562      return cxstring::createRef("ObjCCategoryImplDecl");
3563  case CXCursor_CXXMethod:
3564      return cxstring::createRef("CXXMethod");
3565  case CXCursor_UnexposedDecl:
3566      return cxstring::createRef("UnexposedDecl");
3567  case CXCursor_ObjCSuperClassRef:
3568      return cxstring::createRef("ObjCSuperClassRef");
3569  case CXCursor_ObjCProtocolRef:
3570      return cxstring::createRef("ObjCProtocolRef");
3571  case CXCursor_ObjCClassRef:
3572      return cxstring::createRef("ObjCClassRef");
3573  case CXCursor_TypeRef:
3574      return cxstring::createRef("TypeRef");
3575  case CXCursor_TemplateRef:
3576      return cxstring::createRef("TemplateRef");
3577  case CXCursor_NamespaceRef:
3578    return cxstring::createRef("NamespaceRef");
3579  case CXCursor_MemberRef:
3580    return cxstring::createRef("MemberRef");
3581  case CXCursor_LabelRef:
3582    return cxstring::createRef("LabelRef");
3583  case CXCursor_OverloadedDeclRef:
3584    return cxstring::createRef("OverloadedDeclRef");
3585  case CXCursor_VariableRef:
3586    return cxstring::createRef("VariableRef");
3587  case CXCursor_IntegerLiteral:
3588      return cxstring::createRef("IntegerLiteral");
3589  case CXCursor_FloatingLiteral:
3590      return cxstring::createRef("FloatingLiteral");
3591  case CXCursor_ImaginaryLiteral:
3592      return cxstring::createRef("ImaginaryLiteral");
3593  case CXCursor_StringLiteral:
3594      return cxstring::createRef("StringLiteral");
3595  case CXCursor_CharacterLiteral:
3596      return cxstring::createRef("CharacterLiteral");
3597  case CXCursor_ParenExpr:
3598      return cxstring::createRef("ParenExpr");
3599  case CXCursor_UnaryOperator:
3600      return cxstring::createRef("UnaryOperator");
3601  case CXCursor_ArraySubscriptExpr:
3602      return cxstring::createRef("ArraySubscriptExpr");
3603  case CXCursor_BinaryOperator:
3604      return cxstring::createRef("BinaryOperator");
3605  case CXCursor_CompoundAssignOperator:
3606      return cxstring::createRef("CompoundAssignOperator");
3607  case CXCursor_ConditionalOperator:
3608      return cxstring::createRef("ConditionalOperator");
3609  case CXCursor_CStyleCastExpr:
3610      return cxstring::createRef("CStyleCastExpr");
3611  case CXCursor_CompoundLiteralExpr:
3612      return cxstring::createRef("CompoundLiteralExpr");
3613  case CXCursor_InitListExpr:
3614      return cxstring::createRef("InitListExpr");
3615  case CXCursor_AddrLabelExpr:
3616      return cxstring::createRef("AddrLabelExpr");
3617  case CXCursor_StmtExpr:
3618      return cxstring::createRef("StmtExpr");
3619  case CXCursor_GenericSelectionExpr:
3620      return cxstring::createRef("GenericSelectionExpr");
3621  case CXCursor_GNUNullExpr:
3622      return cxstring::createRef("GNUNullExpr");
3623  case CXCursor_CXXStaticCastExpr:
3624      return cxstring::createRef("CXXStaticCastExpr");
3625  case CXCursor_CXXDynamicCastExpr:
3626      return cxstring::createRef("CXXDynamicCastExpr");
3627  case CXCursor_CXXReinterpretCastExpr:
3628      return cxstring::createRef("CXXReinterpretCastExpr");
3629  case CXCursor_CXXConstCastExpr:
3630      return cxstring::createRef("CXXConstCastExpr");
3631  case CXCursor_CXXFunctionalCastExpr:
3632      return cxstring::createRef("CXXFunctionalCastExpr");
3633  case CXCursor_CXXTypeidExpr:
3634      return cxstring::createRef("CXXTypeidExpr");
3635  case CXCursor_CXXBoolLiteralExpr:
3636      return cxstring::createRef("CXXBoolLiteralExpr");
3637  case CXCursor_CXXNullPtrLiteralExpr:
3638      return cxstring::createRef("CXXNullPtrLiteralExpr");
3639  case CXCursor_CXXThisExpr:
3640      return cxstring::createRef("CXXThisExpr");
3641  case CXCursor_CXXThrowExpr:
3642      return cxstring::createRef("CXXThrowExpr");
3643  case CXCursor_CXXNewExpr:
3644      return cxstring::createRef("CXXNewExpr");
3645  case CXCursor_CXXDeleteExpr:
3646      return cxstring::createRef("CXXDeleteExpr");
3647  case CXCursor_UnaryExpr:
3648      return cxstring::createRef("UnaryExpr");
3649  case CXCursor_ObjCStringLiteral:
3650      return cxstring::createRef("ObjCStringLiteral");
3651  case CXCursor_ObjCBoolLiteralExpr:
3652      return cxstring::createRef("ObjCBoolLiteralExpr");
3653  case CXCursor_ObjCSelfExpr:
3654      return cxstring::createRef("ObjCSelfExpr");
3655  case CXCursor_ObjCEncodeExpr:
3656      return cxstring::createRef("ObjCEncodeExpr");
3657  case CXCursor_ObjCSelectorExpr:
3658      return cxstring::createRef("ObjCSelectorExpr");
3659  case CXCursor_ObjCProtocolExpr:
3660      return cxstring::createRef("ObjCProtocolExpr");
3661  case CXCursor_ObjCBridgedCastExpr:
3662      return cxstring::createRef("ObjCBridgedCastExpr");
3663  case CXCursor_BlockExpr:
3664      return cxstring::createRef("BlockExpr");
3665  case CXCursor_PackExpansionExpr:
3666      return cxstring::createRef("PackExpansionExpr");
3667  case CXCursor_SizeOfPackExpr:
3668      return cxstring::createRef("SizeOfPackExpr");
3669  case CXCursor_LambdaExpr:
3670    return cxstring::createRef("LambdaExpr");
3671  case CXCursor_UnexposedExpr:
3672      return cxstring::createRef("UnexposedExpr");
3673  case CXCursor_DeclRefExpr:
3674      return cxstring::createRef("DeclRefExpr");
3675  case CXCursor_MemberRefExpr:
3676      return cxstring::createRef("MemberRefExpr");
3677  case CXCursor_CallExpr:
3678      return cxstring::createRef("CallExpr");
3679  case CXCursor_ObjCMessageExpr:
3680      return cxstring::createRef("ObjCMessageExpr");
3681  case CXCursor_UnexposedStmt:
3682      return cxstring::createRef("UnexposedStmt");
3683  case CXCursor_DeclStmt:
3684      return cxstring::createRef("DeclStmt");
3685  case CXCursor_LabelStmt:
3686      return cxstring::createRef("LabelStmt");
3687  case CXCursor_CompoundStmt:
3688      return cxstring::createRef("CompoundStmt");
3689  case CXCursor_CaseStmt:
3690      return cxstring::createRef("CaseStmt");
3691  case CXCursor_DefaultStmt:
3692      return cxstring::createRef("DefaultStmt");
3693  case CXCursor_IfStmt:
3694      return cxstring::createRef("IfStmt");
3695  case CXCursor_SwitchStmt:
3696      return cxstring::createRef("SwitchStmt");
3697  case CXCursor_WhileStmt:
3698      return cxstring::createRef("WhileStmt");
3699  case CXCursor_DoStmt:
3700      return cxstring::createRef("DoStmt");
3701  case CXCursor_ForStmt:
3702      return cxstring::createRef("ForStmt");
3703  case CXCursor_GotoStmt:
3704      return cxstring::createRef("GotoStmt");
3705  case CXCursor_IndirectGotoStmt:
3706      return cxstring::createRef("IndirectGotoStmt");
3707  case CXCursor_ContinueStmt:
3708      return cxstring::createRef("ContinueStmt");
3709  case CXCursor_BreakStmt:
3710      return cxstring::createRef("BreakStmt");
3711  case CXCursor_ReturnStmt:
3712      return cxstring::createRef("ReturnStmt");
3713  case CXCursor_GCCAsmStmt:
3714      return cxstring::createRef("GCCAsmStmt");
3715  case CXCursor_MSAsmStmt:
3716      return cxstring::createRef("MSAsmStmt");
3717  case CXCursor_ObjCAtTryStmt:
3718      return cxstring::createRef("ObjCAtTryStmt");
3719  case CXCursor_ObjCAtCatchStmt:
3720      return cxstring::createRef("ObjCAtCatchStmt");
3721  case CXCursor_ObjCAtFinallyStmt:
3722      return cxstring::createRef("ObjCAtFinallyStmt");
3723  case CXCursor_ObjCAtThrowStmt:
3724      return cxstring::createRef("ObjCAtThrowStmt");
3725  case CXCursor_ObjCAtSynchronizedStmt:
3726      return cxstring::createRef("ObjCAtSynchronizedStmt");
3727  case CXCursor_ObjCAutoreleasePoolStmt:
3728      return cxstring::createRef("ObjCAutoreleasePoolStmt");
3729  case CXCursor_ObjCForCollectionStmt:
3730      return cxstring::createRef("ObjCForCollectionStmt");
3731  case CXCursor_CXXCatchStmt:
3732      return cxstring::createRef("CXXCatchStmt");
3733  case CXCursor_CXXTryStmt:
3734      return cxstring::createRef("CXXTryStmt");
3735  case CXCursor_CXXForRangeStmt:
3736      return cxstring::createRef("CXXForRangeStmt");
3737  case CXCursor_SEHTryStmt:
3738      return cxstring::createRef("SEHTryStmt");
3739  case CXCursor_SEHExceptStmt:
3740      return cxstring::createRef("SEHExceptStmt");
3741  case CXCursor_SEHFinallyStmt:
3742      return cxstring::createRef("SEHFinallyStmt");
3743  case CXCursor_NullStmt:
3744      return cxstring::createRef("NullStmt");
3745  case CXCursor_InvalidFile:
3746      return cxstring::createRef("InvalidFile");
3747  case CXCursor_InvalidCode:
3748    return cxstring::createRef("InvalidCode");
3749  case CXCursor_NoDeclFound:
3750      return cxstring::createRef("NoDeclFound");
3751  case CXCursor_NotImplemented:
3752      return cxstring::createRef("NotImplemented");
3753  case CXCursor_TranslationUnit:
3754      return cxstring::createRef("TranslationUnit");
3755  case CXCursor_UnexposedAttr:
3756      return cxstring::createRef("UnexposedAttr");
3757  case CXCursor_IBActionAttr:
3758      return cxstring::createRef("attribute(ibaction)");
3759  case CXCursor_IBOutletAttr:
3760     return cxstring::createRef("attribute(iboutlet)");
3761  case CXCursor_IBOutletCollectionAttr:
3762      return cxstring::createRef("attribute(iboutletcollection)");
3763  case CXCursor_CXXFinalAttr:
3764      return cxstring::createRef("attribute(final)");
3765  case CXCursor_CXXOverrideAttr:
3766      return cxstring::createRef("attribute(override)");
3767  case CXCursor_AnnotateAttr:
3768    return cxstring::createRef("attribute(annotate)");
3769  case CXCursor_AsmLabelAttr:
3770    return cxstring::createRef("asm label");
3771  case CXCursor_PreprocessingDirective:
3772    return cxstring::createRef("preprocessing directive");
3773  case CXCursor_MacroDefinition:
3774    return cxstring::createRef("macro definition");
3775  case CXCursor_MacroExpansion:
3776    return cxstring::createRef("macro expansion");
3777  case CXCursor_InclusionDirective:
3778    return cxstring::createRef("inclusion directive");
3779  case CXCursor_Namespace:
3780    return cxstring::createRef("Namespace");
3781  case CXCursor_LinkageSpec:
3782    return cxstring::createRef("LinkageSpec");
3783  case CXCursor_CXXBaseSpecifier:
3784    return cxstring::createRef("C++ base class specifier");
3785  case CXCursor_Constructor:
3786    return cxstring::createRef("CXXConstructor");
3787  case CXCursor_Destructor:
3788    return cxstring::createRef("CXXDestructor");
3789  case CXCursor_ConversionFunction:
3790    return cxstring::createRef("CXXConversion");
3791  case CXCursor_TemplateTypeParameter:
3792    return cxstring::createRef("TemplateTypeParameter");
3793  case CXCursor_NonTypeTemplateParameter:
3794    return cxstring::createRef("NonTypeTemplateParameter");
3795  case CXCursor_TemplateTemplateParameter:
3796    return cxstring::createRef("TemplateTemplateParameter");
3797  case CXCursor_FunctionTemplate:
3798    return cxstring::createRef("FunctionTemplate");
3799  case CXCursor_ClassTemplate:
3800    return cxstring::createRef("ClassTemplate");
3801  case CXCursor_ClassTemplatePartialSpecialization:
3802    return cxstring::createRef("ClassTemplatePartialSpecialization");
3803  case CXCursor_NamespaceAlias:
3804    return cxstring::createRef("NamespaceAlias");
3805  case CXCursor_UsingDirective:
3806    return cxstring::createRef("UsingDirective");
3807  case CXCursor_UsingDeclaration:
3808    return cxstring::createRef("UsingDeclaration");
3809  case CXCursor_TypeAliasDecl:
3810    return cxstring::createRef("TypeAliasDecl");
3811  case CXCursor_ObjCSynthesizeDecl:
3812    return cxstring::createRef("ObjCSynthesizeDecl");
3813  case CXCursor_ObjCDynamicDecl:
3814    return cxstring::createRef("ObjCDynamicDecl");
3815  case CXCursor_CXXAccessSpecifier:
3816    return cxstring::createRef("CXXAccessSpecifier");
3817  case CXCursor_ModuleImportDecl:
3818    return cxstring::createRef("ModuleImport");
3819  case CXCursor_OMPParallelDirective:
3820      return cxstring::createRef("OMPParallelDirective");
3821  }
3822
3823  llvm_unreachable("Unhandled CXCursorKind");
3824}
3825
3826struct GetCursorData {
3827  SourceLocation TokenBeginLoc;
3828  bool PointsAtMacroArgExpansion;
3829  bool VisitedObjCPropertyImplDecl;
3830  SourceLocation VisitedDeclaratorDeclStartLoc;
3831  CXCursor &BestCursor;
3832
3833  GetCursorData(SourceManager &SM,
3834                SourceLocation tokenBegin, CXCursor &outputCursor)
3835    : TokenBeginLoc(tokenBegin), BestCursor(outputCursor) {
3836    PointsAtMacroArgExpansion = SM.isMacroArgExpansion(tokenBegin);
3837    VisitedObjCPropertyImplDecl = false;
3838  }
3839};
3840
3841static enum CXChildVisitResult GetCursorVisitor(CXCursor cursor,
3842                                                CXCursor parent,
3843                                                CXClientData client_data) {
3844  GetCursorData *Data = static_cast<GetCursorData *>(client_data);
3845  CXCursor *BestCursor = &Data->BestCursor;
3846
3847  // If we point inside a macro argument we should provide info of what the
3848  // token is so use the actual cursor, don't replace it with a macro expansion
3849  // cursor.
3850  if (cursor.kind == CXCursor_MacroExpansion && Data->PointsAtMacroArgExpansion)
3851    return CXChildVisit_Recurse;
3852
3853  if (clang_isDeclaration(cursor.kind)) {
3854    // Avoid having the implicit methods override the property decls.
3855    if (const ObjCMethodDecl *MD
3856          = dyn_cast_or_null<ObjCMethodDecl>(getCursorDecl(cursor))) {
3857      if (MD->isImplicit())
3858        return CXChildVisit_Break;
3859
3860    } else if (const ObjCInterfaceDecl *ID
3861                 = dyn_cast_or_null<ObjCInterfaceDecl>(getCursorDecl(cursor))) {
3862      // Check that when we have multiple @class references in the same line,
3863      // that later ones do not override the previous ones.
3864      // If we have:
3865      // @class Foo, Bar;
3866      // source ranges for both start at '@', so 'Bar' will end up overriding
3867      // 'Foo' even though the cursor location was at 'Foo'.
3868      if (BestCursor->kind == CXCursor_ObjCInterfaceDecl ||
3869          BestCursor->kind == CXCursor_ObjCClassRef)
3870        if (const ObjCInterfaceDecl *PrevID
3871             = dyn_cast_or_null<ObjCInterfaceDecl>(getCursorDecl(*BestCursor))){
3872         if (PrevID != ID &&
3873             !PrevID->isThisDeclarationADefinition() &&
3874             !ID->isThisDeclarationADefinition())
3875           return CXChildVisit_Break;
3876        }
3877
3878    } else if (const DeclaratorDecl *DD
3879                    = dyn_cast_or_null<DeclaratorDecl>(getCursorDecl(cursor))) {
3880      SourceLocation StartLoc = DD->getSourceRange().getBegin();
3881      // Check that when we have multiple declarators in the same line,
3882      // that later ones do not override the previous ones.
3883      // If we have:
3884      // int Foo, Bar;
3885      // source ranges for both start at 'int', so 'Bar' will end up overriding
3886      // 'Foo' even though the cursor location was at 'Foo'.
3887      if (Data->VisitedDeclaratorDeclStartLoc == StartLoc)
3888        return CXChildVisit_Break;
3889      Data->VisitedDeclaratorDeclStartLoc = StartLoc;
3890
3891    } else if (const ObjCPropertyImplDecl *PropImp
3892              = dyn_cast_or_null<ObjCPropertyImplDecl>(getCursorDecl(cursor))) {
3893      (void)PropImp;
3894      // Check that when we have multiple @synthesize in the same line,
3895      // that later ones do not override the previous ones.
3896      // If we have:
3897      // @synthesize Foo, Bar;
3898      // source ranges for both start at '@', so 'Bar' will end up overriding
3899      // 'Foo' even though the cursor location was at 'Foo'.
3900      if (Data->VisitedObjCPropertyImplDecl)
3901        return CXChildVisit_Break;
3902      Data->VisitedObjCPropertyImplDecl = true;
3903    }
3904  }
3905
3906  if (clang_isExpression(cursor.kind) &&
3907      clang_isDeclaration(BestCursor->kind)) {
3908    if (const Decl *D = getCursorDecl(*BestCursor)) {
3909      // Avoid having the cursor of an expression replace the declaration cursor
3910      // when the expression source range overlaps the declaration range.
3911      // This can happen for C++ constructor expressions whose range generally
3912      // include the variable declaration, e.g.:
3913      //  MyCXXClass foo; // Make sure pointing at 'foo' returns a VarDecl cursor.
3914      if (D->getLocation().isValid() && Data->TokenBeginLoc.isValid() &&
3915          D->getLocation() == Data->TokenBeginLoc)
3916        return CXChildVisit_Break;
3917    }
3918  }
3919
3920  // If our current best cursor is the construction of a temporary object,
3921  // don't replace that cursor with a type reference, because we want
3922  // clang_getCursor() to point at the constructor.
3923  if (clang_isExpression(BestCursor->kind) &&
3924      isa<CXXTemporaryObjectExpr>(getCursorExpr(*BestCursor)) &&
3925      cursor.kind == CXCursor_TypeRef) {
3926    // Keep the cursor pointing at CXXTemporaryObjectExpr but also mark it
3927    // as having the actual point on the type reference.
3928    *BestCursor = getTypeRefedCallExprCursor(*BestCursor);
3929    return CXChildVisit_Recurse;
3930  }
3931
3932  *BestCursor = cursor;
3933  return CXChildVisit_Recurse;
3934}
3935
3936CXCursor clang_getCursor(CXTranslationUnit TU, CXSourceLocation Loc) {
3937  if (!TU)
3938    return clang_getNullCursor();
3939
3940  ASTUnit *CXXUnit = cxtu::getASTUnit(TU);
3941  ASTUnit::ConcurrencyCheck Check(*CXXUnit);
3942
3943  SourceLocation SLoc = cxloc::translateSourceLocation(Loc);
3944  CXCursor Result = cxcursor::getCursor(TU, SLoc);
3945
3946  LOG_FUNC_SECTION {
3947    CXFile SearchFile;
3948    unsigned SearchLine, SearchColumn;
3949    CXFile ResultFile;
3950    unsigned ResultLine, ResultColumn;
3951    CXString SearchFileName, ResultFileName, KindSpelling, USR;
3952    const char *IsDef = clang_isCursorDefinition(Result)? " (Definition)" : "";
3953    CXSourceLocation ResultLoc = clang_getCursorLocation(Result);
3954
3955    clang_getFileLocation(Loc, &SearchFile, &SearchLine, &SearchColumn, 0);
3956    clang_getFileLocation(ResultLoc, &ResultFile, &ResultLine,
3957                               &ResultColumn, 0);
3958    SearchFileName = clang_getFileName(SearchFile);
3959    ResultFileName = clang_getFileName(ResultFile);
3960    KindSpelling = clang_getCursorKindSpelling(Result.kind);
3961    USR = clang_getCursorUSR(Result);
3962    *Log << llvm::format("(%s:%d:%d) = %s",
3963                   clang_getCString(SearchFileName), SearchLine, SearchColumn,
3964                   clang_getCString(KindSpelling))
3965        << llvm::format("(%s:%d:%d):%s%s",
3966                     clang_getCString(ResultFileName), ResultLine, ResultColumn,
3967                     clang_getCString(USR), IsDef);
3968    clang_disposeString(SearchFileName);
3969    clang_disposeString(ResultFileName);
3970    clang_disposeString(KindSpelling);
3971    clang_disposeString(USR);
3972
3973    CXCursor Definition = clang_getCursorDefinition(Result);
3974    if (!clang_equalCursors(Definition, clang_getNullCursor())) {
3975      CXSourceLocation DefinitionLoc = clang_getCursorLocation(Definition);
3976      CXString DefinitionKindSpelling
3977                                = clang_getCursorKindSpelling(Definition.kind);
3978      CXFile DefinitionFile;
3979      unsigned DefinitionLine, DefinitionColumn;
3980      clang_getFileLocation(DefinitionLoc, &DefinitionFile,
3981                                 &DefinitionLine, &DefinitionColumn, 0);
3982      CXString DefinitionFileName = clang_getFileName(DefinitionFile);
3983      *Log << llvm::format("  -> %s(%s:%d:%d)",
3984                     clang_getCString(DefinitionKindSpelling),
3985                     clang_getCString(DefinitionFileName),
3986                     DefinitionLine, DefinitionColumn);
3987      clang_disposeString(DefinitionFileName);
3988      clang_disposeString(DefinitionKindSpelling);
3989    }
3990  }
3991
3992  return Result;
3993}
3994
3995CXCursor clang_getNullCursor(void) {
3996  return MakeCXCursorInvalid(CXCursor_InvalidFile);
3997}
3998
3999unsigned clang_equalCursors(CXCursor X, CXCursor Y) {
4000  // Clear out the "FirstInDeclGroup" part in a declaration cursor, since we
4001  // can't set consistently. For example, when visiting a DeclStmt we will set
4002  // it but we don't set it on the result of clang_getCursorDefinition for
4003  // a reference of the same declaration.
4004  // FIXME: Setting "FirstInDeclGroup" in CXCursors is a hack that only works
4005  // when visiting a DeclStmt currently, the AST should be enhanced to be able
4006  // to provide that kind of info.
4007  if (clang_isDeclaration(X.kind))
4008    X.data[1] = 0;
4009  if (clang_isDeclaration(Y.kind))
4010    Y.data[1] = 0;
4011
4012  return X == Y;
4013}
4014
4015unsigned clang_hashCursor(CXCursor C) {
4016  unsigned Index = 0;
4017  if (clang_isExpression(C.kind) || clang_isStatement(C.kind))
4018    Index = 1;
4019
4020  return llvm::DenseMapInfo<std::pair<unsigned, const void*> >::getHashValue(
4021                                        std::make_pair(C.kind, C.data[Index]));
4022}
4023
4024unsigned clang_isInvalid(enum CXCursorKind K) {
4025  return K >= CXCursor_FirstInvalid && K <= CXCursor_LastInvalid;
4026}
4027
4028unsigned clang_isDeclaration(enum CXCursorKind K) {
4029  return (K >= CXCursor_FirstDecl && K <= CXCursor_LastDecl) ||
4030         (K >= CXCursor_FirstExtraDecl && K <= CXCursor_LastExtraDecl);
4031}
4032
4033unsigned clang_isReference(enum CXCursorKind K) {
4034  return K >= CXCursor_FirstRef && K <= CXCursor_LastRef;
4035}
4036
4037unsigned clang_isExpression(enum CXCursorKind K) {
4038  return K >= CXCursor_FirstExpr && K <= CXCursor_LastExpr;
4039}
4040
4041unsigned clang_isStatement(enum CXCursorKind K) {
4042  return K >= CXCursor_FirstStmt && K <= CXCursor_LastStmt;
4043}
4044
4045unsigned clang_isAttribute(enum CXCursorKind K) {
4046    return K >= CXCursor_FirstAttr && K <= CXCursor_LastAttr;
4047}
4048
4049unsigned clang_isTranslationUnit(enum CXCursorKind K) {
4050  return K == CXCursor_TranslationUnit;
4051}
4052
4053unsigned clang_isPreprocessing(enum CXCursorKind K) {
4054  return K >= CXCursor_FirstPreprocessing && K <= CXCursor_LastPreprocessing;
4055}
4056
4057unsigned clang_isUnexposed(enum CXCursorKind K) {
4058  switch (K) {
4059    case CXCursor_UnexposedDecl:
4060    case CXCursor_UnexposedExpr:
4061    case CXCursor_UnexposedStmt:
4062    case CXCursor_UnexposedAttr:
4063      return true;
4064    default:
4065      return false;
4066  }
4067}
4068
4069CXCursorKind clang_getCursorKind(CXCursor C) {
4070  return C.kind;
4071}
4072
4073CXSourceLocation clang_getCursorLocation(CXCursor C) {
4074  if (clang_isReference(C.kind)) {
4075    switch (C.kind) {
4076    case CXCursor_ObjCSuperClassRef: {
4077      std::pair<const ObjCInterfaceDecl *, SourceLocation> P
4078        = getCursorObjCSuperClassRef(C);
4079      return cxloc::translateSourceLocation(P.first->getASTContext(), P.second);
4080    }
4081
4082    case CXCursor_ObjCProtocolRef: {
4083      std::pair<const ObjCProtocolDecl *, SourceLocation> P
4084        = getCursorObjCProtocolRef(C);
4085      return cxloc::translateSourceLocation(P.first->getASTContext(), P.second);
4086    }
4087
4088    case CXCursor_ObjCClassRef: {
4089      std::pair<const ObjCInterfaceDecl *, SourceLocation> P
4090        = getCursorObjCClassRef(C);
4091      return cxloc::translateSourceLocation(P.first->getASTContext(), P.second);
4092    }
4093
4094    case CXCursor_TypeRef: {
4095      std::pair<const TypeDecl *, SourceLocation> P = getCursorTypeRef(C);
4096      return cxloc::translateSourceLocation(P.first->getASTContext(), P.second);
4097    }
4098
4099    case CXCursor_TemplateRef: {
4100      std::pair<const TemplateDecl *, SourceLocation> P =
4101          getCursorTemplateRef(C);
4102      return cxloc::translateSourceLocation(P.first->getASTContext(), P.second);
4103    }
4104
4105    case CXCursor_NamespaceRef: {
4106      std::pair<const NamedDecl *, SourceLocation> P = getCursorNamespaceRef(C);
4107      return cxloc::translateSourceLocation(P.first->getASTContext(), P.second);
4108    }
4109
4110    case CXCursor_MemberRef: {
4111      std::pair<const FieldDecl *, SourceLocation> P = getCursorMemberRef(C);
4112      return cxloc::translateSourceLocation(P.first->getASTContext(), P.second);
4113    }
4114
4115    case CXCursor_VariableRef: {
4116      std::pair<const VarDecl *, SourceLocation> P = getCursorVariableRef(C);
4117      return cxloc::translateSourceLocation(P.first->getASTContext(), P.second);
4118    }
4119
4120    case CXCursor_CXXBaseSpecifier: {
4121      const CXXBaseSpecifier *BaseSpec = getCursorCXXBaseSpecifier(C);
4122      if (!BaseSpec)
4123        return clang_getNullLocation();
4124
4125      if (TypeSourceInfo *TSInfo = BaseSpec->getTypeSourceInfo())
4126        return cxloc::translateSourceLocation(getCursorContext(C),
4127                                            TSInfo->getTypeLoc().getBeginLoc());
4128
4129      return cxloc::translateSourceLocation(getCursorContext(C),
4130                                        BaseSpec->getLocStart());
4131    }
4132
4133    case CXCursor_LabelRef: {
4134      std::pair<const LabelStmt *, SourceLocation> P = getCursorLabelRef(C);
4135      return cxloc::translateSourceLocation(getCursorContext(C), P.second);
4136    }
4137
4138    case CXCursor_OverloadedDeclRef:
4139      return cxloc::translateSourceLocation(getCursorContext(C),
4140                                          getCursorOverloadedDeclRef(C).second);
4141
4142    default:
4143      // FIXME: Need a way to enumerate all non-reference cases.
4144      llvm_unreachable("Missed a reference kind");
4145    }
4146  }
4147
4148  if (clang_isExpression(C.kind))
4149    return cxloc::translateSourceLocation(getCursorContext(C),
4150                                   getLocationFromExpr(getCursorExpr(C)));
4151
4152  if (clang_isStatement(C.kind))
4153    return cxloc::translateSourceLocation(getCursorContext(C),
4154                                          getCursorStmt(C)->getLocStart());
4155
4156  if (C.kind == CXCursor_PreprocessingDirective) {
4157    SourceLocation L = cxcursor::getCursorPreprocessingDirective(C).getBegin();
4158    return cxloc::translateSourceLocation(getCursorContext(C), L);
4159  }
4160
4161  if (C.kind == CXCursor_MacroExpansion) {
4162    SourceLocation L
4163      = cxcursor::getCursorMacroExpansion(C).getSourceRange().getBegin();
4164    return cxloc::translateSourceLocation(getCursorContext(C), L);
4165  }
4166
4167  if (C.kind == CXCursor_MacroDefinition) {
4168    SourceLocation L = cxcursor::getCursorMacroDefinition(C)->getLocation();
4169    return cxloc::translateSourceLocation(getCursorContext(C), L);
4170  }
4171
4172  if (C.kind == CXCursor_InclusionDirective) {
4173    SourceLocation L
4174      = cxcursor::getCursorInclusionDirective(C)->getSourceRange().getBegin();
4175    return cxloc::translateSourceLocation(getCursorContext(C), L);
4176  }
4177
4178  if (!clang_isDeclaration(C.kind))
4179    return clang_getNullLocation();
4180
4181  const Decl *D = getCursorDecl(C);
4182  if (!D)
4183    return clang_getNullLocation();
4184
4185  SourceLocation Loc = D->getLocation();
4186  // FIXME: Multiple variables declared in a single declaration
4187  // currently lack the information needed to correctly determine their
4188  // ranges when accounting for the type-specifier.  We use context
4189  // stored in the CXCursor to determine if the VarDecl is in a DeclGroup,
4190  // and if so, whether it is the first decl.
4191  if (const VarDecl *VD = dyn_cast<VarDecl>(D)) {
4192    if (!cxcursor::isFirstInDeclGroup(C))
4193      Loc = VD->getLocation();
4194  }
4195
4196  // For ObjC methods, give the start location of the method name.
4197  if (const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(D))
4198    Loc = MD->getSelectorStartLoc();
4199
4200  return cxloc::translateSourceLocation(getCursorContext(C), Loc);
4201}
4202
4203} // end extern "C"
4204
4205CXCursor cxcursor::getCursor(CXTranslationUnit TU, SourceLocation SLoc) {
4206  assert(TU);
4207
4208  // Guard against an invalid SourceLocation, or we may assert in one
4209  // of the following calls.
4210  if (SLoc.isInvalid())
4211    return clang_getNullCursor();
4212
4213  ASTUnit *CXXUnit = cxtu::getASTUnit(TU);
4214
4215  // Translate the given source location to make it point at the beginning of
4216  // the token under the cursor.
4217  SLoc = Lexer::GetBeginningOfToken(SLoc, CXXUnit->getSourceManager(),
4218                                    CXXUnit->getASTContext().getLangOpts());
4219
4220  CXCursor Result = MakeCXCursorInvalid(CXCursor_NoDeclFound);
4221  if (SLoc.isValid()) {
4222    GetCursorData ResultData(CXXUnit->getSourceManager(), SLoc, Result);
4223    CursorVisitor CursorVis(TU, GetCursorVisitor, &ResultData,
4224                            /*VisitPreprocessorLast=*/true,
4225                            /*VisitIncludedEntities=*/false,
4226                            SourceLocation(SLoc));
4227    CursorVis.visitFileRegion();
4228  }
4229
4230  return Result;
4231}
4232
4233static SourceRange getRawCursorExtent(CXCursor C) {
4234  if (clang_isReference(C.kind)) {
4235    switch (C.kind) {
4236    case CXCursor_ObjCSuperClassRef:
4237      return  getCursorObjCSuperClassRef(C).second;
4238
4239    case CXCursor_ObjCProtocolRef:
4240      return getCursorObjCProtocolRef(C).second;
4241
4242    case CXCursor_ObjCClassRef:
4243      return getCursorObjCClassRef(C).second;
4244
4245    case CXCursor_TypeRef:
4246      return getCursorTypeRef(C).second;
4247
4248    case CXCursor_TemplateRef:
4249      return getCursorTemplateRef(C).second;
4250
4251    case CXCursor_NamespaceRef:
4252      return getCursorNamespaceRef(C).second;
4253
4254    case CXCursor_MemberRef:
4255      return getCursorMemberRef(C).second;
4256
4257    case CXCursor_CXXBaseSpecifier:
4258      return getCursorCXXBaseSpecifier(C)->getSourceRange();
4259
4260    case CXCursor_LabelRef:
4261      return getCursorLabelRef(C).second;
4262
4263    case CXCursor_OverloadedDeclRef:
4264      return getCursorOverloadedDeclRef(C).second;
4265
4266    case CXCursor_VariableRef:
4267      return getCursorVariableRef(C).second;
4268
4269    default:
4270      // FIXME: Need a way to enumerate all non-reference cases.
4271      llvm_unreachable("Missed a reference kind");
4272    }
4273  }
4274
4275  if (clang_isExpression(C.kind))
4276    return getCursorExpr(C)->getSourceRange();
4277
4278  if (clang_isStatement(C.kind))
4279    return getCursorStmt(C)->getSourceRange();
4280
4281  if (clang_isAttribute(C.kind))
4282    return getCursorAttr(C)->getRange();
4283
4284  if (C.kind == CXCursor_PreprocessingDirective)
4285    return cxcursor::getCursorPreprocessingDirective(C);
4286
4287  if (C.kind == CXCursor_MacroExpansion) {
4288    ASTUnit *TU = getCursorASTUnit(C);
4289    SourceRange Range = cxcursor::getCursorMacroExpansion(C).getSourceRange();
4290    return TU->mapRangeFromPreamble(Range);
4291  }
4292
4293  if (C.kind == CXCursor_MacroDefinition) {
4294    ASTUnit *TU = getCursorASTUnit(C);
4295    SourceRange Range = cxcursor::getCursorMacroDefinition(C)->getSourceRange();
4296    return TU->mapRangeFromPreamble(Range);
4297  }
4298
4299  if (C.kind == CXCursor_InclusionDirective) {
4300    ASTUnit *TU = getCursorASTUnit(C);
4301    SourceRange Range = cxcursor::getCursorInclusionDirective(C)->getSourceRange();
4302    return TU->mapRangeFromPreamble(Range);
4303  }
4304
4305  if (C.kind == CXCursor_TranslationUnit) {
4306    ASTUnit *TU = getCursorASTUnit(C);
4307    FileID MainID = TU->getSourceManager().getMainFileID();
4308    SourceLocation Start = TU->getSourceManager().getLocForStartOfFile(MainID);
4309    SourceLocation End = TU->getSourceManager().getLocForEndOfFile(MainID);
4310    return SourceRange(Start, End);
4311  }
4312
4313  if (clang_isDeclaration(C.kind)) {
4314    const Decl *D = cxcursor::getCursorDecl(C);
4315    if (!D)
4316      return SourceRange();
4317
4318    SourceRange R = D->getSourceRange();
4319    // FIXME: Multiple variables declared in a single declaration
4320    // currently lack the information needed to correctly determine their
4321    // ranges when accounting for the type-specifier.  We use context
4322    // stored in the CXCursor to determine if the VarDecl is in a DeclGroup,
4323    // and if so, whether it is the first decl.
4324    if (const VarDecl *VD = dyn_cast<VarDecl>(D)) {
4325      if (!cxcursor::isFirstInDeclGroup(C))
4326        R.setBegin(VD->getLocation());
4327    }
4328    return R;
4329  }
4330  return SourceRange();
4331}
4332
4333/// \brief Retrieves the "raw" cursor extent, which is then extended to include
4334/// the decl-specifier-seq for declarations.
4335static SourceRange getFullCursorExtent(CXCursor C, SourceManager &SrcMgr) {
4336  if (clang_isDeclaration(C.kind)) {
4337    const Decl *D = cxcursor::getCursorDecl(C);
4338    if (!D)
4339      return SourceRange();
4340
4341    SourceRange R = D->getSourceRange();
4342
4343    // Adjust the start of the location for declarations preceded by
4344    // declaration specifiers.
4345    SourceLocation StartLoc;
4346    if (const DeclaratorDecl *DD = dyn_cast<DeclaratorDecl>(D)) {
4347      if (TypeSourceInfo *TI = DD->getTypeSourceInfo())
4348        StartLoc = TI->getTypeLoc().getLocStart();
4349    } else if (const TypedefDecl *Typedef = dyn_cast<TypedefDecl>(D)) {
4350      if (TypeSourceInfo *TI = Typedef->getTypeSourceInfo())
4351        StartLoc = TI->getTypeLoc().getLocStart();
4352    }
4353
4354    if (StartLoc.isValid() && R.getBegin().isValid() &&
4355        SrcMgr.isBeforeInTranslationUnit(StartLoc, R.getBegin()))
4356      R.setBegin(StartLoc);
4357
4358    // FIXME: Multiple variables declared in a single declaration
4359    // currently lack the information needed to correctly determine their
4360    // ranges when accounting for the type-specifier.  We use context
4361    // stored in the CXCursor to determine if the VarDecl is in a DeclGroup,
4362    // and if so, whether it is the first decl.
4363    if (const VarDecl *VD = dyn_cast<VarDecl>(D)) {
4364      if (!cxcursor::isFirstInDeclGroup(C))
4365        R.setBegin(VD->getLocation());
4366    }
4367
4368    return R;
4369  }
4370
4371  return getRawCursorExtent(C);
4372}
4373
4374extern "C" {
4375
4376CXSourceRange clang_getCursorExtent(CXCursor C) {
4377  SourceRange R = getRawCursorExtent(C);
4378  if (R.isInvalid())
4379    return clang_getNullRange();
4380
4381  return cxloc::translateSourceRange(getCursorContext(C), R);
4382}
4383
4384CXCursor clang_getCursorReferenced(CXCursor C) {
4385  if (clang_isInvalid(C.kind))
4386    return clang_getNullCursor();
4387
4388  CXTranslationUnit tu = getCursorTU(C);
4389  if (clang_isDeclaration(C.kind)) {
4390    const Decl *D = getCursorDecl(C);
4391    if (!D)
4392      return clang_getNullCursor();
4393    if (const UsingDecl *Using = dyn_cast<UsingDecl>(D))
4394      return MakeCursorOverloadedDeclRef(Using, D->getLocation(), tu);
4395    if (const ObjCPropertyImplDecl *PropImpl =
4396            dyn_cast<ObjCPropertyImplDecl>(D))
4397      if (ObjCPropertyDecl *Property = PropImpl->getPropertyDecl())
4398        return MakeCXCursor(Property, tu);
4399
4400    return C;
4401  }
4402
4403  if (clang_isExpression(C.kind)) {
4404    const Expr *E = getCursorExpr(C);
4405    const Decl *D = getDeclFromExpr(E);
4406    if (D) {
4407      CXCursor declCursor = MakeCXCursor(D, tu);
4408      declCursor = getSelectorIdentifierCursor(getSelectorIdentifierIndex(C),
4409                                               declCursor);
4410      return declCursor;
4411    }
4412
4413    if (const OverloadExpr *Ovl = dyn_cast_or_null<OverloadExpr>(E))
4414      return MakeCursorOverloadedDeclRef(Ovl, tu);
4415
4416    return clang_getNullCursor();
4417  }
4418
4419  if (clang_isStatement(C.kind)) {
4420    const Stmt *S = getCursorStmt(C);
4421    if (const GotoStmt *Goto = dyn_cast_or_null<GotoStmt>(S))
4422      if (LabelDecl *label = Goto->getLabel())
4423        if (LabelStmt *labelS = label->getStmt())
4424        return MakeCXCursor(labelS, getCursorDecl(C), tu);
4425
4426    return clang_getNullCursor();
4427  }
4428
4429  if (C.kind == CXCursor_MacroExpansion) {
4430    if (const MacroDefinition *Def = getCursorMacroExpansion(C).getDefinition())
4431      return MakeMacroDefinitionCursor(Def, tu);
4432  }
4433
4434  if (!clang_isReference(C.kind))
4435    return clang_getNullCursor();
4436
4437  switch (C.kind) {
4438    case CXCursor_ObjCSuperClassRef:
4439      return MakeCXCursor(getCursorObjCSuperClassRef(C).first, tu);
4440
4441    case CXCursor_ObjCProtocolRef: {
4442      const ObjCProtocolDecl *Prot = getCursorObjCProtocolRef(C).first;
4443      if (const ObjCProtocolDecl *Def = Prot->getDefinition())
4444        return MakeCXCursor(Def, tu);
4445
4446      return MakeCXCursor(Prot, tu);
4447    }
4448
4449    case CXCursor_ObjCClassRef: {
4450      const ObjCInterfaceDecl *Class = getCursorObjCClassRef(C).first;
4451      if (const ObjCInterfaceDecl *Def = Class->getDefinition())
4452        return MakeCXCursor(Def, tu);
4453
4454      return MakeCXCursor(Class, tu);
4455    }
4456
4457    case CXCursor_TypeRef:
4458      return MakeCXCursor(getCursorTypeRef(C).first, tu );
4459
4460    case CXCursor_TemplateRef:
4461      return MakeCXCursor(getCursorTemplateRef(C).first, tu );
4462
4463    case CXCursor_NamespaceRef:
4464      return MakeCXCursor(getCursorNamespaceRef(C).first, tu );
4465
4466    case CXCursor_MemberRef:
4467      return MakeCXCursor(getCursorMemberRef(C).first, tu );
4468
4469    case CXCursor_CXXBaseSpecifier: {
4470      const CXXBaseSpecifier *B = cxcursor::getCursorCXXBaseSpecifier(C);
4471      return clang_getTypeDeclaration(cxtype::MakeCXType(B->getType(),
4472                                                         tu ));
4473    }
4474
4475    case CXCursor_LabelRef:
4476      // FIXME: We end up faking the "parent" declaration here because we
4477      // don't want to make CXCursor larger.
4478      return MakeCXCursor(getCursorLabelRef(C).first,
4479                          cxtu::getASTUnit(tu)->getASTContext()
4480                              .getTranslationUnitDecl(),
4481                          tu);
4482
4483    case CXCursor_OverloadedDeclRef:
4484      return C;
4485
4486    case CXCursor_VariableRef:
4487      return MakeCXCursor(getCursorVariableRef(C).first, tu);
4488
4489    default:
4490      // We would prefer to enumerate all non-reference cursor kinds here.
4491      llvm_unreachable("Unhandled reference cursor kind");
4492  }
4493}
4494
4495CXCursor clang_getCursorDefinition(CXCursor C) {
4496  if (clang_isInvalid(C.kind))
4497    return clang_getNullCursor();
4498
4499  CXTranslationUnit TU = getCursorTU(C);
4500
4501  bool WasReference = false;
4502  if (clang_isReference(C.kind) || clang_isExpression(C.kind)) {
4503    C = clang_getCursorReferenced(C);
4504    WasReference = true;
4505  }
4506
4507  if (C.kind == CXCursor_MacroExpansion)
4508    return clang_getCursorReferenced(C);
4509
4510  if (!clang_isDeclaration(C.kind))
4511    return clang_getNullCursor();
4512
4513  const Decl *D = getCursorDecl(C);
4514  if (!D)
4515    return clang_getNullCursor();
4516
4517  switch (D->getKind()) {
4518  // Declaration kinds that don't really separate the notions of
4519  // declaration and definition.
4520  case Decl::Namespace:
4521  case Decl::Typedef:
4522  case Decl::TypeAlias:
4523  case Decl::TypeAliasTemplate:
4524  case Decl::TemplateTypeParm:
4525  case Decl::EnumConstant:
4526  case Decl::Field:
4527  case Decl::MSProperty:
4528  case Decl::IndirectField:
4529  case Decl::ObjCIvar:
4530  case Decl::ObjCAtDefsField:
4531  case Decl::ImplicitParam:
4532  case Decl::ParmVar:
4533  case Decl::NonTypeTemplateParm:
4534  case Decl::TemplateTemplateParm:
4535  case Decl::ObjCCategoryImpl:
4536  case Decl::ObjCImplementation:
4537  case Decl::AccessSpec:
4538  case Decl::LinkageSpec:
4539  case Decl::ObjCPropertyImpl:
4540  case Decl::FileScopeAsm:
4541  case Decl::StaticAssert:
4542  case Decl::Block:
4543  case Decl::Captured:
4544  case Decl::Label:  // FIXME: Is this right??
4545  case Decl::ClassScopeFunctionSpecialization:
4546  case Decl::Import:
4547  case Decl::OMPThreadPrivate:
4548    return C;
4549
4550  // Declaration kinds that don't make any sense here, but are
4551  // nonetheless harmless.
4552  case Decl::Empty:
4553  case Decl::TranslationUnit:
4554    break;
4555
4556  // Declaration kinds for which the definition is not resolvable.
4557  case Decl::UnresolvedUsingTypename:
4558  case Decl::UnresolvedUsingValue:
4559    break;
4560
4561  case Decl::UsingDirective:
4562    return MakeCXCursor(cast<UsingDirectiveDecl>(D)->getNominatedNamespace(),
4563                        TU);
4564
4565  case Decl::NamespaceAlias:
4566    return MakeCXCursor(cast<NamespaceAliasDecl>(D)->getNamespace(), TU);
4567
4568  case Decl::Enum:
4569  case Decl::Record:
4570  case Decl::CXXRecord:
4571  case Decl::ClassTemplateSpecialization:
4572  case Decl::ClassTemplatePartialSpecialization:
4573    if (TagDecl *Def = cast<TagDecl>(D)->getDefinition())
4574      return MakeCXCursor(Def, TU);
4575    return clang_getNullCursor();
4576
4577  case Decl::Function:
4578  case Decl::CXXMethod:
4579  case Decl::CXXConstructor:
4580  case Decl::CXXDestructor:
4581  case Decl::CXXConversion: {
4582    const FunctionDecl *Def = 0;
4583    if (cast<FunctionDecl>(D)->getBody(Def))
4584      return MakeCXCursor(Def, TU);
4585    return clang_getNullCursor();
4586  }
4587
4588  case Decl::Var: {
4589    // Ask the variable if it has a definition.
4590    if (const VarDecl *Def = cast<VarDecl>(D)->getDefinition())
4591      return MakeCXCursor(Def, TU);
4592    return clang_getNullCursor();
4593  }
4594
4595  case Decl::FunctionTemplate: {
4596    const FunctionDecl *Def = 0;
4597    if (cast<FunctionTemplateDecl>(D)->getTemplatedDecl()->getBody(Def))
4598      return MakeCXCursor(Def->getDescribedFunctionTemplate(), TU);
4599    return clang_getNullCursor();
4600  }
4601
4602  case Decl::ClassTemplate: {
4603    if (RecordDecl *Def = cast<ClassTemplateDecl>(D)->getTemplatedDecl()
4604                                                            ->getDefinition())
4605      return MakeCXCursor(cast<CXXRecordDecl>(Def)->getDescribedClassTemplate(),
4606                          TU);
4607    return clang_getNullCursor();
4608  }
4609
4610  case Decl::Using:
4611    return MakeCursorOverloadedDeclRef(cast<UsingDecl>(D),
4612                                       D->getLocation(), TU);
4613
4614  case Decl::UsingShadow:
4615    return clang_getCursorDefinition(
4616                       MakeCXCursor(cast<UsingShadowDecl>(D)->getTargetDecl(),
4617                                    TU));
4618
4619  case Decl::ObjCMethod: {
4620    const ObjCMethodDecl *Method = cast<ObjCMethodDecl>(D);
4621    if (Method->isThisDeclarationADefinition())
4622      return C;
4623
4624    // Dig out the method definition in the associated
4625    // @implementation, if we have it.
4626    // FIXME: The ASTs should make finding the definition easier.
4627    if (const ObjCInterfaceDecl *Class
4628                       = dyn_cast<ObjCInterfaceDecl>(Method->getDeclContext()))
4629      if (ObjCImplementationDecl *ClassImpl = Class->getImplementation())
4630        if (ObjCMethodDecl *Def = ClassImpl->getMethod(Method->getSelector(),
4631                                                  Method->isInstanceMethod()))
4632          if (Def->isThisDeclarationADefinition())
4633            return MakeCXCursor(Def, TU);
4634
4635    return clang_getNullCursor();
4636  }
4637
4638  case Decl::ObjCCategory:
4639    if (ObjCCategoryImplDecl *Impl
4640                               = cast<ObjCCategoryDecl>(D)->getImplementation())
4641      return MakeCXCursor(Impl, TU);
4642    return clang_getNullCursor();
4643
4644  case Decl::ObjCProtocol:
4645    if (const ObjCProtocolDecl *Def = cast<ObjCProtocolDecl>(D)->getDefinition())
4646      return MakeCXCursor(Def, TU);
4647    return clang_getNullCursor();
4648
4649  case Decl::ObjCInterface: {
4650    // There are two notions of a "definition" for an Objective-C
4651    // class: the interface and its implementation. When we resolved a
4652    // reference to an Objective-C class, produce the @interface as
4653    // the definition; when we were provided with the interface,
4654    // produce the @implementation as the definition.
4655    const ObjCInterfaceDecl *IFace = cast<ObjCInterfaceDecl>(D);
4656    if (WasReference) {
4657      if (const ObjCInterfaceDecl *Def = IFace->getDefinition())
4658        return MakeCXCursor(Def, TU);
4659    } else if (ObjCImplementationDecl *Impl = IFace->getImplementation())
4660      return MakeCXCursor(Impl, TU);
4661    return clang_getNullCursor();
4662  }
4663
4664  case Decl::ObjCProperty:
4665    // FIXME: We don't really know where to find the
4666    // ObjCPropertyImplDecls that implement this property.
4667    return clang_getNullCursor();
4668
4669  case Decl::ObjCCompatibleAlias:
4670    if (const ObjCInterfaceDecl *Class
4671          = cast<ObjCCompatibleAliasDecl>(D)->getClassInterface())
4672      if (const ObjCInterfaceDecl *Def = Class->getDefinition())
4673        return MakeCXCursor(Def, TU);
4674
4675    return clang_getNullCursor();
4676
4677  case Decl::Friend:
4678    if (NamedDecl *Friend = cast<FriendDecl>(D)->getFriendDecl())
4679      return clang_getCursorDefinition(MakeCXCursor(Friend, TU));
4680    return clang_getNullCursor();
4681
4682  case Decl::FriendTemplate:
4683    if (NamedDecl *Friend = cast<FriendTemplateDecl>(D)->getFriendDecl())
4684      return clang_getCursorDefinition(MakeCXCursor(Friend, TU));
4685    return clang_getNullCursor();
4686  }
4687
4688  return clang_getNullCursor();
4689}
4690
4691unsigned clang_isCursorDefinition(CXCursor C) {
4692  if (!clang_isDeclaration(C.kind))
4693    return 0;
4694
4695  return clang_getCursorDefinition(C) == C;
4696}
4697
4698CXCursor clang_getCanonicalCursor(CXCursor C) {
4699  if (!clang_isDeclaration(C.kind))
4700    return C;
4701
4702  if (const Decl *D = getCursorDecl(C)) {
4703    if (const ObjCCategoryImplDecl *CatImplD = dyn_cast<ObjCCategoryImplDecl>(D))
4704      if (ObjCCategoryDecl *CatD = CatImplD->getCategoryDecl())
4705        return MakeCXCursor(CatD, getCursorTU(C));
4706
4707    if (const ObjCImplDecl *ImplD = dyn_cast<ObjCImplDecl>(D))
4708      if (const ObjCInterfaceDecl *IFD = ImplD->getClassInterface())
4709        return MakeCXCursor(IFD, getCursorTU(C));
4710
4711    return MakeCXCursor(D->getCanonicalDecl(), getCursorTU(C));
4712  }
4713
4714  return C;
4715}
4716
4717int clang_Cursor_getObjCSelectorIndex(CXCursor cursor) {
4718  return cxcursor::getSelectorIdentifierIndexAndLoc(cursor).first;
4719}
4720
4721unsigned clang_getNumOverloadedDecls(CXCursor C) {
4722  if (C.kind != CXCursor_OverloadedDeclRef)
4723    return 0;
4724
4725  OverloadedDeclRefStorage Storage = getCursorOverloadedDeclRef(C).first;
4726  if (const OverloadExpr *E = Storage.dyn_cast<const OverloadExpr *>())
4727    return E->getNumDecls();
4728
4729  if (OverloadedTemplateStorage *S
4730                              = Storage.dyn_cast<OverloadedTemplateStorage*>())
4731    return S->size();
4732
4733  const Decl *D = Storage.get<const Decl *>();
4734  if (const UsingDecl *Using = dyn_cast<UsingDecl>(D))
4735    return Using->shadow_size();
4736
4737  return 0;
4738}
4739
4740CXCursor clang_getOverloadedDecl(CXCursor cursor, unsigned index) {
4741  if (cursor.kind != CXCursor_OverloadedDeclRef)
4742    return clang_getNullCursor();
4743
4744  if (index >= clang_getNumOverloadedDecls(cursor))
4745    return clang_getNullCursor();
4746
4747  CXTranslationUnit TU = getCursorTU(cursor);
4748  OverloadedDeclRefStorage Storage = getCursorOverloadedDeclRef(cursor).first;
4749  if (const OverloadExpr *E = Storage.dyn_cast<const OverloadExpr *>())
4750    return MakeCXCursor(E->decls_begin()[index], TU);
4751
4752  if (OverloadedTemplateStorage *S
4753                              = Storage.dyn_cast<OverloadedTemplateStorage*>())
4754    return MakeCXCursor(S->begin()[index], TU);
4755
4756  const Decl *D = Storage.get<const Decl *>();
4757  if (const UsingDecl *Using = dyn_cast<UsingDecl>(D)) {
4758    // FIXME: This is, unfortunately, linear time.
4759    UsingDecl::shadow_iterator Pos = Using->shadow_begin();
4760    std::advance(Pos, index);
4761    return MakeCXCursor(cast<UsingShadowDecl>(*Pos)->getTargetDecl(), TU);
4762  }
4763
4764  return clang_getNullCursor();
4765}
4766
4767void clang_getDefinitionSpellingAndExtent(CXCursor C,
4768                                          const char **startBuf,
4769                                          const char **endBuf,
4770                                          unsigned *startLine,
4771                                          unsigned *startColumn,
4772                                          unsigned *endLine,
4773                                          unsigned *endColumn) {
4774  assert(getCursorDecl(C) && "CXCursor has null decl");
4775  const FunctionDecl *FD = dyn_cast<FunctionDecl>(getCursorDecl(C));
4776  CompoundStmt *Body = dyn_cast<CompoundStmt>(FD->getBody());
4777
4778  SourceManager &SM = FD->getASTContext().getSourceManager();
4779  *startBuf = SM.getCharacterData(Body->getLBracLoc());
4780  *endBuf = SM.getCharacterData(Body->getRBracLoc());
4781  *startLine = SM.getSpellingLineNumber(Body->getLBracLoc());
4782  *startColumn = SM.getSpellingColumnNumber(Body->getLBracLoc());
4783  *endLine = SM.getSpellingLineNumber(Body->getRBracLoc());
4784  *endColumn = SM.getSpellingColumnNumber(Body->getRBracLoc());
4785}
4786
4787
4788CXSourceRange clang_getCursorReferenceNameRange(CXCursor C, unsigned NameFlags,
4789                                                unsigned PieceIndex) {
4790  RefNamePieces Pieces;
4791
4792  switch (C.kind) {
4793  case CXCursor_MemberRefExpr:
4794    if (const MemberExpr *E = dyn_cast<MemberExpr>(getCursorExpr(C)))
4795      Pieces = buildPieces(NameFlags, true, E->getMemberNameInfo(),
4796                           E->getQualifierLoc().getSourceRange());
4797    break;
4798
4799  case CXCursor_DeclRefExpr:
4800    if (const DeclRefExpr *E = dyn_cast<DeclRefExpr>(getCursorExpr(C)))
4801      Pieces = buildPieces(NameFlags, false, E->getNameInfo(),
4802                           E->getQualifierLoc().getSourceRange(),
4803                           E->getOptionalExplicitTemplateArgs());
4804    break;
4805
4806  case CXCursor_CallExpr:
4807    if (const CXXOperatorCallExpr *OCE =
4808        dyn_cast<CXXOperatorCallExpr>(getCursorExpr(C))) {
4809      const Expr *Callee = OCE->getCallee();
4810      if (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Callee))
4811        Callee = ICE->getSubExpr();
4812
4813      if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee))
4814        Pieces = buildPieces(NameFlags, false, DRE->getNameInfo(),
4815                             DRE->getQualifierLoc().getSourceRange());
4816    }
4817    break;
4818
4819  default:
4820    break;
4821  }
4822
4823  if (Pieces.empty()) {
4824    if (PieceIndex == 0)
4825      return clang_getCursorExtent(C);
4826  } else if (PieceIndex < Pieces.size()) {
4827      SourceRange R = Pieces[PieceIndex];
4828      if (R.isValid())
4829        return cxloc::translateSourceRange(getCursorContext(C), R);
4830  }
4831
4832  return clang_getNullRange();
4833}
4834
4835void clang_enableStackTraces(void) {
4836  llvm::sys::PrintStackTraceOnErrorSignal();
4837}
4838
4839void clang_executeOnThread(void (*fn)(void*), void *user_data,
4840                           unsigned stack_size) {
4841  llvm::llvm_execute_on_thread(fn, user_data, stack_size);
4842}
4843
4844} // end: extern "C"
4845
4846//===----------------------------------------------------------------------===//
4847// Token-based Operations.
4848//===----------------------------------------------------------------------===//
4849
4850/* CXToken layout:
4851 *   int_data[0]: a CXTokenKind
4852 *   int_data[1]: starting token location
4853 *   int_data[2]: token length
4854 *   int_data[3]: reserved
4855 *   ptr_data: for identifiers and keywords, an IdentifierInfo*.
4856 *   otherwise unused.
4857 */
4858extern "C" {
4859
4860CXTokenKind clang_getTokenKind(CXToken CXTok) {
4861  return static_cast<CXTokenKind>(CXTok.int_data[0]);
4862}
4863
4864CXString clang_getTokenSpelling(CXTranslationUnit TU, CXToken CXTok) {
4865  switch (clang_getTokenKind(CXTok)) {
4866  case CXToken_Identifier:
4867  case CXToken_Keyword:
4868    // We know we have an IdentifierInfo*, so use that.
4869    return cxstring::createRef(static_cast<IdentifierInfo *>(CXTok.ptr_data)
4870                            ->getNameStart());
4871
4872  case CXToken_Literal: {
4873    // We have stashed the starting pointer in the ptr_data field. Use it.
4874    const char *Text = static_cast<const char *>(CXTok.ptr_data);
4875    return cxstring::createDup(StringRef(Text, CXTok.int_data[2]));
4876  }
4877
4878  case CXToken_Punctuation:
4879  case CXToken_Comment:
4880    break;
4881  }
4882
4883  // We have to find the starting buffer pointer the hard way, by
4884  // deconstructing the source location.
4885  ASTUnit *CXXUnit = cxtu::getASTUnit(TU);
4886  if (!CXXUnit)
4887    return cxstring::createEmpty();
4888
4889  SourceLocation Loc = SourceLocation::getFromRawEncoding(CXTok.int_data[1]);
4890  std::pair<FileID, unsigned> LocInfo
4891    = CXXUnit->getSourceManager().getDecomposedSpellingLoc(Loc);
4892  bool Invalid = false;
4893  StringRef Buffer
4894    = CXXUnit->getSourceManager().getBufferData(LocInfo.first, &Invalid);
4895  if (Invalid)
4896    return cxstring::createEmpty();
4897
4898  return cxstring::createDup(Buffer.substr(LocInfo.second, CXTok.int_data[2]));
4899}
4900
4901CXSourceLocation clang_getTokenLocation(CXTranslationUnit TU, CXToken CXTok) {
4902  ASTUnit *CXXUnit = cxtu::getASTUnit(TU);
4903  if (!CXXUnit)
4904    return clang_getNullLocation();
4905
4906  return cxloc::translateSourceLocation(CXXUnit->getASTContext(),
4907                        SourceLocation::getFromRawEncoding(CXTok.int_data[1]));
4908}
4909
4910CXSourceRange clang_getTokenExtent(CXTranslationUnit TU, CXToken CXTok) {
4911  ASTUnit *CXXUnit = cxtu::getASTUnit(TU);
4912  if (!CXXUnit)
4913    return clang_getNullRange();
4914
4915  return cxloc::translateSourceRange(CXXUnit->getASTContext(),
4916                        SourceLocation::getFromRawEncoding(CXTok.int_data[1]));
4917}
4918
4919static void getTokens(ASTUnit *CXXUnit, SourceRange Range,
4920                      SmallVectorImpl<CXToken> &CXTokens) {
4921  SourceManager &SourceMgr = CXXUnit->getSourceManager();
4922  std::pair<FileID, unsigned> BeginLocInfo
4923    = SourceMgr.getDecomposedSpellingLoc(Range.getBegin());
4924  std::pair<FileID, unsigned> EndLocInfo
4925    = SourceMgr.getDecomposedSpellingLoc(Range.getEnd());
4926
4927  // Cannot tokenize across files.
4928  if (BeginLocInfo.first != EndLocInfo.first)
4929    return;
4930
4931  // Create a lexer
4932  bool Invalid = false;
4933  StringRef Buffer
4934    = SourceMgr.getBufferData(BeginLocInfo.first, &Invalid);
4935  if (Invalid)
4936    return;
4937
4938  Lexer Lex(SourceMgr.getLocForStartOfFile(BeginLocInfo.first),
4939            CXXUnit->getASTContext().getLangOpts(),
4940            Buffer.begin(), Buffer.data() + BeginLocInfo.second, Buffer.end());
4941  Lex.SetCommentRetentionState(true);
4942
4943  // Lex tokens until we hit the end of the range.
4944  const char *EffectiveBufferEnd = Buffer.data() + EndLocInfo.second;
4945  Token Tok;
4946  bool previousWasAt = false;
4947  do {
4948    // Lex the next token
4949    Lex.LexFromRawLexer(Tok);
4950    if (Tok.is(tok::eof))
4951      break;
4952
4953    // Initialize the CXToken.
4954    CXToken CXTok;
4955
4956    //   - Common fields
4957    CXTok.int_data[1] = Tok.getLocation().getRawEncoding();
4958    CXTok.int_data[2] = Tok.getLength();
4959    CXTok.int_data[3] = 0;
4960
4961    //   - Kind-specific fields
4962    if (Tok.isLiteral()) {
4963      CXTok.int_data[0] = CXToken_Literal;
4964      CXTok.ptr_data = const_cast<char *>(Tok.getLiteralData());
4965    } else if (Tok.is(tok::raw_identifier)) {
4966      // Lookup the identifier to determine whether we have a keyword.
4967      IdentifierInfo *II
4968        = CXXUnit->getPreprocessor().LookUpIdentifierInfo(Tok);
4969
4970      if ((II->getObjCKeywordID() != tok::objc_not_keyword) && previousWasAt) {
4971        CXTok.int_data[0] = CXToken_Keyword;
4972      }
4973      else {
4974        CXTok.int_data[0] = Tok.is(tok::identifier)
4975          ? CXToken_Identifier
4976          : CXToken_Keyword;
4977      }
4978      CXTok.ptr_data = II;
4979    } else if (Tok.is(tok::comment)) {
4980      CXTok.int_data[0] = CXToken_Comment;
4981      CXTok.ptr_data = 0;
4982    } else {
4983      CXTok.int_data[0] = CXToken_Punctuation;
4984      CXTok.ptr_data = 0;
4985    }
4986    CXTokens.push_back(CXTok);
4987    previousWasAt = Tok.is(tok::at);
4988  } while (Lex.getBufferLocation() <= EffectiveBufferEnd);
4989}
4990
4991void clang_tokenize(CXTranslationUnit TU, CXSourceRange Range,
4992                    CXToken **Tokens, unsigned *NumTokens) {
4993  LOG_FUNC_SECTION {
4994    *Log << TU << ' ' << Range;
4995  }
4996
4997  if (Tokens)
4998    *Tokens = 0;
4999  if (NumTokens)
5000    *NumTokens = 0;
5001
5002  if (!TU)
5003    return;
5004
5005  ASTUnit *CXXUnit = cxtu::getASTUnit(TU);
5006  if (!CXXUnit || !Tokens || !NumTokens)
5007    return;
5008
5009  ASTUnit::ConcurrencyCheck Check(*CXXUnit);
5010
5011  SourceRange R = cxloc::translateCXSourceRange(Range);
5012  if (R.isInvalid())
5013    return;
5014
5015  SmallVector<CXToken, 32> CXTokens;
5016  getTokens(CXXUnit, R, CXTokens);
5017
5018  if (CXTokens.empty())
5019    return;
5020
5021  *Tokens = (CXToken *)malloc(sizeof(CXToken) * CXTokens.size());
5022  memmove(*Tokens, CXTokens.data(), sizeof(CXToken) * CXTokens.size());
5023  *NumTokens = CXTokens.size();
5024}
5025
5026void clang_disposeTokens(CXTranslationUnit TU,
5027                         CXToken *Tokens, unsigned NumTokens) {
5028  free(Tokens);
5029}
5030
5031} // end: extern "C"
5032
5033//===----------------------------------------------------------------------===//
5034// Token annotation APIs.
5035//===----------------------------------------------------------------------===//
5036
5037static enum CXChildVisitResult AnnotateTokensVisitor(CXCursor cursor,
5038                                                     CXCursor parent,
5039                                                     CXClientData client_data);
5040static bool AnnotateTokensPostChildrenVisitor(CXCursor cursor,
5041                                              CXClientData client_data);
5042
5043namespace {
5044class AnnotateTokensWorker {
5045  CXToken *Tokens;
5046  CXCursor *Cursors;
5047  unsigned NumTokens;
5048  unsigned TokIdx;
5049  unsigned PreprocessingTokIdx;
5050  CursorVisitor AnnotateVis;
5051  SourceManager &SrcMgr;
5052  bool HasContextSensitiveKeywords;
5053
5054  struct PostChildrenInfo {
5055    CXCursor Cursor;
5056    SourceRange CursorRange;
5057    unsigned BeforeReachingCursorIdx;
5058    unsigned BeforeChildrenTokenIdx;
5059  };
5060  SmallVector<PostChildrenInfo, 8> PostChildrenInfos;
5061
5062  bool MoreTokens() const { return TokIdx < NumTokens; }
5063  unsigned NextToken() const { return TokIdx; }
5064  void AdvanceToken() { ++TokIdx; }
5065  SourceLocation GetTokenLoc(unsigned tokI) {
5066    return SourceLocation::getFromRawEncoding(Tokens[tokI].int_data[1]);
5067  }
5068  bool isFunctionMacroToken(unsigned tokI) const {
5069    return Tokens[tokI].int_data[3] != 0;
5070  }
5071  SourceLocation getFunctionMacroTokenLoc(unsigned tokI) const {
5072    return SourceLocation::getFromRawEncoding(Tokens[tokI].int_data[3]);
5073  }
5074
5075  void annotateAndAdvanceTokens(CXCursor, RangeComparisonResult, SourceRange);
5076  bool annotateAndAdvanceFunctionMacroTokens(CXCursor, RangeComparisonResult,
5077                                             SourceRange);
5078
5079public:
5080  AnnotateTokensWorker(CXToken *tokens, CXCursor *cursors, unsigned numTokens,
5081                       CXTranslationUnit TU, SourceRange RegionOfInterest)
5082    : Tokens(tokens), Cursors(cursors),
5083      NumTokens(numTokens), TokIdx(0), PreprocessingTokIdx(0),
5084      AnnotateVis(TU,
5085                  AnnotateTokensVisitor, this,
5086                  /*VisitPreprocessorLast=*/true,
5087                  /*VisitIncludedEntities=*/false,
5088                  RegionOfInterest,
5089                  /*VisitDeclsOnly=*/false,
5090                  AnnotateTokensPostChildrenVisitor),
5091      SrcMgr(cxtu::getASTUnit(TU)->getSourceManager()),
5092      HasContextSensitiveKeywords(false) { }
5093
5094  void VisitChildren(CXCursor C) { AnnotateVis.VisitChildren(C); }
5095  enum CXChildVisitResult Visit(CXCursor cursor, CXCursor parent);
5096  bool postVisitChildren(CXCursor cursor);
5097  void AnnotateTokens();
5098
5099  /// \brief Determine whether the annotator saw any cursors that have
5100  /// context-sensitive keywords.
5101  bool hasContextSensitiveKeywords() const {
5102    return HasContextSensitiveKeywords;
5103  }
5104
5105  ~AnnotateTokensWorker() {
5106    assert(PostChildrenInfos.empty());
5107  }
5108};
5109}
5110
5111void AnnotateTokensWorker::AnnotateTokens() {
5112  // Walk the AST within the region of interest, annotating tokens
5113  // along the way.
5114  AnnotateVis.visitFileRegion();
5115}
5116
5117static inline void updateCursorAnnotation(CXCursor &Cursor,
5118                                          const CXCursor &updateC) {
5119  if (clang_isInvalid(updateC.kind) || !clang_isInvalid(Cursor.kind))
5120    return;
5121  Cursor = updateC;
5122}
5123
5124/// \brief It annotates and advances tokens with a cursor until the comparison
5125//// between the cursor location and the source range is the same as
5126/// \arg compResult.
5127///
5128/// Pass RangeBefore to annotate tokens with a cursor until a range is reached.
5129/// Pass RangeOverlap to annotate tokens inside a range.
5130void AnnotateTokensWorker::annotateAndAdvanceTokens(CXCursor updateC,
5131                                               RangeComparisonResult compResult,
5132                                               SourceRange range) {
5133  while (MoreTokens()) {
5134    const unsigned I = NextToken();
5135    if (isFunctionMacroToken(I))
5136      if (!annotateAndAdvanceFunctionMacroTokens(updateC, compResult, range))
5137        return;
5138
5139    SourceLocation TokLoc = GetTokenLoc(I);
5140    if (LocationCompare(SrcMgr, TokLoc, range) == compResult) {
5141      updateCursorAnnotation(Cursors[I], updateC);
5142      AdvanceToken();
5143      continue;
5144    }
5145    break;
5146  }
5147}
5148
5149/// \brief Special annotation handling for macro argument tokens.
5150/// \returns true if it advanced beyond all macro tokens, false otherwise.
5151bool AnnotateTokensWorker::annotateAndAdvanceFunctionMacroTokens(
5152                                               CXCursor updateC,
5153                                               RangeComparisonResult compResult,
5154                                               SourceRange range) {
5155  assert(MoreTokens());
5156  assert(isFunctionMacroToken(NextToken()) &&
5157         "Should be called only for macro arg tokens");
5158
5159  // This works differently than annotateAndAdvanceTokens; because expanded
5160  // macro arguments can have arbitrary translation-unit source order, we do not
5161  // advance the token index one by one until a token fails the range test.
5162  // We only advance once past all of the macro arg tokens if all of them
5163  // pass the range test. If one of them fails we keep the token index pointing
5164  // at the start of the macro arg tokens so that the failing token will be
5165  // annotated by a subsequent annotation try.
5166
5167  bool atLeastOneCompFail = false;
5168
5169  unsigned I = NextToken();
5170  for (; I < NumTokens && isFunctionMacroToken(I); ++I) {
5171    SourceLocation TokLoc = getFunctionMacroTokenLoc(I);
5172    if (TokLoc.isFileID())
5173      continue; // not macro arg token, it's parens or comma.
5174    if (LocationCompare(SrcMgr, TokLoc, range) == compResult) {
5175      if (clang_isInvalid(clang_getCursorKind(Cursors[I])))
5176        Cursors[I] = updateC;
5177    } else
5178      atLeastOneCompFail = true;
5179  }
5180
5181  if (atLeastOneCompFail)
5182    return false;
5183
5184  TokIdx = I; // All of the tokens were handled, advance beyond all of them.
5185  return true;
5186}
5187
5188enum CXChildVisitResult
5189AnnotateTokensWorker::Visit(CXCursor cursor, CXCursor parent) {
5190  SourceRange cursorRange = getRawCursorExtent(cursor);
5191  if (cursorRange.isInvalid())
5192    return CXChildVisit_Recurse;
5193
5194  if (!HasContextSensitiveKeywords) {
5195    // Objective-C properties can have context-sensitive keywords.
5196    if (cursor.kind == CXCursor_ObjCPropertyDecl) {
5197      if (const ObjCPropertyDecl *Property
5198                  = dyn_cast_or_null<ObjCPropertyDecl>(getCursorDecl(cursor)))
5199        HasContextSensitiveKeywords = Property->getPropertyAttributesAsWritten() != 0;
5200    }
5201    // Objective-C methods can have context-sensitive keywords.
5202    else if (cursor.kind == CXCursor_ObjCInstanceMethodDecl ||
5203             cursor.kind == CXCursor_ObjCClassMethodDecl) {
5204      if (const ObjCMethodDecl *Method
5205            = dyn_cast_or_null<ObjCMethodDecl>(getCursorDecl(cursor))) {
5206        if (Method->getObjCDeclQualifier())
5207          HasContextSensitiveKeywords = true;
5208        else {
5209          for (ObjCMethodDecl::param_const_iterator P = Method->param_begin(),
5210                                                 PEnd = Method->param_end();
5211               P != PEnd; ++P) {
5212            if ((*P)->getObjCDeclQualifier()) {
5213              HasContextSensitiveKeywords = true;
5214              break;
5215            }
5216          }
5217        }
5218      }
5219    }
5220    // C++ methods can have context-sensitive keywords.
5221    else if (cursor.kind == CXCursor_CXXMethod) {
5222      if (const CXXMethodDecl *Method
5223                  = dyn_cast_or_null<CXXMethodDecl>(getCursorDecl(cursor))) {
5224        if (Method->hasAttr<FinalAttr>() || Method->hasAttr<OverrideAttr>())
5225          HasContextSensitiveKeywords = true;
5226      }
5227    }
5228    // C++ classes can have context-sensitive keywords.
5229    else if (cursor.kind == CXCursor_StructDecl ||
5230             cursor.kind == CXCursor_ClassDecl ||
5231             cursor.kind == CXCursor_ClassTemplate ||
5232             cursor.kind == CXCursor_ClassTemplatePartialSpecialization) {
5233      if (const Decl *D = getCursorDecl(cursor))
5234        if (D->hasAttr<FinalAttr>())
5235          HasContextSensitiveKeywords = true;
5236    }
5237  }
5238
5239  // Don't override a property annotation with its getter/setter method.
5240  if (cursor.kind == CXCursor_ObjCInstanceMethodDecl &&
5241      parent.kind == CXCursor_ObjCPropertyDecl)
5242    return CXChildVisit_Continue;
5243
5244  if (clang_isPreprocessing(cursor.kind)) {
5245    // Items in the preprocessing record are kept separate from items in
5246    // declarations, so we keep a separate token index.
5247    unsigned SavedTokIdx = TokIdx;
5248    TokIdx = PreprocessingTokIdx;
5249
5250    // Skip tokens up until we catch up to the beginning of the preprocessing
5251    // entry.
5252    while (MoreTokens()) {
5253      const unsigned I = NextToken();
5254      SourceLocation TokLoc = GetTokenLoc(I);
5255      switch (LocationCompare(SrcMgr, TokLoc, cursorRange)) {
5256      case RangeBefore:
5257        AdvanceToken();
5258        continue;
5259      case RangeAfter:
5260      case RangeOverlap:
5261        break;
5262      }
5263      break;
5264    }
5265
5266    // Look at all of the tokens within this range.
5267    while (MoreTokens()) {
5268      const unsigned I = NextToken();
5269      SourceLocation TokLoc = GetTokenLoc(I);
5270      switch (LocationCompare(SrcMgr, TokLoc, cursorRange)) {
5271      case RangeBefore:
5272        llvm_unreachable("Infeasible");
5273      case RangeAfter:
5274        break;
5275      case RangeOverlap:
5276        // For macro expansions, just note where the beginning of the macro
5277        // expansion occurs.
5278        if (cursor.kind == CXCursor_MacroExpansion) {
5279          if (TokLoc == cursorRange.getBegin())
5280            Cursors[I] = cursor;
5281          AdvanceToken();
5282          break;
5283        }
5284        // We may have already annotated macro names inside macro definitions.
5285        if (Cursors[I].kind != CXCursor_MacroExpansion)
5286          Cursors[I] = cursor;
5287        AdvanceToken();
5288        continue;
5289      }
5290      break;
5291    }
5292
5293    // Save the preprocessing token index; restore the non-preprocessing
5294    // token index.
5295    PreprocessingTokIdx = TokIdx;
5296    TokIdx = SavedTokIdx;
5297    return CXChildVisit_Recurse;
5298  }
5299
5300  if (cursorRange.isInvalid())
5301    return CXChildVisit_Continue;
5302
5303  unsigned BeforeReachingCursorIdx = NextToken();
5304  const enum CXCursorKind cursorK = clang_getCursorKind(cursor);
5305  const enum CXCursorKind K = clang_getCursorKind(parent);
5306  const CXCursor updateC =
5307    (clang_isInvalid(K) || K == CXCursor_TranslationUnit ||
5308     // Attributes are annotated out-of-order, skip tokens until we reach it.
5309     clang_isAttribute(cursor.kind))
5310     ? clang_getNullCursor() : parent;
5311
5312  annotateAndAdvanceTokens(updateC, RangeBefore, cursorRange);
5313
5314  // Avoid having the cursor of an expression "overwrite" the annotation of the
5315  // variable declaration that it belongs to.
5316  // This can happen for C++ constructor expressions whose range generally
5317  // include the variable declaration, e.g.:
5318  //  MyCXXClass foo; // Make sure we don't annotate 'foo' as a CallExpr cursor.
5319  if (clang_isExpression(cursorK)) {
5320    const Expr *E = getCursorExpr(cursor);
5321    if (const Decl *D = getCursorParentDecl(cursor)) {
5322      const unsigned I = NextToken();
5323      if (E->getLocStart().isValid() && D->getLocation().isValid() &&
5324          E->getLocStart() == D->getLocation() &&
5325          E->getLocStart() == GetTokenLoc(I)) {
5326        updateCursorAnnotation(Cursors[I], updateC);
5327        AdvanceToken();
5328      }
5329    }
5330  }
5331
5332  // Before recursing into the children keep some state that we are going
5333  // to use in the AnnotateTokensWorker::postVisitChildren callback to do some
5334  // extra work after the child nodes are visited.
5335  // Note that we don't call VisitChildren here to avoid traversing statements
5336  // code-recursively which can blow the stack.
5337
5338  PostChildrenInfo Info;
5339  Info.Cursor = cursor;
5340  Info.CursorRange = cursorRange;
5341  Info.BeforeReachingCursorIdx = BeforeReachingCursorIdx;
5342  Info.BeforeChildrenTokenIdx = NextToken();
5343  PostChildrenInfos.push_back(Info);
5344
5345  return CXChildVisit_Recurse;
5346}
5347
5348bool AnnotateTokensWorker::postVisitChildren(CXCursor cursor) {
5349  if (PostChildrenInfos.empty())
5350    return false;
5351  const PostChildrenInfo &Info = PostChildrenInfos.back();
5352  if (!clang_equalCursors(Info.Cursor, cursor))
5353    return false;
5354
5355  const unsigned BeforeChildren = Info.BeforeChildrenTokenIdx;
5356  const unsigned AfterChildren = NextToken();
5357  SourceRange cursorRange = Info.CursorRange;
5358
5359  // Scan the tokens that are at the end of the cursor, but are not captured
5360  // but the child cursors.
5361  annotateAndAdvanceTokens(cursor, RangeOverlap, cursorRange);
5362
5363  // Scan the tokens that are at the beginning of the cursor, but are not
5364  // capture by the child cursors.
5365  for (unsigned I = BeforeChildren; I != AfterChildren; ++I) {
5366    if (!clang_isInvalid(clang_getCursorKind(Cursors[I])))
5367      break;
5368
5369    Cursors[I] = cursor;
5370  }
5371
5372  // Attributes are annotated out-of-order, rewind TokIdx to when we first
5373  // encountered the attribute cursor.
5374  if (clang_isAttribute(cursor.kind))
5375    TokIdx = Info.BeforeReachingCursorIdx;
5376
5377  PostChildrenInfos.pop_back();
5378  return false;
5379}
5380
5381static enum CXChildVisitResult AnnotateTokensVisitor(CXCursor cursor,
5382                                                     CXCursor parent,
5383                                                     CXClientData client_data) {
5384  return static_cast<AnnotateTokensWorker*>(client_data)->Visit(cursor, parent);
5385}
5386
5387static bool AnnotateTokensPostChildrenVisitor(CXCursor cursor,
5388                                              CXClientData client_data) {
5389  return static_cast<AnnotateTokensWorker*>(client_data)->
5390                                                      postVisitChildren(cursor);
5391}
5392
5393namespace {
5394
5395/// \brief Uses the macro expansions in the preprocessing record to find
5396/// and mark tokens that are macro arguments. This info is used by the
5397/// AnnotateTokensWorker.
5398class MarkMacroArgTokensVisitor {
5399  SourceManager &SM;
5400  CXToken *Tokens;
5401  unsigned NumTokens;
5402  unsigned CurIdx;
5403
5404public:
5405  MarkMacroArgTokensVisitor(SourceManager &SM,
5406                            CXToken *tokens, unsigned numTokens)
5407    : SM(SM), Tokens(tokens), NumTokens(numTokens), CurIdx(0) { }
5408
5409  CXChildVisitResult visit(CXCursor cursor, CXCursor parent) {
5410    if (cursor.kind != CXCursor_MacroExpansion)
5411      return CXChildVisit_Continue;
5412
5413    SourceRange macroRange = getCursorMacroExpansion(cursor).getSourceRange();
5414    if (macroRange.getBegin() == macroRange.getEnd())
5415      return CXChildVisit_Continue; // it's not a function macro.
5416
5417    for (; CurIdx < NumTokens; ++CurIdx) {
5418      if (!SM.isBeforeInTranslationUnit(getTokenLoc(CurIdx),
5419                                        macroRange.getBegin()))
5420        break;
5421    }
5422
5423    if (CurIdx == NumTokens)
5424      return CXChildVisit_Break;
5425
5426    for (; CurIdx < NumTokens; ++CurIdx) {
5427      SourceLocation tokLoc = getTokenLoc(CurIdx);
5428      if (!SM.isBeforeInTranslationUnit(tokLoc, macroRange.getEnd()))
5429        break;
5430
5431      setFunctionMacroTokenLoc(CurIdx, SM.getMacroArgExpandedLocation(tokLoc));
5432    }
5433
5434    if (CurIdx == NumTokens)
5435      return CXChildVisit_Break;
5436
5437    return CXChildVisit_Continue;
5438  }
5439
5440private:
5441  SourceLocation getTokenLoc(unsigned tokI) {
5442    return SourceLocation::getFromRawEncoding(Tokens[tokI].int_data[1]);
5443  }
5444
5445  void setFunctionMacroTokenLoc(unsigned tokI, SourceLocation loc) {
5446    // The third field is reserved and currently not used. Use it here
5447    // to mark macro arg expanded tokens with their expanded locations.
5448    Tokens[tokI].int_data[3] = loc.getRawEncoding();
5449  }
5450};
5451
5452} // end anonymous namespace
5453
5454static CXChildVisitResult
5455MarkMacroArgTokensVisitorDelegate(CXCursor cursor, CXCursor parent,
5456                                  CXClientData client_data) {
5457  return static_cast<MarkMacroArgTokensVisitor*>(client_data)->visit(cursor,
5458                                                                     parent);
5459}
5460
5461namespace {
5462  struct clang_annotateTokens_Data {
5463    CXTranslationUnit TU;
5464    ASTUnit *CXXUnit;
5465    CXToken *Tokens;
5466    unsigned NumTokens;
5467    CXCursor *Cursors;
5468  };
5469}
5470
5471/// \brief Used by \c annotatePreprocessorTokens.
5472/// \returns true if lexing was finished, false otherwise.
5473static bool lexNext(Lexer &Lex, Token &Tok,
5474                   unsigned &NextIdx, unsigned NumTokens) {
5475  if (NextIdx >= NumTokens)
5476    return true;
5477
5478  ++NextIdx;
5479  Lex.LexFromRawLexer(Tok);
5480  if (Tok.is(tok::eof))
5481    return true;
5482
5483  return false;
5484}
5485
5486static void annotatePreprocessorTokens(CXTranslationUnit TU,
5487                                       SourceRange RegionOfInterest,
5488                                       CXCursor *Cursors,
5489                                       CXToken *Tokens,
5490                                       unsigned NumTokens) {
5491  ASTUnit *CXXUnit = cxtu::getASTUnit(TU);
5492
5493  Preprocessor &PP = CXXUnit->getPreprocessor();
5494  SourceManager &SourceMgr = CXXUnit->getSourceManager();
5495  std::pair<FileID, unsigned> BeginLocInfo
5496    = SourceMgr.getDecomposedSpellingLoc(RegionOfInterest.getBegin());
5497  std::pair<FileID, unsigned> EndLocInfo
5498    = SourceMgr.getDecomposedSpellingLoc(RegionOfInterest.getEnd());
5499
5500  if (BeginLocInfo.first != EndLocInfo.first)
5501    return;
5502
5503  StringRef Buffer;
5504  bool Invalid = false;
5505  Buffer = SourceMgr.getBufferData(BeginLocInfo.first, &Invalid);
5506  if (Buffer.empty() || Invalid)
5507    return;
5508
5509  Lexer Lex(SourceMgr.getLocForStartOfFile(BeginLocInfo.first),
5510            CXXUnit->getASTContext().getLangOpts(),
5511            Buffer.begin(), Buffer.data() + BeginLocInfo.second,
5512            Buffer.end());
5513  Lex.SetCommentRetentionState(true);
5514
5515  unsigned NextIdx = 0;
5516  // Lex tokens in raw mode until we hit the end of the range, to avoid
5517  // entering #includes or expanding macros.
5518  while (true) {
5519    Token Tok;
5520    if (lexNext(Lex, Tok, NextIdx, NumTokens))
5521      break;
5522    unsigned TokIdx = NextIdx-1;
5523    assert(Tok.getLocation() ==
5524             SourceLocation::getFromRawEncoding(Tokens[TokIdx].int_data[1]));
5525
5526  reprocess:
5527    if (Tok.is(tok::hash) && Tok.isAtStartOfLine()) {
5528      // We have found a preprocessing directive. Annotate the tokens
5529      // appropriately.
5530      //
5531      // FIXME: Some simple tests here could identify macro definitions and
5532      // #undefs, to provide specific cursor kinds for those.
5533
5534      SourceLocation BeginLoc = Tok.getLocation();
5535      if (lexNext(Lex, Tok, NextIdx, NumTokens))
5536        break;
5537
5538      MacroInfo *MI = 0;
5539      if (Tok.is(tok::raw_identifier) &&
5540          StringRef(Tok.getRawIdentifierData(), Tok.getLength()) == "define") {
5541        if (lexNext(Lex, Tok, NextIdx, NumTokens))
5542          break;
5543
5544        if (Tok.is(tok::raw_identifier)) {
5545          StringRef Name(Tok.getRawIdentifierData(), Tok.getLength());
5546          IdentifierInfo &II = PP.getIdentifierTable().get(Name);
5547          SourceLocation MappedTokLoc =
5548              CXXUnit->mapLocationToPreamble(Tok.getLocation());
5549          MI = getMacroInfo(II, MappedTokLoc, TU);
5550        }
5551      }
5552
5553      bool finished = false;
5554      do {
5555        if (lexNext(Lex, Tok, NextIdx, NumTokens)) {
5556          finished = true;
5557          break;
5558        }
5559        // If we are in a macro definition, check if the token was ever a
5560        // macro name and annotate it if that's the case.
5561        if (MI) {
5562          SourceLocation SaveLoc = Tok.getLocation();
5563          Tok.setLocation(CXXUnit->mapLocationToPreamble(SaveLoc));
5564          MacroDefinition *MacroDef = checkForMacroInMacroDefinition(MI,Tok,TU);
5565          Tok.setLocation(SaveLoc);
5566          if (MacroDef)
5567            Cursors[NextIdx-1] = MakeMacroExpansionCursor(MacroDef,
5568                                                         Tok.getLocation(), TU);
5569        }
5570      } while (!Tok.isAtStartOfLine());
5571
5572      unsigned LastIdx = finished ? NextIdx-1 : NextIdx-2;
5573      assert(TokIdx <= LastIdx);
5574      SourceLocation EndLoc =
5575          SourceLocation::getFromRawEncoding(Tokens[LastIdx].int_data[1]);
5576      CXCursor Cursor =
5577          MakePreprocessingDirectiveCursor(SourceRange(BeginLoc, EndLoc), TU);
5578
5579      for (; TokIdx <= LastIdx; ++TokIdx)
5580        updateCursorAnnotation(Cursors[TokIdx], Cursor);
5581
5582      if (finished)
5583        break;
5584      goto reprocess;
5585    }
5586  }
5587}
5588
5589// This gets run a separate thread to avoid stack blowout.
5590static void clang_annotateTokensImpl(void *UserData) {
5591  CXTranslationUnit TU = ((clang_annotateTokens_Data*)UserData)->TU;
5592  ASTUnit *CXXUnit = ((clang_annotateTokens_Data*)UserData)->CXXUnit;
5593  CXToken *Tokens = ((clang_annotateTokens_Data*)UserData)->Tokens;
5594  const unsigned NumTokens = ((clang_annotateTokens_Data*)UserData)->NumTokens;
5595  CXCursor *Cursors = ((clang_annotateTokens_Data*)UserData)->Cursors;
5596
5597  CIndexer *CXXIdx = TU->CIdx;
5598  if (CXXIdx->isOptEnabled(CXGlobalOpt_ThreadBackgroundPriorityForEditing))
5599    setThreadBackgroundPriority();
5600
5601  // Determine the region of interest, which contains all of the tokens.
5602  SourceRange RegionOfInterest;
5603  RegionOfInterest.setBegin(
5604    cxloc::translateSourceLocation(clang_getTokenLocation(TU, Tokens[0])));
5605  RegionOfInterest.setEnd(
5606    cxloc::translateSourceLocation(clang_getTokenLocation(TU,
5607                                                         Tokens[NumTokens-1])));
5608
5609  // Relex the tokens within the source range to look for preprocessing
5610  // directives.
5611  annotatePreprocessorTokens(TU, RegionOfInterest, Cursors, Tokens, NumTokens);
5612
5613  // If begin location points inside a macro argument, set it to the expansion
5614  // location so we can have the full context when annotating semantically.
5615  {
5616    SourceManager &SM = CXXUnit->getSourceManager();
5617    SourceLocation Loc =
5618        SM.getMacroArgExpandedLocation(RegionOfInterest.getBegin());
5619    if (Loc.isMacroID())
5620      RegionOfInterest.setBegin(SM.getExpansionLoc(Loc));
5621  }
5622
5623  if (CXXUnit->getPreprocessor().getPreprocessingRecord()) {
5624    // Search and mark tokens that are macro argument expansions.
5625    MarkMacroArgTokensVisitor Visitor(CXXUnit->getSourceManager(),
5626                                      Tokens, NumTokens);
5627    CursorVisitor MacroArgMarker(TU,
5628                                 MarkMacroArgTokensVisitorDelegate, &Visitor,
5629                                 /*VisitPreprocessorLast=*/true,
5630                                 /*VisitIncludedEntities=*/false,
5631                                 RegionOfInterest);
5632    MacroArgMarker.visitPreprocessedEntitiesInRegion();
5633  }
5634
5635  // Annotate all of the source locations in the region of interest that map to
5636  // a specific cursor.
5637  AnnotateTokensWorker W(Tokens, Cursors, NumTokens, TU, RegionOfInterest);
5638
5639  // FIXME: We use a ridiculous stack size here because the data-recursion
5640  // algorithm uses a large stack frame than the non-data recursive version,
5641  // and AnnotationTokensWorker currently transforms the data-recursion
5642  // algorithm back into a traditional recursion by explicitly calling
5643  // VisitChildren().  We will need to remove this explicit recursive call.
5644  W.AnnotateTokens();
5645
5646  // If we ran into any entities that involve context-sensitive keywords,
5647  // take another pass through the tokens to mark them as such.
5648  if (W.hasContextSensitiveKeywords()) {
5649    for (unsigned I = 0; I != NumTokens; ++I) {
5650      if (clang_getTokenKind(Tokens[I]) != CXToken_Identifier)
5651        continue;
5652
5653      if (Cursors[I].kind == CXCursor_ObjCPropertyDecl) {
5654        IdentifierInfo *II = static_cast<IdentifierInfo *>(Tokens[I].ptr_data);
5655        if (const ObjCPropertyDecl *Property
5656            = dyn_cast_or_null<ObjCPropertyDecl>(getCursorDecl(Cursors[I]))) {
5657          if (Property->getPropertyAttributesAsWritten() != 0 &&
5658              llvm::StringSwitch<bool>(II->getName())
5659              .Case("readonly", true)
5660              .Case("assign", true)
5661              .Case("unsafe_unretained", true)
5662              .Case("readwrite", true)
5663              .Case("retain", true)
5664              .Case("copy", true)
5665              .Case("nonatomic", true)
5666              .Case("atomic", true)
5667              .Case("getter", true)
5668              .Case("setter", true)
5669              .Case("strong", true)
5670              .Case("weak", true)
5671              .Default(false))
5672            Tokens[I].int_data[0] = CXToken_Keyword;
5673        }
5674        continue;
5675      }
5676
5677      if (Cursors[I].kind == CXCursor_ObjCInstanceMethodDecl ||
5678          Cursors[I].kind == CXCursor_ObjCClassMethodDecl) {
5679        IdentifierInfo *II = static_cast<IdentifierInfo *>(Tokens[I].ptr_data);
5680        if (llvm::StringSwitch<bool>(II->getName())
5681            .Case("in", true)
5682            .Case("out", true)
5683            .Case("inout", true)
5684            .Case("oneway", true)
5685            .Case("bycopy", true)
5686            .Case("byref", true)
5687            .Default(false))
5688          Tokens[I].int_data[0] = CXToken_Keyword;
5689        continue;
5690      }
5691
5692      if (Cursors[I].kind == CXCursor_CXXFinalAttr ||
5693          Cursors[I].kind == CXCursor_CXXOverrideAttr) {
5694        Tokens[I].int_data[0] = CXToken_Keyword;
5695        continue;
5696      }
5697    }
5698  }
5699}
5700
5701extern "C" {
5702
5703void clang_annotateTokens(CXTranslationUnit TU,
5704                          CXToken *Tokens, unsigned NumTokens,
5705                          CXCursor *Cursors) {
5706  if (!TU || NumTokens == 0 || !Tokens || !Cursors) {
5707    LOG_FUNC_SECTION { *Log << "<null input>"; }
5708    return;
5709  }
5710
5711  LOG_FUNC_SECTION {
5712    *Log << TU << ' ';
5713    CXSourceLocation bloc = clang_getTokenLocation(TU, Tokens[0]);
5714    CXSourceLocation eloc = clang_getTokenLocation(TU, Tokens[NumTokens-1]);
5715    *Log << clang_getRange(bloc, eloc);
5716  }
5717
5718  // Any token we don't specifically annotate will have a NULL cursor.
5719  CXCursor C = clang_getNullCursor();
5720  for (unsigned I = 0; I != NumTokens; ++I)
5721    Cursors[I] = C;
5722
5723  ASTUnit *CXXUnit = cxtu::getASTUnit(TU);
5724  if (!CXXUnit)
5725    return;
5726
5727  ASTUnit::ConcurrencyCheck Check(*CXXUnit);
5728
5729  clang_annotateTokens_Data data = { TU, CXXUnit, Tokens, NumTokens, Cursors };
5730  llvm::CrashRecoveryContext CRC;
5731  if (!RunSafely(CRC, clang_annotateTokensImpl, &data,
5732                 GetSafetyThreadStackSize() * 2)) {
5733    fprintf(stderr, "libclang: crash detected while annotating tokens\n");
5734  }
5735}
5736
5737} // end: extern "C"
5738
5739//===----------------------------------------------------------------------===//
5740// Operations for querying linkage of a cursor.
5741//===----------------------------------------------------------------------===//
5742
5743extern "C" {
5744CXLinkageKind clang_getCursorLinkage(CXCursor cursor) {
5745  if (!clang_isDeclaration(cursor.kind))
5746    return CXLinkage_Invalid;
5747
5748  const Decl *D = cxcursor::getCursorDecl(cursor);
5749  if (const NamedDecl *ND = dyn_cast_or_null<NamedDecl>(D))
5750    switch (ND->getLinkageInternal()) {
5751      case NoLinkage:
5752      case VisibleNoLinkage: return CXLinkage_NoLinkage;
5753      case InternalLinkage: return CXLinkage_Internal;
5754      case UniqueExternalLinkage: return CXLinkage_UniqueExternal;
5755      case ExternalLinkage: return CXLinkage_External;
5756    };
5757
5758  return CXLinkage_Invalid;
5759}
5760} // end: extern "C"
5761
5762//===----------------------------------------------------------------------===//
5763// Operations for querying language of a cursor.
5764//===----------------------------------------------------------------------===//
5765
5766static CXLanguageKind getDeclLanguage(const Decl *D) {
5767  if (!D)
5768    return CXLanguage_C;
5769
5770  switch (D->getKind()) {
5771    default:
5772      break;
5773    case Decl::ImplicitParam:
5774    case Decl::ObjCAtDefsField:
5775    case Decl::ObjCCategory:
5776    case Decl::ObjCCategoryImpl:
5777    case Decl::ObjCCompatibleAlias:
5778    case Decl::ObjCImplementation:
5779    case Decl::ObjCInterface:
5780    case Decl::ObjCIvar:
5781    case Decl::ObjCMethod:
5782    case Decl::ObjCProperty:
5783    case Decl::ObjCPropertyImpl:
5784    case Decl::ObjCProtocol:
5785      return CXLanguage_ObjC;
5786    case Decl::CXXConstructor:
5787    case Decl::CXXConversion:
5788    case Decl::CXXDestructor:
5789    case Decl::CXXMethod:
5790    case Decl::CXXRecord:
5791    case Decl::ClassTemplate:
5792    case Decl::ClassTemplatePartialSpecialization:
5793    case Decl::ClassTemplateSpecialization:
5794    case Decl::Friend:
5795    case Decl::FriendTemplate:
5796    case Decl::FunctionTemplate:
5797    case Decl::LinkageSpec:
5798    case Decl::Namespace:
5799    case Decl::NamespaceAlias:
5800    case Decl::NonTypeTemplateParm:
5801    case Decl::StaticAssert:
5802    case Decl::TemplateTemplateParm:
5803    case Decl::TemplateTypeParm:
5804    case Decl::UnresolvedUsingTypename:
5805    case Decl::UnresolvedUsingValue:
5806    case Decl::Using:
5807    case Decl::UsingDirective:
5808    case Decl::UsingShadow:
5809      return CXLanguage_CPlusPlus;
5810  }
5811
5812  return CXLanguage_C;
5813}
5814
5815extern "C" {
5816
5817enum CXAvailabilityKind clang_getCursorAvailability(CXCursor cursor) {
5818  if (clang_isDeclaration(cursor.kind))
5819    if (const Decl *D = cxcursor::getCursorDecl(cursor)) {
5820      if (isa<FunctionDecl>(D) && cast<FunctionDecl>(D)->isDeleted())
5821        return CXAvailability_Available;
5822
5823      switch (D->getAvailability()) {
5824      case AR_Available:
5825      case AR_NotYetIntroduced:
5826        return CXAvailability_Available;
5827
5828      case AR_Deprecated:
5829        return CXAvailability_Deprecated;
5830
5831      case AR_Unavailable:
5832        return CXAvailability_NotAvailable;
5833      }
5834    }
5835
5836  return CXAvailability_Available;
5837}
5838
5839static CXVersion convertVersion(VersionTuple In) {
5840  CXVersion Out = { -1, -1, -1 };
5841  if (In.empty())
5842    return Out;
5843
5844  Out.Major = In.getMajor();
5845
5846  Optional<unsigned> Minor = In.getMinor();
5847  if (Minor.hasValue())
5848    Out.Minor = *Minor;
5849  else
5850    return Out;
5851
5852  Optional<unsigned> Subminor = In.getSubminor();
5853  if (Subminor.hasValue())
5854    Out.Subminor = *Subminor;
5855
5856  return Out;
5857}
5858
5859int clang_getCursorPlatformAvailability(CXCursor cursor,
5860                                        int *always_deprecated,
5861                                        CXString *deprecated_message,
5862                                        int *always_unavailable,
5863                                        CXString *unavailable_message,
5864                                        CXPlatformAvailability *availability,
5865                                        int availability_size) {
5866  if (always_deprecated)
5867    *always_deprecated = 0;
5868  if (deprecated_message)
5869    *deprecated_message = cxstring::createEmpty();
5870  if (always_unavailable)
5871    *always_unavailable = 0;
5872  if (unavailable_message)
5873    *unavailable_message = cxstring::createEmpty();
5874
5875  if (!clang_isDeclaration(cursor.kind))
5876    return 0;
5877
5878  const Decl *D = cxcursor::getCursorDecl(cursor);
5879  if (!D)
5880    return 0;
5881
5882  int N = 0;
5883  for (Decl::attr_iterator A = D->attr_begin(), AEnd = D->attr_end(); A != AEnd;
5884       ++A) {
5885    if (DeprecatedAttr *Deprecated = dyn_cast<DeprecatedAttr>(*A)) {
5886      if (always_deprecated)
5887        *always_deprecated = 1;
5888      if (deprecated_message)
5889        *deprecated_message = cxstring::createDup(Deprecated->getMessage());
5890      continue;
5891    }
5892
5893    if (UnavailableAttr *Unavailable = dyn_cast<UnavailableAttr>(*A)) {
5894      if (always_unavailable)
5895        *always_unavailable = 1;
5896      if (unavailable_message) {
5897        *unavailable_message = cxstring::createDup(Unavailable->getMessage());
5898      }
5899      continue;
5900    }
5901
5902    if (AvailabilityAttr *Avail = dyn_cast<AvailabilityAttr>(*A)) {
5903      if (N < availability_size) {
5904        availability[N].Platform
5905          = cxstring::createDup(Avail->getPlatform()->getName());
5906        availability[N].Introduced = convertVersion(Avail->getIntroduced());
5907        availability[N].Deprecated = convertVersion(Avail->getDeprecated());
5908        availability[N].Obsoleted = convertVersion(Avail->getObsoleted());
5909        availability[N].Unavailable = Avail->getUnavailable();
5910        availability[N].Message = cxstring::createDup(Avail->getMessage());
5911      }
5912      ++N;
5913    }
5914  }
5915
5916  return N;
5917}
5918
5919void clang_disposeCXPlatformAvailability(CXPlatformAvailability *availability) {
5920  clang_disposeString(availability->Platform);
5921  clang_disposeString(availability->Message);
5922}
5923
5924CXLanguageKind clang_getCursorLanguage(CXCursor cursor) {
5925  if (clang_isDeclaration(cursor.kind))
5926    return getDeclLanguage(cxcursor::getCursorDecl(cursor));
5927
5928  return CXLanguage_Invalid;
5929}
5930
5931 /// \brief If the given cursor is the "templated" declaration
5932 /// descibing a class or function template, return the class or
5933 /// function template.
5934static const Decl *maybeGetTemplateCursor(const Decl *D) {
5935  if (!D)
5936    return 0;
5937
5938  if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D))
5939    if (FunctionTemplateDecl *FunTmpl = FD->getDescribedFunctionTemplate())
5940      return FunTmpl;
5941
5942  if (const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(D))
5943    if (ClassTemplateDecl *ClassTmpl = RD->getDescribedClassTemplate())
5944      return ClassTmpl;
5945
5946  return D;
5947}
5948
5949CXCursor clang_getCursorSemanticParent(CXCursor cursor) {
5950  if (clang_isDeclaration(cursor.kind)) {
5951    if (const Decl *D = getCursorDecl(cursor)) {
5952      const DeclContext *DC = D->getDeclContext();
5953      if (!DC)
5954        return clang_getNullCursor();
5955
5956      return MakeCXCursor(maybeGetTemplateCursor(cast<Decl>(DC)),
5957                          getCursorTU(cursor));
5958    }
5959  }
5960
5961  if (clang_isStatement(cursor.kind) || clang_isExpression(cursor.kind)) {
5962    if (const Decl *D = getCursorDecl(cursor))
5963      return MakeCXCursor(D, getCursorTU(cursor));
5964  }
5965
5966  return clang_getNullCursor();
5967}
5968
5969CXCursor clang_getCursorLexicalParent(CXCursor cursor) {
5970  if (clang_isDeclaration(cursor.kind)) {
5971    if (const Decl *D = getCursorDecl(cursor)) {
5972      const DeclContext *DC = D->getLexicalDeclContext();
5973      if (!DC)
5974        return clang_getNullCursor();
5975
5976      return MakeCXCursor(maybeGetTemplateCursor(cast<Decl>(DC)),
5977                          getCursorTU(cursor));
5978    }
5979  }
5980
5981  // FIXME: Note that we can't easily compute the lexical context of a
5982  // statement or expression, so we return nothing.
5983  return clang_getNullCursor();
5984}
5985
5986CXFile clang_getIncludedFile(CXCursor cursor) {
5987  if (cursor.kind != CXCursor_InclusionDirective)
5988    return 0;
5989
5990  const InclusionDirective *ID = getCursorInclusionDirective(cursor);
5991  return const_cast<FileEntry *>(ID->getFile());
5992}
5993
5994unsigned clang_Cursor_getObjCPropertyAttributes(CXCursor C, unsigned reserved) {
5995  if (C.kind != CXCursor_ObjCPropertyDecl)
5996    return CXObjCPropertyAttr_noattr;
5997
5998  unsigned Result = CXObjCPropertyAttr_noattr;
5999  const ObjCPropertyDecl *PD = dyn_cast<ObjCPropertyDecl>(getCursorDecl(C));
6000  ObjCPropertyDecl::PropertyAttributeKind Attr =
6001      PD->getPropertyAttributesAsWritten();
6002
6003#define SET_CXOBJCPROP_ATTR(A) \
6004  if (Attr & ObjCPropertyDecl::OBJC_PR_##A) \
6005    Result |= CXObjCPropertyAttr_##A
6006  SET_CXOBJCPROP_ATTR(readonly);
6007  SET_CXOBJCPROP_ATTR(getter);
6008  SET_CXOBJCPROP_ATTR(assign);
6009  SET_CXOBJCPROP_ATTR(readwrite);
6010  SET_CXOBJCPROP_ATTR(retain);
6011  SET_CXOBJCPROP_ATTR(copy);
6012  SET_CXOBJCPROP_ATTR(nonatomic);
6013  SET_CXOBJCPROP_ATTR(setter);
6014  SET_CXOBJCPROP_ATTR(atomic);
6015  SET_CXOBJCPROP_ATTR(weak);
6016  SET_CXOBJCPROP_ATTR(strong);
6017  SET_CXOBJCPROP_ATTR(unsafe_unretained);
6018#undef SET_CXOBJCPROP_ATTR
6019
6020  return Result;
6021}
6022
6023unsigned clang_Cursor_getObjCDeclQualifiers(CXCursor C) {
6024  if (!clang_isDeclaration(C.kind))
6025    return CXObjCDeclQualifier_None;
6026
6027  Decl::ObjCDeclQualifier QT = Decl::OBJC_TQ_None;
6028  const Decl *D = getCursorDecl(C);
6029  if (const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(D))
6030    QT = MD->getObjCDeclQualifier();
6031  else if (const ParmVarDecl *PD = dyn_cast<ParmVarDecl>(D))
6032    QT = PD->getObjCDeclQualifier();
6033  if (QT == Decl::OBJC_TQ_None)
6034    return CXObjCDeclQualifier_None;
6035
6036  unsigned Result = CXObjCDeclQualifier_None;
6037  if (QT & Decl::OBJC_TQ_In) Result |= CXObjCDeclQualifier_In;
6038  if (QT & Decl::OBJC_TQ_Inout) Result |= CXObjCDeclQualifier_Inout;
6039  if (QT & Decl::OBJC_TQ_Out) Result |= CXObjCDeclQualifier_Out;
6040  if (QT & Decl::OBJC_TQ_Bycopy) Result |= CXObjCDeclQualifier_Bycopy;
6041  if (QT & Decl::OBJC_TQ_Byref) Result |= CXObjCDeclQualifier_Byref;
6042  if (QT & Decl::OBJC_TQ_Oneway) Result |= CXObjCDeclQualifier_Oneway;
6043
6044  return Result;
6045}
6046
6047unsigned clang_Cursor_isObjCOptional(CXCursor C) {
6048  if (!clang_isDeclaration(C.kind))
6049    return 0;
6050
6051  const Decl *D = getCursorDecl(C);
6052  if (const ObjCPropertyDecl *PD = dyn_cast<ObjCPropertyDecl>(D))
6053    return PD->getPropertyImplementation() == ObjCPropertyDecl::Optional;
6054  if (const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(D))
6055    return MD->getImplementationControl() == ObjCMethodDecl::Optional;
6056
6057  return 0;
6058}
6059
6060unsigned clang_Cursor_isVariadic(CXCursor C) {
6061  if (!clang_isDeclaration(C.kind))
6062    return 0;
6063
6064  const Decl *D = getCursorDecl(C);
6065  if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D))
6066    return FD->isVariadic();
6067  if (const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(D))
6068    return MD->isVariadic();
6069
6070  return 0;
6071}
6072
6073CXSourceRange clang_Cursor_getCommentRange(CXCursor C) {
6074  if (!clang_isDeclaration(C.kind))
6075    return clang_getNullRange();
6076
6077  const Decl *D = getCursorDecl(C);
6078  ASTContext &Context = getCursorContext(C);
6079  const RawComment *RC = Context.getRawCommentForAnyRedecl(D);
6080  if (!RC)
6081    return clang_getNullRange();
6082
6083  return cxloc::translateSourceRange(Context, RC->getSourceRange());
6084}
6085
6086CXString clang_Cursor_getRawCommentText(CXCursor C) {
6087  if (!clang_isDeclaration(C.kind))
6088    return cxstring::createNull();
6089
6090  const Decl *D = getCursorDecl(C);
6091  ASTContext &Context = getCursorContext(C);
6092  const RawComment *RC = Context.getRawCommentForAnyRedecl(D);
6093  StringRef RawText = RC ? RC->getRawText(Context.getSourceManager()) :
6094                           StringRef();
6095
6096  // Don't duplicate the string because RawText points directly into source
6097  // code.
6098  return cxstring::createRef(RawText);
6099}
6100
6101CXString clang_Cursor_getBriefCommentText(CXCursor C) {
6102  if (!clang_isDeclaration(C.kind))
6103    return cxstring::createNull();
6104
6105  const Decl *D = getCursorDecl(C);
6106  const ASTContext &Context = getCursorContext(C);
6107  const RawComment *RC = Context.getRawCommentForAnyRedecl(D);
6108
6109  if (RC) {
6110    StringRef BriefText = RC->getBriefText(Context);
6111
6112    // Don't duplicate the string because RawComment ensures that this memory
6113    // will not go away.
6114    return cxstring::createRef(BriefText);
6115  }
6116
6117  return cxstring::createNull();
6118}
6119
6120CXComment clang_Cursor_getParsedComment(CXCursor C) {
6121  if (!clang_isDeclaration(C.kind))
6122    return cxcomment::createCXComment(NULL, NULL);
6123
6124  const Decl *D = getCursorDecl(C);
6125  const ASTContext &Context = getCursorContext(C);
6126  const comments::FullComment *FC = Context.getCommentForDecl(D, /*PP=*/ NULL);
6127
6128  return cxcomment::createCXComment(FC, getCursorTU(C));
6129}
6130
6131CXModule clang_Cursor_getModule(CXCursor C) {
6132  if (C.kind == CXCursor_ModuleImportDecl) {
6133    if (const ImportDecl *ImportD =
6134            dyn_cast_or_null<ImportDecl>(getCursorDecl(C)))
6135      return ImportD->getImportedModule();
6136  }
6137
6138  return 0;
6139}
6140
6141CXFile clang_Module_getASTFile(CXModule CXMod) {
6142  if (!CXMod)
6143    return 0;
6144  Module *Mod = static_cast<Module*>(CXMod);
6145  return const_cast<FileEntry *>(Mod->getASTFile());
6146}
6147
6148CXModule clang_Module_getParent(CXModule CXMod) {
6149  if (!CXMod)
6150    return 0;
6151  Module *Mod = static_cast<Module*>(CXMod);
6152  return Mod->Parent;
6153}
6154
6155CXString clang_Module_getName(CXModule CXMod) {
6156  if (!CXMod)
6157    return cxstring::createEmpty();
6158  Module *Mod = static_cast<Module*>(CXMod);
6159  return cxstring::createDup(Mod->Name);
6160}
6161
6162CXString clang_Module_getFullName(CXModule CXMod) {
6163  if (!CXMod)
6164    return cxstring::createEmpty();
6165  Module *Mod = static_cast<Module*>(CXMod);
6166  return cxstring::createDup(Mod->getFullModuleName());
6167}
6168
6169unsigned clang_Module_getNumTopLevelHeaders(CXTranslationUnit TU,
6170                                            CXModule CXMod) {
6171  if (!TU || !CXMod)
6172    return 0;
6173  Module *Mod = static_cast<Module*>(CXMod);
6174  FileManager &FileMgr = cxtu::getASTUnit(TU)->getFileManager();
6175  ArrayRef<const FileEntry *> TopHeaders = Mod->getTopHeaders(FileMgr);
6176  return TopHeaders.size();
6177}
6178
6179CXFile clang_Module_getTopLevelHeader(CXTranslationUnit TU,
6180                                      CXModule CXMod, unsigned Index) {
6181  if (!TU || !CXMod)
6182    return 0;
6183  Module *Mod = static_cast<Module*>(CXMod);
6184  FileManager &FileMgr = cxtu::getASTUnit(TU)->getFileManager();
6185
6186  ArrayRef<const FileEntry *> TopHeaders = Mod->getTopHeaders(FileMgr);
6187  if (Index < TopHeaders.size())
6188    return const_cast<FileEntry *>(TopHeaders[Index]);
6189
6190  return 0;
6191}
6192
6193} // end: extern "C"
6194
6195//===----------------------------------------------------------------------===//
6196// C++ AST instrospection.
6197//===----------------------------------------------------------------------===//
6198
6199extern "C" {
6200unsigned clang_CXXMethod_isPureVirtual(CXCursor C) {
6201  if (!clang_isDeclaration(C.kind))
6202    return 0;
6203
6204  const CXXMethodDecl *Method = 0;
6205  const Decl *D = cxcursor::getCursorDecl(C);
6206  if (const FunctionTemplateDecl *FunTmpl =
6207          dyn_cast_or_null<FunctionTemplateDecl>(D))
6208    Method = dyn_cast<CXXMethodDecl>(FunTmpl->getTemplatedDecl());
6209  else
6210    Method = dyn_cast_or_null<CXXMethodDecl>(D);
6211  return (Method && Method->isVirtual() && Method->isPure()) ? 1 : 0;
6212}
6213
6214unsigned clang_CXXMethod_isStatic(CXCursor C) {
6215  if (!clang_isDeclaration(C.kind))
6216    return 0;
6217
6218  const CXXMethodDecl *Method = 0;
6219  const Decl *D = cxcursor::getCursorDecl(C);
6220  if (const FunctionTemplateDecl *FunTmpl =
6221          dyn_cast_or_null<FunctionTemplateDecl>(D))
6222    Method = dyn_cast<CXXMethodDecl>(FunTmpl->getTemplatedDecl());
6223  else
6224    Method = dyn_cast_or_null<CXXMethodDecl>(D);
6225  return (Method && Method->isStatic()) ? 1 : 0;
6226}
6227
6228unsigned clang_CXXMethod_isVirtual(CXCursor C) {
6229  if (!clang_isDeclaration(C.kind))
6230    return 0;
6231
6232  const CXXMethodDecl *Method = 0;
6233  const Decl *D = cxcursor::getCursorDecl(C);
6234  if (const FunctionTemplateDecl *FunTmpl =
6235          dyn_cast_or_null<FunctionTemplateDecl>(D))
6236    Method = dyn_cast<CXXMethodDecl>(FunTmpl->getTemplatedDecl());
6237  else
6238    Method = dyn_cast_or_null<CXXMethodDecl>(D);
6239  return (Method && Method->isVirtual()) ? 1 : 0;
6240}
6241} // end: extern "C"
6242
6243//===----------------------------------------------------------------------===//
6244// Attribute introspection.
6245//===----------------------------------------------------------------------===//
6246
6247extern "C" {
6248CXType clang_getIBOutletCollectionType(CXCursor C) {
6249  if (C.kind != CXCursor_IBOutletCollectionAttr)
6250    return cxtype::MakeCXType(QualType(), cxcursor::getCursorTU(C));
6251
6252  const IBOutletCollectionAttr *A =
6253    cast<IBOutletCollectionAttr>(cxcursor::getCursorAttr(C));
6254
6255  return cxtype::MakeCXType(A->getInterface(), cxcursor::getCursorTU(C));
6256}
6257} // end: extern "C"
6258
6259//===----------------------------------------------------------------------===//
6260// Inspecting memory usage.
6261//===----------------------------------------------------------------------===//
6262
6263typedef std::vector<CXTUResourceUsageEntry> MemUsageEntries;
6264
6265static inline void createCXTUResourceUsageEntry(MemUsageEntries &entries,
6266                                              enum CXTUResourceUsageKind k,
6267                                              unsigned long amount) {
6268  CXTUResourceUsageEntry entry = { k, amount };
6269  entries.push_back(entry);
6270}
6271
6272extern "C" {
6273
6274const char *clang_getTUResourceUsageName(CXTUResourceUsageKind kind) {
6275  const char *str = "";
6276  switch (kind) {
6277    case CXTUResourceUsage_AST:
6278      str = "ASTContext: expressions, declarations, and types";
6279      break;
6280    case CXTUResourceUsage_Identifiers:
6281      str = "ASTContext: identifiers";
6282      break;
6283    case CXTUResourceUsage_Selectors:
6284      str = "ASTContext: selectors";
6285      break;
6286    case CXTUResourceUsage_GlobalCompletionResults:
6287      str = "Code completion: cached global results";
6288      break;
6289    case CXTUResourceUsage_SourceManagerContentCache:
6290      str = "SourceManager: content cache allocator";
6291      break;
6292    case CXTUResourceUsage_AST_SideTables:
6293      str = "ASTContext: side tables";
6294      break;
6295    case CXTUResourceUsage_SourceManager_Membuffer_Malloc:
6296      str = "SourceManager: malloc'ed memory buffers";
6297      break;
6298    case CXTUResourceUsage_SourceManager_Membuffer_MMap:
6299      str = "SourceManager: mmap'ed memory buffers";
6300      break;
6301    case CXTUResourceUsage_ExternalASTSource_Membuffer_Malloc:
6302      str = "ExternalASTSource: malloc'ed memory buffers";
6303      break;
6304    case CXTUResourceUsage_ExternalASTSource_Membuffer_MMap:
6305      str = "ExternalASTSource: mmap'ed memory buffers";
6306      break;
6307    case CXTUResourceUsage_Preprocessor:
6308      str = "Preprocessor: malloc'ed memory";
6309      break;
6310    case CXTUResourceUsage_PreprocessingRecord:
6311      str = "Preprocessor: PreprocessingRecord";
6312      break;
6313    case CXTUResourceUsage_SourceManager_DataStructures:
6314      str = "SourceManager: data structures and tables";
6315      break;
6316    case CXTUResourceUsage_Preprocessor_HeaderSearch:
6317      str = "Preprocessor: header search tables";
6318      break;
6319  }
6320  return str;
6321}
6322
6323CXTUResourceUsage clang_getCXTUResourceUsage(CXTranslationUnit TU) {
6324  if (!TU) {
6325    CXTUResourceUsage usage = { (void*) 0, 0, 0 };
6326    return usage;
6327  }
6328
6329  ASTUnit *astUnit = cxtu::getASTUnit(TU);
6330  OwningPtr<MemUsageEntries> entries(new MemUsageEntries());
6331  ASTContext &astContext = astUnit->getASTContext();
6332
6333  // How much memory is used by AST nodes and types?
6334  createCXTUResourceUsageEntry(*entries, CXTUResourceUsage_AST,
6335    (unsigned long) astContext.getASTAllocatedMemory());
6336
6337  // How much memory is used by identifiers?
6338  createCXTUResourceUsageEntry(*entries, CXTUResourceUsage_Identifiers,
6339    (unsigned long) astContext.Idents.getAllocator().getTotalMemory());
6340
6341  // How much memory is used for selectors?
6342  createCXTUResourceUsageEntry(*entries, CXTUResourceUsage_Selectors,
6343    (unsigned long) astContext.Selectors.getTotalMemory());
6344
6345  // How much memory is used by ASTContext's side tables?
6346  createCXTUResourceUsageEntry(*entries, CXTUResourceUsage_AST_SideTables,
6347    (unsigned long) astContext.getSideTableAllocatedMemory());
6348
6349  // How much memory is used for caching global code completion results?
6350  unsigned long completionBytes = 0;
6351  if (GlobalCodeCompletionAllocator *completionAllocator =
6352      astUnit->getCachedCompletionAllocator().getPtr()) {
6353    completionBytes = completionAllocator->getTotalMemory();
6354  }
6355  createCXTUResourceUsageEntry(*entries,
6356                               CXTUResourceUsage_GlobalCompletionResults,
6357                               completionBytes);
6358
6359  // How much memory is being used by SourceManager's content cache?
6360  createCXTUResourceUsageEntry(*entries,
6361          CXTUResourceUsage_SourceManagerContentCache,
6362          (unsigned long) astContext.getSourceManager().getContentCacheSize());
6363
6364  // How much memory is being used by the MemoryBuffer's in SourceManager?
6365  const SourceManager::MemoryBufferSizes &srcBufs =
6366    astUnit->getSourceManager().getMemoryBufferSizes();
6367
6368  createCXTUResourceUsageEntry(*entries,
6369                               CXTUResourceUsage_SourceManager_Membuffer_Malloc,
6370                               (unsigned long) srcBufs.malloc_bytes);
6371  createCXTUResourceUsageEntry(*entries,
6372                               CXTUResourceUsage_SourceManager_Membuffer_MMap,
6373                               (unsigned long) srcBufs.mmap_bytes);
6374  createCXTUResourceUsageEntry(*entries,
6375                               CXTUResourceUsage_SourceManager_DataStructures,
6376                               (unsigned long) astContext.getSourceManager()
6377                                .getDataStructureSizes());
6378
6379  // How much memory is being used by the ExternalASTSource?
6380  if (ExternalASTSource *esrc = astContext.getExternalSource()) {
6381    const ExternalASTSource::MemoryBufferSizes &sizes =
6382      esrc->getMemoryBufferSizes();
6383
6384    createCXTUResourceUsageEntry(*entries,
6385      CXTUResourceUsage_ExternalASTSource_Membuffer_Malloc,
6386                                 (unsigned long) sizes.malloc_bytes);
6387    createCXTUResourceUsageEntry(*entries,
6388      CXTUResourceUsage_ExternalASTSource_Membuffer_MMap,
6389                                 (unsigned long) sizes.mmap_bytes);
6390  }
6391
6392  // How much memory is being used by the Preprocessor?
6393  Preprocessor &pp = astUnit->getPreprocessor();
6394  createCXTUResourceUsageEntry(*entries,
6395                               CXTUResourceUsage_Preprocessor,
6396                               pp.getTotalMemory());
6397
6398  if (PreprocessingRecord *pRec = pp.getPreprocessingRecord()) {
6399    createCXTUResourceUsageEntry(*entries,
6400                                 CXTUResourceUsage_PreprocessingRecord,
6401                                 pRec->getTotalMemory());
6402  }
6403
6404  createCXTUResourceUsageEntry(*entries,
6405                               CXTUResourceUsage_Preprocessor_HeaderSearch,
6406                               pp.getHeaderSearchInfo().getTotalMemory());
6407
6408  CXTUResourceUsage usage = { (void*) entries.get(),
6409                            (unsigned) entries->size(),
6410                            entries->size() ? &(*entries)[0] : 0 };
6411  entries.take();
6412  return usage;
6413}
6414
6415void clang_disposeCXTUResourceUsage(CXTUResourceUsage usage) {
6416  if (usage.data)
6417    delete (MemUsageEntries*) usage.data;
6418}
6419
6420} // end extern "C"
6421
6422void clang::PrintLibclangResourceUsage(CXTranslationUnit TU) {
6423  CXTUResourceUsage Usage = clang_getCXTUResourceUsage(TU);
6424  for (unsigned I = 0; I != Usage.numEntries; ++I)
6425    fprintf(stderr, "  %s: %lu\n",
6426            clang_getTUResourceUsageName(Usage.entries[I].kind),
6427            Usage.entries[I].amount);
6428
6429  clang_disposeCXTUResourceUsage(Usage);
6430}
6431
6432//===----------------------------------------------------------------------===//
6433// Misc. utility functions.
6434//===----------------------------------------------------------------------===//
6435
6436/// Default to using an 8 MB stack size on "safety" threads.
6437static unsigned SafetyStackThreadSize = 8 << 20;
6438
6439namespace clang {
6440
6441bool RunSafely(llvm::CrashRecoveryContext &CRC,
6442               void (*Fn)(void*), void *UserData,
6443               unsigned Size) {
6444  if (!Size)
6445    Size = GetSafetyThreadStackSize();
6446  if (Size)
6447    return CRC.RunSafelyOnThread(Fn, UserData, Size);
6448  return CRC.RunSafely(Fn, UserData);
6449}
6450
6451unsigned GetSafetyThreadStackSize() {
6452  return SafetyStackThreadSize;
6453}
6454
6455void SetSafetyThreadStackSize(unsigned Value) {
6456  SafetyStackThreadSize = Value;
6457}
6458
6459}
6460
6461void clang::setThreadBackgroundPriority() {
6462  if (getenv("LIBCLANG_BGPRIO_DISABLE"))
6463    return;
6464
6465  // FIXME: Move to llvm/Support and make it cross-platform.
6466#ifdef __APPLE__
6467  setpriority(PRIO_DARWIN_THREAD, 0, PRIO_DARWIN_BG);
6468#endif
6469}
6470
6471void cxindex::printDiagsToStderr(ASTUnit *Unit) {
6472  if (!Unit)
6473    return;
6474
6475  for (ASTUnit::stored_diag_iterator D = Unit->stored_diag_begin(),
6476                                  DEnd = Unit->stored_diag_end();
6477       D != DEnd; ++D) {
6478    CXStoredDiagnostic Diag(*D, Unit->getASTContext().getLangOpts());
6479    CXString Msg = clang_formatDiagnostic(&Diag,
6480                                clang_defaultDiagnosticDisplayOptions());
6481    fprintf(stderr, "%s\n", clang_getCString(Msg));
6482    clang_disposeString(Msg);
6483  }
6484#ifdef LLVM_ON_WIN32
6485  // On Windows, force a flush, since there may be multiple copies of
6486  // stderr and stdout in the file system, all with different buffers
6487  // but writing to the same device.
6488  fflush(stderr);
6489#endif
6490}
6491
6492MacroInfo *cxindex::getMacroInfo(const IdentifierInfo &II,
6493                                 SourceLocation MacroDefLoc,
6494                                 CXTranslationUnit TU){
6495  if (MacroDefLoc.isInvalid() || !TU)
6496    return 0;
6497  if (!II.hadMacroDefinition())
6498    return 0;
6499
6500  ASTUnit *Unit = cxtu::getASTUnit(TU);
6501  Preprocessor &PP = Unit->getPreprocessor();
6502  MacroDirective *MD = PP.getMacroDirectiveHistory(&II);
6503  if (MD) {
6504    for (MacroDirective::DefInfo
6505           Def = MD->getDefinition(); Def; Def = Def.getPreviousDefinition()) {
6506      if (MacroDefLoc == Def.getMacroInfo()->getDefinitionLoc())
6507        return Def.getMacroInfo();
6508    }
6509  }
6510
6511  return 0;
6512}
6513
6514const MacroInfo *cxindex::getMacroInfo(const MacroDefinition *MacroDef,
6515                                       CXTranslationUnit TU) {
6516  if (!MacroDef || !TU)
6517    return 0;
6518  const IdentifierInfo *II = MacroDef->getName();
6519  if (!II)
6520    return 0;
6521
6522  return getMacroInfo(*II, MacroDef->getLocation(), TU);
6523}
6524
6525MacroDefinition *cxindex::checkForMacroInMacroDefinition(const MacroInfo *MI,
6526                                                         const Token &Tok,
6527                                                         CXTranslationUnit TU) {
6528  if (!MI || !TU)
6529    return 0;
6530  if (Tok.isNot(tok::raw_identifier))
6531    return 0;
6532
6533  if (MI->getNumTokens() == 0)
6534    return 0;
6535  SourceRange DefRange(MI->getReplacementToken(0).getLocation(),
6536                       MI->getDefinitionEndLoc());
6537  ASTUnit *Unit = cxtu::getASTUnit(TU);
6538
6539  // Check that the token is inside the definition and not its argument list.
6540  SourceManager &SM = Unit->getSourceManager();
6541  if (SM.isBeforeInTranslationUnit(Tok.getLocation(), DefRange.getBegin()))
6542    return 0;
6543  if (SM.isBeforeInTranslationUnit(DefRange.getEnd(), Tok.getLocation()))
6544    return 0;
6545
6546  Preprocessor &PP = Unit->getPreprocessor();
6547  PreprocessingRecord *PPRec = PP.getPreprocessingRecord();
6548  if (!PPRec)
6549    return 0;
6550
6551  StringRef Name(Tok.getRawIdentifierData(), Tok.getLength());
6552  IdentifierInfo &II = PP.getIdentifierTable().get(Name);
6553  if (!II.hadMacroDefinition())
6554    return 0;
6555
6556  // Check that the identifier is not one of the macro arguments.
6557  if (std::find(MI->arg_begin(), MI->arg_end(), &II) != MI->arg_end())
6558    return 0;
6559
6560  MacroDirective *InnerMD = PP.getMacroDirectiveHistory(&II);
6561  if (!InnerMD)
6562    return 0;
6563
6564  return PPRec->findMacroDefinition(InnerMD->getMacroInfo());
6565}
6566
6567MacroDefinition *cxindex::checkForMacroInMacroDefinition(const MacroInfo *MI,
6568                                                         SourceLocation Loc,
6569                                                         CXTranslationUnit TU) {
6570  if (Loc.isInvalid() || !MI || !TU)
6571    return 0;
6572
6573  if (MI->getNumTokens() == 0)
6574    return 0;
6575  ASTUnit *Unit = cxtu::getASTUnit(TU);
6576  Preprocessor &PP = Unit->getPreprocessor();
6577  if (!PP.getPreprocessingRecord())
6578    return 0;
6579  Loc = Unit->getSourceManager().getSpellingLoc(Loc);
6580  Token Tok;
6581  if (PP.getRawToken(Loc, Tok))
6582    return 0;
6583
6584  return checkForMacroInMacroDefinition(MI, Tok, TU);
6585}
6586
6587extern "C" {
6588
6589CXString clang_getClangVersion() {
6590  return cxstring::createDup(getClangFullVersion());
6591}
6592
6593} // end: extern "C"
6594
6595Logger &cxindex::Logger::operator<<(CXTranslationUnit TU) {
6596  if (TU) {
6597    if (ASTUnit *Unit = cxtu::getASTUnit(TU)) {
6598      LogOS << '<' << Unit->getMainFileName() << '>';
6599      if (Unit->isMainFileAST())
6600        LogOS << " (" << Unit->getASTFileName() << ')';
6601      return *this;
6602    }
6603  }
6604
6605  LogOS << "<NULL TU>";
6606  return *this;
6607}
6608
6609Logger &cxindex::Logger::operator<<(const FileEntry *FE) {
6610  *this << FE->getName();
6611  return *this;
6612}
6613
6614Logger &cxindex::Logger::operator<<(CXCursor cursor) {
6615  CXString cursorName = clang_getCursorDisplayName(cursor);
6616  *this << cursorName << "@" << clang_getCursorLocation(cursor);
6617  clang_disposeString(cursorName);
6618  return *this;
6619}
6620
6621Logger &cxindex::Logger::operator<<(CXSourceLocation Loc) {
6622  CXFile File;
6623  unsigned Line, Column;
6624  clang_getFileLocation(Loc, &File, &Line, &Column, 0);
6625  CXString FileName = clang_getFileName(File);
6626  *this << llvm::format("(%s:%d:%d)", clang_getCString(FileName), Line, Column);
6627  clang_disposeString(FileName);
6628  return *this;
6629}
6630
6631Logger &cxindex::Logger::operator<<(CXSourceRange range) {
6632  CXSourceLocation BLoc = clang_getRangeStart(range);
6633  CXSourceLocation ELoc = clang_getRangeEnd(range);
6634
6635  CXFile BFile;
6636  unsigned BLine, BColumn;
6637  clang_getFileLocation(BLoc, &BFile, &BLine, &BColumn, 0);
6638
6639  CXFile EFile;
6640  unsigned ELine, EColumn;
6641  clang_getFileLocation(ELoc, &EFile, &ELine, &EColumn, 0);
6642
6643  CXString BFileName = clang_getFileName(BFile);
6644  if (BFile == EFile) {
6645    *this << llvm::format("[%s %d:%d-%d:%d]", clang_getCString(BFileName),
6646                         BLine, BColumn, ELine, EColumn);
6647  } else {
6648    CXString EFileName = clang_getFileName(EFile);
6649    *this << llvm::format("[%s:%d:%d - ", clang_getCString(BFileName),
6650                          BLine, BColumn)
6651          << llvm::format("%s:%d:%d]", clang_getCString(EFileName),
6652                          ELine, EColumn);
6653    clang_disposeString(EFileName);
6654  }
6655  clang_disposeString(BFileName);
6656  return *this;
6657}
6658
6659Logger &cxindex::Logger::operator<<(CXString Str) {
6660  *this << clang_getCString(Str);
6661  return *this;
6662}
6663
6664Logger &cxindex::Logger::operator<<(const llvm::format_object_base &Fmt) {
6665  LogOS << Fmt;
6666  return *this;
6667}
6668
6669cxindex::Logger::~Logger() {
6670  LogOS.flush();
6671
6672  llvm::sys::ScopedLock L(EnableMultithreadingMutex);
6673
6674  static llvm::TimeRecord sBeginTR = llvm::TimeRecord::getCurrentTime();
6675
6676  raw_ostream &OS = llvm::errs();
6677  OS << "[libclang:" << Name << ':';
6678
6679  // FIXME: Portability.
6680#if HAVE_PTHREAD_H && __APPLE__
6681  mach_port_t tid = pthread_mach_thread_np(pthread_self());
6682  OS << tid << ':';
6683#endif
6684
6685  llvm::TimeRecord TR = llvm::TimeRecord::getCurrentTime();
6686  OS << llvm::format("%7.4f] ", TR.getWallTime() - sBeginTR.getWallTime());
6687  OS << Msg.str() << '\n';
6688
6689  if (Trace) {
6690    llvm::sys::PrintStackTrace(stderr);
6691    OS << "--------------------------------------------------\n";
6692  }
6693}
6694