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