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