CIndex.cpp revision 6afcf8875d4e447645cd7bf3733dd8e2eb8455dc
17f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===- CIndex.cpp - Clang-C Source Indexing Library -----------------------===//
27f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//
37f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//                     The LLVM Compiler Infrastructure
47f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//
57f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// This file is distributed under the University of Illinois Open Source
67f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// License. See LICENSE.TXT for details.
77f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//
87f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----------------------------------------------------------------------===//
97f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//
107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// This file implements the main API hooks in the Clang-C Source Indexing
117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// library.
127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//
137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----------------------------------------------------------------------===//
147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "CIndexer.h"
167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "CIndexDiagnostic.h"
17b1ba0efc3d1dc1daa5d82c40bc504e1f368c4fa0Chandler Carruth#include "CLog.h"
187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "CXComment.h"
197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "CXCursor.h"
207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "CXSourceLocation.h"
217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "CXString.h"
227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "CXTranslationUnit.h"
237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "CXType.h"
247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "CursorVisitor.h"
2588b9521364735a6c9a7ccd23c5bd19d81a80cdd3Fariborz Jahanian#include "SimpleFormatContext.h"
267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/AST/StmtVisitor.h"
277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/Basic/Diagnostic.h"
287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/Basic/Version.h"
297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/Frontend/ASTUnit.h"
307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/Frontend/CompilerInstance.h"
317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/Frontend/FrontendDiagnostic.h"
327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/Lex/HeaderSearch.h"
337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/Lex/Lexer.h"
347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/Lex/PreprocessingRecord.h"
357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/Lex/Preprocessor.h"
367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "llvm/ADT/Optional.h"
377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "llvm/ADT/STLExtras.h"
387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "llvm/ADT/StringSwitch.h"
39b1ba0efc3d1dc1daa5d82c40bc504e1f368c4fa0Chandler Carruth#include "llvm/Config/config.h"
407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "llvm/Support/Compiler.h"
417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "llvm/Support/CrashRecoveryContext.h"
42b1ba0efc3d1dc1daa5d82c40bc504e1f368c4fa0Chandler Carruth#include "llvm/Support/Format.h"
437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "llvm/Support/MemoryBuffer.h"
447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "llvm/Support/Mutex.h"
457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "llvm/Support/PrettyStackTrace.h"
467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "llvm/Support/Program.h"
477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "llvm/Support/SaveAndRestore.h"
487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "llvm/Support/Signals.h"
497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "llvm/Support/Threading.h"
507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "llvm/Support/Timer.h"
517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "llvm/Support/raw_ostream.h"
52c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis
53c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis#if HAVE_PTHREAD_H
54c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis#include <pthread.h>
55c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis#endif
567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiusing namespace clang;
587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiusing namespace clang::cxcursor;
597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiusing namespace clang::cxtu;
607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiusing namespace clang::cxindex;
617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
62e42e578ad8a36ad5bd06c8a3110cbd3119aaee36Dmitri GribenkoCXTranslationUnit cxtu::MakeCXTranslationUnit(CIndexer *CIdx, ASTUnit *AU) {
63e42e578ad8a36ad5bd06c8a3110cbd3119aaee36Dmitri Gribenko  if (!AU)
647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return 0;
657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  CXTranslationUnit D = new CXTranslationUnitImpl();
667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  D->CIdx = CIdx;
67e42e578ad8a36ad5bd06c8a3110cbd3119aaee36Dmitri Gribenko  D->TheASTUnit = AU;
68aca3e56144308f97f676fa30b07179e1203f7822Dmitri Gribenko  D->StringPool = new cxstring::CXStringPool();
697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  D->Diagnostics = 0;
707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  D->OverridenCursorsPool = createOverridenCXCursorsPool();
7188b9521364735a6c9a7ccd23c5bd19d81a80cdd3Fariborz Jahanian  D->FormatContext = 0;
7288b9521364735a6c9a7ccd23c5bd19d81a80cdd3Fariborz Jahanian  D->FormatInMemoryUniqueId = 0;
737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return D;
747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeicxtu::CXTUOwner::~CXTUOwner() {
777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (TU)
787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    clang_disposeTranslationUnit(TU);
797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \brief Compare two source ranges to determine their relative position in
827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// the translation unit.
837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic RangeComparisonResult RangeCompare(SourceManager &SM,
847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                          SourceRange R1,
857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                          SourceRange R2) {
867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  assert(R1.isValid() && "First range is invalid?");
877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  assert(R2.isValid() && "Second range is invalid?");
887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (R1.getEnd() != R2.getBegin() &&
897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      SM.isBeforeInTranslationUnit(R1.getEnd(), R2.getBegin()))
907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return RangeBefore;
917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (R2.getEnd() != R1.getBegin() &&
927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      SM.isBeforeInTranslationUnit(R2.getEnd(), R1.getBegin()))
937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return RangeAfter;
947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return RangeOverlap;
957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \brief Determine if a source location falls within, before, or after a
987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei///   a given source range.
997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic RangeComparisonResult LocationCompare(SourceManager &SM,
1007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                             SourceLocation L, SourceRange R) {
1017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  assert(R.isValid() && "First range is invalid?");
1027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  assert(L.isValid() && "Second range is invalid?");
1037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (L == R.getBegin() || L == R.getEnd())
1047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return RangeOverlap;
1057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (SM.isBeforeInTranslationUnit(L, R.getBegin()))
1067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return RangeBefore;
1077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (SM.isBeforeInTranslationUnit(R.getEnd(), L))
1087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return RangeAfter;
1097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return RangeOverlap;
1107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
1117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
1127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \brief Translate a Clang source range into a CIndex source range.
1137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei///
1147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// Clang internally represents ranges where the end location points to the
1157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// start of the token at the end. However, for external clients it is more
1167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// useful to have a CXSourceRange be a proper half-open interval. This routine
1177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// does the appropriate translation.
1187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXSourceRange cxloc::translateSourceRange(const SourceManager &SM,
1197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                          const LangOptions &LangOpts,
1207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                          const CharSourceRange &R) {
1217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // We want the last character in this location, so we will adjust the
1227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // location accordingly.
1237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  SourceLocation EndLoc = R.getEnd();
1247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (EndLoc.isValid() && EndLoc.isMacroID() && !SM.isMacroArgExpansion(EndLoc))
1257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    EndLoc = SM.getExpansionRange(EndLoc).second;
1267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (R.isTokenRange() && !EndLoc.isInvalid()) {
1277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    unsigned Length = Lexer::MeasureTokenLength(SM.getSpellingLoc(EndLoc),
1287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                                SM, LangOpts);
1297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    EndLoc = EndLoc.getLocWithOffset(Length);
1307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
1317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
132ccdfdd7937d74396ca1b3bb69ed2642a8ff4c712Bill Wendling  CXSourceRange Result = {
133e4ea879fe73581bc70a9bfbfddc7ca06b5c0768bDmitri Gribenko    { &SM, &LangOpts },
134ccdfdd7937d74396ca1b3bb69ed2642a8ff4c712Bill Wendling    R.getBegin().getRawEncoding(),
135ccdfdd7937d74396ca1b3bb69ed2642a8ff4c712Bill Wendling    EndLoc.getRawEncoding()
136ccdfdd7937d74396ca1b3bb69ed2642a8ff4c712Bill Wendling  };
1377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return Result;
1387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
1397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
1407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----------------------------------------------------------------------===//
1417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// Cursor visitor.
1427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----------------------------------------------------------------------===//
1437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
1447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic SourceRange getRawCursorExtent(CXCursor C);
1457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic SourceRange getFullCursorExtent(CXCursor C, SourceManager &SrcMgr);
1467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
1477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
1487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiRangeComparisonResult CursorVisitor::CompareRegionOfInterest(SourceRange R) {
1497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return RangeCompare(AU->getSourceManager(), R, RegionOfInterest);
1507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
1517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
1527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \brief Visit the given cursor and, if requested by the visitor,
1537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// its children.
1547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei///
1557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \param Cursor the cursor to visit.
1567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei///
1577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \param CheckedRegionOfInterest if true, then the caller already checked
1587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// that this cursor is within the region of interest.
1597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei///
1607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \returns true if the visitation should be aborted, false if it
1617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// should continue.
1627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::Visit(CXCursor Cursor, bool CheckedRegionOfInterest) {
1637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (clang_isInvalid(Cursor.kind))
1647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return false;
1657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
1667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (clang_isDeclaration(Cursor.kind)) {
167e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko    const Decl *D = getCursorDecl(Cursor);
1687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (!D) {
1697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      assert(0 && "Invalid declaration cursor");
1707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return true; // abort.
1717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
1727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
1737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // Ignore implicit declarations, unless it's an objc method because
1747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // currently we should report implicit methods for properties when indexing.
1757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (D->isImplicit() && !isa<ObjCMethodDecl>(D))
1767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return false;
1777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
1787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
1797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // If we have a range of interest, and this cursor doesn't intersect with it,
1807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // we're done.
1817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (RegionOfInterest.isValid() && !CheckedRegionOfInterest) {
1827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    SourceRange Range = getRawCursorExtent(Cursor);
1837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (Range.isInvalid() || CompareRegionOfInterest(Range))
1847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return false;
1857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
1867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
1877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  switch (Visitor(Cursor, Parent, ClientData)) {
1887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXChildVisit_Break:
1897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return true;
1907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
1917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXChildVisit_Continue:
1927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return false;
1937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
1947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXChildVisit_Recurse: {
1957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    bool ret = VisitChildren(Cursor);
1967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (PostChildrenVisitor)
1977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (PostChildrenVisitor(Cursor, ClientData))
1987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        return true;
1997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return ret;
2007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
2017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
2027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
2037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  llvm_unreachable("Invalid CXChildVisitResult!");
2047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
2057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
2067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic bool visitPreprocessedEntitiesInRange(SourceRange R,
2077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                             PreprocessingRecord &PPRec,
2087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                             CursorVisitor &Visitor) {
2097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  SourceManager &SM = Visitor.getASTUnit()->getSourceManager();
2107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  FileID FID;
2117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
2127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!Visitor.shouldVisitIncludedEntities()) {
2137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // If the begin/end of the range lie in the same FileID, do the optimization
2147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // where we skip preprocessed entities that do not come from the same FileID.
2157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    FID = SM.getFileID(SM.getFileLoc(R.getBegin()));
2167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (FID != SM.getFileID(SM.getFileLoc(R.getEnd())))
2177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      FID = FileID();
2187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
2197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
2207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  std::pair<PreprocessingRecord::iterator, PreprocessingRecord::iterator>
2217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    Entities = PPRec.getPreprocessedEntitiesInRange(R);
2227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return Visitor.visitPreprocessedEntities(Entities.first, Entities.second,
2237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                           PPRec, FID);
2247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
2257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
226389dc5603fa10b508a38f668a7830c6d877b6542Argyrios Kyrtzidisbool CursorVisitor::visitFileRegion() {
2277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (RegionOfInterest.isInvalid())
228389dc5603fa10b508a38f668a7830c6d877b6542Argyrios Kyrtzidis    return false;
2297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
2305694feb5ccd6eb862cb600b55753cecc13794471Dmitri Gribenko  ASTUnit *Unit = cxtu::getASTUnit(TU);
2317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  SourceManager &SM = Unit->getSourceManager();
2327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
2337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  std::pair<FileID, unsigned>
2347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    Begin = SM.getDecomposedLoc(SM.getFileLoc(RegionOfInterest.getBegin())),
2357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    End = SM.getDecomposedLoc(SM.getFileLoc(RegionOfInterest.getEnd()));
2367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
2377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (End.first != Begin.first) {
2387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // If the end does not reside in the same file, try to recover by
2397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // picking the end of the file of begin location.
2407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    End.first = Begin.first;
2417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    End.second = SM.getFileIDSize(Begin.first);
2427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
2437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
2447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  assert(Begin.first == End.first);
2457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (Begin.second > End.second)
246389dc5603fa10b508a38f668a7830c6d877b6542Argyrios Kyrtzidis    return false;
2477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
2487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  FileID File = Begin.first;
2497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  unsigned Offset = Begin.second;
2507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  unsigned Length = End.second - Begin.second;
2517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
2527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!VisitDeclsOnly && !VisitPreprocessorLast)
2537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (visitPreprocessedEntitiesInRegion())
254389dc5603fa10b508a38f668a7830c6d877b6542Argyrios Kyrtzidis      return true; // visitation break.
2557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
256389dc5603fa10b508a38f668a7830c6d877b6542Argyrios Kyrtzidis  if (visitDeclsFromFileRegion(File, Offset, Length))
257389dc5603fa10b508a38f668a7830c6d877b6542Argyrios Kyrtzidis    return true; // visitation break.
2587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
2597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!VisitDeclsOnly && VisitPreprocessorLast)
260389dc5603fa10b508a38f668a7830c6d877b6542Argyrios Kyrtzidis    return visitPreprocessedEntitiesInRegion();
261389dc5603fa10b508a38f668a7830c6d877b6542Argyrios Kyrtzidis
262389dc5603fa10b508a38f668a7830c6d877b6542Argyrios Kyrtzidis  return false;
2637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
2647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
2657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic bool isInLexicalContext(Decl *D, DeclContext *DC) {
2667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!DC)
2677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return false;
2687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
2697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  for (DeclContext *DeclDC = D->getLexicalDeclContext();
2707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei         DeclDC; DeclDC = DeclDC->getLexicalParent()) {
2717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (DeclDC == DC)
2727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return true;
2737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
2747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return false;
2757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
2767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
277389dc5603fa10b508a38f668a7830c6d877b6542Argyrios Kyrtzidisbool CursorVisitor::visitDeclsFromFileRegion(FileID File,
2787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                             unsigned Offset, unsigned Length) {
2795694feb5ccd6eb862cb600b55753cecc13794471Dmitri Gribenko  ASTUnit *Unit = cxtu::getASTUnit(TU);
2807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  SourceManager &SM = Unit->getSourceManager();
2817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  SourceRange Range = RegionOfInterest;
2827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
2837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  SmallVector<Decl *, 16> Decls;
2847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  Unit->findFileRegionDecls(File, Offset, Length, Decls);
2857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
2867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // If we didn't find any file level decls for the file, try looking at the
2877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // file that it was included from.
2887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  while (Decls.empty() || Decls.front()->isTopLevelDeclInObjCContainer()) {
2897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    bool Invalid = false;
2907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    const SrcMgr::SLocEntry &SLEntry = SM.getSLocEntry(File, &Invalid);
2917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (Invalid)
292389dc5603fa10b508a38f668a7830c6d877b6542Argyrios Kyrtzidis      return false;
2937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
2947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    SourceLocation Outer;
2957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (SLEntry.isFile())
2967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      Outer = SLEntry.getFile().getIncludeLoc();
2977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    else
2987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      Outer = SLEntry.getExpansion().getExpansionLocStart();
2997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (Outer.isInvalid())
300389dc5603fa10b508a38f668a7830c6d877b6542Argyrios Kyrtzidis      return false;
3017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    llvm::tie(File, Offset) = SM.getDecomposedExpansionLoc(Outer);
3037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    Length = 0;
3047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    Unit->findFileRegionDecls(File, Offset, Length, Decls);
3057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
3067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  assert(!Decls.empty());
3087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  bool VisitedAtLeastOnce = false;
3107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  DeclContext *CurDC = 0;
3117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  SmallVector<Decl *, 16>::iterator DIt = Decls.begin();
3127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  for (SmallVector<Decl *, 16>::iterator DE = Decls.end(); DIt != DE; ++DIt) {
3137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    Decl *D = *DIt;
3147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (D->getSourceRange().isInvalid())
3157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      continue;
3167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (isInLexicalContext(D, CurDC))
3187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      continue;
3197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    CurDC = dyn_cast<DeclContext>(D);
3217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (TagDecl *TD = dyn_cast<TagDecl>(D))
3237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (!TD->isFreeStanding())
3247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        continue;
3257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    RangeComparisonResult CompRes = RangeCompare(SM, D->getSourceRange(),Range);
3277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (CompRes == RangeBefore)
3287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      continue;
3297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (CompRes == RangeAfter)
3307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      break;
3317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    assert(CompRes == RangeOverlap);
3337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    VisitedAtLeastOnce = true;
3347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (isa<ObjCContainerDecl>(D)) {
3367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      FileDI_current = &DIt;
3377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      FileDE_current = DE;
3387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    } else {
3397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      FileDI_current = 0;
3407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
3417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (Visit(MakeCXCursor(D, TU, Range), /*CheckedRegionOfInterest=*/true))
343389dc5603fa10b508a38f668a7830c6d877b6542Argyrios Kyrtzidis      return true; // visitation break.
3447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
3457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (VisitedAtLeastOnce)
347389dc5603fa10b508a38f668a7830c6d877b6542Argyrios Kyrtzidis    return false;
3487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // No Decls overlapped with the range. Move up the lexical context until there
3507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // is a context that contains the range or we reach the translation unit
3517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // level.
3527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  DeclContext *DC = DIt == Decls.begin() ? (*DIt)->getLexicalDeclContext()
3537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                         : (*(DIt-1))->getLexicalDeclContext();
3547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  while (DC && !DC->isTranslationUnit()) {
3567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    Decl *D = cast<Decl>(DC);
3577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    SourceRange CurDeclRange = D->getSourceRange();
3587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (CurDeclRange.isInvalid())
3597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      break;
3607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (RangeCompare(SM, CurDeclRange, Range) == RangeOverlap) {
362389dc5603fa10b508a38f668a7830c6d877b6542Argyrios Kyrtzidis      if (Visit(MakeCXCursor(D, TU, Range), /*CheckedRegionOfInterest=*/true))
363389dc5603fa10b508a38f668a7830c6d877b6542Argyrios Kyrtzidis        return true; // visitation break.
3647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
3657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    DC = D->getLexicalDeclContext();
3677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
368389dc5603fa10b508a38f668a7830c6d877b6542Argyrios Kyrtzidis
369389dc5603fa10b508a38f668a7830c6d877b6542Argyrios Kyrtzidis  return false;
3707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
3717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::visitPreprocessedEntitiesInRegion() {
3737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!AU->getPreprocessor().getPreprocessingRecord())
3747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return false;
3757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  PreprocessingRecord &PPRec
3777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    = *AU->getPreprocessor().getPreprocessingRecord();
3787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  SourceManager &SM = AU->getSourceManager();
3797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (RegionOfInterest.isValid()) {
3817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    SourceRange MappedRange = AU->mapRangeToPreamble(RegionOfInterest);
3827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    SourceLocation B = MappedRange.getBegin();
3837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    SourceLocation E = MappedRange.getEnd();
3847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (AU->isInPreambleFileID(B)) {
3867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (SM.isLoadedSourceLocation(E))
3877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        return visitPreprocessedEntitiesInRange(SourceRange(B, E),
3887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                                 PPRec, *this);
3897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // Beginning of range lies in the preamble but it also extends beyond
3917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // it into the main file. Split the range into 2 parts, one covering
3927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // the preamble and another covering the main file. This allows subsequent
3937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // calls to visitPreprocessedEntitiesInRange to accept a source range that
3947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // lies in the same FileID, allowing it to skip preprocessed entities that
3957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // do not come from the same FileID.
3967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      bool breaked =
3977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        visitPreprocessedEntitiesInRange(
3987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                   SourceRange(B, AU->getEndOfPreambleFileID()),
3997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                          PPRec, *this);
4007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (breaked) return true;
4017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return visitPreprocessedEntitiesInRange(
4027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                    SourceRange(AU->getStartOfMainFileID(), E),
4037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                        PPRec, *this);
4047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
4057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
4067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return visitPreprocessedEntitiesInRange(SourceRange(B, E), PPRec, *this);
4077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
4087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
4097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  bool OnlyLocalDecls
4107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    = !AU->isMainFileAST() && AU->getOnlyLocalDecls();
4117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
4127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (OnlyLocalDecls)
4137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return visitPreprocessedEntities(PPRec.local_begin(), PPRec.local_end(),
4147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                     PPRec);
4157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
4167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return visitPreprocessedEntities(PPRec.begin(), PPRec.end(), PPRec);
4177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
4187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
4197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeitemplate<typename InputIterator>
4207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::visitPreprocessedEntities(InputIterator First,
4217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                              InputIterator Last,
4227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                              PreprocessingRecord &PPRec,
4237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                              FileID FID) {
4247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  for (; First != Last; ++First) {
4257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (!FID.isInvalid() && !PPRec.isEntityInFileID(First, FID))
4267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      continue;
4277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
4287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    PreprocessedEntity *PPE = *First;
4297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (MacroExpansion *ME = dyn_cast<MacroExpansion>(PPE)) {
4307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (Visit(MakeMacroExpansionCursor(ME, TU)))
4317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        return true;
4327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
4337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      continue;
4347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
4357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
4367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (MacroDefinition *MD = dyn_cast<MacroDefinition>(PPE)) {
4377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (Visit(MakeMacroDefinitionCursor(MD, TU)))
4387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        return true;
4397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
4407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      continue;
4417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
4427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
4437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (InclusionDirective *ID = dyn_cast<InclusionDirective>(PPE)) {
4447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (Visit(MakeInclusionDirectiveCursor(ID, TU)))
4457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        return true;
4467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
4477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      continue;
4487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
4497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
4507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
4517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return false;
4527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
4537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
4547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \brief Visit the children of the given cursor.
4557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei///
4567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \returns true if the visitation should be aborted, false if it
4577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// should continue.
4587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitChildren(CXCursor Cursor) {
4597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (clang_isReference(Cursor.kind) &&
4607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      Cursor.kind != CXCursor_CXXBaseSpecifier) {
4617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // By definition, references have no children.
4627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return false;
4637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
4647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
4657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Set the Parent field to Cursor, then back to its old value once we're
4667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // done.
4677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  SetParentRAII SetParent(Parent, StmtParent, Cursor);
4687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
4697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (clang_isDeclaration(Cursor.kind)) {
470e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko    Decl *D = const_cast<Decl *>(getCursorDecl(Cursor));
4717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (!D)
4727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return false;
4737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
4747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return VisitAttributes(D) || Visit(D);
4757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
4767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
4777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (clang_isStatement(Cursor.kind)) {
478ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko    if (const Stmt *S = getCursorStmt(Cursor))
4797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return Visit(S);
4807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
4817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return false;
4827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
4837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
4847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (clang_isExpression(Cursor.kind)) {
485ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko    if (const Expr *E = getCursorExpr(Cursor))
4867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return Visit(E);
4877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
4887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return false;
4897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
4907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
4917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (clang_isTranslationUnit(Cursor.kind)) {
4925694feb5ccd6eb862cb600b55753cecc13794471Dmitri Gribenko    CXTranslationUnit TU = getCursorTU(Cursor);
4935694feb5ccd6eb862cb600b55753cecc13794471Dmitri Gribenko    ASTUnit *CXXUnit = cxtu::getASTUnit(TU);
4947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
4957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    int VisitOrder[2] = { VisitPreprocessorLast, !VisitPreprocessorLast };
4967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    for (unsigned I = 0; I != 2; ++I) {
4977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (VisitOrder[I]) {
4987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        if (!CXXUnit->isMainFileAST() && CXXUnit->getOnlyLocalDecls() &&
4997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            RegionOfInterest.isInvalid()) {
5007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          for (ASTUnit::top_level_iterator TL = CXXUnit->top_level_begin(),
5017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                        TLEnd = CXXUnit->top_level_end();
5027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei               TL != TLEnd; ++TL) {
5035694feb5ccd6eb862cb600b55753cecc13794471Dmitri Gribenko            if (Visit(MakeCXCursor(*TL, TU, RegionOfInterest), true))
5047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei              return true;
5057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          }
5067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        } else if (VisitDeclContext(
5077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                CXXUnit->getASTContext().getTranslationUnitDecl()))
5087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          return true;
5097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        continue;
5107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      }
5117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
5127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // Walk the preprocessing record.
5137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (CXXUnit->getPreprocessor().getPreprocessingRecord())
5147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        visitPreprocessedEntitiesInRegion();
5157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
5167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
5177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return false;
5187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
5197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
5207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (Cursor.kind == CXCursor_CXXBaseSpecifier) {
52167812b2f94f4b5e7d2596db1705ffa1149ddc45aDmitri Gribenko    if (const CXXBaseSpecifier *Base = getCursorCXXBaseSpecifier(Cursor)) {
5227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (TypeSourceInfo *BaseTSInfo = Base->getTypeSourceInfo()) {
5237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        return Visit(BaseTSInfo->getTypeLoc());
5247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      }
5257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
5267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
5277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
5287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (Cursor.kind == CXCursor_IBOutletCollectionAttr) {
5297d91438047450869d7b881e1c63868c4b52a3cc2Dmitri Gribenko    const IBOutletCollectionAttr *A =
5307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      cast<IBOutletCollectionAttr>(cxcursor::getCursorAttr(Cursor));
5317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (const ObjCInterfaceType *InterT = A->getInterface()->getAs<ObjCInterfaceType>())
5327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return Visit(cxcursor::MakeCursorObjCClassRef(InterT->getInterface(),
5337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                                    A->getInterfaceLoc(), TU));
5347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
5357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
536664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis  // If pointing inside a macro definition, check if the token is an identifier
537664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis  // that was ever defined as a macro. In such a case, create a "pseudo" macro
538664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis  // expansion cursor for that token.
539664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis  SourceLocation BeginLoc = RegionOfInterest.getBegin();
540664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis  if (Cursor.kind == CXCursor_MacroDefinition &&
541664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis      BeginLoc == RegionOfInterest.getEnd()) {
542664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis    SourceLocation Loc = AU->mapLocationToPreamble(BeginLoc);
54367812b2f94f4b5e7d2596db1705ffa1149ddc45aDmitri Gribenko    const MacroInfo *MI =
54467812b2f94f4b5e7d2596db1705ffa1149ddc45aDmitri Gribenko        getMacroInfo(cxcursor::getCursorMacroDefinition(Cursor), TU);
545664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis    if (MacroDefinition *MacroDef =
546664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis          checkForMacroInMacroDefinition(MI, Loc, TU))
547664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis      return Visit(cxcursor::MakeMacroExpansionCursor(MacroDef, BeginLoc, TU));
548664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis  }
549664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis
5507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Nothing to visit at the moment.
5517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return false;
5527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
5537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
5547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitBlockDecl(BlockDecl *B) {
5557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (TypeSourceInfo *TSInfo = B->getSignatureAsWritten())
5567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (Visit(TSInfo->getTypeLoc()))
5577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        return true;
5587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
5597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (Stmt *Body = B->getBody())
5607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return Visit(MakeCXCursor(Body, StmtParent, TU, RegionOfInterest));
5617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
5627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return false;
5637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
5647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
565943f909ba72a1c9351dd421cac1413d303a719f1Ted KremenekOptional<bool> CursorVisitor::shouldVisitCursor(CXCursor Cursor) {
5667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (RegionOfInterest.isValid()) {
5677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    SourceRange Range = getFullCursorExtent(Cursor, AU->getSourceManager());
5687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (Range.isInvalid())
56966874fb18afbffb8b2ca05576851a64534be3352David Blaikie      return None;
5707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
5717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    switch (CompareRegionOfInterest(Range)) {
5727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case RangeBefore:
5737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // This declaration comes before the region of interest; skip it.
57466874fb18afbffb8b2ca05576851a64534be3352David Blaikie      return None;
5757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
5767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case RangeAfter:
5777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // This declaration comes after the region of interest; we're done.
5787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return false;
5797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
5807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case RangeOverlap:
5817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // This declaration overlaps the region of interest; visit it.
5827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      break;
5837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
5847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
5857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return true;
5867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
5877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
5887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitDeclContext(DeclContext *DC) {
5897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  DeclContext::decl_iterator I = DC->decls_begin(), E = DC->decls_end();
5907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
5917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // FIXME: Eventually remove.  This part of a hack to support proper
5927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // iteration over all Decls contained lexically within an ObjC container.
5937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  SaveAndRestore<DeclContext::decl_iterator*> DI_saved(DI_current, &I);
5947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  SaveAndRestore<DeclContext::decl_iterator> DE_saved(DE_current, E);
5957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
5967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  for ( ; I != E; ++I) {
5977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    Decl *D = *I;
5987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (D->getLexicalDeclContext() != DC)
5997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      continue;
6007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    CXCursor Cursor = MakeCXCursor(D, TU, RegionOfInterest);
6017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
6027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // Ignore synthesized ivars here, otherwise if we have something like:
6037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    //   @synthesize prop = _prop;
6047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // and '_prop' is not declared, we will encounter a '_prop' ivar before
6057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // encountering the 'prop' synthesize declaration and we will think that
6067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // we passed the region-of-interest.
6077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (ObjCIvarDecl *ivarD = dyn_cast<ObjCIvarDecl>(D)) {
6087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (ivarD->getSynthesize())
6097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        continue;
6107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
6117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
6127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // FIXME: ObjCClassRef/ObjCProtocolRef for forward class/protocol
6137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // declarations is a mismatch with the compiler semantics.
6147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (Cursor.kind == CXCursor_ObjCInterfaceDecl) {
6157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      ObjCInterfaceDecl *ID = cast<ObjCInterfaceDecl>(D);
6167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (!ID->isThisDeclarationADefinition())
6177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        Cursor = MakeCursorObjCClassRef(ID, ID->getLocation(), TU);
6187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
6197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    } else if (Cursor.kind == CXCursor_ObjCProtocolDecl) {
6207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      ObjCProtocolDecl *PD = cast<ObjCProtocolDecl>(D);
6217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (!PD->isThisDeclarationADefinition())
6227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        Cursor = MakeCursorObjCProtocolRef(PD, PD->getLocation(), TU);
6237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
6247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
625943f909ba72a1c9351dd421cac1413d303a719f1Ted Kremenek    const Optional<bool> &V = shouldVisitCursor(Cursor);
6267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (!V.hasValue())
6277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      continue;
6287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (!V.getValue())
6297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return false;
6307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (Visit(Cursor, true))
6317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return true;
6327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
6337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return false;
6347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
6357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
6367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitTranslationUnitDecl(TranslationUnitDecl *D) {
6377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  llvm_unreachable("Translation units are visited directly by Visit()");
6387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
6397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
6407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitTypeAliasDecl(TypeAliasDecl *D) {
6417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (TypeSourceInfo *TSInfo = D->getTypeSourceInfo())
6427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return Visit(TSInfo->getTypeLoc());
6437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
6447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return false;
6457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
6467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
6477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitTypedefDecl(TypedefDecl *D) {
6487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (TypeSourceInfo *TSInfo = D->getTypeSourceInfo())
6497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return Visit(TSInfo->getTypeLoc());
6507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
6517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return false;
6527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
6537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
6547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitTagDecl(TagDecl *D) {
6557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return VisitDeclContext(D);
6567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
6577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
6587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitClassTemplateSpecializationDecl(
6597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                          ClassTemplateSpecializationDecl *D) {
6607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  bool ShouldVisitBody = false;
6617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  switch (D->getSpecializationKind()) {
6627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case TSK_Undeclared:
6637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case TSK_ImplicitInstantiation:
6647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // Nothing to visit
6657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return false;
6667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
6677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case TSK_ExplicitInstantiationDeclaration:
6687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case TSK_ExplicitInstantiationDefinition:
6697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    break;
6707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
6717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case TSK_ExplicitSpecialization:
6727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    ShouldVisitBody = true;
6737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    break;
6747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
6757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
6767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Visit the template arguments used in the specialization.
6777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (TypeSourceInfo *SpecType = D->getTypeAsWritten()) {
6787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    TypeLoc TL = SpecType->getTypeLoc();
67939e6ab4be93d9c5e729a578ddd9d415cd2d49872David Blaikie    if (TemplateSpecializationTypeLoc TSTLoc =
68039e6ab4be93d9c5e729a578ddd9d415cd2d49872David Blaikie            TL.getAs<TemplateSpecializationTypeLoc>()) {
68139e6ab4be93d9c5e729a578ddd9d415cd2d49872David Blaikie      for (unsigned I = 0, N = TSTLoc.getNumArgs(); I != N; ++I)
68239e6ab4be93d9c5e729a578ddd9d415cd2d49872David Blaikie        if (VisitTemplateArgumentLoc(TSTLoc.getArgLoc(I)))
6837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          return true;
6847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
6857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
6867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
6877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (ShouldVisitBody && VisitCXXRecordDecl(D))
6887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return true;
6897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
6907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return false;
6917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
6927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
6937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitClassTemplatePartialSpecializationDecl(
6947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                   ClassTemplatePartialSpecializationDecl *D) {
6957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // FIXME: Visit the "outer" template parameter lists on the TagDecl
6967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // before visiting these template parameters.
6977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (VisitTemplateParameters(D->getTemplateParameters()))
6987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return true;
6997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
7007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Visit the partial specialization arguments.
7017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  const TemplateArgumentLoc *TemplateArgs = D->getTemplateArgsAsWritten();
7027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  for (unsigned I = 0, N = D->getNumTemplateArgsAsWritten(); I != N; ++I)
7037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (VisitTemplateArgumentLoc(TemplateArgs[I]))
7047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return true;
7057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
7067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return VisitCXXRecordDecl(D);
7077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
7087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
7097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D) {
7107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Visit the default argument.
7117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (D->hasDefaultArgument() && !D->defaultArgumentWasInherited())
7127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (TypeSourceInfo *DefArg = D->getDefaultArgumentInfo())
7137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (Visit(DefArg->getTypeLoc()))
7147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        return true;
7157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
7167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return false;
7177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
7187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
7197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitEnumConstantDecl(EnumConstantDecl *D) {
7207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (Expr *Init = D->getInitExpr())
7217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return Visit(MakeCXCursor(Init, StmtParent, TU, RegionOfInterest));
7227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return false;
7237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
7247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
7257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitDeclaratorDecl(DeclaratorDecl *DD) {
726516143b619d1eccfef023ceaf91666803f04cc83Argyrios Kyrtzidis  unsigned NumParamList = DD->getNumTemplateParameterLists();
727516143b619d1eccfef023ceaf91666803f04cc83Argyrios Kyrtzidis  for (unsigned i = 0; i < NumParamList; i++) {
728516143b619d1eccfef023ceaf91666803f04cc83Argyrios Kyrtzidis    TemplateParameterList* Params = DD->getTemplateParameterList(i);
729516143b619d1eccfef023ceaf91666803f04cc83Argyrios Kyrtzidis    if (VisitTemplateParameters(Params))
730516143b619d1eccfef023ceaf91666803f04cc83Argyrios Kyrtzidis      return true;
731516143b619d1eccfef023ceaf91666803f04cc83Argyrios Kyrtzidis  }
732516143b619d1eccfef023ceaf91666803f04cc83Argyrios Kyrtzidis
7337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (TypeSourceInfo *TSInfo = DD->getTypeSourceInfo())
7347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (Visit(TSInfo->getTypeLoc()))
7357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return true;
7367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
7377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Visit the nested-name-specifier, if present.
7387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (NestedNameSpecifierLoc QualifierLoc = DD->getQualifierLoc())
7397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (VisitNestedNameSpecifierLoc(QualifierLoc))
7407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return true;
7417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
7427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return false;
7437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
7447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
7457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \brief Compare two base or member initializers based on their source order.
7467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic int CompareCXXCtorInitializers(const void* Xp, const void *Yp) {
7477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  CXXCtorInitializer const * const *X
7487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    = static_cast<CXXCtorInitializer const * const *>(Xp);
7497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  CXXCtorInitializer const * const *Y
7507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    = static_cast<CXXCtorInitializer const * const *>(Yp);
7517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
7527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if ((*X)->getSourceOrder() < (*Y)->getSourceOrder())
7537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return -1;
7547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  else if ((*X)->getSourceOrder() > (*Y)->getSourceOrder())
7557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return 1;
7567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  else
7577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return 0;
7587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
7597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
7607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitFunctionDecl(FunctionDecl *ND) {
761516143b619d1eccfef023ceaf91666803f04cc83Argyrios Kyrtzidis  unsigned NumParamList = ND->getNumTemplateParameterLists();
762516143b619d1eccfef023ceaf91666803f04cc83Argyrios Kyrtzidis  for (unsigned i = 0; i < NumParamList; i++) {
763516143b619d1eccfef023ceaf91666803f04cc83Argyrios Kyrtzidis    TemplateParameterList* Params = ND->getTemplateParameterList(i);
764516143b619d1eccfef023ceaf91666803f04cc83Argyrios Kyrtzidis    if (VisitTemplateParameters(Params))
765516143b619d1eccfef023ceaf91666803f04cc83Argyrios Kyrtzidis      return true;
766516143b619d1eccfef023ceaf91666803f04cc83Argyrios Kyrtzidis  }
767516143b619d1eccfef023ceaf91666803f04cc83Argyrios Kyrtzidis
7687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (TypeSourceInfo *TSInfo = ND->getTypeSourceInfo()) {
7697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // Visit the function declaration's syntactic components in the order
7707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // written. This requires a bit of work.
7717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    TypeLoc TL = TSInfo->getTypeLoc().IgnoreParens();
77239e6ab4be93d9c5e729a578ddd9d415cd2d49872David Blaikie    FunctionTypeLoc FTL = TL.getAs<FunctionTypeLoc>();
7737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
7747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // If we have a function declared directly (without the use of a typedef),
7757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // visit just the return type. Otherwise, just visit the function's type
7767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // now.
77739e6ab4be93d9c5e729a578ddd9d415cd2d49872David Blaikie    if ((FTL && !isa<CXXConversionDecl>(ND) && Visit(FTL.getResultLoc())) ||
7787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        (!FTL && Visit(TL)))
7797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return true;
7807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
7817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // Visit the nested-name-specifier, if present.
7827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (NestedNameSpecifierLoc QualifierLoc = ND->getQualifierLoc())
7837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (VisitNestedNameSpecifierLoc(QualifierLoc))
7847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        return true;
7857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
7867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // Visit the declaration name.
7877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (VisitDeclarationNameInfo(ND->getNameInfo()))
7887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return true;
7897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
7907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // FIXME: Visit explicitly-specified template arguments!
7917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
7927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // Visit the function parameters, if we have a function type.
79339e6ab4be93d9c5e729a578ddd9d415cd2d49872David Blaikie    if (FTL && VisitFunctionTypeLoc(FTL, true))
7947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return true;
7957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
796ad017fa7a4df7389d245d02a49b3c79ed70bedb9Bill Wendling    // FIXME: Attributes?
7977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
7987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
7997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (ND->doesThisDeclarationHaveABody() && !ND->isLateTemplateParsed()) {
8007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (CXXConstructorDecl *Constructor = dyn_cast<CXXConstructorDecl>(ND)) {
8017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // Find the initializers that were written in the source.
8027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      SmallVector<CXXCtorInitializer *, 4> WrittenInits;
8037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      for (CXXConstructorDecl::init_iterator I = Constructor->init_begin(),
8047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                          IEnd = Constructor->init_end();
8057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei           I != IEnd; ++I) {
8067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        if (!(*I)->isWritten())
8077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          continue;
8087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
8097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        WrittenInits.push_back(*I);
8107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      }
8117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
8127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // Sort the initializers in source order
8137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      llvm::array_pod_sort(WrittenInits.begin(), WrittenInits.end(),
8147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                           &CompareCXXCtorInitializers);
8157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
8167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // Visit the initializers in source order
8177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      for (unsigned I = 0, N = WrittenInits.size(); I != N; ++I) {
8187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        CXXCtorInitializer *Init = WrittenInits[I];
8197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        if (Init->isAnyMemberInitializer()) {
8207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          if (Visit(MakeCursorMemberRef(Init->getAnyMember(),
8217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                        Init->getMemberLocation(), TU)))
8227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            return true;
8237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        } else if (TypeSourceInfo *TInfo = Init->getTypeSourceInfo()) {
8247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          if (Visit(TInfo->getTypeLoc()))
8257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            return true;
8267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        }
8277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
8287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        // Visit the initializer value.
8297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        if (Expr *Initializer = Init->getInit())
8307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          if (Visit(MakeCXCursor(Initializer, ND, TU, RegionOfInterest)))
8317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            return true;
8327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      }
8337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
8347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
8357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (Visit(MakeCXCursor(ND->getBody(), StmtParent, TU, RegionOfInterest)))
8367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return true;
8377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
8387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
8397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return false;
8407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
8417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
8427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitFieldDecl(FieldDecl *D) {
8437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (VisitDeclaratorDecl(D))
8447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return true;
8457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
8467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (Expr *BitWidth = D->getBitWidth())
8477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return Visit(MakeCXCursor(BitWidth, StmtParent, TU, RegionOfInterest));
8487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
8497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return false;
8507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
8517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
8527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitVarDecl(VarDecl *D) {
8537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (VisitDeclaratorDecl(D))
8547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return true;
8557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
8567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (Expr *Init = D->getInit())
8577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return Visit(MakeCXCursor(Init, StmtParent, TU, RegionOfInterest));
8587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
8597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return false;
8607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
8617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
8627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D) {
8637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (VisitDeclaratorDecl(D))
8647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return true;
8657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
8667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (D->hasDefaultArgument() && !D->defaultArgumentWasInherited())
8677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (Expr *DefArg = D->getDefaultArgument())
8687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return Visit(MakeCXCursor(DefArg, StmtParent, TU, RegionOfInterest));
8697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
8707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return false;
8717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
8727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
8737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitFunctionTemplateDecl(FunctionTemplateDecl *D) {
8747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // FIXME: Visit the "outer" template parameter lists on the FunctionDecl
8757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // before visiting these template parameters.
8767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (VisitTemplateParameters(D->getTemplateParameters()))
8777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return true;
8787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
8797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return VisitFunctionDecl(D->getTemplatedDecl());
8807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
8817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
8827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitClassTemplateDecl(ClassTemplateDecl *D) {
8837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // FIXME: Visit the "outer" template parameter lists on the TagDecl
8847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // before visiting these template parameters.
8857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (VisitTemplateParameters(D->getTemplateParameters()))
8867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return true;
8877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
8887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return VisitCXXRecordDecl(D->getTemplatedDecl());
8897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
8907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
8917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D) {
8927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (VisitTemplateParameters(D->getTemplateParameters()))
8937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return true;
8947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
8957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (D->hasDefaultArgument() && !D->defaultArgumentWasInherited() &&
8967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      VisitTemplateArgumentLoc(D->getDefaultArgument()))
8977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return true;
8987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
8997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return false;
9007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
9017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
9027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitObjCMethodDecl(ObjCMethodDecl *ND) {
9037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (TypeSourceInfo *TSInfo = ND->getResultTypeSourceInfo())
9047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (Visit(TSInfo->getTypeLoc()))
9057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return true;
9067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
9077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  for (ObjCMethodDecl::param_iterator P = ND->param_begin(),
9087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei       PEnd = ND->param_end();
9097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei       P != PEnd; ++P) {
9107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (Visit(MakeCXCursor(*P, TU, RegionOfInterest)))
9117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return true;
9127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
9137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
9147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (ND->isThisDeclarationADefinition() &&
9157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      Visit(MakeCXCursor(ND->getBody(), StmtParent, TU, RegionOfInterest)))
9167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return true;
9177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
9187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return false;
9197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
9207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
9217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeitemplate <typename DeclIt>
9227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic void addRangedDeclsInContainer(DeclIt *DI_current, DeclIt DE_current,
9237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                      SourceManager &SM, SourceLocation EndLoc,
9247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                      SmallVectorImpl<Decl *> &Decls) {
9257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  DeclIt next = *DI_current;
9267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  while (++next != DE_current) {
9277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    Decl *D_next = *next;
9287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (!D_next)
9297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      break;
9307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    SourceLocation L = D_next->getLocStart();
9317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (!L.isValid())
9327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      break;
9337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (SM.isBeforeInTranslationUnit(L, EndLoc)) {
9347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      *DI_current = next;
9357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      Decls.push_back(D_next);
9367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      continue;
9377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
9387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    break;
9397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
9407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
9417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
9427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeinamespace {
9437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  struct ContainerDeclsSort {
9447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    SourceManager &SM;
9457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    ContainerDeclsSort(SourceManager &sm) : SM(sm) {}
9467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    bool operator()(Decl *A, Decl *B) {
9477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      SourceLocation L_A = A->getLocStart();
9487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      SourceLocation L_B = B->getLocStart();
9497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      assert(L_A.isValid() && L_B.isValid());
9507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return SM.isBeforeInTranslationUnit(L_A, L_B);
9517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
9527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  };
9537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
9547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
9557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitObjCContainerDecl(ObjCContainerDecl *D) {
9567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // FIXME: Eventually convert back to just 'VisitDeclContext()'.  Essentially
9577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // an @implementation can lexically contain Decls that are not properly
9587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // nested in the AST.  When we identify such cases, we need to retrofit
9597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // this nesting here.
9607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!DI_current && !FileDI_current)
9617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return VisitDeclContext(D);
9627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
9637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Scan the Decls that immediately come after the container
9647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // in the current DeclContext.  If any fall within the
9657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // container's lexical region, stash them into a vector
9667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // for later processing.
9677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  SmallVector<Decl *, 24> DeclsInContainer;
9687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  SourceLocation EndLoc = D->getSourceRange().getEnd();
9697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  SourceManager &SM = AU->getSourceManager();
9707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (EndLoc.isValid()) {
9717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (DI_current) {
9727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      addRangedDeclsInContainer(DI_current, DE_current, SM, EndLoc,
9737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                DeclsInContainer);
9747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    } else {
9757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      addRangedDeclsInContainer(FileDI_current, FileDE_current, SM, EndLoc,
9767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                DeclsInContainer);
9777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
9787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
9797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
9807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // The common case.
9817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (DeclsInContainer.empty())
9827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return VisitDeclContext(D);
9837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
9847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Get all the Decls in the DeclContext, and sort them with the
9857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // additional ones we've collected.  Then visit them.
9867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  for (DeclContext::decl_iterator I = D->decls_begin(), E = D->decls_end();
9877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei       I!=E; ++I) {
9887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    Decl *subDecl = *I;
9897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (!subDecl || subDecl->getLexicalDeclContext() != D ||
9907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        subDecl->getLocStart().isInvalid())
9917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      continue;
9927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    DeclsInContainer.push_back(subDecl);
9937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
9947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
9957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Now sort the Decls so that they appear in lexical order.
9967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  std::sort(DeclsInContainer.begin(), DeclsInContainer.end(),
9977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            ContainerDeclsSort(SM));
9987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
9997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Now visit the decls.
10007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  for (SmallVectorImpl<Decl*>::iterator I = DeclsInContainer.begin(),
10017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei         E = DeclsInContainer.end(); I != E; ++I) {
10027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    CXCursor Cursor = MakeCXCursor(*I, TU, RegionOfInterest);
1003943f909ba72a1c9351dd421cac1413d303a719f1Ted Kremenek    const Optional<bool> &V = shouldVisitCursor(Cursor);
10047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (!V.hasValue())
10057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      continue;
10067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (!V.getValue())
10077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return false;
10087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (Visit(Cursor, true))
10097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return true;
10107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
10117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return false;
10127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
10137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
10147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitObjCCategoryDecl(ObjCCategoryDecl *ND) {
10157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (Visit(MakeCursorObjCClassRef(ND->getClassInterface(), ND->getLocation(),
10167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                   TU)))
10177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return true;
10187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
10197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  ObjCCategoryDecl::protocol_loc_iterator PL = ND->protocol_loc_begin();
10207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  for (ObjCCategoryDecl::protocol_iterator I = ND->protocol_begin(),
10217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei         E = ND->protocol_end(); I != E; ++I, ++PL)
10227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (Visit(MakeCursorObjCProtocolRef(*I, *PL, TU)))
10237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return true;
10247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
10257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return VisitObjCContainerDecl(ND);
10267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
10277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
10287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitObjCProtocolDecl(ObjCProtocolDecl *PID) {
10297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!PID->isThisDeclarationADefinition())
10307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return Visit(MakeCursorObjCProtocolRef(PID, PID->getLocation(), TU));
10317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
10327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  ObjCProtocolDecl::protocol_loc_iterator PL = PID->protocol_loc_begin();
10337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  for (ObjCProtocolDecl::protocol_iterator I = PID->protocol_begin(),
10347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei       E = PID->protocol_end(); I != E; ++I, ++PL)
10357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (Visit(MakeCursorObjCProtocolRef(*I, *PL, TU)))
10367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return true;
10377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
10387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return VisitObjCContainerDecl(PID);
10397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
10407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
10417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitObjCPropertyDecl(ObjCPropertyDecl *PD) {
10427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (PD->getTypeSourceInfo() && Visit(PD->getTypeSourceInfo()->getTypeLoc()))
10437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return true;
10447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
10457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // FIXME: This implements a workaround with @property declarations also being
10467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // installed in the DeclContext for the @interface.  Eventually this code
10477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // should be removed.
10487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  ObjCCategoryDecl *CDecl = dyn_cast<ObjCCategoryDecl>(PD->getDeclContext());
10497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!CDecl || !CDecl->IsClassExtension())
10507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return false;
10517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
10527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  ObjCInterfaceDecl *ID = CDecl->getClassInterface();
10537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!ID)
10547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return false;
10557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
10567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  IdentifierInfo *PropertyId = PD->getIdentifier();
10577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  ObjCPropertyDecl *prevDecl =
10587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    ObjCPropertyDecl::findPropertyDecl(cast<DeclContext>(ID), PropertyId);
10597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
10607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!prevDecl)
10617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return false;
10627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
10637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Visit synthesized methods since they will be skipped when visiting
10647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // the @interface.
10657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (ObjCMethodDecl *MD = prevDecl->getGetterMethodDecl())
10667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (MD->isPropertyAccessor() && MD->getLexicalDeclContext() == CDecl)
10677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (Visit(MakeCXCursor(MD, TU, RegionOfInterest)))
10687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        return true;
10697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
10707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (ObjCMethodDecl *MD = prevDecl->getSetterMethodDecl())
10717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (MD->isPropertyAccessor() && MD->getLexicalDeclContext() == CDecl)
10727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (Visit(MakeCXCursor(MD, TU, RegionOfInterest)))
10737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        return true;
10747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
10757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return false;
10767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
10777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
10787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitObjCInterfaceDecl(ObjCInterfaceDecl *D) {
10797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!D->isThisDeclarationADefinition()) {
10807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // Forward declaration is treated like a reference.
10817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return Visit(MakeCursorObjCClassRef(D, D->getLocation(), TU));
10827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
10837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
10847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Issue callbacks for super class.
10857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (D->getSuperClass() &&
10867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      Visit(MakeCursorObjCSuperClassRef(D->getSuperClass(),
10877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                        D->getSuperClassLoc(),
10887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                        TU)))
10897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return true;
10907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
10917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  ObjCInterfaceDecl::protocol_loc_iterator PL = D->protocol_loc_begin();
10927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  for (ObjCInterfaceDecl::protocol_iterator I = D->protocol_begin(),
10937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei         E = D->protocol_end(); I != E; ++I, ++PL)
10947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (Visit(MakeCursorObjCProtocolRef(*I, *PL, TU)))
10957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return true;
10967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
10977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return VisitObjCContainerDecl(D);
10987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
10997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
11007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitObjCImplDecl(ObjCImplDecl *D) {
11017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return VisitObjCContainerDecl(D);
11027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
11037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
11047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D) {
11057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // 'ID' could be null when dealing with invalid code.
11067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (ObjCInterfaceDecl *ID = D->getClassInterface())
11077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (Visit(MakeCursorObjCClassRef(ID, D->getLocation(), TU)))
11087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return true;
11097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
11107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return VisitObjCImplDecl(D);
11117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
11127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
11137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitObjCImplementationDecl(ObjCImplementationDecl *D) {
11147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#if 0
11157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Issue callbacks for super class.
11167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // FIXME: No source location information!
11177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (D->getSuperClass() &&
11187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      Visit(MakeCursorObjCSuperClassRef(D->getSuperClass(),
11197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                        D->getSuperClassLoc(),
11207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                        TU)))
11217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return true;
11227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#endif
11237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
11247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return VisitObjCImplDecl(D);
11257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
11267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
11277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *PD) {
11287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (ObjCIvarDecl *Ivar = PD->getPropertyIvarDecl())
11297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (PD->isIvarNameSpecified())
11307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return Visit(MakeCursorMemberRef(Ivar, PD->getPropertyIvarDeclLoc(), TU));
11317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
11327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return false;
11337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
11347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
11357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitNamespaceDecl(NamespaceDecl *D) {
11367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return VisitDeclContext(D);
11377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
11387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
11397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitNamespaceAliasDecl(NamespaceAliasDecl *D) {
11407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Visit nested-name-specifier.
11417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (NestedNameSpecifierLoc QualifierLoc = D->getQualifierLoc())
11427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (VisitNestedNameSpecifierLoc(QualifierLoc))
11437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return true;
11447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
11457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return Visit(MakeCursorNamespaceRef(D->getAliasedNamespace(),
11467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                      D->getTargetNameLoc(), TU));
11477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
11487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
11497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitUsingDecl(UsingDecl *D) {
11507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Visit nested-name-specifier.
11517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (NestedNameSpecifierLoc QualifierLoc = D->getQualifierLoc()) {
11527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (VisitNestedNameSpecifierLoc(QualifierLoc))
11537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return true;
11547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
11557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
11567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (Visit(MakeCursorOverloadedDeclRef(D, D->getLocation(), TU)))
11577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return true;
11587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
11597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return VisitDeclarationNameInfo(D->getNameInfo());
11607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
11617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
11627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitUsingDirectiveDecl(UsingDirectiveDecl *D) {
11637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Visit nested-name-specifier.
11647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (NestedNameSpecifierLoc QualifierLoc = D->getQualifierLoc())
11657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (VisitNestedNameSpecifierLoc(QualifierLoc))
11667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return true;
11677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
11687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return Visit(MakeCursorNamespaceRef(D->getNominatedNamespaceAsWritten(),
11697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                      D->getIdentLocation(), TU));
11707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
11717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
11727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D) {
11737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Visit nested-name-specifier.
11747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (NestedNameSpecifierLoc QualifierLoc = D->getQualifierLoc()) {
11757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (VisitNestedNameSpecifierLoc(QualifierLoc))
11767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return true;
11777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
11787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
11797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return VisitDeclarationNameInfo(D->getNameInfo());
11807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
11817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
11827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitUnresolvedUsingTypenameDecl(
11837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                               UnresolvedUsingTypenameDecl *D) {
11847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Visit nested-name-specifier.
11857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (NestedNameSpecifierLoc QualifierLoc = D->getQualifierLoc())
11867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (VisitNestedNameSpecifierLoc(QualifierLoc))
11877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return true;
11887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
11897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return false;
11907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
11917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
11927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitDeclarationNameInfo(DeclarationNameInfo Name) {
11937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  switch (Name.getName().getNameKind()) {
11947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case clang::DeclarationName::Identifier:
11957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case clang::DeclarationName::CXXLiteralOperatorName:
11967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case clang::DeclarationName::CXXOperatorName:
11977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case clang::DeclarationName::CXXUsingDirective:
11987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return false;
11997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
12007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case clang::DeclarationName::CXXConstructorName:
12017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case clang::DeclarationName::CXXDestructorName:
12027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case clang::DeclarationName::CXXConversionFunctionName:
12037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (TypeSourceInfo *TSInfo = Name.getNamedTypeInfo())
12047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return Visit(TSInfo->getTypeLoc());
12057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return false;
12067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
12077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case clang::DeclarationName::ObjCZeroArgSelector:
12087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case clang::DeclarationName::ObjCOneArgSelector:
12097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case clang::DeclarationName::ObjCMultiArgSelector:
12107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // FIXME: Per-identifier location info?
12117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return false;
12127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
12137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
12147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  llvm_unreachable("Invalid DeclarationName::Kind!");
12157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
12167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
12177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitNestedNameSpecifier(NestedNameSpecifier *NNS,
12187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                             SourceRange Range) {
12197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // FIXME: This whole routine is a hack to work around the lack of proper
12207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // source information in nested-name-specifiers (PR5791). Since we do have
12217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // a beginning source location, we can visit the first component of the
12227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // nested-name-specifier, if it's a single-token component.
12237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!NNS)
12247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return false;
12257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
12267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Get the first component in the nested-name-specifier.
12277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  while (NestedNameSpecifier *Prefix = NNS->getPrefix())
12287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    NNS = Prefix;
12297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
12307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  switch (NNS->getKind()) {
12317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case NestedNameSpecifier::Namespace:
12327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return Visit(MakeCursorNamespaceRef(NNS->getAsNamespace(), Range.getBegin(),
12337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                        TU));
12347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
12357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case NestedNameSpecifier::NamespaceAlias:
12367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return Visit(MakeCursorNamespaceRef(NNS->getAsNamespaceAlias(),
12377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                        Range.getBegin(), TU));
12387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
12397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case NestedNameSpecifier::TypeSpec: {
12407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // If the type has a form where we know that the beginning of the source
12417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // range matches up with a reference cursor. Visit the appropriate reference
12427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // cursor.
12437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    const Type *T = NNS->getAsType();
12447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (const TypedefType *Typedef = dyn_cast<TypedefType>(T))
12457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return Visit(MakeCursorTypeRef(Typedef->getDecl(), Range.getBegin(), TU));
12467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (const TagType *Tag = dyn_cast<TagType>(T))
12477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return Visit(MakeCursorTypeRef(Tag->getDecl(), Range.getBegin(), TU));
12487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (const TemplateSpecializationType *TST
12497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                      = dyn_cast<TemplateSpecializationType>(T))
12507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return VisitTemplateName(TST->getTemplateName(), Range.getBegin());
12517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    break;
12527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
12537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
12547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case NestedNameSpecifier::TypeSpecWithTemplate:
12557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case NestedNameSpecifier::Global:
12567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case NestedNameSpecifier::Identifier:
12577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    break;
12587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
12597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
12607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return false;
12617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
12627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
12637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool
12647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCursorVisitor::VisitNestedNameSpecifierLoc(NestedNameSpecifierLoc Qualifier) {
12657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  SmallVector<NestedNameSpecifierLoc, 4> Qualifiers;
12667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  for (; Qualifier; Qualifier = Qualifier.getPrefix())
12677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    Qualifiers.push_back(Qualifier);
12687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
12697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  while (!Qualifiers.empty()) {
12707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    NestedNameSpecifierLoc Q = Qualifiers.pop_back_val();
12717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    NestedNameSpecifier *NNS = Q.getNestedNameSpecifier();
12727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    switch (NNS->getKind()) {
12737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case NestedNameSpecifier::Namespace:
12747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (Visit(MakeCursorNamespaceRef(NNS->getAsNamespace(),
12757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                       Q.getLocalBeginLoc(),
12767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                       TU)))
12777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        return true;
12787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
12797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      break;
12807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
12817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case NestedNameSpecifier::NamespaceAlias:
12827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (Visit(MakeCursorNamespaceRef(NNS->getAsNamespaceAlias(),
12837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                       Q.getLocalBeginLoc(),
12847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                       TU)))
12857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        return true;
12867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
12877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      break;
12887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
12897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case NestedNameSpecifier::TypeSpec:
12907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case NestedNameSpecifier::TypeSpecWithTemplate:
12917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (Visit(Q.getTypeLoc()))
12927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        return true;
12937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
12947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      break;
12957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
12967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case NestedNameSpecifier::Global:
12977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case NestedNameSpecifier::Identifier:
12987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      break;
12997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
13007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
13017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
13027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return false;
13037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
13047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
13057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitTemplateParameters(
13067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                          const TemplateParameterList *Params) {
13077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!Params)
13087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return false;
13097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
13107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  for (TemplateParameterList::const_iterator P = Params->begin(),
13117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                          PEnd = Params->end();
13127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei       P != PEnd; ++P) {
13137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (Visit(MakeCXCursor(*P, TU, RegionOfInterest)))
13147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return true;
13157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
13167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
13177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return false;
13187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
13197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
13207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitTemplateName(TemplateName Name, SourceLocation Loc) {
13217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  switch (Name.getKind()) {
13227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case TemplateName::Template:
13237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return Visit(MakeCursorTemplateRef(Name.getAsTemplateDecl(), Loc, TU));
13247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
13257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case TemplateName::OverloadedTemplate:
13267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // Visit the overloaded template set.
13277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (Visit(MakeCursorOverloadedDeclRef(Name, Loc, TU)))
13287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return true;
13297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
13307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return false;
13317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
13327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case TemplateName::DependentTemplate:
13337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // FIXME: Visit nested-name-specifier.
13347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return false;
13357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
13367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case TemplateName::QualifiedTemplate:
13377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // FIXME: Visit nested-name-specifier.
13387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return Visit(MakeCursorTemplateRef(
13397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                  Name.getAsQualifiedTemplateName()->getDecl(),
13407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                       Loc, TU));
13417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
13427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case TemplateName::SubstTemplateTemplateParm:
13437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return Visit(MakeCursorTemplateRef(
13447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                         Name.getAsSubstTemplateTemplateParm()->getParameter(),
13457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                       Loc, TU));
13467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
13477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case TemplateName::SubstTemplateTemplateParmPack:
13487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return Visit(MakeCursorTemplateRef(
13497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                  Name.getAsSubstTemplateTemplateParmPack()->getParameterPack(),
13507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                       Loc, TU));
13517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
13527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
13537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  llvm_unreachable("Invalid TemplateName::Kind!");
13547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
13557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
13567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitTemplateArgumentLoc(const TemplateArgumentLoc &TAL) {
13577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  switch (TAL.getArgument().getKind()) {
13587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case TemplateArgument::Null:
13597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case TemplateArgument::Integral:
13607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case TemplateArgument::Pack:
13617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return false;
13627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
13637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case TemplateArgument::Type:
13647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (TypeSourceInfo *TSInfo = TAL.getTypeSourceInfo())
13657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return Visit(TSInfo->getTypeLoc());
13667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return false;
13677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
13687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case TemplateArgument::Declaration:
13697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (Expr *E = TAL.getSourceDeclExpression())
13707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return Visit(MakeCXCursor(E, StmtParent, TU, RegionOfInterest));
13717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return false;
13727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
13737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case TemplateArgument::NullPtr:
13747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (Expr *E = TAL.getSourceNullPtrExpression())
13757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return Visit(MakeCXCursor(E, StmtParent, TU, RegionOfInterest));
13767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return false;
13777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
13787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case TemplateArgument::Expression:
13797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (Expr *E = TAL.getSourceExpression())
13807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return Visit(MakeCXCursor(E, StmtParent, TU, RegionOfInterest));
13817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return false;
13827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
13837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case TemplateArgument::Template:
13847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case TemplateArgument::TemplateExpansion:
13857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (VisitNestedNameSpecifierLoc(TAL.getTemplateQualifierLoc()))
13867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return true;
13877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
13887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return VisitTemplateName(TAL.getArgument().getAsTemplateOrTemplatePattern(),
13897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                             TAL.getTemplateNameLoc());
13907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
13917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
13927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  llvm_unreachable("Invalid TemplateArgument::Kind!");
13937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
13947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
13957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitLinkageSpecDecl(LinkageSpecDecl *D) {
13967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return VisitDeclContext(D);
13977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
13987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
13997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitQualifiedTypeLoc(QualifiedTypeLoc TL) {
14007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return Visit(TL.getUnqualifiedLoc());
14017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
14027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
14037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) {
14047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  ASTContext &Context = AU->getASTContext();
14057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
14067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Some builtin types (such as Objective-C's "id", "sel", and
14077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // "Class") have associated declarations. Create cursors for those.
14087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  QualType VisitType;
14097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  switch (TL.getTypePtr()->getKind()) {
14107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
14117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case BuiltinType::Void:
14127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case BuiltinType::NullPtr:
14137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case BuiltinType::Dependent:
1414b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei  case BuiltinType::OCLImage1d:
1415b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei  case BuiltinType::OCLImage1dArray:
1416b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei  case BuiltinType::OCLImage1dBuffer:
1417b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei  case BuiltinType::OCLImage2d:
1418b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei  case BuiltinType::OCLImage2dArray:
1419b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei  case BuiltinType::OCLImage3d:
1420775bb8a4aecdd1e0af2a7a6baba449f074afa2c1NAKAMURA Takumi  case BuiltinType::OCLSampler:
1421e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei  case BuiltinType::OCLEvent:
14227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define BUILTIN_TYPE(Id, SingletonId)
14237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define SIGNED_TYPE(Id, SingletonId) case BuiltinType::Id:
14247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define UNSIGNED_TYPE(Id, SingletonId) case BuiltinType::Id:
14257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define FLOATING_TYPE(Id, SingletonId) case BuiltinType::Id:
14267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define PLACEHOLDER_TYPE(Id, SingletonId) case BuiltinType::Id:
14277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/AST/BuiltinTypes.def"
14287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    break;
14297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
14307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case BuiltinType::ObjCId:
14317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    VisitType = Context.getObjCIdType();
14327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    break;
14337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
14347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case BuiltinType::ObjCClass:
14357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    VisitType = Context.getObjCClassType();
14367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    break;
14377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
14387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case BuiltinType::ObjCSel:
14397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    VisitType = Context.getObjCSelType();
14407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    break;
14417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
14427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
14437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!VisitType.isNull()) {
14447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (const TypedefType *Typedef = VisitType->getAs<TypedefType>())
14457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return Visit(MakeCursorTypeRef(Typedef->getDecl(), TL.getBuiltinLoc(),
14467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                     TU));
14477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
14487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
14497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return false;
14507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
14517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
14527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitTypedefTypeLoc(TypedefTypeLoc TL) {
14537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return Visit(MakeCursorTypeRef(TL.getTypedefNameDecl(), TL.getNameLoc(), TU));
14547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
14557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
14567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) {
14577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return Visit(MakeCursorTypeRef(TL.getDecl(), TL.getNameLoc(), TU));
14587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
14597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
14607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitTagTypeLoc(TagTypeLoc TL) {
14617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (TL.isDefinition())
14627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return Visit(MakeCXCursor(TL.getDecl(), TU, RegionOfInterest));
14637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
14647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return Visit(MakeCursorTypeRef(TL.getDecl(), TL.getNameLoc(), TU));
14657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
14667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
14677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) {
14687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return Visit(MakeCursorTypeRef(TL.getDecl(), TL.getNameLoc(), TU));
14697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
14707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
14717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) {
14727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (Visit(MakeCursorObjCClassRef(TL.getIFaceDecl(), TL.getNameLoc(), TU)))
14737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return true;
14747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
14757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return false;
14767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
14777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
14787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) {
14797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (TL.hasBaseTypeAsWritten() && Visit(TL.getBaseLoc()))
14807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return true;
14817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
14827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  for (unsigned I = 0, N = TL.getNumProtocols(); I != N; ++I) {
14837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (Visit(MakeCursorObjCProtocolRef(TL.getProtocol(I), TL.getProtocolLoc(I),
14847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                        TU)))
14857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return true;
14867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
14877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
14887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return false;
14897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
14907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
14917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) {
14927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return Visit(TL.getPointeeLoc());
14937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
14947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
14957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitParenTypeLoc(ParenTypeLoc TL) {
14967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return Visit(TL.getInnerLoc());
14977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
14987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
14997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitPointerTypeLoc(PointerTypeLoc TL) {
15007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return Visit(TL.getPointeeLoc());
15017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
15027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
15037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) {
15047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return Visit(TL.getPointeeLoc());
15057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
15067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
15077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) {
15087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return Visit(TL.getPointeeLoc());
15097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
15107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
15117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) {
15127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return Visit(TL.getPointeeLoc());
15137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
15147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
15157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) {
15167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return Visit(TL.getPointeeLoc());
15177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
15187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
15197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitAttributedTypeLoc(AttributedTypeLoc TL) {
15207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return Visit(TL.getModifiedLoc());
15217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
15227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
15237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitFunctionTypeLoc(FunctionTypeLoc TL,
15247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                         bool SkipResultType) {
15257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!SkipResultType && Visit(TL.getResultLoc()))
15267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return true;
15277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
15287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  for (unsigned I = 0, N = TL.getNumArgs(); I != N; ++I)
15297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (Decl *D = TL.getArg(I))
15307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (Visit(MakeCXCursor(D, TU, RegionOfInterest)))
15317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        return true;
15327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
15337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return false;
15347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
15357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
15367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitArrayTypeLoc(ArrayTypeLoc TL) {
15377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (Visit(TL.getElementLoc()))
15387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return true;
15397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
15407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (Expr *Size = TL.getSizeExpr())
15417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return Visit(MakeCXCursor(Size, StmtParent, TU, RegionOfInterest));
15427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
15437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return false;
15447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
15457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
15467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitTemplateSpecializationTypeLoc(
15477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                             TemplateSpecializationTypeLoc TL) {
15487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Visit the template name.
15497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (VisitTemplateName(TL.getTypePtr()->getTemplateName(),
15507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                        TL.getTemplateNameLoc()))
15517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return true;
15527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
15537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Visit the template arguments.
15547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  for (unsigned I = 0, N = TL.getNumArgs(); I != N; ++I)
15557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (VisitTemplateArgumentLoc(TL.getArgLoc(I)))
15567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return true;
15577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
15587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return false;
15597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
15607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
15617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) {
15627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return Visit(MakeCXCursor(TL.getUnderlyingExpr(), StmtParent, TU));
15637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
15647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
15657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) {
15667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (TypeSourceInfo *TSInfo = TL.getUnderlyingTInfo())
15677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return Visit(TSInfo->getTypeLoc());
15687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
15697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return false;
15707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
15717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
15727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) {
15737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (TypeSourceInfo *TSInfo = TL.getUnderlyingTInfo())
15747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return Visit(TSInfo->getTypeLoc());
15757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
15767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return false;
15777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
15787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
15797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) {
15807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (VisitNestedNameSpecifierLoc(TL.getQualifierLoc()))
15817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return true;
15827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
15837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return false;
15847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
15857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
15867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitDependentTemplateSpecializationTypeLoc(
15877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                    DependentTemplateSpecializationTypeLoc TL) {
15887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Visit the nested-name-specifier, if there is one.
15897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (TL.getQualifierLoc() &&
15907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      VisitNestedNameSpecifierLoc(TL.getQualifierLoc()))
15917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return true;
15927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
15937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Visit the template arguments.
15947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  for (unsigned I = 0, N = TL.getNumArgs(); I != N; ++I)
15957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (VisitTemplateArgumentLoc(TL.getArgLoc(I)))
15967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return true;
15977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
15987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return false;
15997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
16007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
16017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitElaboratedTypeLoc(ElaboratedTypeLoc TL) {
16027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (VisitNestedNameSpecifierLoc(TL.getQualifierLoc()))
16037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return true;
16047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
16057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return Visit(TL.getNamedTypeLoc());
16067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
16077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
16087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) {
16097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return Visit(TL.getPatternLoc());
16107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
16117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
16127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitDecltypeTypeLoc(DecltypeTypeLoc TL) {
16137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (Expr *E = TL.getUnderlyingExpr())
16147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return Visit(MakeCXCursor(E, StmtParent, TU));
16157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
16167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return false;
16177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
16187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
16197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitInjectedClassNameTypeLoc(InjectedClassNameTypeLoc TL) {
16207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return Visit(MakeCursorTypeRef(TL.getDecl(), TL.getNameLoc(), TU));
16217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
16227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
16237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitAtomicTypeLoc(AtomicTypeLoc TL) {
16247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return Visit(TL.getValueLoc());
16257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
16267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
16277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define DEFAULT_TYPELOC_IMPL(CLASS, PARENT) \
16287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::Visit##CLASS##TypeLoc(CLASS##TypeLoc TL) { \
16297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return Visit##PARENT##Loc(TL); \
16307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
16317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
16327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiDEFAULT_TYPELOC_IMPL(Complex, Type)
16337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiDEFAULT_TYPELOC_IMPL(ConstantArray, ArrayType)
16347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiDEFAULT_TYPELOC_IMPL(IncompleteArray, ArrayType)
16357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiDEFAULT_TYPELOC_IMPL(VariableArray, ArrayType)
16367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiDEFAULT_TYPELOC_IMPL(DependentSizedArray, ArrayType)
16377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiDEFAULT_TYPELOC_IMPL(DependentSizedExtVector, Type)
16387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiDEFAULT_TYPELOC_IMPL(Vector, Type)
16397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiDEFAULT_TYPELOC_IMPL(ExtVector, VectorType)
16407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiDEFAULT_TYPELOC_IMPL(FunctionProto, FunctionType)
16417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiDEFAULT_TYPELOC_IMPL(FunctionNoProto, FunctionType)
16427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiDEFAULT_TYPELOC_IMPL(Record, TagType)
16437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiDEFAULT_TYPELOC_IMPL(Enum, TagType)
16447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiDEFAULT_TYPELOC_IMPL(SubstTemplateTypeParm, Type)
16457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiDEFAULT_TYPELOC_IMPL(SubstTemplateTypeParmPack, Type)
16467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiDEFAULT_TYPELOC_IMPL(Auto, Type)
16477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
16487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitCXXRecordDecl(CXXRecordDecl *D) {
16497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Visit the nested-name-specifier, if present.
16507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (NestedNameSpecifierLoc QualifierLoc = D->getQualifierLoc())
16517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (VisitNestedNameSpecifierLoc(QualifierLoc))
16527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return true;
16537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
16547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (D->isCompleteDefinition()) {
16557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    for (CXXRecordDecl::base_class_iterator I = D->bases_begin(),
16567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei         E = D->bases_end(); I != E; ++I) {
16577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (Visit(cxcursor::MakeCursorCXXBaseSpecifier(I, TU)))
16587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        return true;
16597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
16607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
16617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
16627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return VisitTagDecl(D);
16637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
16647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
16657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitAttributes(Decl *D) {
16667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  for (AttrVec::const_iterator i = D->attr_begin(), e = D->attr_end();
16677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei       i != e; ++i)
16687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (Visit(MakeCXCursor(*i, D, TU)))
16697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        return true;
16707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
16717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return false;
16727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
16737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
16747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----------------------------------------------------------------------===//
16757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// Data-recursive visitor methods.
16767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----------------------------------------------------------------------===//
16777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
16787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeinamespace {
16797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define DEF_JOB(NAME, DATA, KIND)\
16807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiclass NAME : public VisitorJob {\
16817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeipublic:\
1682ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  NAME(const DATA *d, CXCursor parent) : \
1683ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko      VisitorJob(parent, VisitorJob::KIND, d) {} \
16847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  static bool classof(const VisitorJob *VJ) { return VJ->getKind() == KIND; }\
1685ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  const DATA *get() const { return static_cast<const DATA*>(data[0]); }\
16867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei};
16877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
16887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiDEF_JOB(StmtVisit, Stmt, StmtVisitKind)
16897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiDEF_JOB(MemberExprParts, MemberExpr, MemberExprPartsKind)
16907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiDEF_JOB(DeclRefExprParts, DeclRefExpr, DeclRefExprPartsKind)
16917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiDEF_JOB(OverloadExprParts, OverloadExpr, OverloadExprPartsKind)
16927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiDEF_JOB(ExplicitTemplateArgsVisit, ASTTemplateArgumentListInfo,
16937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        ExplicitTemplateArgsVisitKind)
16947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiDEF_JOB(SizeOfPackExprParts, SizeOfPackExpr, SizeOfPackExprPartsKind)
16957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiDEF_JOB(LambdaExprParts, LambdaExpr, LambdaExprPartsKind)
16967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiDEF_JOB(PostChildrenVisit, void, PostChildrenVisitKind)
16977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#undef DEF_JOB
16987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
16997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiclass DeclVisit : public VisitorJob {
17007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeipublic:
1701ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  DeclVisit(const Decl *D, CXCursor parent, bool isFirst) :
17027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    VisitorJob(parent, VisitorJob::DeclVisitKind,
1703a376f8774a73cfeb1c48bf2fe0baa8c2731cfaccDmitri Gribenko               D, isFirst ? (void*) 1 : (void*) 0) {}
17047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  static bool classof(const VisitorJob *VJ) {
17057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return VJ->getKind() == DeclVisitKind;
17067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
1707ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  const Decl *get() const { return static_cast<const Decl *>(data[0]); }
17087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  bool isFirst() const { return data[1] ? true : false; }
17097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei};
17107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiclass TypeLocVisit : public VisitorJob {
17117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeipublic:
17127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  TypeLocVisit(TypeLoc tl, CXCursor parent) :
17137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    VisitorJob(parent, VisitorJob::TypeLocVisitKind,
17147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei               tl.getType().getAsOpaquePtr(), tl.getOpaqueData()) {}
17157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
17167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  static bool classof(const VisitorJob *VJ) {
17177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return VJ->getKind() == TypeLocVisitKind;
17187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
17197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
17207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  TypeLoc get() const {
17217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    QualType T = QualType::getFromOpaquePtr(data[0]);
1722ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko    return TypeLoc(T, const_cast<void *>(data[1]));
17237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
17247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei};
17257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
17267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiclass LabelRefVisit : public VisitorJob {
17277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeipublic:
17287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  LabelRefVisit(LabelDecl *LD, SourceLocation labelLoc, CXCursor parent)
17297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    : VisitorJob(parent, VisitorJob::LabelRefVisitKind, LD,
17307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                 labelLoc.getPtrEncoding()) {}
17317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
17327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  static bool classof(const VisitorJob *VJ) {
17337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return VJ->getKind() == VisitorJob::LabelRefVisitKind;
17347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
1735ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  const LabelDecl *get() const {
1736ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko    return static_cast<const LabelDecl *>(data[0]);
1737ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  }
17387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  SourceLocation getLoc() const {
17397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return SourceLocation::getFromPtrEncoding(data[1]); }
17407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei};
17417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
17427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiclass NestedNameSpecifierLocVisit : public VisitorJob {
17437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeipublic:
17447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  NestedNameSpecifierLocVisit(NestedNameSpecifierLoc Qualifier, CXCursor parent)
17457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    : VisitorJob(parent, VisitorJob::NestedNameSpecifierLocVisitKind,
17467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                 Qualifier.getNestedNameSpecifier(),
17477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                 Qualifier.getOpaqueData()) { }
17487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
17497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  static bool classof(const VisitorJob *VJ) {
17507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return VJ->getKind() == VisitorJob::NestedNameSpecifierLocVisitKind;
17517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
17527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
17537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  NestedNameSpecifierLoc get() const {
1754ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko    return NestedNameSpecifierLoc(
1755ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko            const_cast<NestedNameSpecifier *>(
1756ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko              static_cast<const NestedNameSpecifier *>(data[0])),
1757ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko            const_cast<void *>(data[1]));
17587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
17597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei};
17607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
17617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiclass DeclarationNameInfoVisit : public VisitorJob {
17627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeipublic:
1763ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  DeclarationNameInfoVisit(const Stmt *S, CXCursor parent)
1764a376f8774a73cfeb1c48bf2fe0baa8c2731cfaccDmitri Gribenko    : VisitorJob(parent, VisitorJob::DeclarationNameInfoVisitKind, S) {}
17657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  static bool classof(const VisitorJob *VJ) {
17667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return VJ->getKind() == VisitorJob::DeclarationNameInfoVisitKind;
17677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
17687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  DeclarationNameInfo get() const {
1769ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko    const Stmt *S = static_cast<const Stmt *>(data[0]);
17707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    switch (S->getStmtClass()) {
17717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    default:
17727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      llvm_unreachable("Unhandled Stmt");
17737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case clang::Stmt::MSDependentExistsStmtClass:
17747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return cast<MSDependentExistsStmt>(S)->getNameInfo();
17757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case Stmt::CXXDependentScopeMemberExprClass:
17767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return cast<CXXDependentScopeMemberExpr>(S)->getMemberNameInfo();
17777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case Stmt::DependentScopeDeclRefExprClass:
17787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return cast<DependentScopeDeclRefExpr>(S)->getNameInfo();
17797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
17807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
17817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei};
17827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiclass MemberRefVisit : public VisitorJob {
17837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeipublic:
1784ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  MemberRefVisit(const FieldDecl *D, SourceLocation L, CXCursor parent)
17857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    : VisitorJob(parent, VisitorJob::MemberRefVisitKind, D,
17867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                 L.getPtrEncoding()) {}
17877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  static bool classof(const VisitorJob *VJ) {
17887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return VJ->getKind() == VisitorJob::MemberRefVisitKind;
17897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
1790ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  const FieldDecl *get() const {
1791ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko    return static_cast<const FieldDecl *>(data[0]);
17927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
17937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  SourceLocation getLoc() const {
17947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return SourceLocation::getFromRawEncoding((unsigned)(uintptr_t) data[1]);
17957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
17967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei};
1797ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkoclass EnqueueVisitor : public ConstStmtVisitor<EnqueueVisitor, void> {
17987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  VisitorWorkList &WL;
17997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  CXCursor Parent;
18007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeipublic:
18017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  EnqueueVisitor(VisitorWorkList &wl, CXCursor parent)
18027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    : WL(wl), Parent(parent) {}
18037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
1804ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitAddrLabelExpr(const AddrLabelExpr *E);
1805ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitBlockExpr(const BlockExpr *B);
1806ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitCompoundLiteralExpr(const CompoundLiteralExpr *E);
1807ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitCompoundStmt(const CompoundStmt *S);
1808ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitCXXDefaultArgExpr(const CXXDefaultArgExpr *E) { /* Do nothing. */ }
1809ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitMSDependentExistsStmt(const MSDependentExistsStmt *S);
1810ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitCXXDependentScopeMemberExpr(const CXXDependentScopeMemberExpr *E);
1811ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitCXXNewExpr(const CXXNewExpr *E);
1812ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitCXXScalarValueInitExpr(const CXXScalarValueInitExpr *E);
1813ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitCXXOperatorCallExpr(const CXXOperatorCallExpr *E);
1814ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitCXXPseudoDestructorExpr(const CXXPseudoDestructorExpr *E);
1815ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitCXXTemporaryObjectExpr(const CXXTemporaryObjectExpr *E);
1816ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitCXXTypeidExpr(const CXXTypeidExpr *E);
1817ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitCXXUnresolvedConstructExpr(const CXXUnresolvedConstructExpr *E);
1818ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitCXXUuidofExpr(const CXXUuidofExpr *E);
1819ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitCXXCatchStmt(const CXXCatchStmt *S);
1820ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitDeclRefExpr(const DeclRefExpr *D);
1821ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitDeclStmt(const DeclStmt *S);
1822ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitDependentScopeDeclRefExpr(const DependentScopeDeclRefExpr *E);
1823ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitDesignatedInitExpr(const DesignatedInitExpr *E);
1824ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitExplicitCastExpr(const ExplicitCastExpr *E);
1825ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitForStmt(const ForStmt *FS);
1826ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitGotoStmt(const GotoStmt *GS);
1827ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitIfStmt(const IfStmt *If);
1828ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitInitListExpr(const InitListExpr *IE);
1829ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitMemberExpr(const MemberExpr *M);
1830ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitOffsetOfExpr(const OffsetOfExpr *E);
1831ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitObjCEncodeExpr(const ObjCEncodeExpr *E);
1832ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitObjCMessageExpr(const ObjCMessageExpr *M);
1833ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitOverloadExpr(const OverloadExpr *E);
1834ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitUnaryExprOrTypeTraitExpr(const UnaryExprOrTypeTraitExpr *E);
1835ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitStmt(const Stmt *S);
1836ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitSwitchStmt(const SwitchStmt *S);
1837ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitWhileStmt(const WhileStmt *W);
1838ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitUnaryTypeTraitExpr(const UnaryTypeTraitExpr *E);
1839ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitBinaryTypeTraitExpr(const BinaryTypeTraitExpr *E);
1840ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitTypeTraitExpr(const TypeTraitExpr *E);
1841ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitArrayTypeTraitExpr(const ArrayTypeTraitExpr *E);
1842ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitExpressionTraitExpr(const ExpressionTraitExpr *E);
1843ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitUnresolvedMemberExpr(const UnresolvedMemberExpr *U);
1844ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitVAArgExpr(const VAArgExpr *E);
1845ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitSizeOfPackExpr(const SizeOfPackExpr *E);
1846ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitPseudoObjectExpr(const PseudoObjectExpr *E);
1847ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitOpaqueValueExpr(const OpaqueValueExpr *E);
1848ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitLambdaExpr(const LambdaExpr *E);
1849ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko
18507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiprivate:
1851ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void AddDeclarationNameInfo(const Stmt *S);
18527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  void AddNestedNameSpecifierLoc(NestedNameSpecifierLoc Qualifier);
18537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  void AddExplicitTemplateArgs(const ASTTemplateArgumentListInfo *A);
1854ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void AddMemberRef(const FieldDecl *D, SourceLocation L);
1855ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void AddStmt(const Stmt *S);
1856ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void AddDecl(const Decl *D, bool isFirst = true);
18577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  void AddTypeLoc(TypeSourceInfo *TI);
1858ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void EnqueueChildren(const Stmt *S);
18597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei};
18607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} // end anonyous namespace
18617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
1862ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::AddDeclarationNameInfo(const Stmt *S) {
18637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // 'S' should always be non-null, since it comes from the
18647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // statement we are visiting.
18657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  WL.push_back(DeclarationNameInfoVisit(S, Parent));
18667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
18677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
18687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid
18697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiEnqueueVisitor::AddNestedNameSpecifierLoc(NestedNameSpecifierLoc Qualifier) {
18707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (Qualifier)
18717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    WL.push_back(NestedNameSpecifierLocVisit(Qualifier, Parent));
18727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
18737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
1874ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::AddStmt(const Stmt *S) {
18757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (S)
18767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    WL.push_back(StmtVisit(S, Parent));
18777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
1878ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::AddDecl(const Decl *D, bool isFirst) {
18797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (D)
18807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    WL.push_back(DeclVisit(D, Parent, isFirst));
18817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
18827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid EnqueueVisitor::
18837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddExplicitTemplateArgs(const ASTTemplateArgumentListInfo *A) {
18847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (A)
1885ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko    WL.push_back(ExplicitTemplateArgsVisit(A, Parent));
18867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
1887ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::AddMemberRef(const FieldDecl *D, SourceLocation L) {
18887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (D)
18897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    WL.push_back(MemberRefVisit(D, L, Parent));
18907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
18917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid EnqueueVisitor::AddTypeLoc(TypeSourceInfo *TI) {
18927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (TI)
18937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    WL.push_back(TypeLocVisit(TI->getTypeLoc(), Parent));
18947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei }
1895ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::EnqueueChildren(const Stmt *S) {
18967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  unsigned size = WL.size();
1897ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  for (Stmt::const_child_range Child = S->children(); Child; ++Child) {
18987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    AddStmt(*Child);
18997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
19007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (size == WL.size())
19017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return;
19027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Now reverse the entries we just added.  This will match the DFS
19037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // ordering performed by the worklist.
19047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  VisitorWorkList::iterator I = WL.begin() + size, E = WL.end();
19057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  std::reverse(I, E);
19067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
1907ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::VisitAddrLabelExpr(const AddrLabelExpr *E) {
19087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  WL.push_back(LabelRefVisit(E->getLabel(), E->getLabelLoc(), Parent));
19097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
1910ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::VisitBlockExpr(const BlockExpr *B) {
19117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddDecl(B->getBlockDecl());
19127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
1913ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::VisitCompoundLiteralExpr(const CompoundLiteralExpr *E) {
19147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  EnqueueChildren(E);
19157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddTypeLoc(E->getTypeSourceInfo());
19167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
1917ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::VisitCompoundStmt(const CompoundStmt *S) {
1918ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  for (CompoundStmt::const_reverse_body_iterator I = S->body_rbegin(),
19197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        E = S->body_rend(); I != E; ++I) {
19207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    AddStmt(*I);
19217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
19227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
19237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid EnqueueVisitor::
1924ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri GribenkoVisitMSDependentExistsStmt(const MSDependentExistsStmt *S) {
19257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddStmt(S->getSubStmt());
19267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddDeclarationNameInfo(S);
19277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (NestedNameSpecifierLoc QualifierLoc = S->getQualifierLoc())
19287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    AddNestedNameSpecifierLoc(QualifierLoc);
19297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
19307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
19317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid EnqueueVisitor::
1932ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri GribenkoVisitCXXDependentScopeMemberExpr(const CXXDependentScopeMemberExpr *E) {
19337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddExplicitTemplateArgs(E->getOptionalExplicitTemplateArgs());
19347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddDeclarationNameInfo(E);
19357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc())
19367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    AddNestedNameSpecifierLoc(QualifierLoc);
19377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!E->isImplicitAccess())
19387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    AddStmt(E->getBase());
19397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
1940ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::VisitCXXNewExpr(const CXXNewExpr *E) {
19417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Enqueue the initializer , if any.
19427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddStmt(E->getInitializer());
19437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Enqueue the array size, if any.
19447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddStmt(E->getArraySize());
19457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Enqueue the allocated type.
19467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddTypeLoc(E->getAllocatedTypeSourceInfo());
19477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Enqueue the placement arguments.
19487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  for (unsigned I = E->getNumPlacementArgs(); I > 0; --I)
19497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    AddStmt(E->getPlacementArg(I-1));
19507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
1951ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::VisitCXXOperatorCallExpr(const CXXOperatorCallExpr *CE) {
19527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  for (unsigned I = CE->getNumArgs(); I > 1 /* Yes, this is 1 */; --I)
19537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    AddStmt(CE->getArg(I-1));
19547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddStmt(CE->getCallee());
19557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddStmt(CE->getArg(0));
19567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
1957ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::VisitCXXPseudoDestructorExpr(
1958ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko                                        const CXXPseudoDestructorExpr *E) {
19597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Visit the name of the type being destroyed.
19607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddTypeLoc(E->getDestroyedTypeInfo());
19617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Visit the scope type that looks disturbingly like the nested-name-specifier
19627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // but isn't.
19637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddTypeLoc(E->getScopeTypeInfo());
19647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Visit the nested-name-specifier.
19657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc())
19667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    AddNestedNameSpecifierLoc(QualifierLoc);
19677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Visit base expression.
19687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddStmt(E->getBase());
19697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
1970ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::VisitCXXScalarValueInitExpr(
1971ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko                                        const CXXScalarValueInitExpr *E) {
19727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddTypeLoc(E->getTypeSourceInfo());
19737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
1974ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::VisitCXXTemporaryObjectExpr(
1975ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko                                        const CXXTemporaryObjectExpr *E) {
19767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  EnqueueChildren(E);
19777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddTypeLoc(E->getTypeSourceInfo());
19787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
1979ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::VisitCXXTypeidExpr(const CXXTypeidExpr *E) {
19807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  EnqueueChildren(E);
19817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (E->isTypeOperand())
19827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    AddTypeLoc(E->getTypeOperandSourceInfo());
19837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
19847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
1985ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::VisitCXXUnresolvedConstructExpr(
1986ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko                                        const CXXUnresolvedConstructExpr *E) {
19877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  EnqueueChildren(E);
19887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddTypeLoc(E->getTypeSourceInfo());
19897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
1990ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::VisitCXXUuidofExpr(const CXXUuidofExpr *E) {
19917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  EnqueueChildren(E);
19927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (E->isTypeOperand())
19937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    AddTypeLoc(E->getTypeOperandSourceInfo());
19947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
19957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
1996ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::VisitCXXCatchStmt(const CXXCatchStmt *S) {
19977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  EnqueueChildren(S);
19987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddDecl(S->getExceptionDecl());
19997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
20007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
2001ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::VisitDeclRefExpr(const DeclRefExpr *DR) {
20027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (DR->hasExplicitTemplateArgs()) {
20037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    AddExplicitTemplateArgs(&DR->getExplicitTemplateArgs());
20047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
20057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  WL.push_back(DeclRefExprParts(DR, Parent));
20067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
2007ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::VisitDependentScopeDeclRefExpr(
2008ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko                                        const DependentScopeDeclRefExpr *E) {
20097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddExplicitTemplateArgs(E->getOptionalExplicitTemplateArgs());
20107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddDeclarationNameInfo(E);
20117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddNestedNameSpecifierLoc(E->getQualifierLoc());
20127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
2013ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::VisitDeclStmt(const DeclStmt *S) {
20147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  unsigned size = WL.size();
20157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  bool isFirst = true;
2016ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  for (DeclStmt::const_decl_iterator D = S->decl_begin(), DEnd = S->decl_end();
20177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei       D != DEnd; ++D) {
20187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    AddDecl(*D, isFirst);
20197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    isFirst = false;
20207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
20217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (size == WL.size())
20227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return;
20237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Now reverse the entries we just added.  This will match the DFS
20247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // ordering performed by the worklist.
20257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  VisitorWorkList::iterator I = WL.begin() + size, E = WL.end();
20267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  std::reverse(I, E);
20277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
2028ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::VisitDesignatedInitExpr(const DesignatedInitExpr *E) {
20297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddStmt(E->getInit());
20307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  typedef DesignatedInitExpr::Designator Designator;
2031ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  for (DesignatedInitExpr::const_reverse_designators_iterator
20327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei         D = E->designators_rbegin(), DEnd = E->designators_rend();
20337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei         D != DEnd; ++D) {
20347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (D->isFieldDesignator()) {
20357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (FieldDecl *Field = D->getField())
20367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        AddMemberRef(Field, D->getFieldLoc());
20377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      continue;
20387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
20397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (D->isArrayDesignator()) {
20407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      AddStmt(E->getArrayIndex(*D));
20417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      continue;
20427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
20437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    assert(D->isArrayRangeDesignator() && "Unknown designator kind");
20447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    AddStmt(E->getArrayRangeEnd(*D));
20457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    AddStmt(E->getArrayRangeStart(*D));
20467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
20477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
2048ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::VisitExplicitCastExpr(const ExplicitCastExpr *E) {
20497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  EnqueueChildren(E);
20507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddTypeLoc(E->getTypeInfoAsWritten());
20517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
2052ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::VisitForStmt(const ForStmt *FS) {
20537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddStmt(FS->getBody());
20547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddStmt(FS->getInc());
20557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddStmt(FS->getCond());
20567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddDecl(FS->getConditionVariable());
20577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddStmt(FS->getInit());
20587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
2059ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::VisitGotoStmt(const GotoStmt *GS) {
20607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  WL.push_back(LabelRefVisit(GS->getLabel(), GS->getLabelLoc(), Parent));
20617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
2062ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::VisitIfStmt(const IfStmt *If) {
20637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddStmt(If->getElse());
20647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddStmt(If->getThen());
20657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddStmt(If->getCond());
20667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddDecl(If->getConditionVariable());
20677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
2068ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::VisitInitListExpr(const InitListExpr *IE) {
20697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // We care about the syntactic form of the initializer list, only.
20707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (InitListExpr *Syntactic = IE->getSyntacticForm())
20717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    IE = Syntactic;
20727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  EnqueueChildren(IE);
20737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
2074ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::VisitMemberExpr(const MemberExpr *M) {
20757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  WL.push_back(MemberExprParts(M, Parent));
20767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
20777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // If the base of the member access expression is an implicit 'this', don't
20787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // visit it.
20797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // FIXME: If we ever want to show these implicit accesses, this will be
20807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // unfortunate. However, clang_getCursor() relies on this behavior.
20817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!M->isImplicitAccess())
20827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    AddStmt(M->getBase());
20837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
2084ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::VisitObjCEncodeExpr(const ObjCEncodeExpr *E) {
20857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddTypeLoc(E->getEncodedTypeSourceInfo());
20867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
2087ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::VisitObjCMessageExpr(const ObjCMessageExpr *M) {
20887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  EnqueueChildren(M);
20897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddTypeLoc(M->getClassReceiverTypeInfo());
20907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
2091ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::VisitOffsetOfExpr(const OffsetOfExpr *E) {
20927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Visit the components of the offsetof expression.
20937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  for (unsigned N = E->getNumComponents(), I = N; I > 0; --I) {
20947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    typedef OffsetOfExpr::OffsetOfNode OffsetOfNode;
20957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    const OffsetOfNode &Node = E->getComponent(I-1);
20967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    switch (Node.getKind()) {
20977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case OffsetOfNode::Array:
20987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      AddStmt(E->getIndexExpr(Node.getArrayExprIndex()));
20997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      break;
21007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case OffsetOfNode::Field:
21017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      AddMemberRef(Node.getField(), Node.getSourceRange().getEnd());
21027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      break;
21037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case OffsetOfNode::Identifier:
21047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case OffsetOfNode::Base:
21057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      continue;
21067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
21077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
21087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Visit the type into which we're computing the offset.
21097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddTypeLoc(E->getTypeSourceInfo());
21107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
2111ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::VisitOverloadExpr(const OverloadExpr *E) {
21127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddExplicitTemplateArgs(E->getOptionalExplicitTemplateArgs());
21137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  WL.push_back(OverloadExprParts(E, Parent));
21147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
21157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid EnqueueVisitor::VisitUnaryExprOrTypeTraitExpr(
2116ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko                                        const UnaryExprOrTypeTraitExpr *E) {
21177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  EnqueueChildren(E);
21187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (E->isArgumentType())
21197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    AddTypeLoc(E->getArgumentTypeInfo());
21207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
2121ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::VisitStmt(const Stmt *S) {
21227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  EnqueueChildren(S);
21237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
2124ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::VisitSwitchStmt(const SwitchStmt *S) {
21257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddStmt(S->getBody());
21267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddStmt(S->getCond());
21277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddDecl(S->getConditionVariable());
21287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
21297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
2130ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::VisitWhileStmt(const WhileStmt *W) {
21317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddStmt(W->getBody());
21327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddStmt(W->getCond());
21337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddDecl(W->getConditionVariable());
21347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
21357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
2136ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::VisitUnaryTypeTraitExpr(const UnaryTypeTraitExpr *E) {
21377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddTypeLoc(E->getQueriedTypeSourceInfo());
21387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
21397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
2140ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::VisitBinaryTypeTraitExpr(const BinaryTypeTraitExpr *E) {
21417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddTypeLoc(E->getRhsTypeSourceInfo());
21427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddTypeLoc(E->getLhsTypeSourceInfo());
21437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
21447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
2145ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::VisitTypeTraitExpr(const TypeTraitExpr *E) {
21467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  for (unsigned I = E->getNumArgs(); I > 0; --I)
21477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    AddTypeLoc(E->getArg(I-1));
21487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
21497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
2150ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::VisitArrayTypeTraitExpr(const ArrayTypeTraitExpr *E) {
21517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddTypeLoc(E->getQueriedTypeSourceInfo());
21527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
21537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
2154ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::VisitExpressionTraitExpr(const ExpressionTraitExpr *E) {
21557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  EnqueueChildren(E);
21567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
21577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
2158ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::VisitUnresolvedMemberExpr(const UnresolvedMemberExpr *U) {
21597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  VisitOverloadExpr(U);
21607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!U->isImplicitAccess())
21617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    AddStmt(U->getBase());
21627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
2163ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::VisitVAArgExpr(const VAArgExpr *E) {
21647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddStmt(E->getSubExpr());
21657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddTypeLoc(E->getWrittenTypeInfo());
21667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
2167ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::VisitSizeOfPackExpr(const SizeOfPackExpr *E) {
21687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  WL.push_back(SizeOfPackExprParts(E, Parent));
21697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
2170ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::VisitOpaqueValueExpr(const OpaqueValueExpr *E) {
21717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // If the opaque value has a source expression, just transparently
21727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // visit that.  This is useful for (e.g.) pseudo-object expressions.
21737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (Expr *SourceExpr = E->getSourceExpr())
21747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return Visit(SourceExpr);
21757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
2176ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::VisitLambdaExpr(const LambdaExpr *E) {
21777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddStmt(E->getBody());
21787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  WL.push_back(LambdaExprParts(E, Parent));
21797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
2180ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::VisitPseudoObjectExpr(const PseudoObjectExpr *E) {
21817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Treat the expression like its syntactic form.
21827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  Visit(E->getSyntacticForm());
21837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
21847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
2185ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid CursorVisitor::EnqueueWorkList(VisitorWorkList &WL, const Stmt *S) {
21867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  EnqueueVisitor(WL, MakeCXCursor(S, StmtParent, TU,RegionOfInterest)).Visit(S);
21877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
21887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
21897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::IsInRegionOfInterest(CXCursor C) {
21907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (RegionOfInterest.isValid()) {
21917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    SourceRange Range = getRawCursorExtent(C);
21927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (Range.isInvalid() || CompareRegionOfInterest(Range))
21937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return false;
21947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
21957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return true;
21967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
21977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
21987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::RunVisitorWorkList(VisitorWorkList &WL) {
21997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  while (!WL.empty()) {
22007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // Dequeue the worklist item.
22017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    VisitorJob LI = WL.back();
22027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    WL.pop_back();
22037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
22047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // Set the Parent field, then back to its old value once we're done.
22057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    SetParentRAII SetParent(Parent, StmtParent, LI.getParent());
22067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
22077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    switch (LI.getKind()) {
22087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      case VisitorJob::DeclVisitKind: {
2209ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko        const Decl *D = cast<DeclVisit>(&LI)->get();
22107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        if (!D)
22117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          continue;
22127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
22137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        // For now, perform default visitation for Decls.
22147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        if (Visit(MakeCXCursor(D, TU, RegionOfInterest,
22157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                               cast<DeclVisit>(&LI)->isFirst())))
22167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            return true;
22177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
22187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        continue;
22197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      }
22207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      case VisitorJob::ExplicitTemplateArgsVisitKind: {
22217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        const ASTTemplateArgumentListInfo *ArgList =
22227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          cast<ExplicitTemplateArgsVisit>(&LI)->get();
22237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        for (const TemplateArgumentLoc *Arg = ArgList->getTemplateArgs(),
22247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei               *ArgEnd = Arg + ArgList->NumTemplateArgs;
22257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei               Arg != ArgEnd; ++Arg) {
22267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          if (VisitTemplateArgumentLoc(*Arg))
22277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            return true;
22287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        }
22297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        continue;
22307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      }
22317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      case VisitorJob::TypeLocVisitKind: {
22327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        // Perform default visitation for TypeLocs.
22337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        if (Visit(cast<TypeLocVisit>(&LI)->get()))
22347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          return true;
22357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        continue;
22367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      }
22377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      case VisitorJob::LabelRefVisitKind: {
2238ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko        const LabelDecl *LS = cast<LabelRefVisit>(&LI)->get();
22397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        if (LabelStmt *stmt = LS->getStmt()) {
22407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          if (Visit(MakeCursorLabelRef(stmt, cast<LabelRefVisit>(&LI)->getLoc(),
22417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                       TU))) {
22427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            return true;
22437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          }
22447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        }
22457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        continue;
22467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      }
22477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
22487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      case VisitorJob::NestedNameSpecifierLocVisitKind: {
22497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        NestedNameSpecifierLocVisit *V = cast<NestedNameSpecifierLocVisit>(&LI);
22507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        if (VisitNestedNameSpecifierLoc(V->get()))
22517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          return true;
22527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        continue;
22537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      }
22547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
22557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      case VisitorJob::DeclarationNameInfoVisitKind: {
22567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        if (VisitDeclarationNameInfo(cast<DeclarationNameInfoVisit>(&LI)
22577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                     ->get()))
22587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          return true;
22597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        continue;
22607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      }
22617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      case VisitorJob::MemberRefVisitKind: {
22627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        MemberRefVisit *V = cast<MemberRefVisit>(&LI);
22637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        if (Visit(MakeCursorMemberRef(V->get(), V->getLoc(), TU)))
22647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          return true;
22657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        continue;
22667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      }
22677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      case VisitorJob::StmtVisitKind: {
2268ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko        const Stmt *S = cast<StmtVisit>(&LI)->get();
22697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        if (!S)
22707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          continue;
22717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
22727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        // Update the current cursor.
22737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        CXCursor Cursor = MakeCXCursor(S, StmtParent, TU, RegionOfInterest);
22747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        if (!IsInRegionOfInterest(Cursor))
22757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          continue;
22767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        switch (Visitor(Cursor, Parent, ClientData)) {
22777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          case CXChildVisit_Break: return true;
22787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          case CXChildVisit_Continue: break;
22797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          case CXChildVisit_Recurse:
22807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            if (PostChildrenVisitor)
22817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei              WL.push_back(PostChildrenVisit(0, Cursor));
22827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            EnqueueWorkList(WL, S);
22837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            break;
22847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        }
22857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        continue;
22867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      }
22877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      case VisitorJob::MemberExprPartsKind: {
22887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        // Handle the other pieces in the MemberExpr besides the base.
2289ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko        const MemberExpr *M = cast<MemberExprParts>(&LI)->get();
22907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
22917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        // Visit the nested-name-specifier
22927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        if (NestedNameSpecifierLoc QualifierLoc = M->getQualifierLoc())
22937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          if (VisitNestedNameSpecifierLoc(QualifierLoc))
22947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            return true;
22957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
22967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        // Visit the declaration name.
22977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        if (VisitDeclarationNameInfo(M->getMemberNameInfo()))
22987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          return true;
22997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
23007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        // Visit the explicitly-specified template arguments, if any.
23017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        if (M->hasExplicitTemplateArgs()) {
23027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          for (const TemplateArgumentLoc *Arg = M->getTemplateArgs(),
23037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei               *ArgEnd = Arg + M->getNumTemplateArgs();
23047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei               Arg != ArgEnd; ++Arg) {
23057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            if (VisitTemplateArgumentLoc(*Arg))
23067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei              return true;
23077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          }
23087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        }
23097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        continue;
23107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      }
23117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      case VisitorJob::DeclRefExprPartsKind: {
2312ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko        const DeclRefExpr *DR = cast<DeclRefExprParts>(&LI)->get();
23137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        // Visit nested-name-specifier, if present.
23147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        if (NestedNameSpecifierLoc QualifierLoc = DR->getQualifierLoc())
23157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          if (VisitNestedNameSpecifierLoc(QualifierLoc))
23167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            return true;
23177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        // Visit declaration name.
23187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        if (VisitDeclarationNameInfo(DR->getNameInfo()))
23197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          return true;
23207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        continue;
23217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      }
23227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      case VisitorJob::OverloadExprPartsKind: {
2323ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko        const OverloadExpr *O = cast<OverloadExprParts>(&LI)->get();
23247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        // Visit the nested-name-specifier.
23257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        if (NestedNameSpecifierLoc QualifierLoc = O->getQualifierLoc())
23267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          if (VisitNestedNameSpecifierLoc(QualifierLoc))
23277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            return true;
23287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        // Visit the declaration name.
23297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        if (VisitDeclarationNameInfo(O->getNameInfo()))
23307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          return true;
23317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        // Visit the overloaded declaration reference.
23327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        if (Visit(MakeCursorOverloadedDeclRef(O, TU)))
23337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          return true;
23347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        continue;
23357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      }
23367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      case VisitorJob::SizeOfPackExprPartsKind: {
2337ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko        const SizeOfPackExpr *E = cast<SizeOfPackExprParts>(&LI)->get();
23387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        NamedDecl *Pack = E->getPack();
23397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        if (isa<TemplateTypeParmDecl>(Pack)) {
23407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          if (Visit(MakeCursorTypeRef(cast<TemplateTypeParmDecl>(Pack),
23417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                      E->getPackLoc(), TU)))
23427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            return true;
23437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
23447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          continue;
23457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        }
23467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
23477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        if (isa<TemplateTemplateParmDecl>(Pack)) {
23487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          if (Visit(MakeCursorTemplateRef(cast<TemplateTemplateParmDecl>(Pack),
23497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                          E->getPackLoc(), TU)))
23507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            return true;
23517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
23527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          continue;
23537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        }
23547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
23557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        // Non-type template parameter packs and function parameter packs are
23567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        // treated like DeclRefExpr cursors.
23577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        continue;
23587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      }
23597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
23607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      case VisitorJob::LambdaExprPartsKind: {
23617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        // Visit captures.
2362ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko        const LambdaExpr *E = cast<LambdaExprParts>(&LI)->get();
23637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        for (LambdaExpr::capture_iterator C = E->explicit_capture_begin(),
23647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                       CEnd = E->explicit_capture_end();
23657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei             C != CEnd; ++C) {
23667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          if (C->capturesThis())
23677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            continue;
23687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
23697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          if (Visit(MakeCursorVariableRef(C->getCapturedVar(),
23707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                          C->getLocation(),
23717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                          TU)))
23727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            return true;
23737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        }
23747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
23757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        // Visit parameters and return type, if present.
23767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        if (E->hasExplicitParameters() || E->hasExplicitResultType()) {
23777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          TypeLoc TL = E->getCallOperator()->getTypeSourceInfo()->getTypeLoc();
23787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          if (E->hasExplicitParameters() && E->hasExplicitResultType()) {
23797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            // Visit the whole type.
23807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            if (Visit(TL))
23817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei              return true;
238239e6ab4be93d9c5e729a578ddd9d415cd2d49872David Blaikie          } else if (FunctionProtoTypeLoc Proto =
238339e6ab4be93d9c5e729a578ddd9d415cd2d49872David Blaikie                         TL.getAs<FunctionProtoTypeLoc>()) {
23847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            if (E->hasExplicitParameters()) {
23857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei              // Visit parameters.
23867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei              for (unsigned I = 0, N = Proto.getNumArgs(); I != N; ++I)
23877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                if (Visit(MakeCXCursor(Proto.getArg(I), TU)))
23887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                  return true;
23897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            } else {
23907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei              // Visit result type.
23917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei              if (Visit(Proto.getResultLoc()))
23927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                return true;
23937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            }
23947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          }
23957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        }
23967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        break;
23977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      }
23987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
23997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      case VisitorJob::PostChildrenVisitKind:
24007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        if (PostChildrenVisitor(Parent, ClientData))
24017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          return true;
24027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        break;
24037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
24047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
24057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return false;
24067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
24077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
2408ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkobool CursorVisitor::Visit(const Stmt *S) {
24097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  VisitorWorkList *WL = 0;
24107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!WorkListFreeList.empty()) {
24117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    WL = WorkListFreeList.back();
24127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    WL->clear();
24137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    WorkListFreeList.pop_back();
24147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
24157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  else {
24167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    WL = new VisitorWorkList();
24177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    WorkListCache.push_back(WL);
24187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
24197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  EnqueueWorkList(*WL, S);
24207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  bool result = RunVisitorWorkList(*WL);
24217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  WorkListFreeList.push_back(WL);
24227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return result;
24237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
24247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
24257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeinamespace {
2426cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenkotypedef SmallVector<SourceRange, 4> RefNamePieces;
24277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiRefNamePieces buildPieces(unsigned NameFlags, bool IsMemberRefExpr,
24287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                          const DeclarationNameInfo &NI,
24297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                          const SourceRange &QLoc,
24307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                          const ASTTemplateArgumentListInfo *TemplateArgs = 0){
24317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  const bool WantQualifier = NameFlags & CXNameRange_WantQualifier;
24327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  const bool WantTemplateArgs = NameFlags & CXNameRange_WantTemplateArgs;
24337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  const bool WantSinglePiece = NameFlags & CXNameRange_WantSinglePiece;
24347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
24357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  const DeclarationName::NameKind Kind = NI.getName().getNameKind();
24367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
24377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  RefNamePieces Pieces;
24387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
24397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (WantQualifier && QLoc.isValid())
24407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    Pieces.push_back(QLoc);
24417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
24427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (Kind != DeclarationName::CXXOperatorName || IsMemberRefExpr)
24437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    Pieces.push_back(NI.getLoc());
24447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
24457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (WantTemplateArgs && TemplateArgs)
24467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    Pieces.push_back(SourceRange(TemplateArgs->LAngleLoc,
24477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                 TemplateArgs->RAngleLoc));
24487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
24497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (Kind == DeclarationName::CXXOperatorName) {
24507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    Pieces.push_back(SourceLocation::getFromRawEncoding(
24517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                       NI.getInfo().CXXOperatorName.BeginOpNameLoc));
24527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    Pieces.push_back(SourceLocation::getFromRawEncoding(
24537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                       NI.getInfo().CXXOperatorName.EndOpNameLoc));
24547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
24557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
24567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (WantSinglePiece) {
24577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    SourceRange R(Pieces.front().getBegin(), Pieces.back().getEnd());
24587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    Pieces.clear();
24597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    Pieces.push_back(R);
24607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
24617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
24627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return Pieces;
24637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
24647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
24657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
24667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----------------------------------------------------------------------===//
24677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// Misc. API hooks.
24687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----------------------------------------------------------------------===//
24697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
24707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic llvm::sys::Mutex EnableMultithreadingMutex;
24717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic bool EnabledMultithreading;
24727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
24739083628fec737679eb95abe8e2e5e23717a96e18Chad Rosierstatic void fatal_error_handler(void *user_data, const std::string& reason,
24749083628fec737679eb95abe8e2e5e23717a96e18Chad Rosier                                bool gen_crash_diag) {
24757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Write the result out to stderr avoiding errs() because raw_ostreams can
24767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // call report_fatal_error.
24777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  fprintf(stderr, "LIBCLANG FATAL ERROR: %s\n", reason.c_str());
24787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  ::abort();
24797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
24807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
24817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiextern "C" {
24827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXIndex clang_createIndex(int excludeDeclarationsFromPCH,
24837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                          int displayDiagnostics) {
24847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Disable pretty stack trace functionality, which will otherwise be a very
24857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // poor citizen of the world and set up all sorts of signal handlers.
24867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  llvm::DisablePrettyStackTrace = true;
24877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
24887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // We use crash recovery to make some of our APIs more reliable, implicitly
24897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // enable it.
24907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  llvm::CrashRecoveryContext::Enable();
24917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
24927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Enable support for multithreading in LLVM.
24937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  {
24947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    llvm::sys::ScopedLock L(EnableMultithreadingMutex);
24957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (!EnabledMultithreading) {
24967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      llvm::install_fatal_error_handler(fatal_error_handler, 0);
24977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      llvm::llvm_start_multithreaded();
24987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      EnabledMultithreading = true;
24997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
25007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
25017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
25027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  CIndexer *CIdxr = new CIndexer();
25037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (excludeDeclarationsFromPCH)
25047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    CIdxr->setOnlyLocalDecls();
25057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (displayDiagnostics)
25067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    CIdxr->setDisplayDiagnostics();
25077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
25087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (getenv("LIBCLANG_BGPRIO_INDEX"))
25097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    CIdxr->setCXGlobalOptFlags(CIdxr->getCXGlobalOptFlags() |
25107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                               CXGlobalOpt_ThreadBackgroundPriorityForIndexing);
25117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (getenv("LIBCLANG_BGPRIO_EDIT"))
25127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    CIdxr->setCXGlobalOptFlags(CIdxr->getCXGlobalOptFlags() |
25137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                               CXGlobalOpt_ThreadBackgroundPriorityForEditing);
25147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
25157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return CIdxr;
25167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
25177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
25187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid clang_disposeIndex(CXIndex CIdx) {
25197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (CIdx)
25207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    delete static_cast<CIndexer *>(CIdx);
25217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
25227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
25237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid clang_CXIndex_setGlobalOptions(CXIndex CIdx, unsigned options) {
25247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (CIdx)
25257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    static_cast<CIndexer *>(CIdx)->setCXGlobalOptFlags(options);
25267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
25277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
25287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiunsigned clang_CXIndex_getGlobalOptions(CXIndex CIdx) {
25297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (CIdx)
25307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return static_cast<CIndexer *>(CIdx)->getCXGlobalOptFlags();
25317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return 0;
25327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
25337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
25347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid clang_toggleCrashRecovery(unsigned isEnabled) {
25357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (isEnabled)
25367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    llvm::CrashRecoveryContext::Enable();
25377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  else
25387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    llvm::CrashRecoveryContext::Disable();
25397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
25407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
25417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXTranslationUnit clang_createTranslationUnit(CXIndex CIdx,
25427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                              const char *ast_filename) {
25437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!CIdx)
25447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return 0;
25457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
25467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  CIndexer *CXXIdx = static_cast<CIndexer *>(CIdx);
25477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  FileSystemOptions FileSystemOpts;
25487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
25497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  IntrusiveRefCntPtr<DiagnosticsEngine> Diags;
25507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  ASTUnit *TU = ASTUnit::LoadFromASTFile(ast_filename, Diags, FileSystemOpts,
25517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                  CXXIdx->getOnlyLocalDecls(),
25527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                  0, 0,
25537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                  /*CaptureDiagnostics=*/true,
25547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                  /*AllowPCHWithCompilerErrors=*/true,
25557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                  /*UserFilesAreVolatile=*/true);
25567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return MakeCXTranslationUnit(CXXIdx, TU);
25577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
25587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
25597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiunsigned clang_defaultEditingTranslationUnitOptions() {
25607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return CXTranslationUnit_PrecompiledPreamble |
25617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei         CXTranslationUnit_CacheCompletionResults;
25627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
25637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
25647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXTranslationUnit
25657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiclang_createTranslationUnitFromSourceFile(CXIndex CIdx,
25667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                          const char *source_filename,
25677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                          int num_command_line_args,
25687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                          const char * const *command_line_args,
25697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                          unsigned num_unsaved_files,
25707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                          struct CXUnsavedFile *unsaved_files) {
25717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  unsigned Options = CXTranslationUnit_DetailedPreprocessingRecord;
25727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return clang_parseTranslationUnit(CIdx, source_filename,
25737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                    command_line_args, num_command_line_args,
25747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                    unsaved_files, num_unsaved_files,
25757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                    Options);
25767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
25777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
25787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistruct ParseTranslationUnitInfo {
25797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  CXIndex CIdx;
25807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  const char *source_filename;
25817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  const char *const *command_line_args;
25827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  int num_command_line_args;
25837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  struct CXUnsavedFile *unsaved_files;
25847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  unsigned num_unsaved_files;
25857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  unsigned options;
25867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  CXTranslationUnit result;
25877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei};
25887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic void clang_parseTranslationUnit_Impl(void *UserData) {
25897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  ParseTranslationUnitInfo *PTUI =
25907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    static_cast<ParseTranslationUnitInfo*>(UserData);
25917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  CXIndex CIdx = PTUI->CIdx;
25927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  const char *source_filename = PTUI->source_filename;
25937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  const char * const *command_line_args = PTUI->command_line_args;
25947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  int num_command_line_args = PTUI->num_command_line_args;
25957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  struct CXUnsavedFile *unsaved_files = PTUI->unsaved_files;
25967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  unsigned num_unsaved_files = PTUI->num_unsaved_files;
25977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  unsigned options = PTUI->options;
25987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  PTUI->result = 0;
25997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
26007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!CIdx)
26017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return;
26027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
26037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  CIndexer *CXXIdx = static_cast<CIndexer *>(CIdx);
26047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
26057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (CXXIdx->isOptEnabled(CXGlobalOpt_ThreadBackgroundPriorityForIndexing))
26067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    setThreadBackgroundPriority();
26077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
26087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  bool PrecompilePreamble = options & CXTranslationUnit_PrecompiledPreamble;
26097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // FIXME: Add a flag for modules.
26107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  TranslationUnitKind TUKind
26117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    = (options & CXTranslationUnit_Incomplete)? TU_Prefix : TU_Complete;
26127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  bool CacheCodeCompetionResults
26137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    = options & CXTranslationUnit_CacheCompletionResults;
26147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  bool IncludeBriefCommentsInCodeCompletion
26157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    = options & CXTranslationUnit_IncludeBriefCommentsInCodeCompletion;
26167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  bool SkipFunctionBodies = options & CXTranslationUnit_SkipFunctionBodies;
26177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  bool ForSerialization = options & CXTranslationUnit_ForSerialization;
26187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
26197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Configure the diagnostics.
26207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  IntrusiveRefCntPtr<DiagnosticsEngine>
2621d47afb96a3f988e6d21a92fe4dfe875ab227c7c0Sean Silva    Diags(CompilerInstance::createDiagnostics(new DiagnosticOptions));
26227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
26237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Recover resources if we crash before exiting this function.
26247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  llvm::CrashRecoveryContextCleanupRegistrar<DiagnosticsEngine,
26257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    llvm::CrashRecoveryContextReleaseRefCleanup<DiagnosticsEngine> >
26267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    DiagCleanup(Diags.getPtr());
26277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
26287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  OwningPtr<std::vector<ASTUnit::RemappedFile> >
26297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    RemappedFiles(new std::vector<ASTUnit::RemappedFile>());
26307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
26317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Recover resources if we crash before exiting this function.
26327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  llvm::CrashRecoveryContextCleanupRegistrar<
26337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    std::vector<ASTUnit::RemappedFile> > RemappedCleanup(RemappedFiles.get());
26347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
26357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  for (unsigned I = 0; I != num_unsaved_files; ++I) {
26367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    StringRef Data(unsaved_files[I].Contents, unsaved_files[I].Length);
26377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    const llvm::MemoryBuffer *Buffer
26387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      = llvm::MemoryBuffer::getMemBufferCopy(Data, unsaved_files[I].Filename);
26397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    RemappedFiles->push_back(std::make_pair(unsaved_files[I].Filename,
26407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                            Buffer));
26417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
26427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
26437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  OwningPtr<std::vector<const char *> >
26447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    Args(new std::vector<const char*>());
26457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
26467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Recover resources if we crash before exiting this method.
26477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  llvm::CrashRecoveryContextCleanupRegistrar<std::vector<const char*> >
26487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    ArgsCleanup(Args.get());
26497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
26507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Since the Clang C library is primarily used by batch tools dealing with
26517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // (often very broken) source code, where spell-checking can have a
26527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // significant negative impact on performance (particularly when
26537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // precompiled headers are involved), we disable it by default.
26547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Only do this if we haven't found a spell-checking-related argument.
26557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  bool FoundSpellCheckingArgument = false;
26567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  for (int I = 0; I != num_command_line_args; ++I) {
26577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (strcmp(command_line_args[I], "-fno-spell-checking") == 0 ||
26587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        strcmp(command_line_args[I], "-fspell-checking") == 0) {
26597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      FoundSpellCheckingArgument = true;
26607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      break;
26617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
26627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
26637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!FoundSpellCheckingArgument)
26647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    Args->push_back("-fno-spell-checking");
26657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
26667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  Args->insert(Args->end(), command_line_args,
26677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei               command_line_args + num_command_line_args);
26687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
26697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // The 'source_filename' argument is optional.  If the caller does not
26707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // specify it then it is assumed that the source file is specified
26717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // in the actual argument list.
26727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Put the source file after command_line_args otherwise if '-x' flag is
26737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // present it will be unused.
26747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (source_filename)
26757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    Args->push_back(source_filename);
26767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
26777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Do we need the detailed preprocessing record?
26787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (options & CXTranslationUnit_DetailedPreprocessingRecord) {
26797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    Args->push_back("-Xclang");
26807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    Args->push_back("-detailed-preprocessing-record");
26817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
26827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
26837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  unsigned NumErrors = Diags->getClient()->getNumErrors();
26847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  OwningPtr<ASTUnit> ErrUnit;
26857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  OwningPtr<ASTUnit> Unit(
26867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    ASTUnit::LoadFromCommandLine(Args->size() ? &(*Args)[0] : 0
26877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                 /* vector::data() not portable */,
26887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                 Args->size() ? (&(*Args)[0] + Args->size()) :0,
26897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                 Diags,
26907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                 CXXIdx->getClangResourcesPath(),
26917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                 CXXIdx->getOnlyLocalDecls(),
26927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                 /*CaptureDiagnostics=*/true,
26937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                 RemappedFiles->size() ? &(*RemappedFiles)[0]:0,
26947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                 RemappedFiles->size(),
26957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                 /*RemappedFilesKeepOriginalName=*/true,
26967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                 PrecompilePreamble,
26977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                 TUKind,
26987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                 CacheCodeCompetionResults,
26997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                 IncludeBriefCommentsInCodeCompletion,
27007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                 /*AllowPCHWithCompilerErrors=*/true,
27017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                 SkipFunctionBodies,
27027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                 /*UserFilesAreVolatile=*/true,
27037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                 ForSerialization,
27047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                 &ErrUnit));
27057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
27067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (NumErrors != Diags->getClient()->getNumErrors()) {
27077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // Make sure to check that 'Unit' is non-NULL.
27087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (CXXIdx->getDisplayDiagnostics())
27097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      printDiagsToStderr(Unit ? Unit.get() : ErrUnit.get());
27107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
27117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
27127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  PTUI->result = MakeCXTranslationUnit(CXXIdx, Unit.take());
27137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
27147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXTranslationUnit clang_parseTranslationUnit(CXIndex CIdx,
27157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                             const char *source_filename,
27167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                         const char * const *command_line_args,
27177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                             int num_command_line_args,
27187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                            struct CXUnsavedFile *unsaved_files,
27197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                             unsigned num_unsaved_files,
27207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                             unsigned options) {
2721c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  LOG_FUNC_SECTION {
2722c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis    *Log << source_filename << ": ";
2723c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis    for (int i = 0; i != num_command_line_args; ++i)
2724c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis      *Log << command_line_args[i] << " ";
2725c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  }
2726c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis
27277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  ParseTranslationUnitInfo PTUI = { CIdx, source_filename, command_line_args,
27287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                    num_command_line_args, unsaved_files,
27297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                    num_unsaved_files, options, 0 };
27307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  llvm::CrashRecoveryContext CRC;
27317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
27327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!RunSafely(CRC, clang_parseTranslationUnit_Impl, &PTUI)) {
27337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    fprintf(stderr, "libclang: crash detected during parsing: {\n");
27347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    fprintf(stderr, "  'source_filename' : '%s'\n", source_filename);
27357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    fprintf(stderr, "  'command_line_args' : [");
27367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    for (int i = 0; i != num_command_line_args; ++i) {
27377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (i)
27387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        fprintf(stderr, ", ");
27397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      fprintf(stderr, "'%s'", command_line_args[i]);
27407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
27417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    fprintf(stderr, "],\n");
27427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    fprintf(stderr, "  'unsaved_files' : [");
27437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    for (unsigned i = 0; i != num_unsaved_files; ++i) {
27447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (i)
27457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        fprintf(stderr, ", ");
27467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      fprintf(stderr, "('%s', '...', %ld)", unsaved_files[i].Filename,
27477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei              unsaved_files[i].Length);
27487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
27497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    fprintf(stderr, "],\n");
27507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    fprintf(stderr, "  'options' : %d,\n", options);
27517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    fprintf(stderr, "}\n");
27527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
27537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return 0;
27547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  } else if (getenv("LIBCLANG_RESOURCE_USAGE")) {
27557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    PrintLibclangResourceUsage(PTUI.result);
27567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
27577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
27587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return PTUI.result;
27597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
27607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
27617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiunsigned clang_defaultSaveOptions(CXTranslationUnit TU) {
27627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return CXSaveTranslationUnit_None;
27637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
27647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
27657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeinamespace {
27667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
27677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistruct SaveTranslationUnitInfo {
27687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  CXTranslationUnit TU;
27697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  const char *FileName;
27707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  unsigned options;
27717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  CXSaveError result;
27727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei};
27737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
27747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
27757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
27767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic void clang_saveTranslationUnit_Impl(void *UserData) {
27777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  SaveTranslationUnitInfo *STUI =
27787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    static_cast<SaveTranslationUnitInfo*>(UserData);
27797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
27808c718e7d87018919b5b84b0d545fe477b2d532d1Dmitri Gribenko  CIndexer *CXXIdx = STUI->TU->CIdx;
27817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (CXXIdx->isOptEnabled(CXGlobalOpt_ThreadBackgroundPriorityForIndexing))
27827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    setThreadBackgroundPriority();
27837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
27845694feb5ccd6eb862cb600b55753cecc13794471Dmitri Gribenko  bool hadError = cxtu::getASTUnit(STUI->TU)->Save(STUI->FileName);
27857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  STUI->result = hadError ? CXSaveError_Unknown : CXSaveError_None;
27867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
27877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
27887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiint clang_saveTranslationUnit(CXTranslationUnit TU, const char *FileName,
27897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                              unsigned options) {
2790c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  LOG_FUNC_SECTION {
2791c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis    *Log << TU << ' ' << FileName;
2792c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  }
2793c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis
27947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!TU)
27957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return CXSaveError_InvalidTU;
27967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
27975694feb5ccd6eb862cb600b55753cecc13794471Dmitri Gribenko  ASTUnit *CXXUnit = cxtu::getASTUnit(TU);
27987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  ASTUnit::ConcurrencyCheck Check(*CXXUnit);
27997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!CXXUnit->hasSema())
28007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return CXSaveError_InvalidTU;
28017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
28027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  SaveTranslationUnitInfo STUI = { TU, FileName, options, CXSaveError_None };
28037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
28047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!CXXUnit->getDiagnostics().hasUnrecoverableErrorOccurred() ||
28057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      getenv("LIBCLANG_NOTHREADS")) {
28067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    clang_saveTranslationUnit_Impl(&STUI);
28077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
28087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (getenv("LIBCLANG_RESOURCE_USAGE"))
28097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      PrintLibclangResourceUsage(TU);
28107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
28117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return STUI.result;
28127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
28137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
28147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // We have an AST that has invalid nodes due to compiler errors.
28157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Use a crash recovery thread for protection.
28167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
28177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  llvm::CrashRecoveryContext CRC;
28187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
28197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!RunSafely(CRC, clang_saveTranslationUnit_Impl, &STUI)) {
28207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    fprintf(stderr, "libclang: crash detected during AST saving: {\n");
28217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    fprintf(stderr, "  'filename' : '%s'\n", FileName);
28227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    fprintf(stderr, "  'options' : %d,\n", options);
28237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    fprintf(stderr, "}\n");
28247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
28257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return CXSaveError_Unknown;
28267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
28277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  } else if (getenv("LIBCLANG_RESOURCE_USAGE")) {
28287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    PrintLibclangResourceUsage(TU);
28297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
28307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
28317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return STUI.result;
28327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
28337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
28347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid clang_disposeTranslationUnit(CXTranslationUnit CTUnit) {
28357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (CTUnit) {
28367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // If the translation unit has been marked as unsafe to free, just discard
28377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // it.
28385694feb5ccd6eb862cb600b55753cecc13794471Dmitri Gribenko    if (cxtu::getASTUnit(CTUnit)->isUnsafeToFree())
28397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return;
28407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
28415694feb5ccd6eb862cb600b55753cecc13794471Dmitri Gribenko    delete cxtu::getASTUnit(CTUnit);
28429c48d16a11872624410ab3a5944edcba0f32818cDmitri Gribenko    delete CTUnit->StringPool;
28437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    delete static_cast<CXDiagnosticSetImpl *>(CTUnit->Diagnostics);
28447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    disposeOverridenCXCursorsPool(CTUnit->OverridenCursorsPool);
2845337ee24785a784ba5418c2e78716d15b94fd57f0Dmitri Gribenko    delete CTUnit->FormatContext;
28467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    delete CTUnit;
28477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
28487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
28497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
28507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiunsigned clang_defaultReparseOptions(CXTranslationUnit TU) {
28517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return CXReparse_None;
28527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
28537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
28547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistruct ReparseTranslationUnitInfo {
28557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  CXTranslationUnit TU;
28567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  unsigned num_unsaved_files;
28577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  struct CXUnsavedFile *unsaved_files;
28587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  unsigned options;
28597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  int result;
28607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei};
28617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
28627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic void clang_reparseTranslationUnit_Impl(void *UserData) {
28637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  ReparseTranslationUnitInfo *RTUI =
28647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    static_cast<ReparseTranslationUnitInfo*>(UserData);
28657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  CXTranslationUnit TU = RTUI->TU;
2866d7bf4a4e9c100fb5fe098b0e1870d61891c09dd3Argyrios Kyrtzidis  if (!TU)
2867d7bf4a4e9c100fb5fe098b0e1870d61891c09dd3Argyrios Kyrtzidis    return;
28687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
28697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Reset the associated diagnostics.
28707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  delete static_cast<CXDiagnosticSetImpl*>(TU->Diagnostics);
28717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  TU->Diagnostics = 0;
28727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
28737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  unsigned num_unsaved_files = RTUI->num_unsaved_files;
28747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  struct CXUnsavedFile *unsaved_files = RTUI->unsaved_files;
28757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  unsigned options = RTUI->options;
28767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  (void) options;
28777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  RTUI->result = 1;
28787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
28798c718e7d87018919b5b84b0d545fe477b2d532d1Dmitri Gribenko  CIndexer *CXXIdx = TU->CIdx;
28807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (CXXIdx->isOptEnabled(CXGlobalOpt_ThreadBackgroundPriorityForEditing))
28817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    setThreadBackgroundPriority();
28827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
28835694feb5ccd6eb862cb600b55753cecc13794471Dmitri Gribenko  ASTUnit *CXXUnit = cxtu::getASTUnit(TU);
28847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  ASTUnit::ConcurrencyCheck Check(*CXXUnit);
28857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
28867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  OwningPtr<std::vector<ASTUnit::RemappedFile> >
28877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    RemappedFiles(new std::vector<ASTUnit::RemappedFile>());
28887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
28897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Recover resources if we crash before exiting this function.
28907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  llvm::CrashRecoveryContextCleanupRegistrar<
28917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    std::vector<ASTUnit::RemappedFile> > RemappedCleanup(RemappedFiles.get());
28927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
28937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  for (unsigned I = 0; I != num_unsaved_files; ++I) {
28947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    StringRef Data(unsaved_files[I].Contents, unsaved_files[I].Length);
28957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    const llvm::MemoryBuffer *Buffer
28967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      = llvm::MemoryBuffer::getMemBufferCopy(Data, unsaved_files[I].Filename);
28977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    RemappedFiles->push_back(std::make_pair(unsaved_files[I].Filename,
28987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                            Buffer));
28997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
29007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
29017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!CXXUnit->Reparse(RemappedFiles->size() ? &(*RemappedFiles)[0] : 0,
29027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                        RemappedFiles->size()))
29037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    RTUI->result = 0;
29047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
29057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
29067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiint clang_reparseTranslationUnit(CXTranslationUnit TU,
29077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                 unsigned num_unsaved_files,
29087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                 struct CXUnsavedFile *unsaved_files,
29097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                 unsigned options) {
2910c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  LOG_FUNC_SECTION {
2911c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis    *Log << TU;
2912c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  }
2913c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis
29147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  ReparseTranslationUnitInfo RTUI = { TU, num_unsaved_files, unsaved_files,
29157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                      options, 0 };
29167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
29177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (getenv("LIBCLANG_NOTHREADS")) {
29187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    clang_reparseTranslationUnit_Impl(&RTUI);
29197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return RTUI.result;
29207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
29217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
29227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  llvm::CrashRecoveryContext CRC;
29237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
29247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!RunSafely(CRC, clang_reparseTranslationUnit_Impl, &RTUI)) {
29257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    fprintf(stderr, "libclang: crash detected during reparsing\n");
29265694feb5ccd6eb862cb600b55753cecc13794471Dmitri Gribenko    cxtu::getASTUnit(TU)->setUnsafeToFree(true);
29277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return 1;
29287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  } else if (getenv("LIBCLANG_RESOURCE_USAGE"))
29297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    PrintLibclangResourceUsage(TU);
29307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
29317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return RTUI.result;
29327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
29337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
29347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
29357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXString clang_getTranslationUnitSpelling(CXTranslationUnit CTUnit) {
29367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!CTUnit)
2937dc66adb40ee871b4c578ba615f45d82476c7119eDmitri Gribenko    return cxstring::createEmpty();
29387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
29395694feb5ccd6eb862cb600b55753cecc13794471Dmitri Gribenko  ASTUnit *CXXUnit = cxtu::getASTUnit(CTUnit);
29405595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko  return cxstring::createDup(CXXUnit->getOriginalSourceFileName());
29417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
29427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
29437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXCursor clang_getTranslationUnitCursor(CXTranslationUnit TU) {
29440b602836c63e702b2ba893e8439996b226fc248fArgyrios Kyrtzidis  if (!TU)
29450b602836c63e702b2ba893e8439996b226fc248fArgyrios Kyrtzidis    return clang_getNullCursor();
29460b602836c63e702b2ba893e8439996b226fc248fArgyrios Kyrtzidis
29475694feb5ccd6eb862cb600b55753cecc13794471Dmitri Gribenko  ASTUnit *CXXUnit = cxtu::getASTUnit(TU);
29487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return MakeCXCursor(CXXUnit->getASTContext().getTranslationUnitDecl(), TU);
29497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
29507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
29517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} // end: extern "C"
29527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
29537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----------------------------------------------------------------------===//
29547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// CXFile Operations.
29557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----------------------------------------------------------------------===//
29567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
29577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiextern "C" {
29587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXString clang_getFileName(CXFile SFile) {
29597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!SFile)
2960dad4c1a9ac4ef1aa591ac2ef20dc4c30d96f9f2aDmitri Gribenko    return cxstring::createNull();
29617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
29627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  FileEntry *FEnt = static_cast<FileEntry *>(SFile);
29630c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko  return cxstring::createRef(FEnt->getName());
29647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
29657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
29667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeitime_t clang_getFileTime(CXFile SFile) {
29677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!SFile)
29687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return 0;
29697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
29707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  FileEntry *FEnt = static_cast<FileEntry *>(SFile);
29717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return FEnt->getModificationTime();
29727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
29737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
29745694feb5ccd6eb862cb600b55753cecc13794471Dmitri GribenkoCXFile clang_getFile(CXTranslationUnit TU, const char *file_name) {
29755694feb5ccd6eb862cb600b55753cecc13794471Dmitri Gribenko  if (!TU)
29767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return 0;
29777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
29785694feb5ccd6eb862cb600b55753cecc13794471Dmitri Gribenko  ASTUnit *CXXUnit = cxtu::getASTUnit(TU);
29797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
29807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  FileManager &FMgr = CXXUnit->getFileManager();
29817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return const_cast<FileEntry *>(FMgr.getFile(file_name));
29827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
29837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
29845694feb5ccd6eb862cb600b55753cecc13794471Dmitri Gribenkounsigned clang_isFileMultipleIncludeGuarded(CXTranslationUnit TU, CXFile file) {
29855694feb5ccd6eb862cb600b55753cecc13794471Dmitri Gribenko  if (!TU || !file)
29867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return 0;
29877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
29885694feb5ccd6eb862cb600b55753cecc13794471Dmitri Gribenko  ASTUnit *CXXUnit = cxtu::getASTUnit(TU);
29897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  FileEntry *FEnt = static_cast<FileEntry *>(file);
29907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return CXXUnit->getPreprocessor().getHeaderSearchInfo()
29917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                          .isFileMultipleIncludeGuarded(FEnt);
29927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
29937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
2994db84e7a44dce24c3a8e4e0fc84434c00fc2da168Argyrios Kyrtzidisint clang_getFileUniqueID(CXFile file, CXFileUniqueID *outID) {
2995db84e7a44dce24c3a8e4e0fc84434c00fc2da168Argyrios Kyrtzidis  if (!file || !outID)
2996db84e7a44dce24c3a8e4e0fc84434c00fc2da168Argyrios Kyrtzidis    return 1;
2997db84e7a44dce24c3a8e4e0fc84434c00fc2da168Argyrios Kyrtzidis
2998db84e7a44dce24c3a8e4e0fc84434c00fc2da168Argyrios Kyrtzidis#ifdef LLVM_ON_WIN32
2999db84e7a44dce24c3a8e4e0fc84434c00fc2da168Argyrios Kyrtzidis  return 1; // inodes not supported on windows.
3000db84e7a44dce24c3a8e4e0fc84434c00fc2da168Argyrios Kyrtzidis#else
3001db84e7a44dce24c3a8e4e0fc84434c00fc2da168Argyrios Kyrtzidis  FileEntry *FEnt = static_cast<FileEntry *>(file);
3002db84e7a44dce24c3a8e4e0fc84434c00fc2da168Argyrios Kyrtzidis  outID->data[0] = FEnt->getDevice();
3003db84e7a44dce24c3a8e4e0fc84434c00fc2da168Argyrios Kyrtzidis  outID->data[1] = FEnt->getInode();
3004db84e7a44dce24c3a8e4e0fc84434c00fc2da168Argyrios Kyrtzidis  outID->data[2] = FEnt->getModificationTime();
3005db84e7a44dce24c3a8e4e0fc84434c00fc2da168Argyrios Kyrtzidis  return 0;
3006db84e7a44dce24c3a8e4e0fc84434c00fc2da168Argyrios Kyrtzidis#endif
3007db84e7a44dce24c3a8e4e0fc84434c00fc2da168Argyrios Kyrtzidis}
3008db84e7a44dce24c3a8e4e0fc84434c00fc2da168Argyrios Kyrtzidis
30097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} // end: extern "C"
30107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
30117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----------------------------------------------------------------------===//
30127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// CXCursor Operations.
30137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----------------------------------------------------------------------===//
30147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3015e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenkostatic const Decl *getDeclFromExpr(const Stmt *E) {
3016e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko  if (const ImplicitCastExpr *CE = dyn_cast<ImplicitCastExpr>(E))
30177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return getDeclFromExpr(CE->getSubExpr());
30187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3019e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko  if (const DeclRefExpr *RefExpr = dyn_cast<DeclRefExpr>(E))
30207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return RefExpr->getDecl();
3021e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko  if (const MemberExpr *ME = dyn_cast<MemberExpr>(E))
30227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return ME->getMemberDecl();
3023e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko  if (const ObjCIvarRefExpr *RE = dyn_cast<ObjCIvarRefExpr>(E))
30247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return RE->getDecl();
3025e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko  if (const ObjCPropertyRefExpr *PRE = dyn_cast<ObjCPropertyRefExpr>(E)) {
30267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (PRE->isExplicitProperty())
30277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return PRE->getExplicitProperty();
30287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // It could be messaging both getter and setter as in:
30297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // ++myobj.myprop;
30307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // in which case prefer to associate the setter since it is less obvious
30317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // from inspecting the source that the setter is going to get called.
30327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (PRE->isMessagingSetter())
30337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return PRE->getImplicitPropertySetter();
30347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return PRE->getImplicitPropertyGetter();
30357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
3036e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko  if (const PseudoObjectExpr *POE = dyn_cast<PseudoObjectExpr>(E))
30377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return getDeclFromExpr(POE->getSyntacticForm());
3038e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko  if (const OpaqueValueExpr *OVE = dyn_cast<OpaqueValueExpr>(E))
30397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (Expr *Src = OVE->getSourceExpr())
30407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return getDeclFromExpr(Src);
30417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3042e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko  if (const CallExpr *CE = dyn_cast<CallExpr>(E))
30437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return getDeclFromExpr(CE->getCallee());
3044e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko  if (const CXXConstructExpr *CE = dyn_cast<CXXConstructExpr>(E))
30457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (!CE->isElidable())
30467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return CE->getConstructor();
3047e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko  if (const ObjCMessageExpr *OME = dyn_cast<ObjCMessageExpr>(E))
30487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return OME->getMethodDecl();
30497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3050e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko  if (const ObjCProtocolExpr *PE = dyn_cast<ObjCProtocolExpr>(E))
30517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return PE->getProtocol();
3052e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko  if (const SubstNonTypeTemplateParmPackExpr *NTTP
30537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                              = dyn_cast<SubstNonTypeTemplateParmPackExpr>(E))
30547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return NTTP->getParameterPack();
3055e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko  if (const SizeOfPackExpr *SizeOfPack = dyn_cast<SizeOfPackExpr>(E))
30567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (isa<NonTypeTemplateParmDecl>(SizeOfPack->getPack()) ||
30577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        isa<ParmVarDecl>(SizeOfPack->getPack()))
30587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return SizeOfPack->getPack();
30597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
30607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return 0;
30617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
30627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3063ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkostatic SourceLocation getLocationFromExpr(const Expr *E) {
3064ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  if (const ImplicitCastExpr *CE = dyn_cast<ImplicitCastExpr>(E))
30657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return getLocationFromExpr(CE->getSubExpr());
30667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3067ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  if (const ObjCMessageExpr *Msg = dyn_cast<ObjCMessageExpr>(E))
30687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return /*FIXME:*/Msg->getLeftLoc();
3069ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E))
30707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return DRE->getLocation();
3071ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  if (const MemberExpr *Member = dyn_cast<MemberExpr>(E))
30727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return Member->getMemberLoc();
3073ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  if (const ObjCIvarRefExpr *Ivar = dyn_cast<ObjCIvarRefExpr>(E))
30747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return Ivar->getLocation();
3075ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  if (const SizeOfPackExpr *SizeOfPack = dyn_cast<SizeOfPackExpr>(E))
30767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return SizeOfPack->getPackLoc();
3077ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  if (const ObjCPropertyRefExpr *PropRef = dyn_cast<ObjCPropertyRefExpr>(E))
30787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return PropRef->getLocation();
30797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
30807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return E->getLocStart();
30817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
30827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
30837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiextern "C" {
30847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
30857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiunsigned clang_visitChildren(CXCursor parent,
30867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                             CXCursorVisitor visitor,
30877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                             CXClientData client_data) {
30887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  CursorVisitor CursorVis(getCursorTU(parent), visitor, client_data,
30897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                          /*VisitPreprocessorLast=*/false);
30907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return CursorVis.VisitChildren(parent);
30917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
30927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
30937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#ifndef __has_feature
30947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define __has_feature(x) 0
30957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#endif
30967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#if __has_feature(blocks)
30977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeitypedef enum CXChildVisitResult
30987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei     (^CXCursorVisitorBlock)(CXCursor cursor, CXCursor parent);
30997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
31007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic enum CXChildVisitResult visitWithBlock(CXCursor cursor, CXCursor parent,
31017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    CXClientData client_data) {
31027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  CXCursorVisitorBlock block = (CXCursorVisitorBlock)client_data;
31037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return block(cursor, parent);
31047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
31057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#else
31067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// If we are compiled with a compiler that doesn't have native blocks support,
31077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// define and call the block manually, so the
31087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeitypedef struct _CXChildVisitResult
31097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei{
31107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei	void *isa;
31117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei	int flags;
31127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei	int reserved;
31137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei	enum CXChildVisitResult(*invoke)(struct _CXChildVisitResult*, CXCursor,
31147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                         CXCursor);
31157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} *CXCursorVisitorBlock;
31167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
31177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic enum CXChildVisitResult visitWithBlock(CXCursor cursor, CXCursor parent,
31187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    CXClientData client_data) {
31197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  CXCursorVisitorBlock block = (CXCursorVisitorBlock)client_data;
31207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return block->invoke(block, cursor, parent);
31217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
31227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#endif
31237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
31247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
31257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiunsigned clang_visitChildrenWithBlock(CXCursor parent,
31267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                      CXCursorVisitorBlock block) {
31277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return clang_visitChildren(parent, visitWithBlock, block);
31287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
31297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3130e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenkostatic CXString getDeclSpelling(const Decl *D) {
31317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!D)
3132dc66adb40ee871b4c578ba615f45d82476c7119eDmitri Gribenko    return cxstring::createEmpty();
31337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3134e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko  const NamedDecl *ND = dyn_cast<NamedDecl>(D);
31357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!ND) {
3136e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko    if (const ObjCPropertyImplDecl *PropImpl =
3137e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko            dyn_cast<ObjCPropertyImplDecl>(D))
31387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (ObjCPropertyDecl *Property = PropImpl->getPropertyDecl())
31395595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko        return cxstring::createDup(Property->getIdentifier()->getName());
31407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3141e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko    if (const ImportDecl *ImportD = dyn_cast<ImportDecl>(D))
31427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (Module *Mod = ImportD->getImportedModule())
31435595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko        return cxstring::createDup(Mod->getFullModuleName());
31447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3145dc66adb40ee871b4c578ba615f45d82476c7119eDmitri Gribenko    return cxstring::createEmpty();
31467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
31477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3148e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko  if (const ObjCMethodDecl *OMD = dyn_cast<ObjCMethodDecl>(ND))
31495595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko    return cxstring::createDup(OMD->getSelector().getAsString());
31507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3151e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko  if (const ObjCCategoryImplDecl *CIMP = dyn_cast<ObjCCategoryImplDecl>(ND))
31527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // No, this isn't the same as the code below. getIdentifier() is non-virtual
31537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // and returns different names. NamedDecl returns the class name and
31547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // ObjCCategoryImplDecl returns the category name.
31550c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko    return cxstring::createRef(CIMP->getIdentifier()->getNameStart());
31567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
31577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (isa<UsingDirectiveDecl>(D))
3158dc66adb40ee871b4c578ba615f45d82476c7119eDmitri Gribenko    return cxstring::createEmpty();
31597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
31607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  SmallString<1024> S;
31617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  llvm::raw_svector_ostream os(S);
31627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  ND->printName(os);
31637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
31645595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko  return cxstring::createDup(os.str());
31657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
31667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
31677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXString clang_getCursorSpelling(CXCursor C) {
31687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (clang_isTranslationUnit(C.kind))
316946f92523918fd4ac4df5489265c7f85c1b28baeaDmitri Gribenko    return clang_getTranslationUnitSpelling(getCursorTU(C));
31707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
31717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (clang_isReference(C.kind)) {
31727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    switch (C.kind) {
31737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_ObjCSuperClassRef: {
317467812b2f94f4b5e7d2596db1705ffa1149ddc45aDmitri Gribenko      const ObjCInterfaceDecl *Super = getCursorObjCSuperClassRef(C).first;
31750c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef(Super->getIdentifier()->getNameStart());
31767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
31777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_ObjCClassRef: {
317867812b2f94f4b5e7d2596db1705ffa1149ddc45aDmitri Gribenko      const ObjCInterfaceDecl *Class = getCursorObjCClassRef(C).first;
31790c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef(Class->getIdentifier()->getNameStart());
31807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
31817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_ObjCProtocolRef: {
318267812b2f94f4b5e7d2596db1705ffa1149ddc45aDmitri Gribenko      const ObjCProtocolDecl *OID = getCursorObjCProtocolRef(C).first;
31837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      assert(OID && "getCursorSpelling(): Missing protocol decl");
31840c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef(OID->getIdentifier()->getNameStart());
31857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
31867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_CXXBaseSpecifier: {
318767812b2f94f4b5e7d2596db1705ffa1149ddc45aDmitri Gribenko      const CXXBaseSpecifier *B = getCursorCXXBaseSpecifier(C);
31885595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko      return cxstring::createDup(B->getType().getAsString());
31897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
31907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_TypeRef: {
319167812b2f94f4b5e7d2596db1705ffa1149ddc45aDmitri Gribenko      const TypeDecl *Type = getCursorTypeRef(C).first;
31927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      assert(Type && "Missing type decl");
31937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
31945595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko      return cxstring::createDup(getCursorContext(C).getTypeDeclType(Type).
31957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                              getAsString());
31967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
31977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_TemplateRef: {
319867812b2f94f4b5e7d2596db1705ffa1149ddc45aDmitri Gribenko      const TemplateDecl *Template = getCursorTemplateRef(C).first;
31997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      assert(Template && "Missing template decl");
32007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
32015595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko      return cxstring::createDup(Template->getNameAsString());
32027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
32037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
32047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_NamespaceRef: {
320567812b2f94f4b5e7d2596db1705ffa1149ddc45aDmitri Gribenko      const NamedDecl *NS = getCursorNamespaceRef(C).first;
32067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      assert(NS && "Missing namespace decl");
32077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
32085595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko      return cxstring::createDup(NS->getNameAsString());
32097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
32107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
32117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_MemberRef: {
321267812b2f94f4b5e7d2596db1705ffa1149ddc45aDmitri Gribenko      const FieldDecl *Field = getCursorMemberRef(C).first;
32137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      assert(Field && "Missing member decl");
32147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
32155595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko      return cxstring::createDup(Field->getNameAsString());
32167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
32177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
32187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_LabelRef: {
321967812b2f94f4b5e7d2596db1705ffa1149ddc45aDmitri Gribenko      const LabelStmt *Label = getCursorLabelRef(C).first;
32207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      assert(Label && "Missing label");
32217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
32220c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef(Label->getName());
32237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
32247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
32257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_OverloadedDeclRef: {
32267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      OverloadedDeclRefStorage Storage = getCursorOverloadedDeclRef(C).first;
3227e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko      if (const Decl *D = Storage.dyn_cast<const Decl *>()) {
3228e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko        if (const NamedDecl *ND = dyn_cast<NamedDecl>(D))
32295595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko          return cxstring::createDup(ND->getNameAsString());
3230dc66adb40ee871b4c578ba615f45d82476c7119eDmitri Gribenko        return cxstring::createEmpty();
32317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      }
3232e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko      if (const OverloadExpr *E = Storage.dyn_cast<const OverloadExpr *>())
32335595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko        return cxstring::createDup(E->getName().getAsString());
32347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      OverloadedTemplateStorage *Ovl
32357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        = Storage.get<OverloadedTemplateStorage*>();
32367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (Ovl->size() == 0)
3237dc66adb40ee871b4c578ba615f45d82476c7119eDmitri Gribenko        return cxstring::createEmpty();
32385595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko      return cxstring::createDup((*Ovl->begin())->getNameAsString());
32397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
32407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
32417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_VariableRef: {
324267812b2f94f4b5e7d2596db1705ffa1149ddc45aDmitri Gribenko      const VarDecl *Var = getCursorVariableRef(C).first;
32437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      assert(Var && "Missing variable decl");
32447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
32455595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko      return cxstring::createDup(Var->getNameAsString());
32467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
32477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
32487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    default:
32490c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("<not implemented>");
32507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
32517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
32527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
32537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (clang_isExpression(C.kind)) {
3254e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko    const Decl *D = getDeclFromExpr(getCursorExpr(C));
32557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (D)
32567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return getDeclSpelling(D);
3257dc66adb40ee871b4c578ba615f45d82476c7119eDmitri Gribenko    return cxstring::createEmpty();
32587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
32597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
32607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (clang_isStatement(C.kind)) {
3261ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko    const Stmt *S = getCursorStmt(C);
3262ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko    if (const LabelStmt *Label = dyn_cast_or_null<LabelStmt>(S))
32630c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef(Label->getName());
32647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3265dc66adb40ee871b4c578ba615f45d82476c7119eDmitri Gribenko    return cxstring::createEmpty();
32667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
32677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
32687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (C.kind == CXCursor_MacroExpansion)
32690c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko    return cxstring::createRef(getCursorMacroExpansion(C).getName()
32707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                                           ->getNameStart());
32717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
32727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (C.kind == CXCursor_MacroDefinition)
32730c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko    return cxstring::createRef(getCursorMacroDefinition(C)->getName()
32747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                                           ->getNameStart());
32757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
32767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (C.kind == CXCursor_InclusionDirective)
32775595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko    return cxstring::createDup(getCursorInclusionDirective(C)->getFileName());
32787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
32797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (clang_isDeclaration(C.kind))
32807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return getDeclSpelling(getCursorDecl(C));
32817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
32827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (C.kind == CXCursor_AnnotateAttr) {
32837d91438047450869d7b881e1c63868c4b52a3cc2Dmitri Gribenko    const AnnotateAttr *AA = cast<AnnotateAttr>(cxcursor::getCursorAttr(C));
32845595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko    return cxstring::createDup(AA->getAnnotation());
32857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
32867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
32877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (C.kind == CXCursor_AsmLabelAttr) {
32887d91438047450869d7b881e1c63868c4b52a3cc2Dmitri Gribenko    const AsmLabelAttr *AA = cast<AsmLabelAttr>(cxcursor::getCursorAttr(C));
32895595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko    return cxstring::createDup(AA->getLabel());
32907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
32917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3292dc66adb40ee871b4c578ba615f45d82476c7119eDmitri Gribenko  return cxstring::createEmpty();
32937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
32947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
32957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXSourceRange clang_Cursor_getSpellingNameRange(CXCursor C,
32967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                                unsigned pieceIndex,
32977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                                unsigned options) {
32987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (clang_Cursor_isNull(C))
32997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return clang_getNullRange();
33007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
33017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  ASTContext &Ctx = getCursorContext(C);
33027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
33037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (clang_isStatement(C.kind)) {
3304ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko    const Stmt *S = getCursorStmt(C);
3305ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko    if (const LabelStmt *Label = dyn_cast_or_null<LabelStmt>(S)) {
33067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (pieceIndex > 0)
33077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        return clang_getNullRange();
33087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return cxloc::translateSourceRange(Ctx, Label->getIdentLoc());
33097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
33107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
33117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return clang_getNullRange();
33127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
33137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
33147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (C.kind == CXCursor_ObjCMessageExpr) {
3315ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko    if (const ObjCMessageExpr *
33167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          ME = dyn_cast_or_null<ObjCMessageExpr>(getCursorExpr(C))) {
33177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (pieceIndex >= ME->getNumSelectorLocs())
33187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        return clang_getNullRange();
33197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return cxloc::translateSourceRange(Ctx, ME->getSelectorLoc(pieceIndex));
33207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
33217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
33227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
33237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (C.kind == CXCursor_ObjCInstanceMethodDecl ||
33247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      C.kind == CXCursor_ObjCClassMethodDecl) {
3325e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko    if (const ObjCMethodDecl *
33267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          MD = dyn_cast_or_null<ObjCMethodDecl>(getCursorDecl(C))) {
33277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (pieceIndex >= MD->getNumSelectorLocs())
33287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        return clang_getNullRange();
33297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return cxloc::translateSourceRange(Ctx, MD->getSelectorLoc(pieceIndex));
33307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
33317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
33327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
33337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (C.kind == CXCursor_ObjCCategoryDecl ||
33347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      C.kind == CXCursor_ObjCCategoryImplDecl) {
33357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (pieceIndex > 0)
33367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return clang_getNullRange();
3337e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko    if (const ObjCCategoryDecl *
33387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          CD = dyn_cast_or_null<ObjCCategoryDecl>(getCursorDecl(C)))
33397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return cxloc::translateSourceRange(Ctx, CD->getCategoryNameLoc());
3340e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko    if (const ObjCCategoryImplDecl *
33417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          CID = dyn_cast_or_null<ObjCCategoryImplDecl>(getCursorDecl(C)))
33427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return cxloc::translateSourceRange(Ctx, CID->getCategoryNameLoc());
33437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
33447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
33457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (C.kind == CXCursor_ModuleImportDecl) {
33467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (pieceIndex > 0)
33477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return clang_getNullRange();
3348e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko    if (const ImportDecl *ImportD =
3349e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko            dyn_cast_or_null<ImportDecl>(getCursorDecl(C))) {
33507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      ArrayRef<SourceLocation> Locs = ImportD->getIdentifierLocs();
33517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (!Locs.empty())
33527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        return cxloc::translateSourceRange(Ctx,
33537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                         SourceRange(Locs.front(), Locs.back()));
33547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
33557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return clang_getNullRange();
33567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
33577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
33587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // FIXME: A CXCursor_InclusionDirective should give the location of the
33597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // filename, but we don't keep track of this.
33607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
33617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // FIXME: A CXCursor_AnnotateAttr should give the location of the annotation
33627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // but we don't keep track of this.
33637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
33647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // FIXME: A CXCursor_AsmLabelAttr should give the location of the label
33657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // but we don't keep track of this.
33667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
33677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Default handling, give the location of the cursor.
33687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
33697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (pieceIndex > 0)
33707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return clang_getNullRange();
33717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
33727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  CXSourceLocation CXLoc = clang_getCursorLocation(C);
33737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  SourceLocation Loc = cxloc::translateSourceLocation(CXLoc);
33747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return cxloc::translateSourceRange(Ctx, Loc);
33757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
33767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
33777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXString clang_getCursorDisplayName(CXCursor C) {
33787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!clang_isDeclaration(C.kind))
33797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return clang_getCursorSpelling(C);
33807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3381e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko  const Decl *D = getCursorDecl(C);
33827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!D)
3383dc66adb40ee871b4c578ba615f45d82476c7119eDmitri Gribenko    return cxstring::createEmpty();
33847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
33857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  PrintingPolicy Policy = getCursorContext(C).getPrintingPolicy();
3386e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko  if (const FunctionTemplateDecl *FunTmpl = dyn_cast<FunctionTemplateDecl>(D))
33877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    D = FunTmpl->getTemplatedDecl();
33887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3389e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko  if (const FunctionDecl *Function = dyn_cast<FunctionDecl>(D)) {
33907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    SmallString<64> Str;
33917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    llvm::raw_svector_ostream OS(Str);
33927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    OS << *Function;
33937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (Function->getPrimaryTemplate())
33947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      OS << "<>";
33957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    OS << "(";
33967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    for (unsigned I = 0, N = Function->getNumParams(); I != N; ++I) {
33977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (I)
33987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        OS << ", ";
33997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      OS << Function->getParamDecl(I)->getType().getAsString(Policy);
34007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
34017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
34027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (Function->isVariadic()) {
34037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (Function->getNumParams())
34047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        OS << ", ";
34057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      OS << "...";
34067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
34077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    OS << ")";
34085595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko    return cxstring::createDup(OS.str());
34097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
34107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3411e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko  if (const ClassTemplateDecl *ClassTemplate = dyn_cast<ClassTemplateDecl>(D)) {
34127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    SmallString<64> Str;
34137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    llvm::raw_svector_ostream OS(Str);
34147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    OS << *ClassTemplate;
34157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    OS << "<";
34167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    TemplateParameterList *Params = ClassTemplate->getTemplateParameters();
34177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    for (unsigned I = 0, N = Params->size(); I != N; ++I) {
34187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (I)
34197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        OS << ", ";
34207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
34217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      NamedDecl *Param = Params->getParam(I);
34227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (Param->getIdentifier()) {
34237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        OS << Param->getIdentifier()->getName();
34247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        continue;
34257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      }
34267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
34277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // There is no parameter name, which makes this tricky. Try to come up
34287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // with something useful that isn't too long.
34297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(Param))
34307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        OS << (TTP->wasDeclaredWithTypename()? "typename" : "class");
34317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      else if (NonTypeTemplateParmDecl *NTTP
34327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                    = dyn_cast<NonTypeTemplateParmDecl>(Param))
34337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        OS << NTTP->getType().getAsString(Policy);
34347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      else
34357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        OS << "template<...> class";
34367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
34377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
34387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    OS << ">";
34395595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko    return cxstring::createDup(OS.str());
34407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
34417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3442e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko  if (const ClassTemplateSpecializationDecl *ClassSpec
34437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                              = dyn_cast<ClassTemplateSpecializationDecl>(D)) {
34447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // If the type was explicitly written, use that.
34457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (TypeSourceInfo *TSInfo = ClassSpec->getTypeAsWritten())
34465595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko      return cxstring::createDup(TSInfo->getType().getAsString(Policy));
34477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
34485eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer    SmallString<128> Str;
34497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    llvm::raw_svector_ostream OS(Str);
34507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    OS << *ClassSpec;
34515eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer    TemplateSpecializationType::PrintTemplateArgumentList(OS,
34527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                      ClassSpec->getTemplateArgs().data(),
34537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                      ClassSpec->getTemplateArgs().size(),
34547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                                                Policy);
34555595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko    return cxstring::createDup(OS.str());
34567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
34577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
34587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return clang_getCursorSpelling(C);
34597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
34607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
34617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXString clang_getCursorKindSpelling(enum CXCursorKind Kind) {
34627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  switch (Kind) {
34637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_FunctionDecl:
34640c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("FunctionDecl");
34657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_TypedefDecl:
34660c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("TypedefDecl");
34677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_EnumDecl:
34680c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("EnumDecl");
34697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_EnumConstantDecl:
34700c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("EnumConstantDecl");
34717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_StructDecl:
34720c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("StructDecl");
34737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_UnionDecl:
34740c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("UnionDecl");
34757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_ClassDecl:
34760c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("ClassDecl");
34777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_FieldDecl:
34780c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("FieldDecl");
34797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_VarDecl:
34800c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("VarDecl");
34817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_ParmDecl:
34820c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("ParmDecl");
34837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_ObjCInterfaceDecl:
34840c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("ObjCInterfaceDecl");
34857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_ObjCCategoryDecl:
34860c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("ObjCCategoryDecl");
34877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_ObjCProtocolDecl:
34880c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("ObjCProtocolDecl");
34897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_ObjCPropertyDecl:
34900c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("ObjCPropertyDecl");
34917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_ObjCIvarDecl:
34920c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("ObjCIvarDecl");
34937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_ObjCInstanceMethodDecl:
34940c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("ObjCInstanceMethodDecl");
34957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_ObjCClassMethodDecl:
34960c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("ObjCClassMethodDecl");
34977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_ObjCImplementationDecl:
34980c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("ObjCImplementationDecl");
34997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_ObjCCategoryImplDecl:
35000c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("ObjCCategoryImplDecl");
35017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_CXXMethod:
35020c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("CXXMethod");
35037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_UnexposedDecl:
35040c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("UnexposedDecl");
35057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_ObjCSuperClassRef:
35060c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("ObjCSuperClassRef");
35077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_ObjCProtocolRef:
35080c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("ObjCProtocolRef");
35097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_ObjCClassRef:
35100c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("ObjCClassRef");
35117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_TypeRef:
35120c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("TypeRef");
35137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_TemplateRef:
35140c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("TemplateRef");
35157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_NamespaceRef:
35160c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko    return cxstring::createRef("NamespaceRef");
35177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_MemberRef:
35180c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko    return cxstring::createRef("MemberRef");
35197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_LabelRef:
35200c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko    return cxstring::createRef("LabelRef");
35217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_OverloadedDeclRef:
35220c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko    return cxstring::createRef("OverloadedDeclRef");
35237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_VariableRef:
35240c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko    return cxstring::createRef("VariableRef");
35257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_IntegerLiteral:
35260c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("IntegerLiteral");
35277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_FloatingLiteral:
35280c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("FloatingLiteral");
35297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_ImaginaryLiteral:
35300c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("ImaginaryLiteral");
35317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_StringLiteral:
35320c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("StringLiteral");
35337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_CharacterLiteral:
35340c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("CharacterLiteral");
35357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_ParenExpr:
35360c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("ParenExpr");
35377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_UnaryOperator:
35380c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("UnaryOperator");
35397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_ArraySubscriptExpr:
35400c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("ArraySubscriptExpr");
35417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_BinaryOperator:
35420c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("BinaryOperator");
35437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_CompoundAssignOperator:
35440c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("CompoundAssignOperator");
35457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_ConditionalOperator:
35460c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("ConditionalOperator");
35477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_CStyleCastExpr:
35480c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("CStyleCastExpr");
35497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_CompoundLiteralExpr:
35500c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("CompoundLiteralExpr");
35517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_InitListExpr:
35520c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("InitListExpr");
35537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_AddrLabelExpr:
35540c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("AddrLabelExpr");
35557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_StmtExpr:
35560c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("StmtExpr");
35577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_GenericSelectionExpr:
35580c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("GenericSelectionExpr");
35597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_GNUNullExpr:
35600c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("GNUNullExpr");
35617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_CXXStaticCastExpr:
35620c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("CXXStaticCastExpr");
35637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_CXXDynamicCastExpr:
35640c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("CXXDynamicCastExpr");
35657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_CXXReinterpretCastExpr:
35660c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("CXXReinterpretCastExpr");
35677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_CXXConstCastExpr:
35680c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("CXXConstCastExpr");
35697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_CXXFunctionalCastExpr:
35700c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("CXXFunctionalCastExpr");
35717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_CXXTypeidExpr:
35720c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("CXXTypeidExpr");
35737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_CXXBoolLiteralExpr:
35740c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("CXXBoolLiteralExpr");
35757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_CXXNullPtrLiteralExpr:
35760c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("CXXNullPtrLiteralExpr");
35777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_CXXThisExpr:
35780c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("CXXThisExpr");
35797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_CXXThrowExpr:
35800c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("CXXThrowExpr");
35817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_CXXNewExpr:
35820c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("CXXNewExpr");
35837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_CXXDeleteExpr:
35840c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("CXXDeleteExpr");
35857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_UnaryExpr:
35860c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("UnaryExpr");
35877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_ObjCStringLiteral:
35880c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("ObjCStringLiteral");
35897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_ObjCBoolLiteralExpr:
35900c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("ObjCBoolLiteralExpr");
35917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_ObjCEncodeExpr:
35920c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("ObjCEncodeExpr");
35937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_ObjCSelectorExpr:
35940c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("ObjCSelectorExpr");
35957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_ObjCProtocolExpr:
35960c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("ObjCProtocolExpr");
35977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_ObjCBridgedCastExpr:
35980c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("ObjCBridgedCastExpr");
35997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_BlockExpr:
36000c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("BlockExpr");
36017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_PackExpansionExpr:
36020c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("PackExpansionExpr");
36037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_SizeOfPackExpr:
36040c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("SizeOfPackExpr");
36057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_LambdaExpr:
36060c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko    return cxstring::createRef("LambdaExpr");
36077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_UnexposedExpr:
36080c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("UnexposedExpr");
36097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_DeclRefExpr:
36100c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("DeclRefExpr");
36117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_MemberRefExpr:
36120c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("MemberRefExpr");
36137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_CallExpr:
36140c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("CallExpr");
36157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_ObjCMessageExpr:
36160c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("ObjCMessageExpr");
36177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_UnexposedStmt:
36180c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("UnexposedStmt");
36197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_DeclStmt:
36200c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("DeclStmt");
36217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_LabelStmt:
36220c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("LabelStmt");
36237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_CompoundStmt:
36240c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("CompoundStmt");
36257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_CaseStmt:
36260c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("CaseStmt");
36277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_DefaultStmt:
36280c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("DefaultStmt");
36297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_IfStmt:
36300c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("IfStmt");
36317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_SwitchStmt:
36320c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("SwitchStmt");
36337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_WhileStmt:
36340c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("WhileStmt");
36357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_DoStmt:
36360c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("DoStmt");
36377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_ForStmt:
36380c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("ForStmt");
36397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_GotoStmt:
36400c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("GotoStmt");
36417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_IndirectGotoStmt:
36420c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("IndirectGotoStmt");
36437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_ContinueStmt:
36440c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("ContinueStmt");
36457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_BreakStmt:
36460c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("BreakStmt");
36477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_ReturnStmt:
36480c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("ReturnStmt");
36497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_GCCAsmStmt:
36500c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("GCCAsmStmt");
36517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_MSAsmStmt:
36520c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("MSAsmStmt");
36537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_ObjCAtTryStmt:
36540c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("ObjCAtTryStmt");
36557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_ObjCAtCatchStmt:
36560c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("ObjCAtCatchStmt");
36577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_ObjCAtFinallyStmt:
36580c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("ObjCAtFinallyStmt");
36597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_ObjCAtThrowStmt:
36600c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("ObjCAtThrowStmt");
36617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_ObjCAtSynchronizedStmt:
36620c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("ObjCAtSynchronizedStmt");
36637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_ObjCAutoreleasePoolStmt:
36640c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("ObjCAutoreleasePoolStmt");
36657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_ObjCForCollectionStmt:
36660c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("ObjCForCollectionStmt");
36677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_CXXCatchStmt:
36680c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("CXXCatchStmt");
36697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_CXXTryStmt:
36700c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("CXXTryStmt");
36717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_CXXForRangeStmt:
36720c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("CXXForRangeStmt");
36737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_SEHTryStmt:
36740c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("SEHTryStmt");
36757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_SEHExceptStmt:
36760c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("SEHExceptStmt");
36777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_SEHFinallyStmt:
36780c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("SEHFinallyStmt");
36797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_NullStmt:
36800c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("NullStmt");
36817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_InvalidFile:
36820c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("InvalidFile");
36837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_InvalidCode:
36840c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko    return cxstring::createRef("InvalidCode");
36857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_NoDeclFound:
36860c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("NoDeclFound");
36877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_NotImplemented:
36880c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("NotImplemented");
36897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_TranslationUnit:
36900c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("TranslationUnit");
36917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_UnexposedAttr:
36920c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("UnexposedAttr");
36937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_IBActionAttr:
36940c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("attribute(ibaction)");
36957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_IBOutletAttr:
36960c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko     return cxstring::createRef("attribute(iboutlet)");
36977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_IBOutletCollectionAttr:
36980c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("attribute(iboutletcollection)");
36997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_CXXFinalAttr:
37000c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("attribute(final)");
37017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_CXXOverrideAttr:
37020c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("attribute(override)");
37037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_AnnotateAttr:
37040c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko    return cxstring::createRef("attribute(annotate)");
37057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_AsmLabelAttr:
37060c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko    return cxstring::createRef("asm label");
37077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_PreprocessingDirective:
37080c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko    return cxstring::createRef("preprocessing directive");
37097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_MacroDefinition:
37100c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko    return cxstring::createRef("macro definition");
37117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_MacroExpansion:
37120c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko    return cxstring::createRef("macro expansion");
37137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_InclusionDirective:
37140c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko    return cxstring::createRef("inclusion directive");
37157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_Namespace:
37160c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko    return cxstring::createRef("Namespace");
37177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_LinkageSpec:
37180c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko    return cxstring::createRef("LinkageSpec");
37197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_CXXBaseSpecifier:
37200c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko    return cxstring::createRef("C++ base class specifier");
37217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_Constructor:
37220c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko    return cxstring::createRef("CXXConstructor");
37237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_Destructor:
37240c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko    return cxstring::createRef("CXXDestructor");
37257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_ConversionFunction:
37260c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko    return cxstring::createRef("CXXConversion");
37277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_TemplateTypeParameter:
37280c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko    return cxstring::createRef("TemplateTypeParameter");
37297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_NonTypeTemplateParameter:
37300c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko    return cxstring::createRef("NonTypeTemplateParameter");
37317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_TemplateTemplateParameter:
37320c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko    return cxstring::createRef("TemplateTemplateParameter");
37337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_FunctionTemplate:
37340c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko    return cxstring::createRef("FunctionTemplate");
37357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_ClassTemplate:
37360c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko    return cxstring::createRef("ClassTemplate");
37377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_ClassTemplatePartialSpecialization:
37380c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko    return cxstring::createRef("ClassTemplatePartialSpecialization");
37397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_NamespaceAlias:
37400c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko    return cxstring::createRef("NamespaceAlias");
37417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_UsingDirective:
37420c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko    return cxstring::createRef("UsingDirective");
37437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_UsingDeclaration:
37440c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko    return cxstring::createRef("UsingDeclaration");
37457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_TypeAliasDecl:
37460c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko    return cxstring::createRef("TypeAliasDecl");
37477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_ObjCSynthesizeDecl:
37480c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko    return cxstring::createRef("ObjCSynthesizeDecl");
37497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_ObjCDynamicDecl:
37500c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko    return cxstring::createRef("ObjCDynamicDecl");
37517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_CXXAccessSpecifier:
37520c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko    return cxstring::createRef("CXXAccessSpecifier");
37537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_ModuleImportDecl:
37540c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko    return cxstring::createRef("ModuleImport");
37557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
37567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
37577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  llvm_unreachable("Unhandled CXCursorKind");
37587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
37597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
37607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistruct GetCursorData {
37617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  SourceLocation TokenBeginLoc;
37627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  bool PointsAtMacroArgExpansion;
37637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  bool VisitedObjCPropertyImplDecl;
37647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  SourceLocation VisitedDeclaratorDeclStartLoc;
37657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  CXCursor &BestCursor;
37667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
37677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  GetCursorData(SourceManager &SM,
37687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                SourceLocation tokenBegin, CXCursor &outputCursor)
37697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    : TokenBeginLoc(tokenBegin), BestCursor(outputCursor) {
37707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    PointsAtMacroArgExpansion = SM.isMacroArgExpansion(tokenBegin);
37717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    VisitedObjCPropertyImplDecl = false;
37727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
37737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei};
37747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
37757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic enum CXChildVisitResult GetCursorVisitor(CXCursor cursor,
37767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                                CXCursor parent,
37777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                                CXClientData client_data) {
37787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  GetCursorData *Data = static_cast<GetCursorData *>(client_data);
37797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  CXCursor *BestCursor = &Data->BestCursor;
37807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
37817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // If we point inside a macro argument we should provide info of what the
37827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // token is so use the actual cursor, don't replace it with a macro expansion
37837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // cursor.
37847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (cursor.kind == CXCursor_MacroExpansion && Data->PointsAtMacroArgExpansion)
37857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return CXChildVisit_Recurse;
37867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
37877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (clang_isDeclaration(cursor.kind)) {
37887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // Avoid having the implicit methods override the property decls.
3789e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko    if (const ObjCMethodDecl *MD
37907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          = dyn_cast_or_null<ObjCMethodDecl>(getCursorDecl(cursor))) {
37917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (MD->isImplicit())
37927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        return CXChildVisit_Break;
37937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3794e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko    } else if (const ObjCInterfaceDecl *ID
37957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                 = dyn_cast_or_null<ObjCInterfaceDecl>(getCursorDecl(cursor))) {
37967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // Check that when we have multiple @class references in the same line,
37977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // that later ones do not override the previous ones.
37987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // If we have:
37997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // @class Foo, Bar;
38007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // source ranges for both start at '@', so 'Bar' will end up overriding
38017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // 'Foo' even though the cursor location was at 'Foo'.
38027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (BestCursor->kind == CXCursor_ObjCInterfaceDecl ||
38037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          BestCursor->kind == CXCursor_ObjCClassRef)
3804e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko        if (const ObjCInterfaceDecl *PrevID
38057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei             = dyn_cast_or_null<ObjCInterfaceDecl>(getCursorDecl(*BestCursor))){
38067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei         if (PrevID != ID &&
38077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei             !PrevID->isThisDeclarationADefinition() &&
38087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei             !ID->isThisDeclarationADefinition())
38097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei           return CXChildVisit_Break;
38107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        }
38117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3812e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko    } else if (const DeclaratorDecl *DD
38137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                    = dyn_cast_or_null<DeclaratorDecl>(getCursorDecl(cursor))) {
38147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      SourceLocation StartLoc = DD->getSourceRange().getBegin();
38157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // Check that when we have multiple declarators in the same line,
38167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // that later ones do not override the previous ones.
38177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // If we have:
38187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // int Foo, Bar;
38197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // source ranges for both start at 'int', so 'Bar' will end up overriding
38207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // 'Foo' even though the cursor location was at 'Foo'.
38217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (Data->VisitedDeclaratorDeclStartLoc == StartLoc)
38227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        return CXChildVisit_Break;
38237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      Data->VisitedDeclaratorDeclStartLoc = StartLoc;
38247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3825e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko    } else if (const ObjCPropertyImplDecl *PropImp
38267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei              = dyn_cast_or_null<ObjCPropertyImplDecl>(getCursorDecl(cursor))) {
38277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      (void)PropImp;
38287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // Check that when we have multiple @synthesize in the same line,
38297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // that later ones do not override the previous ones.
38307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // If we have:
38317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // @synthesize Foo, Bar;
38327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // source ranges for both start at '@', so 'Bar' will end up overriding
38337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // 'Foo' even though the cursor location was at 'Foo'.
38347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (Data->VisitedObjCPropertyImplDecl)
38357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        return CXChildVisit_Break;
38367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      Data->VisitedObjCPropertyImplDecl = true;
38377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
38387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
38397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
38407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (clang_isExpression(cursor.kind) &&
38417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      clang_isDeclaration(BestCursor->kind)) {
3842e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko    if (const Decl *D = getCursorDecl(*BestCursor)) {
38437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // Avoid having the cursor of an expression replace the declaration cursor
38447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // when the expression source range overlaps the declaration range.
38457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // This can happen for C++ constructor expressions whose range generally
38467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // include the variable declaration, e.g.:
38477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      //  MyCXXClass foo; // Make sure pointing at 'foo' returns a VarDecl cursor.
38487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (D->getLocation().isValid() && Data->TokenBeginLoc.isValid() &&
38497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          D->getLocation() == Data->TokenBeginLoc)
38507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        return CXChildVisit_Break;
38517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
38527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
38537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
38547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // If our current best cursor is the construction of a temporary object,
38557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // don't replace that cursor with a type reference, because we want
38567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // clang_getCursor() to point at the constructor.
38577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (clang_isExpression(BestCursor->kind) &&
38587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      isa<CXXTemporaryObjectExpr>(getCursorExpr(*BestCursor)) &&
38597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      cursor.kind == CXCursor_TypeRef) {
38607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // Keep the cursor pointing at CXXTemporaryObjectExpr but also mark it
38617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // as having the actual point on the type reference.
38627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    *BestCursor = getTypeRefedCallExprCursor(*BestCursor);
38637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return CXChildVisit_Recurse;
38647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
38657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
38667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  *BestCursor = cursor;
38677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return CXChildVisit_Recurse;
38687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
38697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
38707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXCursor clang_getCursor(CXTranslationUnit TU, CXSourceLocation Loc) {
38717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!TU)
38727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return clang_getNullCursor();
38737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
38745694feb5ccd6eb862cb600b55753cecc13794471Dmitri Gribenko  ASTUnit *CXXUnit = cxtu::getASTUnit(TU);
38757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  ASTUnit::ConcurrencyCheck Check(*CXXUnit);
38767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
38777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  SourceLocation SLoc = cxloc::translateSourceLocation(Loc);
38787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  CXCursor Result = cxcursor::getCursor(TU, SLoc);
38797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3880c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  LOG_FUNC_SECTION {
38817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    CXFile SearchFile;
38827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    unsigned SearchLine, SearchColumn;
38837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    CXFile ResultFile;
38847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    unsigned ResultLine, ResultColumn;
38857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    CXString SearchFileName, ResultFileName, KindSpelling, USR;
38867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    const char *IsDef = clang_isCursorDefinition(Result)? " (Definition)" : "";
38877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    CXSourceLocation ResultLoc = clang_getCursorLocation(Result);
38887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3889c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis    clang_getFileLocation(Loc, &SearchFile, &SearchLine, &SearchColumn, 0);
3890c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis    clang_getFileLocation(ResultLoc, &ResultFile, &ResultLine,
38917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                               &ResultColumn, 0);
38927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    SearchFileName = clang_getFileName(SearchFile);
38937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    ResultFileName = clang_getFileName(ResultFile);
38947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    KindSpelling = clang_getCursorKindSpelling(Result.kind);
38957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    USR = clang_getCursorUSR(Result);
3896c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis    *Log << llvm::format("(%s:%d:%d) = %s",
3897c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis                   clang_getCString(SearchFileName), SearchLine, SearchColumn,
3898c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis                   clang_getCString(KindSpelling))
3899c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis        << llvm::format("(%s:%d:%d):%s%s",
3900c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis                     clang_getCString(ResultFileName), ResultLine, ResultColumn,
3901c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis                     clang_getCString(USR), IsDef);
39027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    clang_disposeString(SearchFileName);
39037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    clang_disposeString(ResultFileName);
39047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    clang_disposeString(KindSpelling);
39057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    clang_disposeString(USR);
39067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
39077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    CXCursor Definition = clang_getCursorDefinition(Result);
39087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (!clang_equalCursors(Definition, clang_getNullCursor())) {
39097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      CXSourceLocation DefinitionLoc = clang_getCursorLocation(Definition);
39107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      CXString DefinitionKindSpelling
39117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                = clang_getCursorKindSpelling(Definition.kind);
39127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      CXFile DefinitionFile;
39137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      unsigned DefinitionLine, DefinitionColumn;
3914c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis      clang_getFileLocation(DefinitionLoc, &DefinitionFile,
39157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                 &DefinitionLine, &DefinitionColumn, 0);
39167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      CXString DefinitionFileName = clang_getFileName(DefinitionFile);
3917c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis      *Log << llvm::format("  -> %s(%s:%d:%d)",
3918c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis                     clang_getCString(DefinitionKindSpelling),
3919c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis                     clang_getCString(DefinitionFileName),
3920c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis                     DefinitionLine, DefinitionColumn);
39217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      clang_disposeString(DefinitionFileName);
39227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      clang_disposeString(DefinitionKindSpelling);
39237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
39247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
39257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
39267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return Result;
39277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
39287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
39297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXCursor clang_getNullCursor(void) {
39307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return MakeCXCursorInvalid(CXCursor_InvalidFile);
39317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
39327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
39337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiunsigned clang_equalCursors(CXCursor X, CXCursor Y) {
3934d1d9df688baf384f1ca1220e51104c3b30d6a81aArgyrios Kyrtzidis  // Clear out the "FirstInDeclGroup" part in a declaration cursor, since we
3935d1d9df688baf384f1ca1220e51104c3b30d6a81aArgyrios Kyrtzidis  // can't set consistently. For example, when visiting a DeclStmt we will set
3936d1d9df688baf384f1ca1220e51104c3b30d6a81aArgyrios Kyrtzidis  // it but we don't set it on the result of clang_getCursorDefinition for
3937d1d9df688baf384f1ca1220e51104c3b30d6a81aArgyrios Kyrtzidis  // a reference of the same declaration.
3938d1d9df688baf384f1ca1220e51104c3b30d6a81aArgyrios Kyrtzidis  // FIXME: Setting "FirstInDeclGroup" in CXCursors is a hack that only works
3939d1d9df688baf384f1ca1220e51104c3b30d6a81aArgyrios Kyrtzidis  // when visiting a DeclStmt currently, the AST should be enhanced to be able
3940d1d9df688baf384f1ca1220e51104c3b30d6a81aArgyrios Kyrtzidis  // to provide that kind of info.
3941d1d9df688baf384f1ca1220e51104c3b30d6a81aArgyrios Kyrtzidis  if (clang_isDeclaration(X.kind))
3942d1d9df688baf384f1ca1220e51104c3b30d6a81aArgyrios Kyrtzidis    X.data[1] = 0;
3943d1d9df688baf384f1ca1220e51104c3b30d6a81aArgyrios Kyrtzidis  if (clang_isDeclaration(Y.kind))
3944d1d9df688baf384f1ca1220e51104c3b30d6a81aArgyrios Kyrtzidis    Y.data[1] = 0;
3945d1d9df688baf384f1ca1220e51104c3b30d6a81aArgyrios Kyrtzidis
39467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return X == Y;
39477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
39487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
39497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiunsigned clang_hashCursor(CXCursor C) {
39507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  unsigned Index = 0;
39517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (clang_isExpression(C.kind) || clang_isStatement(C.kind))
39527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    Index = 1;
39537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
395467812b2f94f4b5e7d2596db1705ffa1149ddc45aDmitri Gribenko  return llvm::DenseMapInfo<std::pair<unsigned, const void*> >::getHashValue(
39557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                        std::make_pair(C.kind, C.data[Index]));
39567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
39577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
39587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiunsigned clang_isInvalid(enum CXCursorKind K) {
39597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return K >= CXCursor_FirstInvalid && K <= CXCursor_LastInvalid;
39607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
39617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
39627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiunsigned clang_isDeclaration(enum CXCursorKind K) {
39637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return (K >= CXCursor_FirstDecl && K <= CXCursor_LastDecl) ||
39647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei         (K >= CXCursor_FirstExtraDecl && K <= CXCursor_LastExtraDecl);
39657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
39667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
39677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiunsigned clang_isReference(enum CXCursorKind K) {
39687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return K >= CXCursor_FirstRef && K <= CXCursor_LastRef;
39697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
39707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
39717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiunsigned clang_isExpression(enum CXCursorKind K) {
39727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return K >= CXCursor_FirstExpr && K <= CXCursor_LastExpr;
39737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
39747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
39757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiunsigned clang_isStatement(enum CXCursorKind K) {
39767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return K >= CXCursor_FirstStmt && K <= CXCursor_LastStmt;
39777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
39787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
39797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiunsigned clang_isAttribute(enum CXCursorKind K) {
39807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return K >= CXCursor_FirstAttr && K <= CXCursor_LastAttr;
39817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
39827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
39837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiunsigned clang_isTranslationUnit(enum CXCursorKind K) {
39847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return K == CXCursor_TranslationUnit;
39857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
39867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
39877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiunsigned clang_isPreprocessing(enum CXCursorKind K) {
39887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return K >= CXCursor_FirstPreprocessing && K <= CXCursor_LastPreprocessing;
39897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
39907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
39917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiunsigned clang_isUnexposed(enum CXCursorKind K) {
39927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  switch (K) {
39937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_UnexposedDecl:
39947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_UnexposedExpr:
39957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_UnexposedStmt:
39967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_UnexposedAttr:
39977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return true;
39987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    default:
39997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return false;
40007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
40017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
40027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
40037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXCursorKind clang_getCursorKind(CXCursor C) {
40047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return C.kind;
40057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
40067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
40077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXSourceLocation clang_getCursorLocation(CXCursor C) {
40087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (clang_isReference(C.kind)) {
40097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    switch (C.kind) {
40107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_ObjCSuperClassRef: {
401167812b2f94f4b5e7d2596db1705ffa1149ddc45aDmitri Gribenko      std::pair<const ObjCInterfaceDecl *, SourceLocation> P
40127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        = getCursorObjCSuperClassRef(C);
40137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return cxloc::translateSourceLocation(P.first->getASTContext(), P.second);
40147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
40157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
40167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_ObjCProtocolRef: {
401767812b2f94f4b5e7d2596db1705ffa1149ddc45aDmitri Gribenko      std::pair<const ObjCProtocolDecl *, SourceLocation> P
40187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        = getCursorObjCProtocolRef(C);
40197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return cxloc::translateSourceLocation(P.first->getASTContext(), P.second);
40207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
40217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
40227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_ObjCClassRef: {
402367812b2f94f4b5e7d2596db1705ffa1149ddc45aDmitri Gribenko      std::pair<const ObjCInterfaceDecl *, SourceLocation> P
40247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        = getCursorObjCClassRef(C);
40257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return cxloc::translateSourceLocation(P.first->getASTContext(), P.second);
40267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
40277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
40287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_TypeRef: {
402967812b2f94f4b5e7d2596db1705ffa1149ddc45aDmitri Gribenko      std::pair<const TypeDecl *, SourceLocation> P = getCursorTypeRef(C);
40307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return cxloc::translateSourceLocation(P.first->getASTContext(), P.second);
40317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
40327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
40337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_TemplateRef: {
403467812b2f94f4b5e7d2596db1705ffa1149ddc45aDmitri Gribenko      std::pair<const TemplateDecl *, SourceLocation> P =
403567812b2f94f4b5e7d2596db1705ffa1149ddc45aDmitri Gribenko          getCursorTemplateRef(C);
40367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return cxloc::translateSourceLocation(P.first->getASTContext(), P.second);
40377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
40387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
40397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_NamespaceRef: {
404067812b2f94f4b5e7d2596db1705ffa1149ddc45aDmitri Gribenko      std::pair<const NamedDecl *, SourceLocation> P = getCursorNamespaceRef(C);
40417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return cxloc::translateSourceLocation(P.first->getASTContext(), P.second);
40427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
40437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
40447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_MemberRef: {
404567812b2f94f4b5e7d2596db1705ffa1149ddc45aDmitri Gribenko      std::pair<const FieldDecl *, SourceLocation> P = getCursorMemberRef(C);
40467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return cxloc::translateSourceLocation(P.first->getASTContext(), P.second);
40477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
40487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
40497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_VariableRef: {
405067812b2f94f4b5e7d2596db1705ffa1149ddc45aDmitri Gribenko      std::pair<const VarDecl *, SourceLocation> P = getCursorVariableRef(C);
40517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return cxloc::translateSourceLocation(P.first->getASTContext(), P.second);
40527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
40537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
40547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_CXXBaseSpecifier: {
405567812b2f94f4b5e7d2596db1705ffa1149ddc45aDmitri Gribenko      const CXXBaseSpecifier *BaseSpec = getCursorCXXBaseSpecifier(C);
40567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (!BaseSpec)
40577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        return clang_getNullLocation();
40587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
40597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (TypeSourceInfo *TSInfo = BaseSpec->getTypeSourceInfo())
40607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        return cxloc::translateSourceLocation(getCursorContext(C),
40617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                            TSInfo->getTypeLoc().getBeginLoc());
40627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
40637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return cxloc::translateSourceLocation(getCursorContext(C),
40647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                        BaseSpec->getLocStart());
40657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
40667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
40677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_LabelRef: {
406867812b2f94f4b5e7d2596db1705ffa1149ddc45aDmitri Gribenko      std::pair<const LabelStmt *, SourceLocation> P = getCursorLabelRef(C);
40697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return cxloc::translateSourceLocation(getCursorContext(C), P.second);
40707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
40717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
40727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_OverloadedDeclRef:
40737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return cxloc::translateSourceLocation(getCursorContext(C),
40747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                          getCursorOverloadedDeclRef(C).second);
40757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
40767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    default:
40777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // FIXME: Need a way to enumerate all non-reference cases.
40787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      llvm_unreachable("Missed a reference kind");
40797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
40807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
40817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
40827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (clang_isExpression(C.kind))
40837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return cxloc::translateSourceLocation(getCursorContext(C),
40847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                   getLocationFromExpr(getCursorExpr(C)));
40857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
40867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (clang_isStatement(C.kind))
40877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return cxloc::translateSourceLocation(getCursorContext(C),
40887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                          getCursorStmt(C)->getLocStart());
40897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
40907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (C.kind == CXCursor_PreprocessingDirective) {
40917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    SourceLocation L = cxcursor::getCursorPreprocessingDirective(C).getBegin();
40927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return cxloc::translateSourceLocation(getCursorContext(C), L);
40937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
40947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
40957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (C.kind == CXCursor_MacroExpansion) {
40967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    SourceLocation L
4097664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis      = cxcursor::getCursorMacroExpansion(C).getSourceRange().getBegin();
40987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return cxloc::translateSourceLocation(getCursorContext(C), L);
40997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
41007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
41017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (C.kind == CXCursor_MacroDefinition) {
41027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    SourceLocation L = cxcursor::getCursorMacroDefinition(C)->getLocation();
41037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return cxloc::translateSourceLocation(getCursorContext(C), L);
41047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
41057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
41067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (C.kind == CXCursor_InclusionDirective) {
41077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    SourceLocation L
41087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      = cxcursor::getCursorInclusionDirective(C)->getSourceRange().getBegin();
41097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return cxloc::translateSourceLocation(getCursorContext(C), L);
41107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
41117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
41127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!clang_isDeclaration(C.kind))
41137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return clang_getNullLocation();
41147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
4115e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko  const Decl *D = getCursorDecl(C);
41167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!D)
41177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return clang_getNullLocation();
41187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
41197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  SourceLocation Loc = D->getLocation();
41207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // FIXME: Multiple variables declared in a single declaration
41217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // currently lack the information needed to correctly determine their
41227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // ranges when accounting for the type-specifier.  We use context
41237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // stored in the CXCursor to determine if the VarDecl is in a DeclGroup,
41247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // and if so, whether it is the first decl.
4125e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko  if (const VarDecl *VD = dyn_cast<VarDecl>(D)) {
41267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (!cxcursor::isFirstInDeclGroup(C))
41277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      Loc = VD->getLocation();
41287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
41297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
41307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // For ObjC methods, give the start location of the method name.
4131e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko  if (const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(D))
41327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    Loc = MD->getSelectorStartLoc();
41337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
41347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return cxloc::translateSourceLocation(getCursorContext(C), Loc);
41357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
41367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
41377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} // end extern "C"
41387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
41397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXCursor cxcursor::getCursor(CXTranslationUnit TU, SourceLocation SLoc) {
41407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  assert(TU);
41417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
41427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Guard against an invalid SourceLocation, or we may assert in one
41437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // of the following calls.
41447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (SLoc.isInvalid())
41457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return clang_getNullCursor();
41467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
41475694feb5ccd6eb862cb600b55753cecc13794471Dmitri Gribenko  ASTUnit *CXXUnit = cxtu::getASTUnit(TU);
41487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
41497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Translate the given source location to make it point at the beginning of
41507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // the token under the cursor.
41517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  SLoc = Lexer::GetBeginningOfToken(SLoc, CXXUnit->getSourceManager(),
41527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                    CXXUnit->getASTContext().getLangOpts());
41537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
41547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  CXCursor Result = MakeCXCursorInvalid(CXCursor_NoDeclFound);
41557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (SLoc.isValid()) {
41567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    GetCursorData ResultData(CXXUnit->getSourceManager(), SLoc, Result);
41577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    CursorVisitor CursorVis(TU, GetCursorVisitor, &ResultData,
41587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                            /*VisitPreprocessorLast=*/true,
41597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                            /*VisitIncludedEntities=*/false,
41607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                            SourceLocation(SLoc));
41617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    CursorVis.visitFileRegion();
41627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
41637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
41647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return Result;
41657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
41667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
41677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic SourceRange getRawCursorExtent(CXCursor C) {
41687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (clang_isReference(C.kind)) {
41697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    switch (C.kind) {
41707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_ObjCSuperClassRef:
41717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return  getCursorObjCSuperClassRef(C).second;
41727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
41737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_ObjCProtocolRef:
41747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return getCursorObjCProtocolRef(C).second;
41757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
41767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_ObjCClassRef:
41777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return getCursorObjCClassRef(C).second;
41787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
41797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_TypeRef:
41807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return getCursorTypeRef(C).second;
41817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
41827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_TemplateRef:
41837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return getCursorTemplateRef(C).second;
41847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
41857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_NamespaceRef:
41867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return getCursorNamespaceRef(C).second;
41877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
41887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_MemberRef:
41897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return getCursorMemberRef(C).second;
41907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
41917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_CXXBaseSpecifier:
41927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return getCursorCXXBaseSpecifier(C)->getSourceRange();
41937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
41947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_LabelRef:
41957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return getCursorLabelRef(C).second;
41967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
41977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_OverloadedDeclRef:
41987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return getCursorOverloadedDeclRef(C).second;
41997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
42007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_VariableRef:
42017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return getCursorVariableRef(C).second;
42027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
42037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    default:
42047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // FIXME: Need a way to enumerate all non-reference cases.
42057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      llvm_unreachable("Missed a reference kind");
42067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
42077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
42087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
42097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (clang_isExpression(C.kind))
42107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return getCursorExpr(C)->getSourceRange();
42117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
42127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (clang_isStatement(C.kind))
42137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return getCursorStmt(C)->getSourceRange();
42147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
42157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (clang_isAttribute(C.kind))
42167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return getCursorAttr(C)->getRange();
42177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
42187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (C.kind == CXCursor_PreprocessingDirective)
42197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return cxcursor::getCursorPreprocessingDirective(C);
42207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
42217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (C.kind == CXCursor_MacroExpansion) {
42227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    ASTUnit *TU = getCursorASTUnit(C);
4223664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis    SourceRange Range = cxcursor::getCursorMacroExpansion(C).getSourceRange();
42247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return TU->mapRangeFromPreamble(Range);
42257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
42267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
42277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (C.kind == CXCursor_MacroDefinition) {
42287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    ASTUnit *TU = getCursorASTUnit(C);
42297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    SourceRange Range = cxcursor::getCursorMacroDefinition(C)->getSourceRange();
42307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return TU->mapRangeFromPreamble(Range);
42317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
42327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
42337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (C.kind == CXCursor_InclusionDirective) {
42347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    ASTUnit *TU = getCursorASTUnit(C);
42357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    SourceRange Range = cxcursor::getCursorInclusionDirective(C)->getSourceRange();
42367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return TU->mapRangeFromPreamble(Range);
42377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
42387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
42397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (C.kind == CXCursor_TranslationUnit) {
42407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    ASTUnit *TU = getCursorASTUnit(C);
42417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    FileID MainID = TU->getSourceManager().getMainFileID();
42427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    SourceLocation Start = TU->getSourceManager().getLocForStartOfFile(MainID);
42437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    SourceLocation End = TU->getSourceManager().getLocForEndOfFile(MainID);
42447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return SourceRange(Start, End);
42457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
42467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
42477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (clang_isDeclaration(C.kind)) {
4248e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko    const Decl *D = cxcursor::getCursorDecl(C);
42497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (!D)
42507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return SourceRange();
42517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
42527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    SourceRange R = D->getSourceRange();
42537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // FIXME: Multiple variables declared in a single declaration
42547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // currently lack the information needed to correctly determine their
42557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // ranges when accounting for the type-specifier.  We use context
42567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // stored in the CXCursor to determine if the VarDecl is in a DeclGroup,
42577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // and if so, whether it is the first decl.
4258e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko    if (const VarDecl *VD = dyn_cast<VarDecl>(D)) {
42597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (!cxcursor::isFirstInDeclGroup(C))
42607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        R.setBegin(VD->getLocation());
42617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
42627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return R;
42637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
42647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return SourceRange();
42657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
42667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
42677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \brief Retrieves the "raw" cursor extent, which is then extended to include
42687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// the decl-specifier-seq for declarations.
42697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic SourceRange getFullCursorExtent(CXCursor C, SourceManager &SrcMgr) {
42707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (clang_isDeclaration(C.kind)) {
4271e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko    const Decl *D = cxcursor::getCursorDecl(C);
42727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (!D)
42737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return SourceRange();
42747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
42757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    SourceRange R = D->getSourceRange();
42767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
42777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // Adjust the start of the location for declarations preceded by
42787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // declaration specifiers.
42797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    SourceLocation StartLoc;
42807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (const DeclaratorDecl *DD = dyn_cast<DeclaratorDecl>(D)) {
42817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (TypeSourceInfo *TI = DD->getTypeSourceInfo())
42827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        StartLoc = TI->getTypeLoc().getLocStart();
4283e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko    } else if (const TypedefDecl *Typedef = dyn_cast<TypedefDecl>(D)) {
42847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (TypeSourceInfo *TI = Typedef->getTypeSourceInfo())
42857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        StartLoc = TI->getTypeLoc().getLocStart();
42867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
42877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
42887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (StartLoc.isValid() && R.getBegin().isValid() &&
42897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        SrcMgr.isBeforeInTranslationUnit(StartLoc, R.getBegin()))
42907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      R.setBegin(StartLoc);
42917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
42927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // FIXME: Multiple variables declared in a single declaration
42937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // currently lack the information needed to correctly determine their
42947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // ranges when accounting for the type-specifier.  We use context
42957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // stored in the CXCursor to determine if the VarDecl is in a DeclGroup,
42967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // and if so, whether it is the first decl.
4297e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko    if (const VarDecl *VD = dyn_cast<VarDecl>(D)) {
42987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (!cxcursor::isFirstInDeclGroup(C))
42997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        R.setBegin(VD->getLocation());
43007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
43017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
43027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return R;
43037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
43047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
43057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return getRawCursorExtent(C);
43067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
43077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
43087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiextern "C" {
43097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
43107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXSourceRange clang_getCursorExtent(CXCursor C) {
43117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  SourceRange R = getRawCursorExtent(C);
43127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (R.isInvalid())
43137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return clang_getNullRange();
43147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
43157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return cxloc::translateSourceRange(getCursorContext(C), R);
43167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
43177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
43187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXCursor clang_getCursorReferenced(CXCursor C) {
43197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (clang_isInvalid(C.kind))
43207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return clang_getNullCursor();
43217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
43227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  CXTranslationUnit tu = getCursorTU(C);
43237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (clang_isDeclaration(C.kind)) {
4324e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko    const Decl *D = getCursorDecl(C);
43257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (!D)
43267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return clang_getNullCursor();
4327e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko    if (const UsingDecl *Using = dyn_cast<UsingDecl>(D))
43287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return MakeCursorOverloadedDeclRef(Using, D->getLocation(), tu);
4329e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko    if (const ObjCPropertyImplDecl *PropImpl =
4330e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko            dyn_cast<ObjCPropertyImplDecl>(D))
43317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (ObjCPropertyDecl *Property = PropImpl->getPropertyDecl())
43327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        return MakeCXCursor(Property, tu);
43337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
43347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return C;
43357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
43367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
43377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (clang_isExpression(C.kind)) {
4338e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko    const Expr *E = getCursorExpr(C);
4339e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko    const Decl *D = getDeclFromExpr(E);
43407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (D) {
43417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      CXCursor declCursor = MakeCXCursor(D, tu);
43427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      declCursor = getSelectorIdentifierCursor(getSelectorIdentifierIndex(C),
43437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                               declCursor);
43447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return declCursor;
43457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
43467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
4347e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko    if (const OverloadExpr *Ovl = dyn_cast_or_null<OverloadExpr>(E))
43487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return MakeCursorOverloadedDeclRef(Ovl, tu);
43497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
43507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return clang_getNullCursor();
43517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
43527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
43537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (clang_isStatement(C.kind)) {
4354ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko    const Stmt *S = getCursorStmt(C);
4355ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko    if (const GotoStmt *Goto = dyn_cast_or_null<GotoStmt>(S))
43567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (LabelDecl *label = Goto->getLabel())
43577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        if (LabelStmt *labelS = label->getStmt())
43587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        return MakeCXCursor(labelS, getCursorDecl(C), tu);
43597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
43607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return clang_getNullCursor();
43617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
43627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
43637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (C.kind == CXCursor_MacroExpansion) {
436467812b2f94f4b5e7d2596db1705ffa1149ddc45aDmitri Gribenko    if (const MacroDefinition *Def = getCursorMacroExpansion(C).getDefinition())
43657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return MakeMacroDefinitionCursor(Def, tu);
43667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
43677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
43687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!clang_isReference(C.kind))
43697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return clang_getNullCursor();
43707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
43717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  switch (C.kind) {
43727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_ObjCSuperClassRef:
43737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return MakeCXCursor(getCursorObjCSuperClassRef(C).first, tu);
43747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
43757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_ObjCProtocolRef: {
437667812b2f94f4b5e7d2596db1705ffa1149ddc45aDmitri Gribenko      const ObjCProtocolDecl *Prot = getCursorObjCProtocolRef(C).first;
437767812b2f94f4b5e7d2596db1705ffa1149ddc45aDmitri Gribenko      if (const ObjCProtocolDecl *Def = Prot->getDefinition())
43787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        return MakeCXCursor(Def, tu);
43797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
43807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return MakeCXCursor(Prot, tu);
43817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
43827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
43837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_ObjCClassRef: {
438467812b2f94f4b5e7d2596db1705ffa1149ddc45aDmitri Gribenko      const ObjCInterfaceDecl *Class = getCursorObjCClassRef(C).first;
438567812b2f94f4b5e7d2596db1705ffa1149ddc45aDmitri Gribenko      if (const ObjCInterfaceDecl *Def = Class->getDefinition())
43867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        return MakeCXCursor(Def, tu);
43877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
43887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return MakeCXCursor(Class, tu);
43897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
43907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
43917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_TypeRef:
43927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return MakeCXCursor(getCursorTypeRef(C).first, tu );
43937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
43947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_TemplateRef:
43957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return MakeCXCursor(getCursorTemplateRef(C).first, tu );
43967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
43977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_NamespaceRef:
43987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return MakeCXCursor(getCursorNamespaceRef(C).first, tu );
43997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
44007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_MemberRef:
44017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return MakeCXCursor(getCursorMemberRef(C).first, tu );
44027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
44037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_CXXBaseSpecifier: {
440467812b2f94f4b5e7d2596db1705ffa1149ddc45aDmitri Gribenko      const CXXBaseSpecifier *B = cxcursor::getCursorCXXBaseSpecifier(C);
44057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return clang_getTypeDeclaration(cxtype::MakeCXType(B->getType(),
44067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                                         tu ));
44077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
44087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
44097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_LabelRef:
44107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // FIXME: We end up faking the "parent" declaration here because we
44117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // don't want to make CXCursor larger.
44125694feb5ccd6eb862cb600b55753cecc13794471Dmitri Gribenko      return MakeCXCursor(getCursorLabelRef(C).first,
44135694feb5ccd6eb862cb600b55753cecc13794471Dmitri Gribenko                          cxtu::getASTUnit(tu)->getASTContext()
44145694feb5ccd6eb862cb600b55753cecc13794471Dmitri Gribenko                              .getTranslationUnitDecl(),
44157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                          tu);
44167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
44177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_OverloadedDeclRef:
44187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return C;
44197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
44207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_VariableRef:
44217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return MakeCXCursor(getCursorVariableRef(C).first, tu);
44227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
44237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    default:
44247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // We would prefer to enumerate all non-reference cursor kinds here.
44257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      llvm_unreachable("Unhandled reference cursor kind");
44267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
44277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
44287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
44297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXCursor clang_getCursorDefinition(CXCursor C) {
44307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (clang_isInvalid(C.kind))
44317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return clang_getNullCursor();
44327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
44337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  CXTranslationUnit TU = getCursorTU(C);
44347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
44357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  bool WasReference = false;
44367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (clang_isReference(C.kind) || clang_isExpression(C.kind)) {
44377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    C = clang_getCursorReferenced(C);
44387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    WasReference = true;
44397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
44407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
44417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (C.kind == CXCursor_MacroExpansion)
44427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return clang_getCursorReferenced(C);
44437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
44447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!clang_isDeclaration(C.kind))
44457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return clang_getNullCursor();
44467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
4447e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko  const Decl *D = getCursorDecl(C);
44487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!D)
44497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return clang_getNullCursor();
44507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
44517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  switch (D->getKind()) {
44527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Declaration kinds that don't really separate the notions of
44537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // declaration and definition.
44547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::Namespace:
44557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::Typedef:
44567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::TypeAlias:
44577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::TypeAliasTemplate:
44587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::TemplateTypeParm:
44597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::EnumConstant:
44607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::Field:
446176da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  case Decl::MSProperty:
44627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::IndirectField:
44637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::ObjCIvar:
44647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::ObjCAtDefsField:
44657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::ImplicitParam:
44667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::ParmVar:
44677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::NonTypeTemplateParm:
44687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::TemplateTemplateParm:
44697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::ObjCCategoryImpl:
44707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::ObjCImplementation:
44717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::AccessSpec:
44727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::LinkageSpec:
44737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::ObjCPropertyImpl:
44747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::FileScopeAsm:
44757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::StaticAssert:
44767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::Block:
44776afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. Siraj  case Decl::Captured:
44787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::Label:  // FIXME: Is this right??
44797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::ClassScopeFunctionSpecialization:
44807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::Import:
4481c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev  case Decl::OMPThreadPrivate:
44827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return C;
44837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
44847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Declaration kinds that don't make any sense here, but are
44857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // nonetheless harmless.
4486f23546a913825bdc1f972f21f638a6ee472aab20David Blaikie  case Decl::Empty:
44877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::TranslationUnit:
44887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    break;
44897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
44907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Declaration kinds for which the definition is not resolvable.
44917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::UnresolvedUsingTypename:
44927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::UnresolvedUsingValue:
44937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    break;
44947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
44957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::UsingDirective:
44967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return MakeCXCursor(cast<UsingDirectiveDecl>(D)->getNominatedNamespace(),
44977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                        TU);
44987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
44997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::NamespaceAlias:
45007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return MakeCXCursor(cast<NamespaceAliasDecl>(D)->getNamespace(), TU);
45017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
45027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::Enum:
45037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::Record:
45047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::CXXRecord:
45057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::ClassTemplateSpecialization:
45067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::ClassTemplatePartialSpecialization:
45077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (TagDecl *Def = cast<TagDecl>(D)->getDefinition())
45087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return MakeCXCursor(Def, TU);
45097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return clang_getNullCursor();
45107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
45117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::Function:
45127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::CXXMethod:
45137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::CXXConstructor:
45147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::CXXDestructor:
45157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::CXXConversion: {
45167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    const FunctionDecl *Def = 0;
45177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (cast<FunctionDecl>(D)->getBody(Def))
451805756dc8d11cd2054e0cb94f0302e4eb39acc68eDmitri Gribenko      return MakeCXCursor(Def, TU);
45197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return clang_getNullCursor();
45207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
45217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
45227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::Var: {
45237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // Ask the variable if it has a definition.
4524e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko    if (const VarDecl *Def = cast<VarDecl>(D)->getDefinition())
45257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return MakeCXCursor(Def, TU);
45267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return clang_getNullCursor();
45277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
45287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
45297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::FunctionTemplate: {
45307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    const FunctionDecl *Def = 0;
45317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (cast<FunctionTemplateDecl>(D)->getTemplatedDecl()->getBody(Def))
45327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return MakeCXCursor(Def->getDescribedFunctionTemplate(), TU);
45337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return clang_getNullCursor();
45347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
45357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
45367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::ClassTemplate: {
45377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (RecordDecl *Def = cast<ClassTemplateDecl>(D)->getTemplatedDecl()
45387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                                            ->getDefinition())
45397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return MakeCXCursor(cast<CXXRecordDecl>(Def)->getDescribedClassTemplate(),
45407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                          TU);
45417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return clang_getNullCursor();
45427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
45437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
45447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::Using:
45457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return MakeCursorOverloadedDeclRef(cast<UsingDecl>(D),
45467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                       D->getLocation(), TU);
45477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
45487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::UsingShadow:
45497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return clang_getCursorDefinition(
45507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                       MakeCXCursor(cast<UsingShadowDecl>(D)->getTargetDecl(),
45517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                    TU));
45527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
45537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::ObjCMethod: {
4554e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko    const ObjCMethodDecl *Method = cast<ObjCMethodDecl>(D);
45557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (Method->isThisDeclarationADefinition())
45567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return C;
45577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
45587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // Dig out the method definition in the associated
45597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // @implementation, if we have it.
45607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // FIXME: The ASTs should make finding the definition easier.
4561e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko    if (const ObjCInterfaceDecl *Class
45627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                       = dyn_cast<ObjCInterfaceDecl>(Method->getDeclContext()))
45637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (ObjCImplementationDecl *ClassImpl = Class->getImplementation())
45647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        if (ObjCMethodDecl *Def = ClassImpl->getMethod(Method->getSelector(),
45657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                                  Method->isInstanceMethod()))
45667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          if (Def->isThisDeclarationADefinition())
45677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            return MakeCXCursor(Def, TU);
45687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
45697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return clang_getNullCursor();
45707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
45717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
45727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::ObjCCategory:
45737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (ObjCCategoryImplDecl *Impl
45747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                               = cast<ObjCCategoryDecl>(D)->getImplementation())
45757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return MakeCXCursor(Impl, TU);
45767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return clang_getNullCursor();
45777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
45787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::ObjCProtocol:
4579e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko    if (const ObjCProtocolDecl *Def = cast<ObjCProtocolDecl>(D)->getDefinition())
45807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return MakeCXCursor(Def, TU);
45817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return clang_getNullCursor();
45827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
45837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::ObjCInterface: {
45847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // There are two notions of a "definition" for an Objective-C
45857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // class: the interface and its implementation. When we resolved a
45867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // reference to an Objective-C class, produce the @interface as
45877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // the definition; when we were provided with the interface,
45887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // produce the @implementation as the definition.
4589e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko    const ObjCInterfaceDecl *IFace = cast<ObjCInterfaceDecl>(D);
45907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (WasReference) {
4591e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko      if (const ObjCInterfaceDecl *Def = IFace->getDefinition())
45927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        return MakeCXCursor(Def, TU);
45937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    } else if (ObjCImplementationDecl *Impl = IFace->getImplementation())
45947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return MakeCXCursor(Impl, TU);
45957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return clang_getNullCursor();
45967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
45977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
45987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::ObjCProperty:
45997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // FIXME: We don't really know where to find the
46007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // ObjCPropertyImplDecls that implement this property.
46017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return clang_getNullCursor();
46027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
46037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::ObjCCompatibleAlias:
4604e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko    if (const ObjCInterfaceDecl *Class
46057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          = cast<ObjCCompatibleAliasDecl>(D)->getClassInterface())
4606e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko      if (const ObjCInterfaceDecl *Def = Class->getDefinition())
46077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        return MakeCXCursor(Def, TU);
46087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
46097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return clang_getNullCursor();
46107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
46117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::Friend:
46127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (NamedDecl *Friend = cast<FriendDecl>(D)->getFriendDecl())
46137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return clang_getCursorDefinition(MakeCXCursor(Friend, TU));
46147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return clang_getNullCursor();
46157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
46167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::FriendTemplate:
46177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (NamedDecl *Friend = cast<FriendTemplateDecl>(D)->getFriendDecl())
46187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return clang_getCursorDefinition(MakeCXCursor(Friend, TU));
46197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return clang_getNullCursor();
46207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
46217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
46227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return clang_getNullCursor();
46237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
46247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
46257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiunsigned clang_isCursorDefinition(CXCursor C) {
46267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!clang_isDeclaration(C.kind))
46277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return 0;
46287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
46297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return clang_getCursorDefinition(C) == C;
46307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
46317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
46327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXCursor clang_getCanonicalCursor(CXCursor C) {
46337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!clang_isDeclaration(C.kind))
46347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return C;
46357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
4636e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko  if (const Decl *D = getCursorDecl(C)) {
4637e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko    if (const ObjCCategoryImplDecl *CatImplD = dyn_cast<ObjCCategoryImplDecl>(D))
46387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (ObjCCategoryDecl *CatD = CatImplD->getCategoryDecl())
46397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        return MakeCXCursor(CatD, getCursorTU(C));
46407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
4641e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko    if (const ObjCImplDecl *ImplD = dyn_cast<ObjCImplDecl>(D))
4642e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko      if (const ObjCInterfaceDecl *IFD = ImplD->getClassInterface())
46437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        return MakeCXCursor(IFD, getCursorTU(C));
46447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
46457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return MakeCXCursor(D->getCanonicalDecl(), getCursorTU(C));
46467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
46477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
46487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return C;
46497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
46507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
46517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiint clang_Cursor_getObjCSelectorIndex(CXCursor cursor) {
46527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return cxcursor::getSelectorIdentifierIndexAndLoc(cursor).first;
46537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
46547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
46557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiunsigned clang_getNumOverloadedDecls(CXCursor C) {
46567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (C.kind != CXCursor_OverloadedDeclRef)
46577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return 0;
46587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
46597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  OverloadedDeclRefStorage Storage = getCursorOverloadedDeclRef(C).first;
4660e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko  if (const OverloadExpr *E = Storage.dyn_cast<const OverloadExpr *>())
46617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return E->getNumDecls();
46627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
46637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (OverloadedTemplateStorage *S
46647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                              = Storage.dyn_cast<OverloadedTemplateStorage*>())
46657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return S->size();
46667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
4667e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko  const Decl *D = Storage.get<const Decl *>();
4668e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko  if (const UsingDecl *Using = dyn_cast<UsingDecl>(D))
46697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return Using->shadow_size();
46707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
46717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return 0;
46727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
46737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
46747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXCursor clang_getOverloadedDecl(CXCursor cursor, unsigned index) {
46757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (cursor.kind != CXCursor_OverloadedDeclRef)
46767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return clang_getNullCursor();
46777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
46787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (index >= clang_getNumOverloadedDecls(cursor))
46797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return clang_getNullCursor();
46807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
46817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  CXTranslationUnit TU = getCursorTU(cursor);
46827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  OverloadedDeclRefStorage Storage = getCursorOverloadedDeclRef(cursor).first;
4683e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko  if (const OverloadExpr *E = Storage.dyn_cast<const OverloadExpr *>())
46847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return MakeCXCursor(E->decls_begin()[index], TU);
46857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
46867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (OverloadedTemplateStorage *S
46877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                              = Storage.dyn_cast<OverloadedTemplateStorage*>())
46887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return MakeCXCursor(S->begin()[index], TU);
46897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
4690e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko  const Decl *D = Storage.get<const Decl *>();
4691e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko  if (const UsingDecl *Using = dyn_cast<UsingDecl>(D)) {
46927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // FIXME: This is, unfortunately, linear time.
46937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    UsingDecl::shadow_iterator Pos = Using->shadow_begin();
46947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    std::advance(Pos, index);
46957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return MakeCXCursor(cast<UsingShadowDecl>(*Pos)->getTargetDecl(), TU);
46967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
46977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
46987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return clang_getNullCursor();
46997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
47007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
47017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid clang_getDefinitionSpellingAndExtent(CXCursor C,
47027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                          const char **startBuf,
47037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                          const char **endBuf,
47047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                          unsigned *startLine,
47057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                          unsigned *startColumn,
47067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                          unsigned *endLine,
47077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                          unsigned *endColumn) {
47087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  assert(getCursorDecl(C) && "CXCursor has null decl");
4709e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko  const FunctionDecl *FD = dyn_cast<FunctionDecl>(getCursorDecl(C));
47107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  CompoundStmt *Body = dyn_cast<CompoundStmt>(FD->getBody());
47117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
47127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  SourceManager &SM = FD->getASTContext().getSourceManager();
47137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  *startBuf = SM.getCharacterData(Body->getLBracLoc());
47147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  *endBuf = SM.getCharacterData(Body->getRBracLoc());
47157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  *startLine = SM.getSpellingLineNumber(Body->getLBracLoc());
47167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  *startColumn = SM.getSpellingColumnNumber(Body->getLBracLoc());
47177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  *endLine = SM.getSpellingLineNumber(Body->getRBracLoc());
47187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  *endColumn = SM.getSpellingColumnNumber(Body->getRBracLoc());
47197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
47207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
47217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
47227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXSourceRange clang_getCursorReferenceNameRange(CXCursor C, unsigned NameFlags,
47237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                                unsigned PieceIndex) {
47247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  RefNamePieces Pieces;
47257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
47267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  switch (C.kind) {
47277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_MemberRefExpr:
4728ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko    if (const MemberExpr *E = dyn_cast<MemberExpr>(getCursorExpr(C)))
47297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      Pieces = buildPieces(NameFlags, true, E->getMemberNameInfo(),
47307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                           E->getQualifierLoc().getSourceRange());
47317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    break;
47327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
47337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_DeclRefExpr:
4734ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko    if (const DeclRefExpr *E = dyn_cast<DeclRefExpr>(getCursorExpr(C)))
47357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      Pieces = buildPieces(NameFlags, false, E->getNameInfo(),
47367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                           E->getQualifierLoc().getSourceRange(),
47377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                           E->getOptionalExplicitTemplateArgs());
47387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    break;
47397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
47407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_CallExpr:
4741ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko    if (const CXXOperatorCallExpr *OCE =
47427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        dyn_cast<CXXOperatorCallExpr>(getCursorExpr(C))) {
4743ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko      const Expr *Callee = OCE->getCallee();
4744ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko      if (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Callee))
47457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        Callee = ICE->getSubExpr();
47467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
4747ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko      if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee))
47487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        Pieces = buildPieces(NameFlags, false, DRE->getNameInfo(),
47497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                             DRE->getQualifierLoc().getSourceRange());
47507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
47517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    break;
47527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
47537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  default:
47547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    break;
47557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
47567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
47577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (Pieces.empty()) {
47587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (PieceIndex == 0)
47597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return clang_getCursorExtent(C);
47607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  } else if (PieceIndex < Pieces.size()) {
47617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      SourceRange R = Pieces[PieceIndex];
47627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (R.isValid())
47637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        return cxloc::translateSourceRange(getCursorContext(C), R);
47647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
47657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
47667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return clang_getNullRange();
47677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
47687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
47697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid clang_enableStackTraces(void) {
47707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  llvm::sys::PrintStackTraceOnErrorSignal();
47717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
47727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
47737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid clang_executeOnThread(void (*fn)(void*), void *user_data,
47747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                           unsigned stack_size) {
47757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  llvm::llvm_execute_on_thread(fn, user_data, stack_size);
47767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
47777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
47787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} // end: extern "C"
47797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
47807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----------------------------------------------------------------------===//
47817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// Token-based Operations.
47827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----------------------------------------------------------------------===//
47837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
47847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/* CXToken layout:
47857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei *   int_data[0]: a CXTokenKind
47867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei *   int_data[1]: starting token location
47877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei *   int_data[2]: token length
47887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei *   int_data[3]: reserved
47897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei *   ptr_data: for identifiers and keywords, an IdentifierInfo*.
47907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei *   otherwise unused.
47917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei */
47927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiextern "C" {
47937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
47947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXTokenKind clang_getTokenKind(CXToken CXTok) {
47957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return static_cast<CXTokenKind>(CXTok.int_data[0]);
47967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
47977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
47987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXString clang_getTokenSpelling(CXTranslationUnit TU, CXToken CXTok) {
47997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  switch (clang_getTokenKind(CXTok)) {
48007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXToken_Identifier:
48017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXToken_Keyword:
48027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // We know we have an IdentifierInfo*, so use that.
48030c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko    return cxstring::createRef(static_cast<IdentifierInfo *>(CXTok.ptr_data)
48047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                            ->getNameStart());
48057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
48067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXToken_Literal: {
48077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // We have stashed the starting pointer in the ptr_data field. Use it.
48087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    const char *Text = static_cast<const char *>(CXTok.ptr_data);
48095595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko    return cxstring::createDup(StringRef(Text, CXTok.int_data[2]));
48107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
48117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
48127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXToken_Punctuation:
48137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXToken_Comment:
48147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    break;
48157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
48167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
48177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // We have to find the starting buffer pointer the hard way, by
48187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // deconstructing the source location.
48195694feb5ccd6eb862cb600b55753cecc13794471Dmitri Gribenko  ASTUnit *CXXUnit = cxtu::getASTUnit(TU);
48207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!CXXUnit)
4821dc66adb40ee871b4c578ba615f45d82476c7119eDmitri Gribenko    return cxstring::createEmpty();
48227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
48237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  SourceLocation Loc = SourceLocation::getFromRawEncoding(CXTok.int_data[1]);
48247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  std::pair<FileID, unsigned> LocInfo
48257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    = CXXUnit->getSourceManager().getDecomposedSpellingLoc(Loc);
48267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  bool Invalid = false;
48277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  StringRef Buffer
48287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    = CXXUnit->getSourceManager().getBufferData(LocInfo.first, &Invalid);
48297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (Invalid)
4830dc66adb40ee871b4c578ba615f45d82476c7119eDmitri Gribenko    return cxstring::createEmpty();
48317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
48325595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko  return cxstring::createDup(Buffer.substr(LocInfo.second, CXTok.int_data[2]));
48337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
48347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
48357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXSourceLocation clang_getTokenLocation(CXTranslationUnit TU, CXToken CXTok) {
48365694feb5ccd6eb862cb600b55753cecc13794471Dmitri Gribenko  ASTUnit *CXXUnit = cxtu::getASTUnit(TU);
48377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!CXXUnit)
48387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return clang_getNullLocation();
48397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
48407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return cxloc::translateSourceLocation(CXXUnit->getASTContext(),
48417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                        SourceLocation::getFromRawEncoding(CXTok.int_data[1]));
48427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
48437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
48447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXSourceRange clang_getTokenExtent(CXTranslationUnit TU, CXToken CXTok) {
48455694feb5ccd6eb862cb600b55753cecc13794471Dmitri Gribenko  ASTUnit *CXXUnit = cxtu::getASTUnit(TU);
48467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!CXXUnit)
48477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return clang_getNullRange();
48487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
48497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return cxloc::translateSourceRange(CXXUnit->getASTContext(),
48507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                        SourceLocation::getFromRawEncoding(CXTok.int_data[1]));
48517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
48527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
48537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic void getTokens(ASTUnit *CXXUnit, SourceRange Range,
48547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                      SmallVectorImpl<CXToken> &CXTokens) {
48557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  SourceManager &SourceMgr = CXXUnit->getSourceManager();
48567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  std::pair<FileID, unsigned> BeginLocInfo
485782064213e9ef308e9a929ecfb31f4698a834ecddArgyrios Kyrtzidis    = SourceMgr.getDecomposedSpellingLoc(Range.getBegin());
48587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  std::pair<FileID, unsigned> EndLocInfo
485982064213e9ef308e9a929ecfb31f4698a834ecddArgyrios Kyrtzidis    = SourceMgr.getDecomposedSpellingLoc(Range.getEnd());
48607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
48617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Cannot tokenize across files.
48627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (BeginLocInfo.first != EndLocInfo.first)
48637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return;
48647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
48657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Create a lexer
48667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  bool Invalid = false;
48677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  StringRef Buffer
48687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    = SourceMgr.getBufferData(BeginLocInfo.first, &Invalid);
48697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (Invalid)
48707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return;
48717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
48727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  Lexer Lex(SourceMgr.getLocForStartOfFile(BeginLocInfo.first),
48737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            CXXUnit->getASTContext().getLangOpts(),
48747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            Buffer.begin(), Buffer.data() + BeginLocInfo.second, Buffer.end());
48757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  Lex.SetCommentRetentionState(true);
48767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
48777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Lex tokens until we hit the end of the range.
48787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  const char *EffectiveBufferEnd = Buffer.data() + EndLocInfo.second;
48797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  Token Tok;
48807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  bool previousWasAt = false;
48817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  do {
48827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // Lex the next token
48837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    Lex.LexFromRawLexer(Tok);
48847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (Tok.is(tok::eof))
48857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      break;
48867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
48877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // Initialize the CXToken.
48887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    CXToken CXTok;
48897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
48907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    //   - Common fields
48917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    CXTok.int_data[1] = Tok.getLocation().getRawEncoding();
48927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    CXTok.int_data[2] = Tok.getLength();
48937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    CXTok.int_data[3] = 0;
48947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
48957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    //   - Kind-specific fields
48967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (Tok.isLiteral()) {
48977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      CXTok.int_data[0] = CXToken_Literal;
4898e4ea879fe73581bc70a9bfbfddc7ca06b5c0768bDmitri Gribenko      CXTok.ptr_data = const_cast<char *>(Tok.getLiteralData());
48997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    } else if (Tok.is(tok::raw_identifier)) {
49007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // Lookup the identifier to determine whether we have a keyword.
49017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      IdentifierInfo *II
49027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        = CXXUnit->getPreprocessor().LookUpIdentifierInfo(Tok);
49037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
49047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if ((II->getObjCKeywordID() != tok::objc_not_keyword) && previousWasAt) {
49057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        CXTok.int_data[0] = CXToken_Keyword;
49067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      }
49077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      else {
49087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        CXTok.int_data[0] = Tok.is(tok::identifier)
49097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          ? CXToken_Identifier
49107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          : CXToken_Keyword;
49117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      }
49127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      CXTok.ptr_data = II;
49137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    } else if (Tok.is(tok::comment)) {
49147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      CXTok.int_data[0] = CXToken_Comment;
49157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      CXTok.ptr_data = 0;
49167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    } else {
49177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      CXTok.int_data[0] = CXToken_Punctuation;
49187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      CXTok.ptr_data = 0;
49197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
49207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    CXTokens.push_back(CXTok);
49217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    previousWasAt = Tok.is(tok::at);
49227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  } while (Lex.getBufferLocation() <= EffectiveBufferEnd);
49237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
49247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
49257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid clang_tokenize(CXTranslationUnit TU, CXSourceRange Range,
49267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                    CXToken **Tokens, unsigned *NumTokens) {
4927c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  LOG_FUNC_SECTION {
4928c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis    *Log << TU << ' ' << Range;
4929c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  }
4930c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis
49317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (Tokens)
49327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    *Tokens = 0;
49337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (NumTokens)
49347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    *NumTokens = 0;
49357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
49360b602836c63e702b2ba893e8439996b226fc248fArgyrios Kyrtzidis  if (!TU)
49370b602836c63e702b2ba893e8439996b226fc248fArgyrios Kyrtzidis    return;
49380b602836c63e702b2ba893e8439996b226fc248fArgyrios Kyrtzidis
49395694feb5ccd6eb862cb600b55753cecc13794471Dmitri Gribenko  ASTUnit *CXXUnit = cxtu::getASTUnit(TU);
49407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!CXXUnit || !Tokens || !NumTokens)
49417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return;
49427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
49437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  ASTUnit::ConcurrencyCheck Check(*CXXUnit);
49447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
49457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  SourceRange R = cxloc::translateCXSourceRange(Range);
49467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (R.isInvalid())
49477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return;
49487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
49497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  SmallVector<CXToken, 32> CXTokens;
49507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  getTokens(CXXUnit, R, CXTokens);
49517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
49527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (CXTokens.empty())
49537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return;
49547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
49557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  *Tokens = (CXToken *)malloc(sizeof(CXToken) * CXTokens.size());
49567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  memmove(*Tokens, CXTokens.data(), sizeof(CXToken) * CXTokens.size());
49577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  *NumTokens = CXTokens.size();
49587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
49597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
49607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid clang_disposeTokens(CXTranslationUnit TU,
49617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                         CXToken *Tokens, unsigned NumTokens) {
49627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  free(Tokens);
49637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
49647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
49657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} // end: extern "C"
49667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
49677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----------------------------------------------------------------------===//
49687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// Token annotation APIs.
49697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----------------------------------------------------------------------===//
49707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
49717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic enum CXChildVisitResult AnnotateTokensVisitor(CXCursor cursor,
49727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                                     CXCursor parent,
49737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                                     CXClientData client_data);
49747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic bool AnnotateTokensPostChildrenVisitor(CXCursor cursor,
49757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                              CXClientData client_data);
49767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
49777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeinamespace {
49787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiclass AnnotateTokensWorker {
49797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  CXToken *Tokens;
49807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  CXCursor *Cursors;
49817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  unsigned NumTokens;
49827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  unsigned TokIdx;
49837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  unsigned PreprocessingTokIdx;
49847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  CursorVisitor AnnotateVis;
49857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  SourceManager &SrcMgr;
49867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  bool HasContextSensitiveKeywords;
49877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
49887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  struct PostChildrenInfo {
49897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    CXCursor Cursor;
49907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    SourceRange CursorRange;
4991a86b37e223a21647175619096e67d0f650add351Argyrios Kyrtzidis    unsigned BeforeReachingCursorIdx;
49927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    unsigned BeforeChildrenTokenIdx;
49937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  };
4994cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko  SmallVector<PostChildrenInfo, 8> PostChildrenInfos;
49957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
49967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  bool MoreTokens() const { return TokIdx < NumTokens; }
49977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  unsigned NextToken() const { return TokIdx; }
49987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  void AdvanceToken() { ++TokIdx; }
49997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  SourceLocation GetTokenLoc(unsigned tokI) {
50007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return SourceLocation::getFromRawEncoding(Tokens[tokI].int_data[1]);
50017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
50027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  bool isFunctionMacroToken(unsigned tokI) const {
50037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return Tokens[tokI].int_data[3] != 0;
50047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
50057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  SourceLocation getFunctionMacroTokenLoc(unsigned tokI) const {
50067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return SourceLocation::getFromRawEncoding(Tokens[tokI].int_data[3]);
50077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
50087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
50097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  void annotateAndAdvanceTokens(CXCursor, RangeComparisonResult, SourceRange);
5010a86b37e223a21647175619096e67d0f650add351Argyrios Kyrtzidis  bool annotateAndAdvanceFunctionMacroTokens(CXCursor, RangeComparisonResult,
50117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                             SourceRange);
50127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
50137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeipublic:
5014c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis  AnnotateTokensWorker(CXToken *tokens, CXCursor *cursors, unsigned numTokens,
50155694feb5ccd6eb862cb600b55753cecc13794471Dmitri Gribenko                       CXTranslationUnit TU, SourceRange RegionOfInterest)
5016c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis    : Tokens(tokens), Cursors(cursors),
50177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      NumTokens(numTokens), TokIdx(0), PreprocessingTokIdx(0),
50185694feb5ccd6eb862cb600b55753cecc13794471Dmitri Gribenko      AnnotateVis(TU,
50197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                  AnnotateTokensVisitor, this,
50207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                  /*VisitPreprocessorLast=*/true,
50217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                  /*VisitIncludedEntities=*/false,
50227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                  RegionOfInterest,
50237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                  /*VisitDeclsOnly=*/false,
50247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                  AnnotateTokensPostChildrenVisitor),
50255694feb5ccd6eb862cb600b55753cecc13794471Dmitri Gribenko      SrcMgr(cxtu::getASTUnit(TU)->getSourceManager()),
50267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      HasContextSensitiveKeywords(false) { }
50277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
50287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  void VisitChildren(CXCursor C) { AnnotateVis.VisitChildren(C); }
50297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  enum CXChildVisitResult Visit(CXCursor cursor, CXCursor parent);
50307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  bool postVisitChildren(CXCursor cursor);
50317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  void AnnotateTokens();
50327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
50337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  /// \brief Determine whether the annotator saw any cursors that have
50347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  /// context-sensitive keywords.
50357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  bool hasContextSensitiveKeywords() const {
50367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return HasContextSensitiveKeywords;
50377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
50387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
50397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  ~AnnotateTokensWorker() {
50407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    assert(PostChildrenInfos.empty());
50417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
50427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei};
50437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
50447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
50457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid AnnotateTokensWorker::AnnotateTokens() {
50467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Walk the AST within the region of interest, annotating tokens
50477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // along the way.
50487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AnnotateVis.visitFileRegion();
5049c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis}
50507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
5051c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidisstatic inline void updateCursorAnnotation(CXCursor &Cursor,
5052c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis                                          const CXCursor &updateC) {
5053a86b37e223a21647175619096e67d0f650add351Argyrios Kyrtzidis  if (clang_isInvalid(updateC.kind) || !clang_isInvalid(Cursor.kind))
50547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return;
5055c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis  Cursor = updateC;
50567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
50577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
50587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \brief It annotates and advances tokens with a cursor until the comparison
50597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//// between the cursor location and the source range is the same as
50607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \arg compResult.
50617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei///
50627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// Pass RangeBefore to annotate tokens with a cursor until a range is reached.
50637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// Pass RangeOverlap to annotate tokens inside a range.
50647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid AnnotateTokensWorker::annotateAndAdvanceTokens(CXCursor updateC,
50657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                               RangeComparisonResult compResult,
50667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                               SourceRange range) {
50677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  while (MoreTokens()) {
50687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    const unsigned I = NextToken();
50697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (isFunctionMacroToken(I))
5070a86b37e223a21647175619096e67d0f650add351Argyrios Kyrtzidis      if (!annotateAndAdvanceFunctionMacroTokens(updateC, compResult, range))
5071a86b37e223a21647175619096e67d0f650add351Argyrios Kyrtzidis        return;
50727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
50737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    SourceLocation TokLoc = GetTokenLoc(I);
50747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (LocationCompare(SrcMgr, TokLoc, range) == compResult) {
5075c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis      updateCursorAnnotation(Cursors[I], updateC);
50767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      AdvanceToken();
50777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      continue;
50787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
50797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    break;
50807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
50817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
50827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
50837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \brief Special annotation handling for macro argument tokens.
5084a86b37e223a21647175619096e67d0f650add351Argyrios Kyrtzidis/// \returns true if it advanced beyond all macro tokens, false otherwise.
5085a86b37e223a21647175619096e67d0f650add351Argyrios Kyrtzidisbool AnnotateTokensWorker::annotateAndAdvanceFunctionMacroTokens(
50867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                               CXCursor updateC,
50877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                               RangeComparisonResult compResult,
50887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                               SourceRange range) {
50897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  assert(MoreTokens());
50907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  assert(isFunctionMacroToken(NextToken()) &&
50917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei         "Should be called only for macro arg tokens");
50927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
50937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // This works differently than annotateAndAdvanceTokens; because expanded
50947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // macro arguments can have arbitrary translation-unit source order, we do not
50957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // advance the token index one by one until a token fails the range test.
50967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // We only advance once past all of the macro arg tokens if all of them
50977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // pass the range test. If one of them fails we keep the token index pointing
50987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // at the start of the macro arg tokens so that the failing token will be
50997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // annotated by a subsequent annotation try.
51007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
51017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  bool atLeastOneCompFail = false;
51027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
51037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  unsigned I = NextToken();
51047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  for (; I < NumTokens && isFunctionMacroToken(I); ++I) {
51057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    SourceLocation TokLoc = getFunctionMacroTokenLoc(I);
51067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (TokLoc.isFileID())
51077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      continue; // not macro arg token, it's parens or comma.
51087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (LocationCompare(SrcMgr, TokLoc, range) == compResult) {
51097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (clang_isInvalid(clang_getCursorKind(Cursors[I])))
51107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        Cursors[I] = updateC;
51117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    } else
51127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      atLeastOneCompFail = true;
51137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
51147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
5115a86b37e223a21647175619096e67d0f650add351Argyrios Kyrtzidis  if (atLeastOneCompFail)
5116a86b37e223a21647175619096e67d0f650add351Argyrios Kyrtzidis    return false;
5117a86b37e223a21647175619096e67d0f650add351Argyrios Kyrtzidis
5118a86b37e223a21647175619096e67d0f650add351Argyrios Kyrtzidis  TokIdx = I; // All of the tokens were handled, advance beyond all of them.
5119a86b37e223a21647175619096e67d0f650add351Argyrios Kyrtzidis  return true;
51207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
51217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
51227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeienum CXChildVisitResult
51237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiAnnotateTokensWorker::Visit(CXCursor cursor, CXCursor parent) {
51247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  SourceRange cursorRange = getRawCursorExtent(cursor);
51257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (cursorRange.isInvalid())
51267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return CXChildVisit_Recurse;
51277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
51287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!HasContextSensitiveKeywords) {
51297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // Objective-C properties can have context-sensitive keywords.
51307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (cursor.kind == CXCursor_ObjCPropertyDecl) {
5131e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko      if (const ObjCPropertyDecl *Property
51327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                  = dyn_cast_or_null<ObjCPropertyDecl>(getCursorDecl(cursor)))
51337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        HasContextSensitiveKeywords = Property->getPropertyAttributesAsWritten() != 0;
51347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
51357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // Objective-C methods can have context-sensitive keywords.
51367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    else if (cursor.kind == CXCursor_ObjCInstanceMethodDecl ||
51377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei             cursor.kind == CXCursor_ObjCClassMethodDecl) {
5138e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko      if (const ObjCMethodDecl *Method
51397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            = dyn_cast_or_null<ObjCMethodDecl>(getCursorDecl(cursor))) {
51407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        if (Method->getObjCDeclQualifier())
51417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          HasContextSensitiveKeywords = true;
51427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        else {
5143e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko          for (ObjCMethodDecl::param_const_iterator P = Method->param_begin(),
5144e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko                                                 PEnd = Method->param_end();
51457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei               P != PEnd; ++P) {
51467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            if ((*P)->getObjCDeclQualifier()) {
51477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei              HasContextSensitiveKeywords = true;
51487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei              break;
51497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            }
51507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          }
51517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        }
51527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      }
51537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
51547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // C++ methods can have context-sensitive keywords.
51557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    else if (cursor.kind == CXCursor_CXXMethod) {
5156e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko      if (const CXXMethodDecl *Method
51577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                  = dyn_cast_or_null<CXXMethodDecl>(getCursorDecl(cursor))) {
51587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        if (Method->hasAttr<FinalAttr>() || Method->hasAttr<OverrideAttr>())
51597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          HasContextSensitiveKeywords = true;
51607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      }
51617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
51627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // C++ classes can have context-sensitive keywords.
51637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    else if (cursor.kind == CXCursor_StructDecl ||
51647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei             cursor.kind == CXCursor_ClassDecl ||
51657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei             cursor.kind == CXCursor_ClassTemplate ||
51667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei             cursor.kind == CXCursor_ClassTemplatePartialSpecialization) {
5167e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko      if (const Decl *D = getCursorDecl(cursor))
51687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        if (D->hasAttr<FinalAttr>())
51697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          HasContextSensitiveKeywords = true;
51707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
51717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
51727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
51737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (clang_isPreprocessing(cursor.kind)) {
51747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // Items in the preprocessing record are kept separate from items in
51757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // declarations, so we keep a separate token index.
51767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    unsigned SavedTokIdx = TokIdx;
51777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    TokIdx = PreprocessingTokIdx;
51787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
51797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // Skip tokens up until we catch up to the beginning of the preprocessing
51807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // entry.
51817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    while (MoreTokens()) {
51827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      const unsigned I = NextToken();
51837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      SourceLocation TokLoc = GetTokenLoc(I);
51847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      switch (LocationCompare(SrcMgr, TokLoc, cursorRange)) {
51857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      case RangeBefore:
51867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        AdvanceToken();
51877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        continue;
51887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      case RangeAfter:
51897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      case RangeOverlap:
51907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        break;
51917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      }
51927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      break;
51937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
51947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
51957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // Look at all of the tokens within this range.
51967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    while (MoreTokens()) {
51977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      const unsigned I = NextToken();
51987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      SourceLocation TokLoc = GetTokenLoc(I);
51997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      switch (LocationCompare(SrcMgr, TokLoc, cursorRange)) {
52007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      case RangeBefore:
52017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        llvm_unreachable("Infeasible");
52027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      case RangeAfter:
52037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        break;
52047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      case RangeOverlap:
520582064213e9ef308e9a929ecfb31f4698a834ecddArgyrios Kyrtzidis        // For macro expansions, just note where the beginning of the macro
520682064213e9ef308e9a929ecfb31f4698a834ecddArgyrios Kyrtzidis        // expansion occurs.
520782064213e9ef308e9a929ecfb31f4698a834ecddArgyrios Kyrtzidis        if (cursor.kind == CXCursor_MacroExpansion) {
520882064213e9ef308e9a929ecfb31f4698a834ecddArgyrios Kyrtzidis          if (TokLoc == cursorRange.getBegin())
520982064213e9ef308e9a929ecfb31f4698a834ecddArgyrios Kyrtzidis            Cursors[I] = cursor;
521082064213e9ef308e9a929ecfb31f4698a834ecddArgyrios Kyrtzidis          AdvanceToken();
521182064213e9ef308e9a929ecfb31f4698a834ecddArgyrios Kyrtzidis          break;
521282064213e9ef308e9a929ecfb31f4698a834ecddArgyrios Kyrtzidis        }
5213c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis        // We may have already annotated macro names inside macro definitions.
5214c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis        if (Cursors[I].kind != CXCursor_MacroExpansion)
5215c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis          Cursors[I] = cursor;
52167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        AdvanceToken();
52177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        continue;
52187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      }
52197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      break;
52207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
52217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
52227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // Save the preprocessing token index; restore the non-preprocessing
52237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // token index.
52247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    PreprocessingTokIdx = TokIdx;
52257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    TokIdx = SavedTokIdx;
52267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return CXChildVisit_Recurse;
52277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
52287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
52297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (cursorRange.isInvalid())
52307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return CXChildVisit_Continue;
5231a86b37e223a21647175619096e67d0f650add351Argyrios Kyrtzidis
5232a86b37e223a21647175619096e67d0f650add351Argyrios Kyrtzidis  unsigned BeforeReachingCursorIdx = NextToken();
52337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  const enum CXCursorKind cursorK = clang_getCursorKind(cursor);
52347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  const enum CXCursorKind K = clang_getCursorKind(parent);
52357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  const CXCursor updateC =
5236a86b37e223a21647175619096e67d0f650add351Argyrios Kyrtzidis    (clang_isInvalid(K) || K == CXCursor_TranslationUnit ||
5237a86b37e223a21647175619096e67d0f650add351Argyrios Kyrtzidis     // Attributes are annotated out-of-order, skip tokens until we reach it.
5238a86b37e223a21647175619096e67d0f650add351Argyrios Kyrtzidis     clang_isAttribute(cursor.kind))
52397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei     ? clang_getNullCursor() : parent;
52407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
52417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  annotateAndAdvanceTokens(updateC, RangeBefore, cursorRange);
52427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
52437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Avoid having the cursor of an expression "overwrite" the annotation of the
52447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // variable declaration that it belongs to.
52457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // This can happen for C++ constructor expressions whose range generally
52467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // include the variable declaration, e.g.:
52477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  //  MyCXXClass foo; // Make sure we don't annotate 'foo' as a CallExpr cursor.
52487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (clang_isExpression(cursorK)) {
5249ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko    const Expr *E = getCursorExpr(cursor);
5250404628caa53a3f898047d73b38647d6fbb827e00Dmitri Gribenko    if (const Decl *D = getCursorParentDecl(cursor)) {
52517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      const unsigned I = NextToken();
52527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (E->getLocStart().isValid() && D->getLocation().isValid() &&
52537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          E->getLocStart() == D->getLocation() &&
52547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          E->getLocStart() == GetTokenLoc(I)) {
5255c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis        updateCursorAnnotation(Cursors[I], updateC);
52567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        AdvanceToken();
52577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      }
52587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
52597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
52607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
52617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Before recursing into the children keep some state that we are going
52627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // to use in the AnnotateTokensWorker::postVisitChildren callback to do some
52637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // extra work after the child nodes are visited.
52647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Note that we don't call VisitChildren here to avoid traversing statements
52657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // code-recursively which can blow the stack.
52667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
52677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  PostChildrenInfo Info;
52687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  Info.Cursor = cursor;
52697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  Info.CursorRange = cursorRange;
5270a86b37e223a21647175619096e67d0f650add351Argyrios Kyrtzidis  Info.BeforeReachingCursorIdx = BeforeReachingCursorIdx;
52717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  Info.BeforeChildrenTokenIdx = NextToken();
52727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  PostChildrenInfos.push_back(Info);
52737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
52747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return CXChildVisit_Recurse;
52757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
52767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
52777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool AnnotateTokensWorker::postVisitChildren(CXCursor cursor) {
52787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (PostChildrenInfos.empty())
52797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return false;
52807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  const PostChildrenInfo &Info = PostChildrenInfos.back();
52817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!clang_equalCursors(Info.Cursor, cursor))
52827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return false;
52837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
52847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  const unsigned BeforeChildren = Info.BeforeChildrenTokenIdx;
52857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  const unsigned AfterChildren = NextToken();
52867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  SourceRange cursorRange = Info.CursorRange;
52877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
52887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Scan the tokens that are at the end of the cursor, but are not captured
52897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // but the child cursors.
52907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  annotateAndAdvanceTokens(cursor, RangeOverlap, cursorRange);
52917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
52927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Scan the tokens that are at the beginning of the cursor, but are not
52937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // capture by the child cursors.
52947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  for (unsigned I = BeforeChildren; I != AfterChildren; ++I) {
52957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (!clang_isInvalid(clang_getCursorKind(Cursors[I])))
52967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      break;
52977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
52987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    Cursors[I] = cursor;
52997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
53007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
5301a86b37e223a21647175619096e67d0f650add351Argyrios Kyrtzidis  // Attributes are annotated out-of-order, rewind TokIdx to when we first
5302a86b37e223a21647175619096e67d0f650add351Argyrios Kyrtzidis  // encountered the attribute cursor.
5303a86b37e223a21647175619096e67d0f650add351Argyrios Kyrtzidis  if (clang_isAttribute(cursor.kind))
5304a86b37e223a21647175619096e67d0f650add351Argyrios Kyrtzidis    TokIdx = Info.BeforeReachingCursorIdx;
5305a86b37e223a21647175619096e67d0f650add351Argyrios Kyrtzidis
53067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  PostChildrenInfos.pop_back();
53077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return false;
53087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
53097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
53107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic enum CXChildVisitResult AnnotateTokensVisitor(CXCursor cursor,
53117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                                     CXCursor parent,
53127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                                     CXClientData client_data) {
53137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return static_cast<AnnotateTokensWorker*>(client_data)->Visit(cursor, parent);
53147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
53157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
53167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic bool AnnotateTokensPostChildrenVisitor(CXCursor cursor,
53177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                              CXClientData client_data) {
53187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return static_cast<AnnotateTokensWorker*>(client_data)->
53197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                                      postVisitChildren(cursor);
53207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
53217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
53227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeinamespace {
53237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
53247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \brief Uses the macro expansions in the preprocessing record to find
53257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// and mark tokens that are macro arguments. This info is used by the
53267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// AnnotateTokensWorker.
53277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiclass MarkMacroArgTokensVisitor {
53287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  SourceManager &SM;
53297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  CXToken *Tokens;
53307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  unsigned NumTokens;
53317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  unsigned CurIdx;
53327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
53337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeipublic:
53347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  MarkMacroArgTokensVisitor(SourceManager &SM,
53357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                            CXToken *tokens, unsigned numTokens)
53367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    : SM(SM), Tokens(tokens), NumTokens(numTokens), CurIdx(0) { }
53377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
53387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  CXChildVisitResult visit(CXCursor cursor, CXCursor parent) {
53397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (cursor.kind != CXCursor_MacroExpansion)
53407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return CXChildVisit_Continue;
53417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
5342664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis    SourceRange macroRange = getCursorMacroExpansion(cursor).getSourceRange();
53437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (macroRange.getBegin() == macroRange.getEnd())
53447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return CXChildVisit_Continue; // it's not a function macro.
53457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
53467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    for (; CurIdx < NumTokens; ++CurIdx) {
53477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (!SM.isBeforeInTranslationUnit(getTokenLoc(CurIdx),
53487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                        macroRange.getBegin()))
53497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        break;
53507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
53517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
53527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (CurIdx == NumTokens)
53537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return CXChildVisit_Break;
53547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
53557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    for (; CurIdx < NumTokens; ++CurIdx) {
53567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      SourceLocation tokLoc = getTokenLoc(CurIdx);
53577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (!SM.isBeforeInTranslationUnit(tokLoc, macroRange.getEnd()))
53587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        break;
53597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
53607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      setFunctionMacroTokenLoc(CurIdx, SM.getMacroArgExpandedLocation(tokLoc));
53617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
53627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
53637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (CurIdx == NumTokens)
53647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return CXChildVisit_Break;
53657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
53667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return CXChildVisit_Continue;
53677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
53687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
53697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiprivate:
53707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  SourceLocation getTokenLoc(unsigned tokI) {
53717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return SourceLocation::getFromRawEncoding(Tokens[tokI].int_data[1]);
53727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
53737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
53747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  void setFunctionMacroTokenLoc(unsigned tokI, SourceLocation loc) {
53757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // The third field is reserved and currently not used. Use it here
53767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // to mark macro arg expanded tokens with their expanded locations.
53777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    Tokens[tokI].int_data[3] = loc.getRawEncoding();
53787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
53797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei};
53807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
53817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} // end anonymous namespace
53827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
53837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic CXChildVisitResult
53847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiMarkMacroArgTokensVisitorDelegate(CXCursor cursor, CXCursor parent,
53857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                  CXClientData client_data) {
53867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return static_cast<MarkMacroArgTokensVisitor*>(client_data)->visit(cursor,
53877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                                                     parent);
53887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
53897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
53907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeinamespace {
53917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  struct clang_annotateTokens_Data {
53927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    CXTranslationUnit TU;
53937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    ASTUnit *CXXUnit;
53947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    CXToken *Tokens;
53957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    unsigned NumTokens;
53967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    CXCursor *Cursors;
53977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  };
53987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
53997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
5400c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis/// \brief Used by \c annotatePreprocessorTokens.
5401c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis/// \returns true if lexing was finished, false otherwise.
5402c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidisstatic bool lexNext(Lexer &Lex, Token &Tok,
5403c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis                   unsigned &NextIdx, unsigned NumTokens) {
5404c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis  if (NextIdx >= NumTokens)
5405c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis    return true;
5406c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis
5407c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis  ++NextIdx;
5408c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis  Lex.LexFromRawLexer(Tok);
5409c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis  if (Tok.is(tok::eof))
5410c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis    return true;
5411c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis
5412c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis  return false;
5413c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis}
5414c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis
54157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic void annotatePreprocessorTokens(CXTranslationUnit TU,
54167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                       SourceRange RegionOfInterest,
5417c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis                                       CXCursor *Cursors,
5418c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis                                       CXToken *Tokens,
5419c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis                                       unsigned NumTokens) {
54205694feb5ccd6eb862cb600b55753cecc13794471Dmitri Gribenko  ASTUnit *CXXUnit = cxtu::getASTUnit(TU);
54217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
54223453bf7da9ac88cd2421b7fdccebf5cd2b8a9d87Argyrios Kyrtzidis  Preprocessor &PP = CXXUnit->getPreprocessor();
54237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  SourceManager &SourceMgr = CXXUnit->getSourceManager();
54247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  std::pair<FileID, unsigned> BeginLocInfo
542582064213e9ef308e9a929ecfb31f4698a834ecddArgyrios Kyrtzidis    = SourceMgr.getDecomposedSpellingLoc(RegionOfInterest.getBegin());
54267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  std::pair<FileID, unsigned> EndLocInfo
542782064213e9ef308e9a929ecfb31f4698a834ecddArgyrios Kyrtzidis    = SourceMgr.getDecomposedSpellingLoc(RegionOfInterest.getEnd());
54287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
54297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (BeginLocInfo.first != EndLocInfo.first)
54307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return;
54317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
54327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  StringRef Buffer;
54337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  bool Invalid = false;
54347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  Buffer = SourceMgr.getBufferData(BeginLocInfo.first, &Invalid);
54357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (Buffer.empty() || Invalid)
54367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return;
54377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
54387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  Lexer Lex(SourceMgr.getLocForStartOfFile(BeginLocInfo.first),
54397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            CXXUnit->getASTContext().getLangOpts(),
54407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            Buffer.begin(), Buffer.data() + BeginLocInfo.second,
54417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            Buffer.end());
54427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  Lex.SetCommentRetentionState(true);
54437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
5444c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis  unsigned NextIdx = 0;
54457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Lex tokens in raw mode until we hit the end of the range, to avoid
54467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // entering #includes or expanding macros.
54477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  while (true) {
54487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    Token Tok;
5449c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis    if (lexNext(Lex, Tok, NextIdx, NumTokens))
5450c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis      break;
5451c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis    unsigned TokIdx = NextIdx-1;
5452c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis    assert(Tok.getLocation() ==
5453c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis             SourceLocation::getFromRawEncoding(Tokens[TokIdx].int_data[1]));
54547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
54557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  reprocess:
54567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (Tok.is(tok::hash) && Tok.isAtStartOfLine()) {
5457c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis      // We have found a preprocessing directive. Annotate the tokens
5458c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis      // appropriately.
54597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      //
54607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // FIXME: Some simple tests here could identify macro definitions and
54617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // #undefs, to provide specific cursor kinds for those.
5462c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis
5463c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis      SourceLocation BeginLoc = Tok.getLocation();
54643453bf7da9ac88cd2421b7fdccebf5cd2b8a9d87Argyrios Kyrtzidis      if (lexNext(Lex, Tok, NextIdx, NumTokens))
54653453bf7da9ac88cd2421b7fdccebf5cd2b8a9d87Argyrios Kyrtzidis        break;
54663453bf7da9ac88cd2421b7fdccebf5cd2b8a9d87Argyrios Kyrtzidis
54673453bf7da9ac88cd2421b7fdccebf5cd2b8a9d87Argyrios Kyrtzidis      MacroInfo *MI = 0;
54683453bf7da9ac88cd2421b7fdccebf5cd2b8a9d87Argyrios Kyrtzidis      if (Tok.is(tok::raw_identifier) &&
54693453bf7da9ac88cd2421b7fdccebf5cd2b8a9d87Argyrios Kyrtzidis          StringRef(Tok.getRawIdentifierData(), Tok.getLength()) == "define") {
54703453bf7da9ac88cd2421b7fdccebf5cd2b8a9d87Argyrios Kyrtzidis        if (lexNext(Lex, Tok, NextIdx, NumTokens))
54713453bf7da9ac88cd2421b7fdccebf5cd2b8a9d87Argyrios Kyrtzidis          break;
54723453bf7da9ac88cd2421b7fdccebf5cd2b8a9d87Argyrios Kyrtzidis
54733453bf7da9ac88cd2421b7fdccebf5cd2b8a9d87Argyrios Kyrtzidis        if (Tok.is(tok::raw_identifier)) {
54743453bf7da9ac88cd2421b7fdccebf5cd2b8a9d87Argyrios Kyrtzidis          StringRef Name(Tok.getRawIdentifierData(), Tok.getLength());
54753453bf7da9ac88cd2421b7fdccebf5cd2b8a9d87Argyrios Kyrtzidis          IdentifierInfo &II = PP.getIdentifierTable().get(Name);
54763453bf7da9ac88cd2421b7fdccebf5cd2b8a9d87Argyrios Kyrtzidis          SourceLocation MappedTokLoc =
54773453bf7da9ac88cd2421b7fdccebf5cd2b8a9d87Argyrios Kyrtzidis              CXXUnit->mapLocationToPreamble(Tok.getLocation());
54783453bf7da9ac88cd2421b7fdccebf5cd2b8a9d87Argyrios Kyrtzidis          MI = getMacroInfo(II, MappedTokLoc, TU);
54793453bf7da9ac88cd2421b7fdccebf5cd2b8a9d87Argyrios Kyrtzidis        }
54803453bf7da9ac88cd2421b7fdccebf5cd2b8a9d87Argyrios Kyrtzidis      }
54813453bf7da9ac88cd2421b7fdccebf5cd2b8a9d87Argyrios Kyrtzidis
5482c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis      bool finished = false;
54837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      do {
5484c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis        if (lexNext(Lex, Tok, NextIdx, NumTokens)) {
5485c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis          finished = true;
5486c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis          break;
5487c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis        }
54883453bf7da9ac88cd2421b7fdccebf5cd2b8a9d87Argyrios Kyrtzidis        // If we are in a macro definition, check if the token was ever a
54893453bf7da9ac88cd2421b7fdccebf5cd2b8a9d87Argyrios Kyrtzidis        // macro name and annotate it if that's the case.
54903453bf7da9ac88cd2421b7fdccebf5cd2b8a9d87Argyrios Kyrtzidis        if (MI) {
54913453bf7da9ac88cd2421b7fdccebf5cd2b8a9d87Argyrios Kyrtzidis          SourceLocation SaveLoc = Tok.getLocation();
54923453bf7da9ac88cd2421b7fdccebf5cd2b8a9d87Argyrios Kyrtzidis          Tok.setLocation(CXXUnit->mapLocationToPreamble(SaveLoc));
54933453bf7da9ac88cd2421b7fdccebf5cd2b8a9d87Argyrios Kyrtzidis          MacroDefinition *MacroDef = checkForMacroInMacroDefinition(MI,Tok,TU);
54943453bf7da9ac88cd2421b7fdccebf5cd2b8a9d87Argyrios Kyrtzidis          Tok.setLocation(SaveLoc);
54953453bf7da9ac88cd2421b7fdccebf5cd2b8a9d87Argyrios Kyrtzidis          if (MacroDef)
54963453bf7da9ac88cd2421b7fdccebf5cd2b8a9d87Argyrios Kyrtzidis            Cursors[NextIdx-1] = MakeMacroExpansionCursor(MacroDef,
54973453bf7da9ac88cd2421b7fdccebf5cd2b8a9d87Argyrios Kyrtzidis                                                         Tok.getLocation(), TU);
54983453bf7da9ac88cd2421b7fdccebf5cd2b8a9d87Argyrios Kyrtzidis        }
5499c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis      } while (!Tok.isAtStartOfLine());
5500c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis
5501c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis      unsigned LastIdx = finished ? NextIdx-1 : NextIdx-2;
5502c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis      assert(TokIdx <= LastIdx);
5503c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis      SourceLocation EndLoc =
5504c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis          SourceLocation::getFromRawEncoding(Tokens[LastIdx].int_data[1]);
5505c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis      CXCursor Cursor =
5506c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis          MakePreprocessingDirectiveCursor(SourceRange(BeginLoc, EndLoc), TU);
5507c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis
5508c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis      for (; TokIdx <= LastIdx; ++TokIdx)
55093453bf7da9ac88cd2421b7fdccebf5cd2b8a9d87Argyrios Kyrtzidis        updateCursorAnnotation(Cursors[TokIdx], Cursor);
55107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
5511c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis      if (finished)
5512c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis        break;
5513c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis      goto reprocess;
55147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
55157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
55167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
55177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
55187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// This gets run a separate thread to avoid stack blowout.
55197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic void clang_annotateTokensImpl(void *UserData) {
55207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  CXTranslationUnit TU = ((clang_annotateTokens_Data*)UserData)->TU;
55217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  ASTUnit *CXXUnit = ((clang_annotateTokens_Data*)UserData)->CXXUnit;
55227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  CXToken *Tokens = ((clang_annotateTokens_Data*)UserData)->Tokens;
55237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  const unsigned NumTokens = ((clang_annotateTokens_Data*)UserData)->NumTokens;
55247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  CXCursor *Cursors = ((clang_annotateTokens_Data*)UserData)->Cursors;
55257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
55268c718e7d87018919b5b84b0d545fe477b2d532d1Dmitri Gribenko  CIndexer *CXXIdx = TU->CIdx;
55277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (CXXIdx->isOptEnabled(CXGlobalOpt_ThreadBackgroundPriorityForEditing))
55287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    setThreadBackgroundPriority();
55297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
55307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Determine the region of interest, which contains all of the tokens.
55317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  SourceRange RegionOfInterest;
55327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  RegionOfInterest.setBegin(
55337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    cxloc::translateSourceLocation(clang_getTokenLocation(TU, Tokens[0])));
55347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  RegionOfInterest.setEnd(
55357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    cxloc::translateSourceLocation(clang_getTokenLocation(TU,
55367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                                         Tokens[NumTokens-1])));
55377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
55387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Relex the tokens within the source range to look for preprocessing
55397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // directives.
5540c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis  annotatePreprocessorTokens(TU, RegionOfInterest, Cursors, Tokens, NumTokens);
554182064213e9ef308e9a929ecfb31f4698a834ecddArgyrios Kyrtzidis
554282064213e9ef308e9a929ecfb31f4698a834ecddArgyrios Kyrtzidis  // If begin location points inside a macro argument, set it to the expansion
554382064213e9ef308e9a929ecfb31f4698a834ecddArgyrios Kyrtzidis  // location so we can have the full context when annotating semantically.
554482064213e9ef308e9a929ecfb31f4698a834ecddArgyrios Kyrtzidis  {
554582064213e9ef308e9a929ecfb31f4698a834ecddArgyrios Kyrtzidis    SourceManager &SM = CXXUnit->getSourceManager();
554682064213e9ef308e9a929ecfb31f4698a834ecddArgyrios Kyrtzidis    SourceLocation Loc =
554782064213e9ef308e9a929ecfb31f4698a834ecddArgyrios Kyrtzidis        SM.getMacroArgExpandedLocation(RegionOfInterest.getBegin());
554882064213e9ef308e9a929ecfb31f4698a834ecddArgyrios Kyrtzidis    if (Loc.isMacroID())
554982064213e9ef308e9a929ecfb31f4698a834ecddArgyrios Kyrtzidis      RegionOfInterest.setBegin(SM.getExpansionLoc(Loc));
555082064213e9ef308e9a929ecfb31f4698a834ecddArgyrios Kyrtzidis  }
555182064213e9ef308e9a929ecfb31f4698a834ecddArgyrios Kyrtzidis
55527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (CXXUnit->getPreprocessor().getPreprocessingRecord()) {
55537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // Search and mark tokens that are macro argument expansions.
55547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    MarkMacroArgTokensVisitor Visitor(CXXUnit->getSourceManager(),
55557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                      Tokens, NumTokens);
55567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    CursorVisitor MacroArgMarker(TU,
55577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                 MarkMacroArgTokensVisitorDelegate, &Visitor,
55587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                 /*VisitPreprocessorLast=*/true,
55597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                 /*VisitIncludedEntities=*/false,
55607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                 RegionOfInterest);
55617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    MacroArgMarker.visitPreprocessedEntitiesInRegion();
55627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
55637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
55647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Annotate all of the source locations in the region of interest that map to
55657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // a specific cursor.
5566c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis  AnnotateTokensWorker W(Tokens, Cursors, NumTokens, TU, RegionOfInterest);
55677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
55687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // FIXME: We use a ridiculous stack size here because the data-recursion
55697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // algorithm uses a large stack frame than the non-data recursive version,
55707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // and AnnotationTokensWorker currently transforms the data-recursion
55717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // algorithm back into a traditional recursion by explicitly calling
55727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // VisitChildren().  We will need to remove this explicit recursive call.
55737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  W.AnnotateTokens();
55747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
55757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // If we ran into any entities that involve context-sensitive keywords,
55767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // take another pass through the tokens to mark them as such.
55777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (W.hasContextSensitiveKeywords()) {
55787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    for (unsigned I = 0; I != NumTokens; ++I) {
55797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (clang_getTokenKind(Tokens[I]) != CXToken_Identifier)
55807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        continue;
55817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
55827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (Cursors[I].kind == CXCursor_ObjCPropertyDecl) {
55837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        IdentifierInfo *II = static_cast<IdentifierInfo *>(Tokens[I].ptr_data);
5584e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko        if (const ObjCPropertyDecl *Property
55857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            = dyn_cast_or_null<ObjCPropertyDecl>(getCursorDecl(Cursors[I]))) {
55867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          if (Property->getPropertyAttributesAsWritten() != 0 &&
55877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei              llvm::StringSwitch<bool>(II->getName())
55887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei              .Case("readonly", true)
55897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei              .Case("assign", true)
55907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei              .Case("unsafe_unretained", true)
55917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei              .Case("readwrite", true)
55927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei              .Case("retain", true)
55937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei              .Case("copy", true)
55947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei              .Case("nonatomic", true)
55957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei              .Case("atomic", true)
55967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei              .Case("getter", true)
55977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei              .Case("setter", true)
55987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei              .Case("strong", true)
55997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei              .Case("weak", true)
56007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei              .Default(false))
56017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            Tokens[I].int_data[0] = CXToken_Keyword;
56027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        }
56037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        continue;
56047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      }
56057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
56067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (Cursors[I].kind == CXCursor_ObjCInstanceMethodDecl ||
56077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          Cursors[I].kind == CXCursor_ObjCClassMethodDecl) {
56087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        IdentifierInfo *II = static_cast<IdentifierInfo *>(Tokens[I].ptr_data);
56097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        if (llvm::StringSwitch<bool>(II->getName())
56107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            .Case("in", true)
56117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            .Case("out", true)
56127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            .Case("inout", true)
56137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            .Case("oneway", true)
56147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            .Case("bycopy", true)
56157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            .Case("byref", true)
56167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            .Default(false))
56177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          Tokens[I].int_data[0] = CXToken_Keyword;
56187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        continue;
56197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      }
56207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
56217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (Cursors[I].kind == CXCursor_CXXFinalAttr ||
56227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          Cursors[I].kind == CXCursor_CXXOverrideAttr) {
56237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        Tokens[I].int_data[0] = CXToken_Keyword;
56247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        continue;
56257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      }
56267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
56277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
56287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
56297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
56307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiextern "C" {
56317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
56327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid clang_annotateTokens(CXTranslationUnit TU,
56337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                          CXToken *Tokens, unsigned NumTokens,
56347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                          CXCursor *Cursors) {
56350b602836c63e702b2ba893e8439996b226fc248fArgyrios Kyrtzidis  if (!TU || NumTokens == 0 || !Tokens || !Cursors) {
5636c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis    LOG_FUNC_SECTION { *Log << "<null input>"; }
56377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return;
5638c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  }
5639c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis
5640c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  LOG_FUNC_SECTION {
5641c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis    *Log << TU << ' ';
5642c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis    CXSourceLocation bloc = clang_getTokenLocation(TU, Tokens[0]);
5643c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis    CXSourceLocation eloc = clang_getTokenLocation(TU, Tokens[NumTokens-1]);
5644c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis    *Log << clang_getRange(bloc, eloc);
5645c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  }
56467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
56477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Any token we don't specifically annotate will have a NULL cursor.
56487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  CXCursor C = clang_getNullCursor();
56497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  for (unsigned I = 0; I != NumTokens; ++I)
56507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    Cursors[I] = C;
56517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
56525694feb5ccd6eb862cb600b55753cecc13794471Dmitri Gribenko  ASTUnit *CXXUnit = cxtu::getASTUnit(TU);
56537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!CXXUnit)
56547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return;
56557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
56567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  ASTUnit::ConcurrencyCheck Check(*CXXUnit);
56577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
56587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  clang_annotateTokens_Data data = { TU, CXXUnit, Tokens, NumTokens, Cursors };
56597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  llvm::CrashRecoveryContext CRC;
56607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!RunSafely(CRC, clang_annotateTokensImpl, &data,
56617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                 GetSafetyThreadStackSize() * 2)) {
56627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    fprintf(stderr, "libclang: crash detected while annotating tokens\n");
56637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
56647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
56657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
56667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} // end: extern "C"
56677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
56687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----------------------------------------------------------------------===//
56697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// Operations for querying linkage of a cursor.
56707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----------------------------------------------------------------------===//
56717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
56727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiextern "C" {
56737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXLinkageKind clang_getCursorLinkage(CXCursor cursor) {
56747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!clang_isDeclaration(cursor.kind))
56757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return CXLinkage_Invalid;
56767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
5677e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko  const Decl *D = cxcursor::getCursorDecl(cursor);
5678e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko  if (const NamedDecl *ND = dyn_cast_or_null<NamedDecl>(D))
56797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    switch (ND->getLinkage()) {
56807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      case NoLinkage: return CXLinkage_NoLinkage;
56817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      case InternalLinkage: return CXLinkage_Internal;
56827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      case UniqueExternalLinkage: return CXLinkage_UniqueExternal;
56837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      case ExternalLinkage: return CXLinkage_External;
56847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    };
56857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
56867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return CXLinkage_Invalid;
56877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
56887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} // end: extern "C"
56897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
56907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----------------------------------------------------------------------===//
56917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// Operations for querying language of a cursor.
56927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----------------------------------------------------------------------===//
56937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
56947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic CXLanguageKind getDeclLanguage(const Decl *D) {
56957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!D)
56967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return CXLanguage_C;
56977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
56987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  switch (D->getKind()) {
56997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    default:
57007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      break;
57017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case Decl::ImplicitParam:
57027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case Decl::ObjCAtDefsField:
57037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case Decl::ObjCCategory:
57047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case Decl::ObjCCategoryImpl:
57057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case Decl::ObjCCompatibleAlias:
57067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case Decl::ObjCImplementation:
57077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case Decl::ObjCInterface:
57087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case Decl::ObjCIvar:
57097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case Decl::ObjCMethod:
57107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case Decl::ObjCProperty:
57117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case Decl::ObjCPropertyImpl:
57127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case Decl::ObjCProtocol:
57137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return CXLanguage_ObjC;
57147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case Decl::CXXConstructor:
57157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case Decl::CXXConversion:
57167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case Decl::CXXDestructor:
57177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case Decl::CXXMethod:
57187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case Decl::CXXRecord:
57197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case Decl::ClassTemplate:
57207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case Decl::ClassTemplatePartialSpecialization:
57217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case Decl::ClassTemplateSpecialization:
57227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case Decl::Friend:
57237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case Decl::FriendTemplate:
57247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case Decl::FunctionTemplate:
57257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case Decl::LinkageSpec:
57267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case Decl::Namespace:
57277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case Decl::NamespaceAlias:
57287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case Decl::NonTypeTemplateParm:
57297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case Decl::StaticAssert:
57307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case Decl::TemplateTemplateParm:
57317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case Decl::TemplateTypeParm:
57327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case Decl::UnresolvedUsingTypename:
57337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case Decl::UnresolvedUsingValue:
57347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case Decl::Using:
57357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case Decl::UsingDirective:
57367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case Decl::UsingShadow:
57377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return CXLanguage_CPlusPlus;
57387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
57397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
57407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return CXLanguage_C;
57417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
57427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
57437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiextern "C" {
57447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
57457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeienum CXAvailabilityKind clang_getCursorAvailability(CXCursor cursor) {
57467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (clang_isDeclaration(cursor.kind))
5747e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko    if (const Decl *D = cxcursor::getCursorDecl(cursor)) {
57487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (isa<FunctionDecl>(D) && cast<FunctionDecl>(D)->isDeleted())
57497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        return CXAvailability_Available;
57507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
57517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      switch (D->getAvailability()) {
57527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      case AR_Available:
57537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      case AR_NotYetIntroduced:
57547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        return CXAvailability_Available;
57557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
57567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      case AR_Deprecated:
57577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        return CXAvailability_Deprecated;
57587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
57597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      case AR_Unavailable:
57607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        return CXAvailability_NotAvailable;
57617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      }
57627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
57637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
57647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return CXAvailability_Available;
57657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
57667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
57677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic CXVersion convertVersion(VersionTuple In) {
57687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  CXVersion Out = { -1, -1, -1 };
57697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (In.empty())
57707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return Out;
57717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
57727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  Out.Major = In.getMajor();
57737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
57744a3012d4dd9748b18b53b90e855989d98308f990NAKAMURA Takumi  Optional<unsigned> Minor = In.getMinor();
57754a3012d4dd9748b18b53b90e855989d98308f990NAKAMURA Takumi  if (Minor.hasValue())
57767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    Out.Minor = *Minor;
57777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  else
57787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return Out;
57797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
57804a3012d4dd9748b18b53b90e855989d98308f990NAKAMURA Takumi  Optional<unsigned> Subminor = In.getSubminor();
57814a3012d4dd9748b18b53b90e855989d98308f990NAKAMURA Takumi  if (Subminor.hasValue())
57827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    Out.Subminor = *Subminor;
57837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
57847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return Out;
57857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
57867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
57877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiint clang_getCursorPlatformAvailability(CXCursor cursor,
57887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                        int *always_deprecated,
57897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                        CXString *deprecated_message,
57907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                        int *always_unavailable,
57917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                        CXString *unavailable_message,
57927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                        CXPlatformAvailability *availability,
57937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                        int availability_size) {
57947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (always_deprecated)
57957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    *always_deprecated = 0;
57967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (deprecated_message)
5797dc66adb40ee871b4c578ba615f45d82476c7119eDmitri Gribenko    *deprecated_message = cxstring::createEmpty();
57987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (always_unavailable)
57997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    *always_unavailable = 0;
58007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (unavailable_message)
5801dc66adb40ee871b4c578ba615f45d82476c7119eDmitri Gribenko    *unavailable_message = cxstring::createEmpty();
58027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
58037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!clang_isDeclaration(cursor.kind))
58047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return 0;
58057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
5806e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko  const Decl *D = cxcursor::getCursorDecl(cursor);
58077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!D)
58087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return 0;
58097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
58107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  int N = 0;
58117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  for (Decl::attr_iterator A = D->attr_begin(), AEnd = D->attr_end(); A != AEnd;
58127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei       ++A) {
58137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (DeprecatedAttr *Deprecated = dyn_cast<DeprecatedAttr>(*A)) {
58147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (always_deprecated)
58157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        *always_deprecated = 1;
58167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (deprecated_message)
58175595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko        *deprecated_message = cxstring::createDup(Deprecated->getMessage());
58187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      continue;
58197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
58207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
58217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (UnavailableAttr *Unavailable = dyn_cast<UnavailableAttr>(*A)) {
58227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (always_unavailable)
58237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        *always_unavailable = 1;
58247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (unavailable_message) {
58255595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko        *unavailable_message = cxstring::createDup(Unavailable->getMessage());
58267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      }
58277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      continue;
58287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
58297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
58307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (AvailabilityAttr *Avail = dyn_cast<AvailabilityAttr>(*A)) {
58317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (N < availability_size) {
58327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        availability[N].Platform
58335595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko          = cxstring::createDup(Avail->getPlatform()->getName());
58347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        availability[N].Introduced = convertVersion(Avail->getIntroduced());
58357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        availability[N].Deprecated = convertVersion(Avail->getDeprecated());
58367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        availability[N].Obsoleted = convertVersion(Avail->getObsoleted());
58377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        availability[N].Unavailable = Avail->getUnavailable();
58385595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko        availability[N].Message = cxstring::createDup(Avail->getMessage());
58397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      }
58407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      ++N;
58417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
58427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
58437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
58447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return N;
58457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
58467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
58477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid clang_disposeCXPlatformAvailability(CXPlatformAvailability *availability) {
58487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  clang_disposeString(availability->Platform);
58497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  clang_disposeString(availability->Message);
58507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
58517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
58527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXLanguageKind clang_getCursorLanguage(CXCursor cursor) {
58537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (clang_isDeclaration(cursor.kind))
58547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return getDeclLanguage(cxcursor::getCursorDecl(cursor));
58557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
58567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return CXLanguage_Invalid;
58577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
58587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
58597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /// \brief If the given cursor is the "templated" declaration
58607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /// descibing a class or function template, return the class or
58617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /// function template.
5862e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenkostatic const Decl *maybeGetTemplateCursor(const Decl *D) {
58637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!D)
58647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return 0;
58657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
5866e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko  if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D))
58677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (FunctionTemplateDecl *FunTmpl = FD->getDescribedFunctionTemplate())
58687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return FunTmpl;
58697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
5870e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko  if (const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(D))
58717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (ClassTemplateDecl *ClassTmpl = RD->getDescribedClassTemplate())
58727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return ClassTmpl;
58737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
58747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return D;
58757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
58767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
58777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXCursor clang_getCursorSemanticParent(CXCursor cursor) {
58787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (clang_isDeclaration(cursor.kind)) {
5879e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko    if (const Decl *D = getCursorDecl(cursor)) {
5880e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko      const DeclContext *DC = D->getDeclContext();
58817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (!DC)
58827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        return clang_getNullCursor();
58837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
58847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return MakeCXCursor(maybeGetTemplateCursor(cast<Decl>(DC)),
58857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                          getCursorTU(cursor));
58867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
58877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
58887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
58897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (clang_isStatement(cursor.kind) || clang_isExpression(cursor.kind)) {
5890e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko    if (const Decl *D = getCursorDecl(cursor))
58917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return MakeCXCursor(D, getCursorTU(cursor));
58927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
58937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
58947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return clang_getNullCursor();
58957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
58967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
58977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXCursor clang_getCursorLexicalParent(CXCursor cursor) {
58987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (clang_isDeclaration(cursor.kind)) {
5899e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko    if (const Decl *D = getCursorDecl(cursor)) {
5900e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko      const DeclContext *DC = D->getLexicalDeclContext();
59017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (!DC)
59027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        return clang_getNullCursor();
59037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
59047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return MakeCXCursor(maybeGetTemplateCursor(cast<Decl>(DC)),
59057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                          getCursorTU(cursor));
59067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
59077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
59087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
59097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // FIXME: Note that we can't easily compute the lexical context of a
59107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // statement or expression, so we return nothing.
59117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return clang_getNullCursor();
59127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
59137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
59147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXFile clang_getIncludedFile(CXCursor cursor) {
59157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (cursor.kind != CXCursor_InclusionDirective)
59167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return 0;
59177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
591867812b2f94f4b5e7d2596db1705ffa1149ddc45aDmitri Gribenko  const InclusionDirective *ID = getCursorInclusionDirective(cursor);
5919e4ea879fe73581bc70a9bfbfddc7ca06b5c0768bDmitri Gribenko  return const_cast<FileEntry *>(ID->getFile());
59207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
59217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
59227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXSourceRange clang_Cursor_getCommentRange(CXCursor C) {
59237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!clang_isDeclaration(C.kind))
59247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return clang_getNullRange();
59257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
59267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  const Decl *D = getCursorDecl(C);
59277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  ASTContext &Context = getCursorContext(C);
59287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  const RawComment *RC = Context.getRawCommentForAnyRedecl(D);
59297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!RC)
59307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return clang_getNullRange();
59317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
59327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return cxloc::translateSourceRange(Context, RC->getSourceRange());
59337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
59347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
59357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXString clang_Cursor_getRawCommentText(CXCursor C) {
59367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!clang_isDeclaration(C.kind))
5937dad4c1a9ac4ef1aa591ac2ef20dc4c30d96f9f2aDmitri Gribenko    return cxstring::createNull();
59387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
59397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  const Decl *D = getCursorDecl(C);
59407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  ASTContext &Context = getCursorContext(C);
59417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  const RawComment *RC = Context.getRawCommentForAnyRedecl(D);
59427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  StringRef RawText = RC ? RC->getRawText(Context.getSourceManager()) :
59437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                           StringRef();
59447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
59457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Don't duplicate the string because RawText points directly into source
59467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // code.
59475595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko  return cxstring::createRef(RawText);
59487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
59497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
59507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXString clang_Cursor_getBriefCommentText(CXCursor C) {
59517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!clang_isDeclaration(C.kind))
5952dad4c1a9ac4ef1aa591ac2ef20dc4c30d96f9f2aDmitri Gribenko    return cxstring::createNull();
59537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
59547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  const Decl *D = getCursorDecl(C);
59557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  const ASTContext &Context = getCursorContext(C);
59567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  const RawComment *RC = Context.getRawCommentForAnyRedecl(D);
59577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
59587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (RC) {
59597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    StringRef BriefText = RC->getBriefText(Context);
59607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
59617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // Don't duplicate the string because RawComment ensures that this memory
59627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // will not go away.
59635595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko    return cxstring::createRef(BriefText);
59647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
59657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
5966dad4c1a9ac4ef1aa591ac2ef20dc4c30d96f9f2aDmitri Gribenko  return cxstring::createNull();
59677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
59687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
59697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXComment clang_Cursor_getParsedComment(CXCursor C) {
59707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!clang_isDeclaration(C.kind))
59717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return cxcomment::createCXComment(NULL, NULL);
59727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
59737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  const Decl *D = getCursorDecl(C);
59747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  const ASTContext &Context = getCursorContext(C);
59757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  const comments::FullComment *FC = Context.getCommentForDecl(D, /*PP=*/ NULL);
59767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
59777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return cxcomment::createCXComment(FC, getCursorTU(C));
59787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
59797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
59807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXModule clang_Cursor_getModule(CXCursor C) {
59817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (C.kind == CXCursor_ModuleImportDecl) {
5982e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko    if (const ImportDecl *ImportD =
5983e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko            dyn_cast_or_null<ImportDecl>(getCursorDecl(C)))
59847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return ImportD->getImportedModule();
59857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
59867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
59877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return 0;
59887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
59897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
59907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXModule clang_Module_getParent(CXModule CXMod) {
59917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!CXMod)
59927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return 0;
59937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  Module *Mod = static_cast<Module*>(CXMod);
59947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return Mod->Parent;
59957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
59967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
59977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXString clang_Module_getName(CXModule CXMod) {
59987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!CXMod)
5999dc66adb40ee871b4c578ba615f45d82476c7119eDmitri Gribenko    return cxstring::createEmpty();
60007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  Module *Mod = static_cast<Module*>(CXMod);
60015595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko  return cxstring::createDup(Mod->Name);
60027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
60037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
60047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXString clang_Module_getFullName(CXModule CXMod) {
60057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!CXMod)
6006dc66adb40ee871b4c578ba615f45d82476c7119eDmitri Gribenko    return cxstring::createEmpty();
60077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  Module *Mod = static_cast<Module*>(CXMod);
60085595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko  return cxstring::createDup(Mod->getFullModuleName());
60097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
60107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
6011c1d22393628a145e54396c0ac66e9625d13a7658Argyrios Kyrtzidisunsigned clang_Module_getNumTopLevelHeaders(CXTranslationUnit TU,
6012c1d22393628a145e54396c0ac66e9625d13a7658Argyrios Kyrtzidis                                            CXModule CXMod) {
6013c1d22393628a145e54396c0ac66e9625d13a7658Argyrios Kyrtzidis  if (!TU || !CXMod)
60147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return 0;
60157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  Module *Mod = static_cast<Module*>(CXMod);
6016c1d22393628a145e54396c0ac66e9625d13a7658Argyrios Kyrtzidis  FileManager &FileMgr = cxtu::getASTUnit(TU)->getFileManager();
6017c1d22393628a145e54396c0ac66e9625d13a7658Argyrios Kyrtzidis  ArrayRef<const FileEntry *> TopHeaders = Mod->getTopHeaders(FileMgr);
6018c1d22393628a145e54396c0ac66e9625d13a7658Argyrios Kyrtzidis  return TopHeaders.size();
60197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
60207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
6021c1d22393628a145e54396c0ac66e9625d13a7658Argyrios KyrtzidisCXFile clang_Module_getTopLevelHeader(CXTranslationUnit TU,
6022c1d22393628a145e54396c0ac66e9625d13a7658Argyrios Kyrtzidis                                      CXModule CXMod, unsigned Index) {
6023c1d22393628a145e54396c0ac66e9625d13a7658Argyrios Kyrtzidis  if (!TU || !CXMod)
60247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return 0;
60257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  Module *Mod = static_cast<Module*>(CXMod);
6026c1d22393628a145e54396c0ac66e9625d13a7658Argyrios Kyrtzidis  FileManager &FileMgr = cxtu::getASTUnit(TU)->getFileManager();
60277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
6028c1d22393628a145e54396c0ac66e9625d13a7658Argyrios Kyrtzidis  ArrayRef<const FileEntry *> TopHeaders = Mod->getTopHeaders(FileMgr);
6029c1d22393628a145e54396c0ac66e9625d13a7658Argyrios Kyrtzidis  if (Index < TopHeaders.size())
6030c1d22393628a145e54396c0ac66e9625d13a7658Argyrios Kyrtzidis    return const_cast<FileEntry *>(TopHeaders[Index]);
60317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
60327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return 0;
60337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
60347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
60357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} // end: extern "C"
60367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
60377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----------------------------------------------------------------------===//
60387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// C++ AST instrospection.
60397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----------------------------------------------------------------------===//
60407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
60417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiextern "C" {
60427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiunsigned clang_CXXMethod_isStatic(CXCursor C) {
60437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!clang_isDeclaration(C.kind))
60447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return 0;
60457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
6046e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko  const CXXMethodDecl *Method = 0;
6047e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko  const Decl *D = cxcursor::getCursorDecl(C);
6048e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko  if (const FunctionTemplateDecl *FunTmpl =
6049e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko          dyn_cast_or_null<FunctionTemplateDecl>(D))
60507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    Method = dyn_cast<CXXMethodDecl>(FunTmpl->getTemplatedDecl());
60517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  else
60527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    Method = dyn_cast_or_null<CXXMethodDecl>(D);
60537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return (Method && Method->isStatic()) ? 1 : 0;
60547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
60557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
60567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiunsigned clang_CXXMethod_isVirtual(CXCursor C) {
60577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!clang_isDeclaration(C.kind))
60587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return 0;
60597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
6060e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko  const CXXMethodDecl *Method = 0;
6061e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko  const Decl *D = cxcursor::getCursorDecl(C);
6062e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko  if (const FunctionTemplateDecl *FunTmpl =
6063e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko          dyn_cast_or_null<FunctionTemplateDecl>(D))
60647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    Method = dyn_cast<CXXMethodDecl>(FunTmpl->getTemplatedDecl());
60657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  else
60667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    Method = dyn_cast_or_null<CXXMethodDecl>(D);
60677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return (Method && Method->isVirtual()) ? 1 : 0;
60687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
60697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} // end: extern "C"
60707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
60717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----------------------------------------------------------------------===//
60727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// Attribute introspection.
60737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----------------------------------------------------------------------===//
60747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
60757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiextern "C" {
60767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXType clang_getIBOutletCollectionType(CXCursor C) {
60777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (C.kind != CXCursor_IBOutletCollectionAttr)
60787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return cxtype::MakeCXType(QualType(), cxcursor::getCursorTU(C));
60797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
60807d91438047450869d7b881e1c63868c4b52a3cc2Dmitri Gribenko  const IBOutletCollectionAttr *A =
60817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    cast<IBOutletCollectionAttr>(cxcursor::getCursorAttr(C));
60827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
60837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return cxtype::MakeCXType(A->getInterface(), cxcursor::getCursorTU(C));
60847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
60857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} // end: extern "C"
60867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
60877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----------------------------------------------------------------------===//
60887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// Inspecting memory usage.
60897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----------------------------------------------------------------------===//
60907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
60917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeitypedef std::vector<CXTUResourceUsageEntry> MemUsageEntries;
60927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
60937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic inline void createCXTUResourceUsageEntry(MemUsageEntries &entries,
60947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                              enum CXTUResourceUsageKind k,
60957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                              unsigned long amount) {
60967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  CXTUResourceUsageEntry entry = { k, amount };
60977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  entries.push_back(entry);
60987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
60997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
61007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiextern "C" {
61017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
61027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiconst char *clang_getTUResourceUsageName(CXTUResourceUsageKind kind) {
61037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  const char *str = "";
61047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  switch (kind) {
61057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXTUResourceUsage_AST:
61067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      str = "ASTContext: expressions, declarations, and types";
61077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      break;
61087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXTUResourceUsage_Identifiers:
61097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      str = "ASTContext: identifiers";
61107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      break;
61117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXTUResourceUsage_Selectors:
61127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      str = "ASTContext: selectors";
61137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      break;
61147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXTUResourceUsage_GlobalCompletionResults:
61157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      str = "Code completion: cached global results";
61167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      break;
61177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXTUResourceUsage_SourceManagerContentCache:
61187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      str = "SourceManager: content cache allocator";
61197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      break;
61207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXTUResourceUsage_AST_SideTables:
61217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      str = "ASTContext: side tables";
61227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      break;
61237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXTUResourceUsage_SourceManager_Membuffer_Malloc:
61247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      str = "SourceManager: malloc'ed memory buffers";
61257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      break;
61267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXTUResourceUsage_SourceManager_Membuffer_MMap:
61277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      str = "SourceManager: mmap'ed memory buffers";
61287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      break;
61297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXTUResourceUsage_ExternalASTSource_Membuffer_Malloc:
61307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      str = "ExternalASTSource: malloc'ed memory buffers";
61317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      break;
61327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXTUResourceUsage_ExternalASTSource_Membuffer_MMap:
61337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      str = "ExternalASTSource: mmap'ed memory buffers";
61347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      break;
61357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXTUResourceUsage_Preprocessor:
61367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      str = "Preprocessor: malloc'ed memory";
61377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      break;
61387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXTUResourceUsage_PreprocessingRecord:
61397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      str = "Preprocessor: PreprocessingRecord";
61407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      break;
61417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXTUResourceUsage_SourceManager_DataStructures:
61427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      str = "SourceManager: data structures and tables";
61437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      break;
61447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXTUResourceUsage_Preprocessor_HeaderSearch:
61457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      str = "Preprocessor: header search tables";
61467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      break;
61477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
61487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return str;
61497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
61507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
61517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXTUResourceUsage clang_getCXTUResourceUsage(CXTranslationUnit TU) {
61527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!TU) {
61537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    CXTUResourceUsage usage = { (void*) 0, 0, 0 };
61547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return usage;
61557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
61567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
61575694feb5ccd6eb862cb600b55753cecc13794471Dmitri Gribenko  ASTUnit *astUnit = cxtu::getASTUnit(TU);
61587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  OwningPtr<MemUsageEntries> entries(new MemUsageEntries());
61597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  ASTContext &astContext = astUnit->getASTContext();
61607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
61617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // How much memory is used by AST nodes and types?
61627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  createCXTUResourceUsageEntry(*entries, CXTUResourceUsage_AST,
61637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    (unsigned long) astContext.getASTAllocatedMemory());
61647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
61657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // How much memory is used by identifiers?
61667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  createCXTUResourceUsageEntry(*entries, CXTUResourceUsage_Identifiers,
61677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    (unsigned long) astContext.Idents.getAllocator().getTotalMemory());
61687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
61697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // How much memory is used for selectors?
61707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  createCXTUResourceUsageEntry(*entries, CXTUResourceUsage_Selectors,
61717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    (unsigned long) astContext.Selectors.getTotalMemory());
61727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
61737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // How much memory is used by ASTContext's side tables?
61747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  createCXTUResourceUsageEntry(*entries, CXTUResourceUsage_AST_SideTables,
61757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    (unsigned long) astContext.getSideTableAllocatedMemory());
61767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
61777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // How much memory is used for caching global code completion results?
61787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  unsigned long completionBytes = 0;
61797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (GlobalCodeCompletionAllocator *completionAllocator =
61807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      astUnit->getCachedCompletionAllocator().getPtr()) {
61817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    completionBytes = completionAllocator->getTotalMemory();
61827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
61837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  createCXTUResourceUsageEntry(*entries,
61847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                               CXTUResourceUsage_GlobalCompletionResults,
61857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                               completionBytes);
61867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
61877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // How much memory is being used by SourceManager's content cache?
61887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  createCXTUResourceUsageEntry(*entries,
61897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          CXTUResourceUsage_SourceManagerContentCache,
61907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          (unsigned long) astContext.getSourceManager().getContentCacheSize());
61917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
61927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // How much memory is being used by the MemoryBuffer's in SourceManager?
61937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  const SourceManager::MemoryBufferSizes &srcBufs =
61947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    astUnit->getSourceManager().getMemoryBufferSizes();
61957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
61967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  createCXTUResourceUsageEntry(*entries,
61977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                               CXTUResourceUsage_SourceManager_Membuffer_Malloc,
61987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                               (unsigned long) srcBufs.malloc_bytes);
61997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  createCXTUResourceUsageEntry(*entries,
62007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                               CXTUResourceUsage_SourceManager_Membuffer_MMap,
62017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                               (unsigned long) srcBufs.mmap_bytes);
62027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  createCXTUResourceUsageEntry(*entries,
62037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                               CXTUResourceUsage_SourceManager_DataStructures,
62047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                               (unsigned long) astContext.getSourceManager()
62057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                .getDataStructureSizes());
62067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
62077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // How much memory is being used by the ExternalASTSource?
62087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (ExternalASTSource *esrc = astContext.getExternalSource()) {
62097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    const ExternalASTSource::MemoryBufferSizes &sizes =
62107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      esrc->getMemoryBufferSizes();
62117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
62127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    createCXTUResourceUsageEntry(*entries,
62137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      CXTUResourceUsage_ExternalASTSource_Membuffer_Malloc,
62147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                 (unsigned long) sizes.malloc_bytes);
62157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    createCXTUResourceUsageEntry(*entries,
62167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      CXTUResourceUsage_ExternalASTSource_Membuffer_MMap,
62177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                 (unsigned long) sizes.mmap_bytes);
62187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
62197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
62207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // How much memory is being used by the Preprocessor?
62217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  Preprocessor &pp = astUnit->getPreprocessor();
62227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  createCXTUResourceUsageEntry(*entries,
62237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                               CXTUResourceUsage_Preprocessor,
62247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                               pp.getTotalMemory());
62257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
62267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (PreprocessingRecord *pRec = pp.getPreprocessingRecord()) {
62277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    createCXTUResourceUsageEntry(*entries,
62287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                 CXTUResourceUsage_PreprocessingRecord,
62297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                 pRec->getTotalMemory());
62307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
62317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
62327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  createCXTUResourceUsageEntry(*entries,
62337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                               CXTUResourceUsage_Preprocessor_HeaderSearch,
62347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                               pp.getHeaderSearchInfo().getTotalMemory());
62357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
62367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  CXTUResourceUsage usage = { (void*) entries.get(),
62377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                            (unsigned) entries->size(),
62387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                            entries->size() ? &(*entries)[0] : 0 };
62397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  entries.take();
62407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return usage;
62417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
62427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
62437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid clang_disposeCXTUResourceUsage(CXTUResourceUsage usage) {
62447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (usage.data)
62457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    delete (MemUsageEntries*) usage.data;
62467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
62477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
62487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} // end extern "C"
62497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
62507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid clang::PrintLibclangResourceUsage(CXTranslationUnit TU) {
62517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  CXTUResourceUsage Usage = clang_getCXTUResourceUsage(TU);
62527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  for (unsigned I = 0; I != Usage.numEntries; ++I)
62537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    fprintf(stderr, "  %s: %lu\n",
62547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            clang_getTUResourceUsageName(Usage.entries[I].kind),
62557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            Usage.entries[I].amount);
62567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
62577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  clang_disposeCXTUResourceUsage(Usage);
62587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
62597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
62607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----------------------------------------------------------------------===//
62617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// Misc. utility functions.
62627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----------------------------------------------------------------------===//
62637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
62647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// Default to using an 8 MB stack size on "safety" threads.
62657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic unsigned SafetyStackThreadSize = 8 << 20;
62667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
62677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeinamespace clang {
62687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
62697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool RunSafely(llvm::CrashRecoveryContext &CRC,
62707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei               void (*Fn)(void*), void *UserData,
62717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei               unsigned Size) {
62727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!Size)
62737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    Size = GetSafetyThreadStackSize();
62747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (Size)
62757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return CRC.RunSafelyOnThread(Fn, UserData, Size);
62767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return CRC.RunSafely(Fn, UserData);
62777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
62787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
62797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiunsigned GetSafetyThreadStackSize() {
62807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return SafetyStackThreadSize;
62817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
62827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
62837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid SetSafetyThreadStackSize(unsigned Value) {
62847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  SafetyStackThreadSize = Value;
62857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
62867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
62877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
62887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
62897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid clang::setThreadBackgroundPriority() {
62907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (getenv("LIBCLANG_BGPRIO_DISABLE"))
62917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return;
62927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
62937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // FIXME: Move to llvm/Support and make it cross-platform.
62947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#ifdef __APPLE__
62957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  setpriority(PRIO_DARWIN_THREAD, 0, PRIO_DARWIN_BG);
62967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#endif
62977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
62987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
62997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid cxindex::printDiagsToStderr(ASTUnit *Unit) {
63007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!Unit)
63017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return;
63027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
63037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  for (ASTUnit::stored_diag_iterator D = Unit->stored_diag_begin(),
63047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                  DEnd = Unit->stored_diag_end();
63057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei       D != DEnd; ++D) {
63067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    CXStoredDiagnostic Diag(*D, Unit->getASTContext().getLangOpts());
63077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    CXString Msg = clang_formatDiagnostic(&Diag,
63087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                clang_defaultDiagnosticDisplayOptions());
63097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    fprintf(stderr, "%s\n", clang_getCString(Msg));
63107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    clang_disposeString(Msg);
63117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
63127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#ifdef LLVM_ON_WIN32
63137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // On Windows, force a flush, since there may be multiple copies of
63147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // stderr and stdout in the file system, all with different buffers
63157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // but writing to the same device.
63167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  fflush(stderr);
63177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#endif
63187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
63197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
6320664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios KyrtzidisMacroInfo *cxindex::getMacroInfo(const IdentifierInfo &II,
6321664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis                                 SourceLocation MacroDefLoc,
6322664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis                                 CXTranslationUnit TU){
6323664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis  if (MacroDefLoc.isInvalid() || !TU)
6324664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis    return 0;
6325664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis  if (!II.hadMacroDefinition())
6326664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis    return 0;
6327664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis
63285694feb5ccd6eb862cb600b55753cecc13794471Dmitri Gribenko  ASTUnit *Unit = cxtu::getASTUnit(TU);
6329c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis  Preprocessor &PP = Unit->getPreprocessor();
63309818a1d443e97677dd3422305de9cc2b1fb2a8c1Argyrios Kyrtzidis  MacroDirective *MD = PP.getMacroDirectiveHistory(&II);
6331c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis  if (MD) {
6332c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis    for (MacroDirective::DefInfo
6333c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis           Def = MD->getDefinition(); Def; Def = Def.getPreviousDefinition()) {
6334c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis      if (MacroDefLoc == Def.getMacroInfo()->getDefinitionLoc())
6335c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis        return Def.getMacroInfo();
6336c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis    }
6337664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis  }
6338664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis
6339664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis  return 0;
6340664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis}
6341664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis
634267812b2f94f4b5e7d2596db1705ffa1149ddc45aDmitri Gribenkoconst MacroInfo *cxindex::getMacroInfo(const MacroDefinition *MacroDef,
634367812b2f94f4b5e7d2596db1705ffa1149ddc45aDmitri Gribenko                                       CXTranslationUnit TU) {
6344664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis  if (!MacroDef || !TU)
6345664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis    return 0;
6346664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis  const IdentifierInfo *II = MacroDef->getName();
6347664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis  if (!II)
6348664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis    return 0;
6349664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis
6350664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis  return getMacroInfo(*II, MacroDef->getLocation(), TU);
6351664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis}
6352664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis
6353664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios KyrtzidisMacroDefinition *cxindex::checkForMacroInMacroDefinition(const MacroInfo *MI,
6354664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis                                                         const Token &Tok,
6355664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis                                                         CXTranslationUnit TU) {
6356664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis  if (!MI || !TU)
6357664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis    return 0;
6358664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis  if (Tok.isNot(tok::raw_identifier))
6359664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis    return 0;
6360664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis
6361664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis  if (MI->getNumTokens() == 0)
6362664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis    return 0;
6363664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis  SourceRange DefRange(MI->getReplacementToken(0).getLocation(),
6364664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis                       MI->getDefinitionEndLoc());
63655694feb5ccd6eb862cb600b55753cecc13794471Dmitri Gribenko  ASTUnit *Unit = cxtu::getASTUnit(TU);
6366664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis
6367664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis  // Check that the token is inside the definition and not its argument list.
6368664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis  SourceManager &SM = Unit->getSourceManager();
6369664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis  if (SM.isBeforeInTranslationUnit(Tok.getLocation(), DefRange.getBegin()))
6370664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis    return 0;
6371664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis  if (SM.isBeforeInTranslationUnit(DefRange.getEnd(), Tok.getLocation()))
6372664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis    return 0;
6373664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis
6374664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis  Preprocessor &PP = Unit->getPreprocessor();
6375664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis  PreprocessingRecord *PPRec = PP.getPreprocessingRecord();
6376664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis  if (!PPRec)
6377664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis    return 0;
6378664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis
6379664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis  StringRef Name(Tok.getRawIdentifierData(), Tok.getLength());
6380664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis  IdentifierInfo &II = PP.getIdentifierTable().get(Name);
6381664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis  if (!II.hadMacroDefinition())
6382664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis    return 0;
6383664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis
6384664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis  // Check that the identifier is not one of the macro arguments.
6385664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis  if (std::find(MI->arg_begin(), MI->arg_end(), &II) != MI->arg_end())
6386664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis    return 0;
6387664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis
63889818a1d443e97677dd3422305de9cc2b1fb2a8c1Argyrios Kyrtzidis  MacroDirective *InnerMD = PP.getMacroDirectiveHistory(&II);
63899818a1d443e97677dd3422305de9cc2b1fb2a8c1Argyrios Kyrtzidis  if (!InnerMD)
6390664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis    return 0;
6391664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis
6392c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis  return PPRec->findMacroDefinition(InnerMD->getMacroInfo());
6393664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis}
6394664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis
6395664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios KyrtzidisMacroDefinition *cxindex::checkForMacroInMacroDefinition(const MacroInfo *MI,
6396664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis                                                         SourceLocation Loc,
6397664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis                                                         CXTranslationUnit TU) {
6398664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis  if (Loc.isInvalid() || !MI || !TU)
6399664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis    return 0;
6400664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis
6401664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis  if (MI->getNumTokens() == 0)
6402664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis    return 0;
64035694feb5ccd6eb862cb600b55753cecc13794471Dmitri Gribenko  ASTUnit *Unit = cxtu::getASTUnit(TU);
6404664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis  Preprocessor &PP = Unit->getPreprocessor();
6405664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis  if (!PP.getPreprocessingRecord())
6406664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis    return 0;
6407664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis  Loc = Unit->getSourceManager().getSpellingLoc(Loc);
6408664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis  Token Tok;
6409664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis  if (PP.getRawToken(Loc, Tok))
6410664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis    return 0;
6411664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis
6412664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis  return checkForMacroInMacroDefinition(MI, Tok, TU);
6413664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis}
6414664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis
64157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiextern "C" {
64167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
64177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXString clang_getClangVersion() {
64185595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko  return cxstring::createDup(getClangFullVersion());
64197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
64207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
64217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} // end: extern "C"
64227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
6423c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios KyrtzidisLogger &cxindex::Logger::operator<<(CXTranslationUnit TU) {
6424c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  if (TU) {
64255694feb5ccd6eb862cb600b55753cecc13794471Dmitri Gribenko    if (ASTUnit *Unit = cxtu::getASTUnit(TU)) {
6426c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis      LogOS << '<' << Unit->getMainFileName() << '>';
642744f65a587ee39c20e715c9df411c864d328c71b5Argyrios Kyrtzidis      if (Unit->isMainFileAST())
642844f65a587ee39c20e715c9df411c864d328c71b5Argyrios Kyrtzidis        LogOS << " (" << Unit->getASTFileName() << ')';
6429c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis      return *this;
6430c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis    }
6431c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  }
6432c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis
6433c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  LogOS << "<NULL TU>";
6434c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  return *this;
6435c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis}
6436c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis
6437b70e7a83ee55e463d52d175bd68dece2bfd084f4Argyrios KyrtzidisLogger &cxindex::Logger::operator<<(const FileEntry *FE) {
6438b70e7a83ee55e463d52d175bd68dece2bfd084f4Argyrios Kyrtzidis  *this << FE->getName();
6439b70e7a83ee55e463d52d175bd68dece2bfd084f4Argyrios Kyrtzidis  return *this;
6440b70e7a83ee55e463d52d175bd68dece2bfd084f4Argyrios Kyrtzidis}
6441b70e7a83ee55e463d52d175bd68dece2bfd084f4Argyrios Kyrtzidis
6442b70e7a83ee55e463d52d175bd68dece2bfd084f4Argyrios KyrtzidisLogger &cxindex::Logger::operator<<(CXCursor cursor) {
6443b70e7a83ee55e463d52d175bd68dece2bfd084f4Argyrios Kyrtzidis  CXString cursorName = clang_getCursorDisplayName(cursor);
6444b70e7a83ee55e463d52d175bd68dece2bfd084f4Argyrios Kyrtzidis  *this << cursorName << "@" << clang_getCursorLocation(cursor);
6445b70e7a83ee55e463d52d175bd68dece2bfd084f4Argyrios Kyrtzidis  clang_disposeString(cursorName);
6446b70e7a83ee55e463d52d175bd68dece2bfd084f4Argyrios Kyrtzidis  return *this;
6447b70e7a83ee55e463d52d175bd68dece2bfd084f4Argyrios Kyrtzidis}
6448b70e7a83ee55e463d52d175bd68dece2bfd084f4Argyrios Kyrtzidis
6449c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios KyrtzidisLogger &cxindex::Logger::operator<<(CXSourceLocation Loc) {
6450c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  CXFile File;
6451c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  unsigned Line, Column;
6452c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  clang_getFileLocation(Loc, &File, &Line, &Column, 0);
6453c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  CXString FileName = clang_getFileName(File);
6454c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  *this << llvm::format("(%s:%d:%d)", clang_getCString(FileName), Line, Column);
6455c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  clang_disposeString(FileName);
6456c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  return *this;
6457c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis}
6458c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis
6459c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios KyrtzidisLogger &cxindex::Logger::operator<<(CXSourceRange range) {
6460c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  CXSourceLocation BLoc = clang_getRangeStart(range);
6461c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  CXSourceLocation ELoc = clang_getRangeEnd(range);
6462c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis
6463c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  CXFile BFile;
6464c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  unsigned BLine, BColumn;
6465c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  clang_getFileLocation(BLoc, &BFile, &BLine, &BColumn, 0);
6466c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis
6467c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  CXFile EFile;
6468c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  unsigned ELine, EColumn;
6469c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  clang_getFileLocation(ELoc, &EFile, &ELine, &EColumn, 0);
6470c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis
6471c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  CXString BFileName = clang_getFileName(BFile);
6472c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  if (BFile == EFile) {
6473c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis    *this << llvm::format("[%s %d:%d-%d:%d]", clang_getCString(BFileName),
6474c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis                         BLine, BColumn, ELine, EColumn);
6475c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  } else {
6476c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis    CXString EFileName = clang_getFileName(EFile);
6477c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis    *this << llvm::format("[%s:%d:%d - ", clang_getCString(BFileName),
6478c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis                          BLine, BColumn)
6479c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis          << llvm::format("%s:%d:%d]", clang_getCString(EFileName),
6480c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis                          ELine, EColumn);
6481c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis    clang_disposeString(EFileName);
6482c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  }
6483c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  clang_disposeString(BFileName);
6484c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  return *this;
6485c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis}
6486c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis
6487c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios KyrtzidisLogger &cxindex::Logger::operator<<(CXString Str) {
6488c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  *this << clang_getCString(Str);
6489c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  return *this;
6490c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis}
6491c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis
6492c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios KyrtzidisLogger &cxindex::Logger::operator<<(const llvm::format_object_base &Fmt) {
6493c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  LogOS << Fmt;
6494c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  return *this;
6495c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis}
6496c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis
6497c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidiscxindex::Logger::~Logger() {
6498c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  LogOS.flush();
6499c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis
6500c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  llvm::sys::ScopedLock L(EnableMultithreadingMutex);
6501c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis
6502c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  static llvm::TimeRecord sBeginTR = llvm::TimeRecord::getCurrentTime();
6503c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis
6504cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko  raw_ostream &OS = llvm::errs();
6505c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  OS << "[libclang:" << Name << ':';
6506c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis
6507c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  // FIXME: Portability.
6508c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis#if HAVE_PTHREAD_H && __APPLE__
6509c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  mach_port_t tid = pthread_mach_thread_np(pthread_self());
6510c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  OS << tid << ':';
6511c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis#endif
6512c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis
6513c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  llvm::TimeRecord TR = llvm::TimeRecord::getCurrentTime();
6514c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  OS << llvm::format("%7.4f] ", TR.getWallTime() - sBeginTR.getWallTime());
6515c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  OS << Msg.str() << '\n';
6516c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis
6517c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  if (Trace) {
6518c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis    llvm::sys::PrintStackTrace(stderr);
6519c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis    OS << "--------------------------------------------------\n";
6520c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  }
6521c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis}
6522