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 "CXCursor.h"
197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "CXSourceLocation.h"
207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "CXString.h"
217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "CXTranslationUnit.h"
227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "CXType.h"
237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "CursorVisitor.h"
240b5ca510fb00eeb19ab82ebfd3c2585404bc9aa8David Blaikie#include "clang/AST/Attr.h"
257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/AST/StmtVisitor.h"
267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/Basic/Diagnostic.h"
27651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include "clang/Basic/DiagnosticCategories.h"
28651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include "clang/Basic/DiagnosticIDs.h"
297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/Basic/Version.h"
307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/Frontend/ASTUnit.h"
317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/Frontend/CompilerInstance.h"
327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/Frontend/FrontendDiagnostic.h"
334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#include "clang/Index/CodegenNameGenerator.h"
3486cfda2fcccc84e92fb7f27e85b58312440ca8deDmitri Gribenko#include "clang/Index/CommentToXML.h"
357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/Lex/HeaderSearch.h"
367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/Lex/Lexer.h"
377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/Lex/PreprocessingRecord.h"
387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/Lex/Preprocessor.h"
39651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include "clang/Serialization/SerializationDiagnostic.h"
407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "llvm/ADT/Optional.h"
417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "llvm/ADT/STLExtras.h"
427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "llvm/ADT/StringSwitch.h"
43c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#include "llvm/Config/llvm-config.h"
447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "llvm/Support/Compiler.h"
457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "llvm/Support/CrashRecoveryContext.h"
46b1ba0efc3d1dc1daa5d82c40bc504e1f368c4fa0Chandler Carruth#include "llvm/Support/Format.h"
47c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#include "llvm/Support/ManagedStatic.h"
487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "llvm/Support/MemoryBuffer.h"
497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "llvm/Support/Mutex.h"
507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "llvm/Support/Program.h"
517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "llvm/Support/SaveAndRestore.h"
527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "llvm/Support/Signals.h"
5387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#include "llvm/Support/TargetSelect.h"
547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "llvm/Support/Threading.h"
557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "llvm/Support/Timer.h"
567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "llvm/Support/raw_ostream.h"
57c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis
58c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#if LLVM_ENABLE_THREADS != 0 && defined(__APPLE__)
59c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#define USE_DARWIN_THREADS
60c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#endif
61c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
62c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#ifdef USE_DARWIN_THREADS
63c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis#include <pthread.h>
64c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis#endif
657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiusing namespace clang;
677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiusing namespace clang::cxcursor;
687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiusing namespace clang::cxtu;
697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiusing namespace clang::cxindex;
707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
71e42e578ad8a36ad5bd06c8a3110cbd3119aaee36Dmitri GribenkoCXTranslationUnit cxtu::MakeCXTranslationUnit(CIndexer *CIdx, ASTUnit *AU) {
72e42e578ad8a36ad5bd06c8a3110cbd3119aaee36Dmitri Gribenko  if (!AU)
73c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    return nullptr;
74651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  assert(CIdx);
757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  CXTranslationUnit D = new CXTranslationUnitImpl();
767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  D->CIdx = CIdx;
77e42e578ad8a36ad5bd06c8a3110cbd3119aaee36Dmitri Gribenko  D->TheASTUnit = AU;
78aca3e56144308f97f676fa30b07179e1203f7822Dmitri Gribenko  D->StringPool = new cxstring::CXStringPool();
79c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  D->Diagnostics = nullptr;
807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  D->OverridenCursorsPool = createOverridenCXCursorsPool();
81c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  D->CommentToXML = nullptr;
827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return D;
837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
85651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesbool cxtu::isASTReadError(ASTUnit *AU) {
86651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  for (ASTUnit::stored_diag_iterator D = AU->stored_diag_begin(),
87651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                     DEnd = AU->stored_diag_end();
88651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines       D != DEnd; ++D) {
89651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (D->getLevel() >= DiagnosticsEngine::Error &&
90651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        DiagnosticIDs::getCategoryNumberForDiag(D->getID()) ==
91651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines            diag::DiagCat_AST_Deserialization_Issue)
92651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      return true;
93651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
94651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return false;
95651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
96651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeicxtu::CXTUOwner::~CXTUOwner() {
987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (TU)
997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    clang_disposeTranslationUnit(TU);
1007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
1017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
1027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \brief Compare two source ranges to determine their relative position in
1037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// the translation unit.
1047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic RangeComparisonResult RangeCompare(SourceManager &SM,
1057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                          SourceRange R1,
1067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                          SourceRange R2) {
1077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  assert(R1.isValid() && "First range is invalid?");
1087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  assert(R2.isValid() && "Second range is invalid?");
1097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (R1.getEnd() != R2.getBegin() &&
1107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      SM.isBeforeInTranslationUnit(R1.getEnd(), R2.getBegin()))
1117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return RangeBefore;
1127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (R2.getEnd() != R1.getBegin() &&
1137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      SM.isBeforeInTranslationUnit(R2.getEnd(), R1.getBegin()))
1147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return RangeAfter;
1157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return RangeOverlap;
1167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
1177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
1187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \brief Determine if a source location falls within, before, or after a
1197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei///   a given source range.
1207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic RangeComparisonResult LocationCompare(SourceManager &SM,
1217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                             SourceLocation L, SourceRange R) {
1227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  assert(R.isValid() && "First range is invalid?");
1237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  assert(L.isValid() && "Second range is invalid?");
1247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (L == R.getBegin() || L == R.getEnd())
1257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return RangeOverlap;
1267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (SM.isBeforeInTranslationUnit(L, R.getBegin()))
1277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return RangeBefore;
1287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (SM.isBeforeInTranslationUnit(R.getEnd(), L))
1297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return RangeAfter;
1307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return RangeOverlap;
1317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
1327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
1337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \brief Translate a Clang source range into a CIndex source range.
1347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei///
1357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// Clang internally represents ranges where the end location points to the
1367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// start of the token at the end. However, for external clients it is more
1377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// useful to have a CXSourceRange be a proper half-open interval. This routine
1387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// does the appropriate translation.
1397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXSourceRange cxloc::translateSourceRange(const SourceManager &SM,
1407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                          const LangOptions &LangOpts,
1417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                          const CharSourceRange &R) {
1427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // We want the last character in this location, so we will adjust the
1437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // location accordingly.
1447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  SourceLocation EndLoc = R.getEnd();
1457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (EndLoc.isValid() && EndLoc.isMacroID() && !SM.isMacroArgExpansion(EndLoc))
1467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    EndLoc = SM.getExpansionRange(EndLoc).second;
14787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  if (R.isTokenRange() && EndLoc.isValid()) {
1487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    unsigned Length = Lexer::MeasureTokenLength(SM.getSpellingLoc(EndLoc),
1497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                                SM, LangOpts);
1507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    EndLoc = EndLoc.getLocWithOffset(Length);
1517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
1527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
153ccdfdd7937d74396ca1b3bb69ed2642a8ff4c712Bill Wendling  CXSourceRange Result = {
154e4ea879fe73581bc70a9bfbfddc7ca06b5c0768bDmitri Gribenko    { &SM, &LangOpts },
155ccdfdd7937d74396ca1b3bb69ed2642a8ff4c712Bill Wendling    R.getBegin().getRawEncoding(),
156ccdfdd7937d74396ca1b3bb69ed2642a8ff4c712Bill Wendling    EndLoc.getRawEncoding()
157ccdfdd7937d74396ca1b3bb69ed2642a8ff4c712Bill Wendling  };
1587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return Result;
1597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
1607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
1617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----------------------------------------------------------------------===//
1627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// Cursor visitor.
1637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----------------------------------------------------------------------===//
1647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
1657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic SourceRange getRawCursorExtent(CXCursor C);
1667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic SourceRange getFullCursorExtent(CXCursor C, SourceManager &SrcMgr);
1677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
1687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
1697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiRangeComparisonResult CursorVisitor::CompareRegionOfInterest(SourceRange R) {
1707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return RangeCompare(AU->getSourceManager(), R, RegionOfInterest);
1717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
1727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
1737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \brief Visit the given cursor and, if requested by the visitor,
1747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// its children.
1757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei///
1767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \param Cursor the cursor to visit.
1777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei///
1787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \param CheckedRegionOfInterest if true, then the caller already checked
1797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// that this cursor is within the region of interest.
1807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei///
1817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \returns true if the visitation should be aborted, false if it
1827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// should continue.
1837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::Visit(CXCursor Cursor, bool CheckedRegionOfInterest) {
1847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (clang_isInvalid(Cursor.kind))
1857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return false;
1867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
1877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (clang_isDeclaration(Cursor.kind)) {
188e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko    const Decl *D = getCursorDecl(Cursor);
1897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (!D) {
1907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      assert(0 && "Invalid declaration cursor");
1917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return true; // abort.
1927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
1937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
1947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // Ignore implicit declarations, unless it's an objc method because
1957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // currently we should report implicit methods for properties when indexing.
1967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (D->isImplicit() && !isa<ObjCMethodDecl>(D))
1977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return false;
1987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
1997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
2007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // If we have a range of interest, and this cursor doesn't intersect with it,
2017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // we're done.
2027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (RegionOfInterest.isValid() && !CheckedRegionOfInterest) {
2037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    SourceRange Range = getRawCursorExtent(Cursor);
2047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (Range.isInvalid() || CompareRegionOfInterest(Range))
2057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return false;
2067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
2077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
2087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  switch (Visitor(Cursor, Parent, ClientData)) {
2097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXChildVisit_Break:
2107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return true;
2117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
2127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXChildVisit_Continue:
2137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return false;
2147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
2157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXChildVisit_Recurse: {
2167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    bool ret = VisitChildren(Cursor);
2177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (PostChildrenVisitor)
2187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (PostChildrenVisitor(Cursor, ClientData))
2197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        return true;
2207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return ret;
2217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
2227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
2237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
2247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  llvm_unreachable("Invalid CXChildVisitResult!");
2257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
2267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
2277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic bool visitPreprocessedEntitiesInRange(SourceRange R,
2287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                             PreprocessingRecord &PPRec,
2297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                             CursorVisitor &Visitor) {
2307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  SourceManager &SM = Visitor.getASTUnit()->getSourceManager();
2317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  FileID FID;
2327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
2337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!Visitor.shouldVisitIncludedEntities()) {
2347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // If the begin/end of the range lie in the same FileID, do the optimization
2357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // where we skip preprocessed entities that do not come from the same FileID.
2367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    FID = SM.getFileID(SM.getFileLoc(R.getBegin()));
2377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (FID != SM.getFileID(SM.getFileLoc(R.getEnd())))
2387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      FID = FileID();
2397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
2407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
2410e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  const auto &Entities = PPRec.getPreprocessedEntitiesInRange(R);
2420e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  return Visitor.visitPreprocessedEntities(Entities.begin(), Entities.end(),
2437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                           PPRec, FID);
2447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
2457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
246389dc5603fa10b508a38f668a7830c6d877b6542Argyrios Kyrtzidisbool CursorVisitor::visitFileRegion() {
2477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (RegionOfInterest.isInvalid())
248389dc5603fa10b508a38f668a7830c6d877b6542Argyrios Kyrtzidis    return false;
2497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
2505694feb5ccd6eb862cb600b55753cecc13794471Dmitri Gribenko  ASTUnit *Unit = cxtu::getASTUnit(TU);
2517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  SourceManager &SM = Unit->getSourceManager();
2527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
2537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  std::pair<FileID, unsigned>
2547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    Begin = SM.getDecomposedLoc(SM.getFileLoc(RegionOfInterest.getBegin())),
2557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    End = SM.getDecomposedLoc(SM.getFileLoc(RegionOfInterest.getEnd()));
2567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
2577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (End.first != Begin.first) {
2587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // If the end does not reside in the same file, try to recover by
2597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // picking the end of the file of begin location.
2607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    End.first = Begin.first;
2617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    End.second = SM.getFileIDSize(Begin.first);
2627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
2637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
2647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  assert(Begin.first == End.first);
2657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (Begin.second > End.second)
266389dc5603fa10b508a38f668a7830c6d877b6542Argyrios Kyrtzidis    return false;
2677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
2687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  FileID File = Begin.first;
2697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  unsigned Offset = Begin.second;
2707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  unsigned Length = End.second - Begin.second;
2717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
2727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!VisitDeclsOnly && !VisitPreprocessorLast)
2737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (visitPreprocessedEntitiesInRegion())
274389dc5603fa10b508a38f668a7830c6d877b6542Argyrios Kyrtzidis      return true; // visitation break.
2757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
276389dc5603fa10b508a38f668a7830c6d877b6542Argyrios Kyrtzidis  if (visitDeclsFromFileRegion(File, Offset, Length))
277389dc5603fa10b508a38f668a7830c6d877b6542Argyrios Kyrtzidis    return true; // visitation break.
2787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
2797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!VisitDeclsOnly && VisitPreprocessorLast)
280389dc5603fa10b508a38f668a7830c6d877b6542Argyrios Kyrtzidis    return visitPreprocessedEntitiesInRegion();
281389dc5603fa10b508a38f668a7830c6d877b6542Argyrios Kyrtzidis
282389dc5603fa10b508a38f668a7830c6d877b6542Argyrios Kyrtzidis  return false;
2837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
2847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
2857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic bool isInLexicalContext(Decl *D, DeclContext *DC) {
2867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!DC)
2877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return false;
2887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
2897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  for (DeclContext *DeclDC = D->getLexicalDeclContext();
2907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei         DeclDC; DeclDC = DeclDC->getLexicalParent()) {
2917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (DeclDC == DC)
2927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return true;
2937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
2947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return false;
2957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
2967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
297389dc5603fa10b508a38f668a7830c6d877b6542Argyrios Kyrtzidisbool CursorVisitor::visitDeclsFromFileRegion(FileID File,
2987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                             unsigned Offset, unsigned Length) {
2995694feb5ccd6eb862cb600b55753cecc13794471Dmitri Gribenko  ASTUnit *Unit = cxtu::getASTUnit(TU);
3007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  SourceManager &SM = Unit->getSourceManager();
3017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  SourceRange Range = RegionOfInterest;
3027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  SmallVector<Decl *, 16> Decls;
3047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  Unit->findFileRegionDecls(File, Offset, Length, Decls);
3057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // If we didn't find any file level decls for the file, try looking at the
3077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // file that it was included from.
3087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  while (Decls.empty() || Decls.front()->isTopLevelDeclInObjCContainer()) {
3097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    bool Invalid = false;
3107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    const SrcMgr::SLocEntry &SLEntry = SM.getSLocEntry(File, &Invalid);
3117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (Invalid)
312389dc5603fa10b508a38f668a7830c6d877b6542Argyrios Kyrtzidis      return false;
3137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    SourceLocation Outer;
3157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (SLEntry.isFile())
3167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      Outer = SLEntry.getFile().getIncludeLoc();
3177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    else
3187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      Outer = SLEntry.getExpansion().getExpansionLocStart();
3197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (Outer.isInvalid())
320389dc5603fa10b508a38f668a7830c6d877b6542Argyrios Kyrtzidis      return false;
3217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
322651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    std::tie(File, Offset) = SM.getDecomposedExpansionLoc(Outer);
3237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    Length = 0;
3247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    Unit->findFileRegionDecls(File, Offset, Length, Decls);
3257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
3267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  assert(!Decls.empty());
3287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  bool VisitedAtLeastOnce = false;
330c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  DeclContext *CurDC = nullptr;
33109d19efaa147762f84aed55efa7930bb3616a4e5Craig Topper  SmallVectorImpl<Decl *>::iterator DIt = Decls.begin();
33209d19efaa147762f84aed55efa7930bb3616a4e5Craig Topper  for (SmallVectorImpl<Decl *>::iterator DE = Decls.end(); DIt != DE; ++DIt) {
3337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    Decl *D = *DIt;
3347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (D->getSourceRange().isInvalid())
3357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      continue;
3367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (isInLexicalContext(D, CurDC))
3387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      continue;
3397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    CurDC = dyn_cast<DeclContext>(D);
3417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (TagDecl *TD = dyn_cast<TagDecl>(D))
3437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (!TD->isFreeStanding())
3447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        continue;
3457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    RangeComparisonResult CompRes = RangeCompare(SM, D->getSourceRange(),Range);
3477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (CompRes == RangeBefore)
3487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      continue;
3497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (CompRes == RangeAfter)
3507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      break;
3517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    assert(CompRes == RangeOverlap);
3537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    VisitedAtLeastOnce = true;
3547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (isa<ObjCContainerDecl>(D)) {
3567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      FileDI_current = &DIt;
3577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      FileDE_current = DE;
3587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    } else {
359c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines      FileDI_current = nullptr;
3607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
3617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (Visit(MakeCXCursor(D, TU, Range), /*CheckedRegionOfInterest=*/true))
363389dc5603fa10b508a38f668a7830c6d877b6542Argyrios Kyrtzidis      return true; // visitation break.
3647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
3657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (VisitedAtLeastOnce)
367389dc5603fa10b508a38f668a7830c6d877b6542Argyrios Kyrtzidis    return false;
3687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // No Decls overlapped with the range. Move up the lexical context until there
3707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // is a context that contains the range or we reach the translation unit
3717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // level.
3727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  DeclContext *DC = DIt == Decls.begin() ? (*DIt)->getLexicalDeclContext()
3737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                         : (*(DIt-1))->getLexicalDeclContext();
3747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  while (DC && !DC->isTranslationUnit()) {
3767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    Decl *D = cast<Decl>(DC);
3777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    SourceRange CurDeclRange = D->getSourceRange();
3787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (CurDeclRange.isInvalid())
3797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      break;
3807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (RangeCompare(SM, CurDeclRange, Range) == RangeOverlap) {
382389dc5603fa10b508a38f668a7830c6d877b6542Argyrios Kyrtzidis      if (Visit(MakeCXCursor(D, TU, Range), /*CheckedRegionOfInterest=*/true))
383389dc5603fa10b508a38f668a7830c6d877b6542Argyrios Kyrtzidis        return true; // visitation break.
3847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
3857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    DC = D->getLexicalDeclContext();
3877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
388389dc5603fa10b508a38f668a7830c6d877b6542Argyrios Kyrtzidis
389389dc5603fa10b508a38f668a7830c6d877b6542Argyrios Kyrtzidis  return false;
3907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
3917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::visitPreprocessedEntitiesInRegion() {
3937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!AU->getPreprocessor().getPreprocessingRecord())
3947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return false;
3957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  PreprocessingRecord &PPRec
3977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    = *AU->getPreprocessor().getPreprocessingRecord();
3987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  SourceManager &SM = AU->getSourceManager();
3997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
4007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (RegionOfInterest.isValid()) {
4017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    SourceRange MappedRange = AU->mapRangeToPreamble(RegionOfInterest);
4027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    SourceLocation B = MappedRange.getBegin();
4037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    SourceLocation E = MappedRange.getEnd();
4047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
4057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (AU->isInPreambleFileID(B)) {
4067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (SM.isLoadedSourceLocation(E))
4077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        return visitPreprocessedEntitiesInRange(SourceRange(B, E),
4087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                                 PPRec, *this);
4097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
4107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // Beginning of range lies in the preamble but it also extends beyond
4117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // it into the main file. Split the range into 2 parts, one covering
4127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // the preamble and another covering the main file. This allows subsequent
4137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // calls to visitPreprocessedEntitiesInRange to accept a source range that
4147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // lies in the same FileID, allowing it to skip preprocessed entities that
4157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // do not come from the same FileID.
4167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      bool breaked =
4177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        visitPreprocessedEntitiesInRange(
4187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                   SourceRange(B, AU->getEndOfPreambleFileID()),
4197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                          PPRec, *this);
4207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (breaked) return true;
4217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return visitPreprocessedEntitiesInRange(
4227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                    SourceRange(AU->getStartOfMainFileID(), E),
4237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                        PPRec, *this);
4247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
4257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
4267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return visitPreprocessedEntitiesInRange(SourceRange(B, E), PPRec, *this);
4277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
4287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
4297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  bool OnlyLocalDecls
4307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    = !AU->isMainFileAST() && AU->getOnlyLocalDecls();
4317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
4327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (OnlyLocalDecls)
4337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return visitPreprocessedEntities(PPRec.local_begin(), PPRec.local_end(),
4347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                     PPRec);
4357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
4367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return visitPreprocessedEntities(PPRec.begin(), PPRec.end(), PPRec);
4377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
4387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
4397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeitemplate<typename InputIterator>
4407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::visitPreprocessedEntities(InputIterator First,
4417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                              InputIterator Last,
4427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                              PreprocessingRecord &PPRec,
4437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                              FileID FID) {
4447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  for (; First != Last; ++First) {
4457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (!FID.isInvalid() && !PPRec.isEntityInFileID(First, FID))
4467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      continue;
4477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
4487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    PreprocessedEntity *PPE = *First;
449333e44c91000c4b7d6a3dc5f79e04358dc78ad3aArgyrios Kyrtzidis    if (!PPE)
450333e44c91000c4b7d6a3dc5f79e04358dc78ad3aArgyrios Kyrtzidis      continue;
451333e44c91000c4b7d6a3dc5f79e04358dc78ad3aArgyrios Kyrtzidis
4527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (MacroExpansion *ME = dyn_cast<MacroExpansion>(PPE)) {
4537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (Visit(MakeMacroExpansionCursor(ME, TU)))
4547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        return true;
455b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar
4567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      continue;
4577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
458b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar
459b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar    if (MacroDefinitionRecord *MD = dyn_cast<MacroDefinitionRecord>(PPE)) {
4607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (Visit(MakeMacroDefinitionCursor(MD, TU)))
4617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        return true;
462b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar
4637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      continue;
4647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
4657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
4667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (InclusionDirective *ID = dyn_cast<InclusionDirective>(PPE)) {
4677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (Visit(MakeInclusionDirectiveCursor(ID, TU)))
4687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        return true;
4697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
4707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      continue;
4717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
4727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
4737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
4747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return false;
4757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
4767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
4777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \brief Visit the children of the given cursor.
4787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei///
4797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \returns true if the visitation should be aborted, false if it
4807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// should continue.
4817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitChildren(CXCursor Cursor) {
4827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (clang_isReference(Cursor.kind) &&
4837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      Cursor.kind != CXCursor_CXXBaseSpecifier) {
4847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // By definition, references have no children.
4857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return false;
4867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
4877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
4887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Set the Parent field to Cursor, then back to its old value once we're
4897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // done.
4907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  SetParentRAII SetParent(Parent, StmtParent, Cursor);
4917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
4927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (clang_isDeclaration(Cursor.kind)) {
493e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko    Decl *D = const_cast<Decl *>(getCursorDecl(Cursor));
4947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (!D)
4957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return false;
4967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
4977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return VisitAttributes(D) || Visit(D);
4987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
4997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
5007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (clang_isStatement(Cursor.kind)) {
501ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko    if (const Stmt *S = getCursorStmt(Cursor))
5027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return Visit(S);
5037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
5047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return false;
5057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
5067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
5077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (clang_isExpression(Cursor.kind)) {
508ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko    if (const Expr *E = getCursorExpr(Cursor))
5097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return Visit(E);
5107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
5117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return false;
5127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
5137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
5147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (clang_isTranslationUnit(Cursor.kind)) {
5155694feb5ccd6eb862cb600b55753cecc13794471Dmitri Gribenko    CXTranslationUnit TU = getCursorTU(Cursor);
5165694feb5ccd6eb862cb600b55753cecc13794471Dmitri Gribenko    ASTUnit *CXXUnit = cxtu::getASTUnit(TU);
5177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
5187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    int VisitOrder[2] = { VisitPreprocessorLast, !VisitPreprocessorLast };
5197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    for (unsigned I = 0; I != 2; ++I) {
5207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (VisitOrder[I]) {
5217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        if (!CXXUnit->isMainFileAST() && CXXUnit->getOnlyLocalDecls() &&
5227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            RegionOfInterest.isInvalid()) {
5237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          for (ASTUnit::top_level_iterator TL = CXXUnit->top_level_begin(),
5247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                        TLEnd = CXXUnit->top_level_end();
5257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei               TL != TLEnd; ++TL) {
5264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar            const Optional<bool> V = handleDeclForVisitation(*TL);
5274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar            if (!V.hasValue())
5284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar              continue;
5294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar            return V.getValue();
5307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          }
5317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        } else if (VisitDeclContext(
5327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                CXXUnit->getASTContext().getTranslationUnitDecl()))
5337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          return true;
5347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        continue;
5357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      }
5367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
5377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // Walk the preprocessing record.
5387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (CXXUnit->getPreprocessor().getPreprocessingRecord())
5397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        visitPreprocessedEntitiesInRegion();
5407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
5417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
5427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return false;
5437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
5447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
5457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (Cursor.kind == CXCursor_CXXBaseSpecifier) {
54667812b2f94f4b5e7d2596db1705ffa1149ddc45aDmitri Gribenko    if (const CXXBaseSpecifier *Base = getCursorCXXBaseSpecifier(Cursor)) {
5477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (TypeSourceInfo *BaseTSInfo = Base->getTypeSourceInfo()) {
5487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        return Visit(BaseTSInfo->getTypeLoc());
5497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      }
5507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
5517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
5527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
5537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (Cursor.kind == CXCursor_IBOutletCollectionAttr) {
5547d91438047450869d7b881e1c63868c4b52a3cc2Dmitri Gribenko    const IBOutletCollectionAttr *A =
5557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      cast<IBOutletCollectionAttr>(cxcursor::getCursorAttr(Cursor));
556d386fef64f1fd00fc9a97efb963d8ec393fd1aceRichard Smith    if (const ObjCObjectType *ObjT = A->getInterface()->getAs<ObjCObjectType>())
557ddc2a53584f91b1fdcc466f1ea1345d97c428802Richard Smith      return Visit(cxcursor::MakeCursorObjCClassRef(
558ddc2a53584f91b1fdcc466f1ea1345d97c428802Richard Smith          ObjT->getInterface(),
559ddc2a53584f91b1fdcc466f1ea1345d97c428802Richard Smith          A->getInterfaceLoc()->getTypeLoc().getLocStart(), TU));
5607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
5617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
562664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis  // If pointing inside a macro definition, check if the token is an identifier
563664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis  // that was ever defined as a macro. In such a case, create a "pseudo" macro
564664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis  // expansion cursor for that token.
565664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis  SourceLocation BeginLoc = RegionOfInterest.getBegin();
566664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis  if (Cursor.kind == CXCursor_MacroDefinition &&
567664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis      BeginLoc == RegionOfInterest.getEnd()) {
568664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis    SourceLocation Loc = AU->mapLocationToPreamble(BeginLoc);
56967812b2f94f4b5e7d2596db1705ffa1149ddc45aDmitri Gribenko    const MacroInfo *MI =
57067812b2f94f4b5e7d2596db1705ffa1149ddc45aDmitri Gribenko        getMacroInfo(cxcursor::getCursorMacroDefinition(Cursor), TU);
571b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar    if (MacroDefinitionRecord *MacroDef =
572b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar            checkForMacroInMacroDefinition(MI, Loc, TU))
573664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis      return Visit(cxcursor::MakeMacroExpansionCursor(MacroDef, BeginLoc, TU));
574664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis  }
575664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis
5767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Nothing to visit at the moment.
5777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return false;
5787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
5797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
5807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitBlockDecl(BlockDecl *B) {
5817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (TypeSourceInfo *TSInfo = B->getSignatureAsWritten())
5827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (Visit(TSInfo->getTypeLoc()))
5837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        return true;
5847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
5857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (Stmt *Body = B->getBody())
5867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return Visit(MakeCXCursor(Body, StmtParent, TU, RegionOfInterest));
5877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
5887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return false;
5897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
5907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
591943f909ba72a1c9351dd421cac1413d303a719f1Ted KremenekOptional<bool> CursorVisitor::shouldVisitCursor(CXCursor Cursor) {
5927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (RegionOfInterest.isValid()) {
5937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    SourceRange Range = getFullCursorExtent(Cursor, AU->getSourceManager());
5947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (Range.isInvalid())
59566874fb18afbffb8b2ca05576851a64534be3352David Blaikie      return None;
5967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
5977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    switch (CompareRegionOfInterest(Range)) {
5987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case RangeBefore:
5997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // This declaration comes before the region of interest; skip it.
60066874fb18afbffb8b2ca05576851a64534be3352David Blaikie      return None;
6017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
6027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case RangeAfter:
6037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // This declaration comes after the region of interest; we're done.
6047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return false;
6057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
6067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case RangeOverlap:
6077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // This declaration overlaps the region of interest; visit it.
6087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      break;
6097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
6107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
6117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return true;
6127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
6137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
6147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitDeclContext(DeclContext *DC) {
6157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  DeclContext::decl_iterator I = DC->decls_begin(), E = DC->decls_end();
6167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
6177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // FIXME: Eventually remove.  This part of a hack to support proper
6187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // iteration over all Decls contained lexically within an ObjC container.
6197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  SaveAndRestore<DeclContext::decl_iterator*> DI_saved(DI_current, &I);
6207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  SaveAndRestore<DeclContext::decl_iterator> DE_saved(DE_current, E);
6217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
6227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  for ( ; I != E; ++I) {
6237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    Decl *D = *I;
6247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (D->getLexicalDeclContext() != DC)
6257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      continue;
6264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    const Optional<bool> V = handleDeclForVisitation(D);
6277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (!V.hasValue())
6287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      continue;
6294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return V.getValue();
6307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
6317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return false;
6327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
6337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
6344967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarOptional<bool> CursorVisitor::handleDeclForVisitation(const Decl *D) {
6354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  CXCursor Cursor = MakeCXCursor(D, TU, RegionOfInterest);
6364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
6374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // Ignore synthesized ivars here, otherwise if we have something like:
6384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  //   @synthesize prop = _prop;
6394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // and '_prop' is not declared, we will encounter a '_prop' ivar before
6404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // encountering the 'prop' synthesize declaration and we will think that
6414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // we passed the region-of-interest.
6424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  if (auto *ivarD = dyn_cast<ObjCIvarDecl>(D)) {
6434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    if (ivarD->getSynthesize())
6444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      return None;
6454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
6464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
6474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // FIXME: ObjCClassRef/ObjCProtocolRef for forward class/protocol
6484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // declarations is a mismatch with the compiler semantics.
6494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  if (Cursor.kind == CXCursor_ObjCInterfaceDecl) {
6504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    auto *ID = cast<ObjCInterfaceDecl>(D);
6514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    if (!ID->isThisDeclarationADefinition())
6524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      Cursor = MakeCursorObjCClassRef(ID, ID->getLocation(), TU);
6534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
6544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  } else if (Cursor.kind == CXCursor_ObjCProtocolDecl) {
6554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    auto *PD = cast<ObjCProtocolDecl>(D);
6564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    if (!PD->isThisDeclarationADefinition())
6574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      Cursor = MakeCursorObjCProtocolRef(PD, PD->getLocation(), TU);
6584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
6594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
6604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  const Optional<bool> V = shouldVisitCursor(Cursor);
6614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  if (!V.hasValue())
6624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return None;
6634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  if (!V.getValue())
6644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return false;
6654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  if (Visit(Cursor, true))
6664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return true;
6674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  return None;
6684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
6694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
6707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitTranslationUnitDecl(TranslationUnitDecl *D) {
6717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  llvm_unreachable("Translation units are visited directly by Visit()");
6727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
6737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
67487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarbool CursorVisitor::VisitTypeAliasTemplateDecl(TypeAliasTemplateDecl *D) {
67587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    if (VisitTemplateParameters(D->getTemplateParameters()))
67687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar        return true;
67787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
67887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return Visit(MakeCXCursor(D->getTemplatedDecl(), TU, RegionOfInterest));
67987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
68087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
6817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitTypeAliasDecl(TypeAliasDecl *D) {
6827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (TypeSourceInfo *TSInfo = D->getTypeSourceInfo())
6837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return Visit(TSInfo->getTypeLoc());
6847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
6857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return false;
6867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
6877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
6887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitTypedefDecl(TypedefDecl *D) {
6897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (TypeSourceInfo *TSInfo = D->getTypeSourceInfo())
6907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return Visit(TSInfo->getTypeLoc());
6917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
6927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return false;
6937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
6947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
6957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitTagDecl(TagDecl *D) {
6967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return VisitDeclContext(D);
6977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
6987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
6997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitClassTemplateSpecializationDecl(
7007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                          ClassTemplateSpecializationDecl *D) {
7017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  bool ShouldVisitBody = false;
7027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  switch (D->getSpecializationKind()) {
7037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case TSK_Undeclared:
7047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case TSK_ImplicitInstantiation:
7057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // Nothing to visit
7067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return false;
7077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
7087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case TSK_ExplicitInstantiationDeclaration:
7097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case TSK_ExplicitInstantiationDefinition:
7107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    break;
7117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
7127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case TSK_ExplicitSpecialization:
7137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    ShouldVisitBody = true;
7147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    break;
7157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
7167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
7177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Visit the template arguments used in the specialization.
7187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (TypeSourceInfo *SpecType = D->getTypeAsWritten()) {
7197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    TypeLoc TL = SpecType->getTypeLoc();
72039e6ab4be93d9c5e729a578ddd9d415cd2d49872David Blaikie    if (TemplateSpecializationTypeLoc TSTLoc =
72139e6ab4be93d9c5e729a578ddd9d415cd2d49872David Blaikie            TL.getAs<TemplateSpecializationTypeLoc>()) {
72239e6ab4be93d9c5e729a578ddd9d415cd2d49872David Blaikie      for (unsigned I = 0, N = TSTLoc.getNumArgs(); I != N; ++I)
72339e6ab4be93d9c5e729a578ddd9d415cd2d49872David Blaikie        if (VisitTemplateArgumentLoc(TSTLoc.getArgLoc(I)))
7247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          return true;
7257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
7267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
7274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
7284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  return ShouldVisitBody && VisitCXXRecordDecl(D);
7297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
7307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
7317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitClassTemplatePartialSpecializationDecl(
7327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                   ClassTemplatePartialSpecializationDecl *D) {
7337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // FIXME: Visit the "outer" template parameter lists on the TagDecl
7347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // before visiting these template parameters.
7357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (VisitTemplateParameters(D->getTemplateParameters()))
7367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return true;
7377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
7387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Visit the partial specialization arguments.
739c1cef0892e049fcd31084f02d1efdd9985d4dfa4Enea Zaffanella  const ASTTemplateArgumentListInfo *Info = D->getTemplateArgsAsWritten();
740c1cef0892e049fcd31084f02d1efdd9985d4dfa4Enea Zaffanella  const TemplateArgumentLoc *TemplateArgs = Info->getTemplateArgs();
741c1cef0892e049fcd31084f02d1efdd9985d4dfa4Enea Zaffanella  for (unsigned I = 0, N = Info->NumTemplateArgs; I != N; ++I)
7427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (VisitTemplateArgumentLoc(TemplateArgs[I]))
7437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return true;
7447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
7457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return VisitCXXRecordDecl(D);
7467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
7477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
7487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D) {
7497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Visit the default argument.
7507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (D->hasDefaultArgument() && !D->defaultArgumentWasInherited())
7517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (TypeSourceInfo *DefArg = D->getDefaultArgumentInfo())
7527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (Visit(DefArg->getTypeLoc()))
7537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        return true;
7547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
7557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return false;
7567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
7577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
7587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitEnumConstantDecl(EnumConstantDecl *D) {
7597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (Expr *Init = D->getInitExpr())
7607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return Visit(MakeCXCursor(Init, StmtParent, TU, RegionOfInterest));
7617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return false;
7627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
7637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
7647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitDeclaratorDecl(DeclaratorDecl *DD) {
765516143b619d1eccfef023ceaf91666803f04cc83Argyrios Kyrtzidis  unsigned NumParamList = DD->getNumTemplateParameterLists();
766516143b619d1eccfef023ceaf91666803f04cc83Argyrios Kyrtzidis  for (unsigned i = 0; i < NumParamList; i++) {
767516143b619d1eccfef023ceaf91666803f04cc83Argyrios Kyrtzidis    TemplateParameterList* Params = DD->getTemplateParameterList(i);
768516143b619d1eccfef023ceaf91666803f04cc83Argyrios Kyrtzidis    if (VisitTemplateParameters(Params))
769516143b619d1eccfef023ceaf91666803f04cc83Argyrios Kyrtzidis      return true;
770516143b619d1eccfef023ceaf91666803f04cc83Argyrios Kyrtzidis  }
771516143b619d1eccfef023ceaf91666803f04cc83Argyrios Kyrtzidis
7727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (TypeSourceInfo *TSInfo = DD->getTypeSourceInfo())
7737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (Visit(TSInfo->getTypeLoc()))
7747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return true;
7757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
7767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Visit the nested-name-specifier, if present.
7777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (NestedNameSpecifierLoc QualifierLoc = DD->getQualifierLoc())
7787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (VisitNestedNameSpecifierLoc(QualifierLoc))
7797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return true;
7807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
7817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return false;
7827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
7837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
7847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \brief Compare two base or member initializers based on their source order.
785767b3d2000a00c56e1a3c19372810e2b7d66b76cBenjamin Kramerstatic int CompareCXXCtorInitializers(CXXCtorInitializer *const *X,
786767b3d2000a00c56e1a3c19372810e2b7d66b76cBenjamin Kramer                                      CXXCtorInitializer *const *Y) {
787767b3d2000a00c56e1a3c19372810e2b7d66b76cBenjamin Kramer  return (*X)->getSourceOrder() - (*Y)->getSourceOrder();
7887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
7897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
7907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitFunctionDecl(FunctionDecl *ND) {
791516143b619d1eccfef023ceaf91666803f04cc83Argyrios Kyrtzidis  unsigned NumParamList = ND->getNumTemplateParameterLists();
792516143b619d1eccfef023ceaf91666803f04cc83Argyrios Kyrtzidis  for (unsigned i = 0; i < NumParamList; i++) {
793516143b619d1eccfef023ceaf91666803f04cc83Argyrios Kyrtzidis    TemplateParameterList* Params = ND->getTemplateParameterList(i);
794516143b619d1eccfef023ceaf91666803f04cc83Argyrios Kyrtzidis    if (VisitTemplateParameters(Params))
795516143b619d1eccfef023ceaf91666803f04cc83Argyrios Kyrtzidis      return true;
796516143b619d1eccfef023ceaf91666803f04cc83Argyrios Kyrtzidis  }
797516143b619d1eccfef023ceaf91666803f04cc83Argyrios Kyrtzidis
7987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (TypeSourceInfo *TSInfo = ND->getTypeSourceInfo()) {
7997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // Visit the function declaration's syntactic components in the order
8007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // written. This requires a bit of work.
8017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    TypeLoc TL = TSInfo->getTypeLoc().IgnoreParens();
80239e6ab4be93d9c5e729a578ddd9d415cd2d49872David Blaikie    FunctionTypeLoc FTL = TL.getAs<FunctionTypeLoc>();
8037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
8047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // If we have a function declared directly (without the use of a typedef),
8057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // visit just the return type. Otherwise, just visit the function's type
8067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // now.
807651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if ((FTL && !isa<CXXConversionDecl>(ND) && Visit(FTL.getReturnLoc())) ||
8087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        (!FTL && Visit(TL)))
8097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return true;
8107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
8117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // Visit the nested-name-specifier, if present.
8127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (NestedNameSpecifierLoc QualifierLoc = ND->getQualifierLoc())
8137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (VisitNestedNameSpecifierLoc(QualifierLoc))
8147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        return true;
8157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
8167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // Visit the declaration name.
817651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (!isa<CXXDestructorDecl>(ND))
818651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      if (VisitDeclarationNameInfo(ND->getNameInfo()))
819651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        return true;
8207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
8217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // FIXME: Visit explicitly-specified template arguments!
8227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
8237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // Visit the function parameters, if we have a function type.
82439e6ab4be93d9c5e729a578ddd9d415cd2d49872David Blaikie    if (FTL && VisitFunctionTypeLoc(FTL, true))
8257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return true;
8267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
827ad017fa7a4df7389d245d02a49b3c79ed70bedb9Bill Wendling    // FIXME: Attributes?
8287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
8297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
8307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (ND->doesThisDeclarationHaveABody() && !ND->isLateTemplateParsed()) {
8317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (CXXConstructorDecl *Constructor = dyn_cast<CXXConstructorDecl>(ND)) {
8327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // Find the initializers that were written in the source.
8337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      SmallVector<CXXCtorInitializer *, 4> WrittenInits;
834651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      for (auto *I : Constructor->inits()) {
835651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        if (!I->isWritten())
8367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          continue;
8377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
838651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        WrittenInits.push_back(I);
8397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      }
8407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
8417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // Sort the initializers in source order
8427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      llvm::array_pod_sort(WrittenInits.begin(), WrittenInits.end(),
8437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                           &CompareCXXCtorInitializers);
8447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
8457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // Visit the initializers in source order
8467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      for (unsigned I = 0, N = WrittenInits.size(); I != N; ++I) {
8477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        CXXCtorInitializer *Init = WrittenInits[I];
8487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        if (Init->isAnyMemberInitializer()) {
8497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          if (Visit(MakeCursorMemberRef(Init->getAnyMember(),
8507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                        Init->getMemberLocation(), TU)))
8517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            return true;
8527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        } else if (TypeSourceInfo *TInfo = Init->getTypeSourceInfo()) {
8537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          if (Visit(TInfo->getTypeLoc()))
8547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            return true;
8557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        }
8567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
8577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        // Visit the initializer value.
8587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        if (Expr *Initializer = Init->getInit())
8597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          if (Visit(MakeCXCursor(Initializer, ND, TU, RegionOfInterest)))
8607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            return true;
8617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      }
8627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
8637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
8647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (Visit(MakeCXCursor(ND->getBody(), StmtParent, TU, RegionOfInterest)))
8657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return true;
8667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
8677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
8687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return false;
8697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
8707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
8717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitFieldDecl(FieldDecl *D) {
8727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (VisitDeclaratorDecl(D))
8737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return true;
8747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
8757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (Expr *BitWidth = D->getBitWidth())
8767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return Visit(MakeCXCursor(BitWidth, StmtParent, TU, RegionOfInterest));
8777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
8787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return false;
8797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
8807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
8817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitVarDecl(VarDecl *D) {
8827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (VisitDeclaratorDecl(D))
8837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return true;
8847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
8857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (Expr *Init = D->getInit())
8867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return Visit(MakeCXCursor(Init, StmtParent, TU, RegionOfInterest));
8877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
8887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return false;
8897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
8907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
8917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D) {
8927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (VisitDeclaratorDecl(D))
8937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return true;
8947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
8957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (D->hasDefaultArgument() && !D->defaultArgumentWasInherited())
8967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (Expr *DefArg = D->getDefaultArgument())
8977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return Visit(MakeCXCursor(DefArg, StmtParent, TU, RegionOfInterest));
8987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
8997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return false;
9007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
9017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
9027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitFunctionTemplateDecl(FunctionTemplateDecl *D) {
9037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // FIXME: Visit the "outer" template parameter lists on the FunctionDecl
9047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // before visiting these template parameters.
9057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (VisitTemplateParameters(D->getTemplateParameters()))
9067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return true;
9077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
9087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return VisitFunctionDecl(D->getTemplatedDecl());
9097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
9107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
9117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitClassTemplateDecl(ClassTemplateDecl *D) {
9127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // FIXME: Visit the "outer" template parameter lists on the TagDecl
9137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // before visiting these template parameters.
9147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (VisitTemplateParameters(D->getTemplateParameters()))
9157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return true;
9167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
9177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return VisitCXXRecordDecl(D->getTemplatedDecl());
9187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
9197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
9207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D) {
9217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (VisitTemplateParameters(D->getTemplateParameters()))
9227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return true;
9237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
9247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (D->hasDefaultArgument() && !D->defaultArgumentWasInherited() &&
9257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      VisitTemplateArgumentLoc(D->getDefaultArgument()))
9267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return true;
9277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
9287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return false;
9297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
9307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
93187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarbool CursorVisitor::VisitObjCTypeParamDecl(ObjCTypeParamDecl *D) {
93287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // Visit the bound, if it's explicit.
93387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  if (D->hasExplicitBound()) {
93487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    if (auto TInfo = D->getTypeSourceInfo()) {
93587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      if (Visit(TInfo->getTypeLoc()))
93687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar        return true;
93787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    }
93887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
93987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
94087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return false;
94187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
94287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
9437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitObjCMethodDecl(ObjCMethodDecl *ND) {
944651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (TypeSourceInfo *TSInfo = ND->getReturnTypeSourceInfo())
9457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (Visit(TSInfo->getTypeLoc()))
9467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return true;
9477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
9484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (const auto *P : ND->parameters()) {
949651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (Visit(MakeCXCursor(P, TU, RegionOfInterest)))
9507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return true;
9517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
9527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
9534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  return ND->isThisDeclarationADefinition() &&
9544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar         Visit(MakeCXCursor(ND->getBody(), StmtParent, TU, RegionOfInterest));
9557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
9567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
9577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeitemplate <typename DeclIt>
9587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic void addRangedDeclsInContainer(DeclIt *DI_current, DeclIt DE_current,
9597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                      SourceManager &SM, SourceLocation EndLoc,
9607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                      SmallVectorImpl<Decl *> &Decls) {
9617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  DeclIt next = *DI_current;
9627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  while (++next != DE_current) {
9637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    Decl *D_next = *next;
9647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (!D_next)
9657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      break;
9667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    SourceLocation L = D_next->getLocStart();
9677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (!L.isValid())
9687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      break;
9697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (SM.isBeforeInTranslationUnit(L, EndLoc)) {
9707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      *DI_current = next;
9717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      Decls.push_back(D_next);
9727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      continue;
9737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
9747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    break;
9757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
9767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
9777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
9787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitObjCContainerDecl(ObjCContainerDecl *D) {
9797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // FIXME: Eventually convert back to just 'VisitDeclContext()'.  Essentially
9807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // an @implementation can lexically contain Decls that are not properly
9817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // nested in the AST.  When we identify such cases, we need to retrofit
9827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // this nesting here.
9837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!DI_current && !FileDI_current)
9847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return VisitDeclContext(D);
9857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
9867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Scan the Decls that immediately come after the container
9877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // in the current DeclContext.  If any fall within the
9887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // container's lexical region, stash them into a vector
9897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // for later processing.
9907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  SmallVector<Decl *, 24> DeclsInContainer;
9917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  SourceLocation EndLoc = D->getSourceRange().getEnd();
9927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  SourceManager &SM = AU->getSourceManager();
9937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (EndLoc.isValid()) {
9947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (DI_current) {
9957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      addRangedDeclsInContainer(DI_current, DE_current, SM, EndLoc,
9967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                DeclsInContainer);
9977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    } else {
9987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      addRangedDeclsInContainer(FileDI_current, FileDE_current, SM, EndLoc,
9997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                DeclsInContainer);
10007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
10017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
10027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
10037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // The common case.
10047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (DeclsInContainer.empty())
10057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return VisitDeclContext(D);
10067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
10077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Get all the Decls in the DeclContext, and sort them with the
10087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // additional ones we've collected.  Then visit them.
1009651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  for (auto *SubDecl : D->decls()) {
1010651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (!SubDecl || SubDecl->getLexicalDeclContext() != D ||
1011651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        SubDecl->getLocStart().isInvalid())
10127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      continue;
1013651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    DeclsInContainer.push_back(SubDecl);
10147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
10157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
10167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Now sort the Decls so that they appear in lexical order.
10177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  std::sort(DeclsInContainer.begin(), DeclsInContainer.end(),
1018651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines            [&SM](Decl *A, Decl *B) {
1019651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    SourceLocation L_A = A->getLocStart();
1020651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    SourceLocation L_B = B->getLocStart();
1021651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    assert(L_A.isValid() && L_B.isValid());
1022651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return SM.isBeforeInTranslationUnit(L_A, L_B);
1023651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  });
10247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
10257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Now visit the decls.
10267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  for (SmallVectorImpl<Decl*>::iterator I = DeclsInContainer.begin(),
10277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei         E = DeclsInContainer.end(); I != E; ++I) {
10287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    CXCursor Cursor = MakeCXCursor(*I, TU, RegionOfInterest);
1029943f909ba72a1c9351dd421cac1413d303a719f1Ted Kremenek    const Optional<bool> &V = shouldVisitCursor(Cursor);
10307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (!V.hasValue())
10317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      continue;
10327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (!V.getValue())
10337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return false;
10347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (Visit(Cursor, true))
10357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return true;
10367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
10377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return false;
10387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
10397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
10407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitObjCCategoryDecl(ObjCCategoryDecl *ND) {
10417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (Visit(MakeCursorObjCClassRef(ND->getClassInterface(), ND->getLocation(),
10427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                   TU)))
10437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return true;
10447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
104587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  if (VisitObjCTypeParamList(ND->getTypeParamList()))
104687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return true;
104787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
10487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  ObjCCategoryDecl::protocol_loc_iterator PL = ND->protocol_loc_begin();
10497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  for (ObjCCategoryDecl::protocol_iterator I = ND->protocol_begin(),
10507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei         E = ND->protocol_end(); I != E; ++I, ++PL)
10517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (Visit(MakeCursorObjCProtocolRef(*I, *PL, TU)))
10527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return true;
10537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
10547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return VisitObjCContainerDecl(ND);
10557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
10567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
10577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitObjCProtocolDecl(ObjCProtocolDecl *PID) {
10587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!PID->isThisDeclarationADefinition())
10597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return Visit(MakeCursorObjCProtocolRef(PID, PID->getLocation(), TU));
10607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
10617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  ObjCProtocolDecl::protocol_loc_iterator PL = PID->protocol_loc_begin();
10627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  for (ObjCProtocolDecl::protocol_iterator I = PID->protocol_begin(),
10637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei       E = PID->protocol_end(); I != E; ++I, ++PL)
10647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (Visit(MakeCursorObjCProtocolRef(*I, *PL, TU)))
10657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return true;
10667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
10677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return VisitObjCContainerDecl(PID);
10687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
10697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
10707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitObjCPropertyDecl(ObjCPropertyDecl *PD) {
10717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (PD->getTypeSourceInfo() && Visit(PD->getTypeSourceInfo()->getTypeLoc()))
10727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return true;
10737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
10747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // FIXME: This implements a workaround with @property declarations also being
10757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // installed in the DeclContext for the @interface.  Eventually this code
10767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // should be removed.
10777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  ObjCCategoryDecl *CDecl = dyn_cast<ObjCCategoryDecl>(PD->getDeclContext());
10787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!CDecl || !CDecl->IsClassExtension())
10797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return false;
10807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
10817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  ObjCInterfaceDecl *ID = CDecl->getClassInterface();
10827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!ID)
10837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return false;
10847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
10857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  IdentifierInfo *PropertyId = PD->getIdentifier();
10867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  ObjCPropertyDecl *prevDecl =
10874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    ObjCPropertyDecl::findPropertyDecl(cast<DeclContext>(ID), PropertyId,
10884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                       PD->getQueryKind());
10897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
10907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!prevDecl)
10917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return false;
10927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
10937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Visit synthesized methods since they will be skipped when visiting
10947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // the @interface.
10957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (ObjCMethodDecl *MD = prevDecl->getGetterMethodDecl())
10967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (MD->isPropertyAccessor() && MD->getLexicalDeclContext() == CDecl)
10977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (Visit(MakeCXCursor(MD, TU, RegionOfInterest)))
10987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        return true;
10997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
11007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (ObjCMethodDecl *MD = prevDecl->getSetterMethodDecl())
11017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (MD->isPropertyAccessor() && MD->getLexicalDeclContext() == CDecl)
11027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (Visit(MakeCXCursor(MD, TU, RegionOfInterest)))
11037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        return true;
11047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
11057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return false;
11067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
11077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
110887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarbool CursorVisitor::VisitObjCTypeParamList(ObjCTypeParamList *typeParamList) {
110987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  if (!typeParamList)
111087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return false;
111187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
111287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  for (auto *typeParam : *typeParamList) {
111387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    // Visit the type parameter.
111487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    if (Visit(MakeCXCursor(typeParam, TU, RegionOfInterest)))
111587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      return true;
111687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
111787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
111887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return false;
111987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
112087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
11217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitObjCInterfaceDecl(ObjCInterfaceDecl *D) {
11227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!D->isThisDeclarationADefinition()) {
11237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // Forward declaration is treated like a reference.
11247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return Visit(MakeCursorObjCClassRef(D, D->getLocation(), TU));
11257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
11267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
112787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // Objective-C type parameters.
112887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  if (VisitObjCTypeParamList(D->getTypeParamListAsWritten()))
112987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return true;
113087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
11317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Issue callbacks for super class.
11327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (D->getSuperClass() &&
11337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      Visit(MakeCursorObjCSuperClassRef(D->getSuperClass(),
11347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                        D->getSuperClassLoc(),
11357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                        TU)))
11367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return true;
11377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
113887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  if (TypeSourceInfo *SuperClassTInfo = D->getSuperClassTInfo())
113987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    if (Visit(SuperClassTInfo->getTypeLoc()))
114087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      return true;
114187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
11427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  ObjCInterfaceDecl::protocol_loc_iterator PL = D->protocol_loc_begin();
11437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  for (ObjCInterfaceDecl::protocol_iterator I = D->protocol_begin(),
11447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei         E = D->protocol_end(); I != E; ++I, ++PL)
11457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (Visit(MakeCursorObjCProtocolRef(*I, *PL, TU)))
11467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return true;
11477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
11487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return VisitObjCContainerDecl(D);
11497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
11507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
11517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitObjCImplDecl(ObjCImplDecl *D) {
11527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return VisitObjCContainerDecl(D);
11537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
11547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
11557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D) {
11567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // 'ID' could be null when dealing with invalid code.
11577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (ObjCInterfaceDecl *ID = D->getClassInterface())
11587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (Visit(MakeCursorObjCClassRef(ID, D->getLocation(), TU)))
11597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return true;
11607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
11617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return VisitObjCImplDecl(D);
11627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
11637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
11647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitObjCImplementationDecl(ObjCImplementationDecl *D) {
11657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#if 0
11667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Issue callbacks for super class.
11677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // FIXME: No source location information!
11687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (D->getSuperClass() &&
11697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      Visit(MakeCursorObjCSuperClassRef(D->getSuperClass(),
11707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                        D->getSuperClassLoc(),
11717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                        TU)))
11727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return true;
11737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#endif
11747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
11757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return VisitObjCImplDecl(D);
11767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
11777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
11787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *PD) {
11797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (ObjCIvarDecl *Ivar = PD->getPropertyIvarDecl())
11807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (PD->isIvarNameSpecified())
11817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return Visit(MakeCursorMemberRef(Ivar, PD->getPropertyIvarDeclLoc(), TU));
11827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
11837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return false;
11847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
11857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
11867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitNamespaceDecl(NamespaceDecl *D) {
11877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return VisitDeclContext(D);
11887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
11897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
11907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitNamespaceAliasDecl(NamespaceAliasDecl *D) {
11917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Visit nested-name-specifier.
11927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (NestedNameSpecifierLoc QualifierLoc = D->getQualifierLoc())
11937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (VisitNestedNameSpecifierLoc(QualifierLoc))
11947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return true;
11957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
11967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return Visit(MakeCursorNamespaceRef(D->getAliasedNamespace(),
11977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                      D->getTargetNameLoc(), TU));
11987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
11997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
12007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitUsingDecl(UsingDecl *D) {
12017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Visit nested-name-specifier.
12027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (NestedNameSpecifierLoc QualifierLoc = D->getQualifierLoc()) {
12037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (VisitNestedNameSpecifierLoc(QualifierLoc))
12047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return true;
12057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
12067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
12077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (Visit(MakeCursorOverloadedDeclRef(D, D->getLocation(), TU)))
12087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return true;
12097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
12107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return VisitDeclarationNameInfo(D->getNameInfo());
12117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
12127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
12137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitUsingDirectiveDecl(UsingDirectiveDecl *D) {
12147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Visit nested-name-specifier.
12157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (NestedNameSpecifierLoc QualifierLoc = D->getQualifierLoc())
12167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (VisitNestedNameSpecifierLoc(QualifierLoc))
12177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return true;
12187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
12197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return Visit(MakeCursorNamespaceRef(D->getNominatedNamespaceAsWritten(),
12207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                      D->getIdentLocation(), TU));
12217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
12227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
12237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D) {
12247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Visit nested-name-specifier.
12257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (NestedNameSpecifierLoc QualifierLoc = D->getQualifierLoc()) {
12267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (VisitNestedNameSpecifierLoc(QualifierLoc))
12277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return true;
12287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
12297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
12307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return VisitDeclarationNameInfo(D->getNameInfo());
12317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
12327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
12337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitUnresolvedUsingTypenameDecl(
12347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                               UnresolvedUsingTypenameDecl *D) {
12357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Visit nested-name-specifier.
12367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (NestedNameSpecifierLoc QualifierLoc = D->getQualifierLoc())
12377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (VisitNestedNameSpecifierLoc(QualifierLoc))
12387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return true;
12397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
12407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return false;
12417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
12427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
12434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarbool CursorVisitor::VisitStaticAssertDecl(StaticAssertDecl *D) {
12444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  if (Visit(MakeCXCursor(D->getAssertExpr(), StmtParent, TU, RegionOfInterest)))
12454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return true;
12464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  if (Visit(MakeCXCursor(D->getMessage(), StmtParent, TU, RegionOfInterest)))
12474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return true;
12484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  return false;
12494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
12504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
12517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitDeclarationNameInfo(DeclarationNameInfo Name) {
12527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  switch (Name.getName().getNameKind()) {
12537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case clang::DeclarationName::Identifier:
12547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case clang::DeclarationName::CXXLiteralOperatorName:
12557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case clang::DeclarationName::CXXOperatorName:
12567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case clang::DeclarationName::CXXUsingDirective:
12577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return false;
12587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
12597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case clang::DeclarationName::CXXConstructorName:
12607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case clang::DeclarationName::CXXDestructorName:
12617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case clang::DeclarationName::CXXConversionFunctionName:
12627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (TypeSourceInfo *TSInfo = Name.getNamedTypeInfo())
12637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return Visit(TSInfo->getTypeLoc());
12647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return false;
12657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
12667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case clang::DeclarationName::ObjCZeroArgSelector:
12677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case clang::DeclarationName::ObjCOneArgSelector:
12687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case clang::DeclarationName::ObjCMultiArgSelector:
12697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // FIXME: Per-identifier location info?
12707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return false;
12717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
12727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
12737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  llvm_unreachable("Invalid DeclarationName::Kind!");
12747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
12757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
12767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitNestedNameSpecifier(NestedNameSpecifier *NNS,
12777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                             SourceRange Range) {
12787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // FIXME: This whole routine is a hack to work around the lack of proper
12797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // source information in nested-name-specifiers (PR5791). Since we do have
12807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // a beginning source location, we can visit the first component of the
12817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // nested-name-specifier, if it's a single-token component.
12827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!NNS)
12837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return false;
12847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
12857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Get the first component in the nested-name-specifier.
12867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  while (NestedNameSpecifier *Prefix = NNS->getPrefix())
12877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    NNS = Prefix;
12887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
12897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  switch (NNS->getKind()) {
12907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case NestedNameSpecifier::Namespace:
12917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return Visit(MakeCursorNamespaceRef(NNS->getAsNamespace(), Range.getBegin(),
12927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                        TU));
12937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
12947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case NestedNameSpecifier::NamespaceAlias:
12957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return Visit(MakeCursorNamespaceRef(NNS->getAsNamespaceAlias(),
12967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                        Range.getBegin(), TU));
12977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
12987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case NestedNameSpecifier::TypeSpec: {
12997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // If the type has a form where we know that the beginning of the source
13007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // range matches up with a reference cursor. Visit the appropriate reference
13017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // cursor.
13027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    const Type *T = NNS->getAsType();
13037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (const TypedefType *Typedef = dyn_cast<TypedefType>(T))
13047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return Visit(MakeCursorTypeRef(Typedef->getDecl(), Range.getBegin(), TU));
13057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (const TagType *Tag = dyn_cast<TagType>(T))
13067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return Visit(MakeCursorTypeRef(Tag->getDecl(), Range.getBegin(), TU));
13077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (const TemplateSpecializationType *TST
13087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                      = dyn_cast<TemplateSpecializationType>(T))
13097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return VisitTemplateName(TST->getTemplateName(), Range.getBegin());
13107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    break;
13117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
13127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
13137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case NestedNameSpecifier::TypeSpecWithTemplate:
13147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case NestedNameSpecifier::Global:
13157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case NestedNameSpecifier::Identifier:
1316176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  case NestedNameSpecifier::Super:
13177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    break;
13187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
13197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
13207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return false;
13217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
13227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
13237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool
13247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCursorVisitor::VisitNestedNameSpecifierLoc(NestedNameSpecifierLoc Qualifier) {
13257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  SmallVector<NestedNameSpecifierLoc, 4> Qualifiers;
13267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  for (; Qualifier; Qualifier = Qualifier.getPrefix())
13277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    Qualifiers.push_back(Qualifier);
13287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
13297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  while (!Qualifiers.empty()) {
13307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    NestedNameSpecifierLoc Q = Qualifiers.pop_back_val();
13317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    NestedNameSpecifier *NNS = Q.getNestedNameSpecifier();
13327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    switch (NNS->getKind()) {
13337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case NestedNameSpecifier::Namespace:
13347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (Visit(MakeCursorNamespaceRef(NNS->getAsNamespace(),
13357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                       Q.getLocalBeginLoc(),
13367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                       TU)))
13377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        return true;
13387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
13397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      break;
13407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
13417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case NestedNameSpecifier::NamespaceAlias:
13427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (Visit(MakeCursorNamespaceRef(NNS->getAsNamespaceAlias(),
13437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                       Q.getLocalBeginLoc(),
13447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                       TU)))
13457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        return true;
13467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
13477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      break;
13487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
13497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case NestedNameSpecifier::TypeSpec:
13507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case NestedNameSpecifier::TypeSpecWithTemplate:
13517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (Visit(Q.getTypeLoc()))
13527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        return true;
13537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
13547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      break;
13557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
13567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case NestedNameSpecifier::Global:
13577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case NestedNameSpecifier::Identifier:
1358176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    case NestedNameSpecifier::Super:
13597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      break;
13607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
13617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
13627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
13637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return false;
13647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
13657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
13667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitTemplateParameters(
13677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                          const TemplateParameterList *Params) {
13687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!Params)
13697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return false;
13707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
13717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  for (TemplateParameterList::const_iterator P = Params->begin(),
13727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                          PEnd = Params->end();
13737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei       P != PEnd; ++P) {
13747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (Visit(MakeCXCursor(*P, TU, RegionOfInterest)))
13757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return true;
13767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
13777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
13787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return false;
13797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
13807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
13817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitTemplateName(TemplateName Name, SourceLocation Loc) {
13827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  switch (Name.getKind()) {
13837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case TemplateName::Template:
13847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return Visit(MakeCursorTemplateRef(Name.getAsTemplateDecl(), Loc, TU));
13857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
13867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case TemplateName::OverloadedTemplate:
13877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // Visit the overloaded template set.
13887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (Visit(MakeCursorOverloadedDeclRef(Name, Loc, TU)))
13897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return true;
13907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
13917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return false;
13927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
13937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case TemplateName::DependentTemplate:
13947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // FIXME: Visit nested-name-specifier.
13957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return false;
13967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
13977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case TemplateName::QualifiedTemplate:
13987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // FIXME: Visit nested-name-specifier.
13997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return Visit(MakeCursorTemplateRef(
14007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                  Name.getAsQualifiedTemplateName()->getDecl(),
14017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                       Loc, TU));
14027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
14037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case TemplateName::SubstTemplateTemplateParm:
14047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return Visit(MakeCursorTemplateRef(
14057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                         Name.getAsSubstTemplateTemplateParm()->getParameter(),
14067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                       Loc, TU));
14077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
14087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case TemplateName::SubstTemplateTemplateParmPack:
14097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return Visit(MakeCursorTemplateRef(
14107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                  Name.getAsSubstTemplateTemplateParmPack()->getParameterPack(),
14117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                       Loc, TU));
14127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
14137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
14147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  llvm_unreachable("Invalid TemplateName::Kind!");
14157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
14167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
14177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitTemplateArgumentLoc(const TemplateArgumentLoc &TAL) {
14187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  switch (TAL.getArgument().getKind()) {
14197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case TemplateArgument::Null:
14207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case TemplateArgument::Integral:
14217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case TemplateArgument::Pack:
14227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return false;
14237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
14247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case TemplateArgument::Type:
14257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (TypeSourceInfo *TSInfo = TAL.getTypeSourceInfo())
14267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return Visit(TSInfo->getTypeLoc());
14277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return false;
14287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
14297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case TemplateArgument::Declaration:
14307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (Expr *E = TAL.getSourceDeclExpression())
14317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return Visit(MakeCXCursor(E, StmtParent, TU, RegionOfInterest));
14327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return false;
14337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
14347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case TemplateArgument::NullPtr:
14357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (Expr *E = TAL.getSourceNullPtrExpression())
14367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return Visit(MakeCXCursor(E, StmtParent, TU, RegionOfInterest));
14377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return false;
14387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
14397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case TemplateArgument::Expression:
14407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (Expr *E = TAL.getSourceExpression())
14417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return Visit(MakeCXCursor(E, StmtParent, TU, RegionOfInterest));
14427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return false;
14437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
14447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case TemplateArgument::Template:
14457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case TemplateArgument::TemplateExpansion:
14467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (VisitNestedNameSpecifierLoc(TAL.getTemplateQualifierLoc()))
14477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return true;
14487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
14497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return VisitTemplateName(TAL.getArgument().getAsTemplateOrTemplatePattern(),
14507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                             TAL.getTemplateNameLoc());
14517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
14527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
14537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  llvm_unreachable("Invalid TemplateArgument::Kind!");
14547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
14557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
14567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitLinkageSpecDecl(LinkageSpecDecl *D) {
14577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return VisitDeclContext(D);
14587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
14597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
14607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitQualifiedTypeLoc(QualifiedTypeLoc TL) {
14617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return Visit(TL.getUnqualifiedLoc());
14627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
14637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
14647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) {
14657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  ASTContext &Context = AU->getASTContext();
14667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
14677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Some builtin types (such as Objective-C's "id", "sel", and
14687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // "Class") have associated declarations. Create cursors for those.
14697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  QualType VisitType;
14707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  switch (TL.getTypePtr()->getKind()) {
14717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
14727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case BuiltinType::Void:
14737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case BuiltinType::NullPtr:
14747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case BuiltinType::Dependent:
14754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
14764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  case BuiltinType::Id:
14774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#include "clang/Basic/OpenCLImageTypes.def"
1478775bb8a4aecdd1e0af2a7a6baba449f074afa2c1NAKAMURA Takumi  case BuiltinType::OCLSampler:
1479e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei  case BuiltinType::OCLEvent:
148087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  case BuiltinType::OCLClkEvent:
148187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  case BuiltinType::OCLQueue:
148287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  case BuiltinType::OCLNDRange:
148387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  case BuiltinType::OCLReserveID:
14847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define BUILTIN_TYPE(Id, SingletonId)
14857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define SIGNED_TYPE(Id, SingletonId) case BuiltinType::Id:
14867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define UNSIGNED_TYPE(Id, SingletonId) case BuiltinType::Id:
14877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define FLOATING_TYPE(Id, SingletonId) case BuiltinType::Id:
14887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define PLACEHOLDER_TYPE(Id, SingletonId) case BuiltinType::Id:
14897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/AST/BuiltinTypes.def"
14907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    break;
14917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
14927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case BuiltinType::ObjCId:
14937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    VisitType = Context.getObjCIdType();
14947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    break;
14957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
14967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case BuiltinType::ObjCClass:
14977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    VisitType = Context.getObjCClassType();
14987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    break;
14997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
15007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case BuiltinType::ObjCSel:
15017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    VisitType = Context.getObjCSelType();
15027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    break;
15037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
15047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
15057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!VisitType.isNull()) {
15067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (const TypedefType *Typedef = VisitType->getAs<TypedefType>())
15077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return Visit(MakeCursorTypeRef(Typedef->getDecl(), TL.getBuiltinLoc(),
15087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                     TU));
15097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
15107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
15117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return false;
15127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
15137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
15147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitTypedefTypeLoc(TypedefTypeLoc TL) {
15157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return Visit(MakeCursorTypeRef(TL.getTypedefNameDecl(), TL.getNameLoc(), TU));
15167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
15177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
15187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) {
15197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return Visit(MakeCursorTypeRef(TL.getDecl(), TL.getNameLoc(), TU));
15207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
15217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
15227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitTagTypeLoc(TagTypeLoc TL) {
15237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (TL.isDefinition())
15247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return Visit(MakeCXCursor(TL.getDecl(), TU, RegionOfInterest));
15257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
15267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return Visit(MakeCursorTypeRef(TL.getDecl(), TL.getNameLoc(), TU));
15277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
15287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
15297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) {
15307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return Visit(MakeCursorTypeRef(TL.getDecl(), TL.getNameLoc(), TU));
15317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
15327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
15337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) {
153487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return Visit(MakeCursorObjCClassRef(TL.getIFaceDecl(), TL.getNameLoc(), TU));
15357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
15367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
15377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) {
15387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (TL.hasBaseTypeAsWritten() && Visit(TL.getBaseLoc()))
15397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return true;
15407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
154187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  for (unsigned I = 0, N = TL.getNumTypeArgs(); I != N; ++I) {
154287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    if (Visit(TL.getTypeArgTInfo(I)->getTypeLoc()))
154387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      return true;
154487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
154587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
15467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  for (unsigned I = 0, N = TL.getNumProtocols(); I != N; ++I) {
15477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (Visit(MakeCursorObjCProtocolRef(TL.getProtocol(I), TL.getProtocolLoc(I),
15487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                        TU)))
15497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return true;
15507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
15517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
15527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return false;
15537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
15547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
15557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) {
15567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return Visit(TL.getPointeeLoc());
15577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
15587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
15597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitParenTypeLoc(ParenTypeLoc TL) {
15607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return Visit(TL.getInnerLoc());
15617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
15627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
15637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitPointerTypeLoc(PointerTypeLoc TL) {
15647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return Visit(TL.getPointeeLoc());
15657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
15667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
15677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) {
15687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return Visit(TL.getPointeeLoc());
15697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
15707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
15717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) {
15727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return Visit(TL.getPointeeLoc());
15737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
15747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
15757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) {
15767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return Visit(TL.getPointeeLoc());
15777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
15787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
15797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) {
15807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return Visit(TL.getPointeeLoc());
15817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
15827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
15837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitAttributedTypeLoc(AttributedTypeLoc TL) {
15847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return Visit(TL.getModifiedLoc());
15857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
15867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
15877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitFunctionTypeLoc(FunctionTypeLoc TL,
15887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                         bool SkipResultType) {
1589651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (!SkipResultType && Visit(TL.getReturnLoc()))
15907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return true;
15917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
1592651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  for (unsigned I = 0, N = TL.getNumParams(); I != N; ++I)
1593651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (Decl *D = TL.getParam(I))
15947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (Visit(MakeCXCursor(D, TU, RegionOfInterest)))
15957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        return true;
15967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
15977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return false;
15987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
15997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
16007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitArrayTypeLoc(ArrayTypeLoc TL) {
16017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (Visit(TL.getElementLoc()))
16027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return true;
16037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
16047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (Expr *Size = TL.getSizeExpr())
16057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return Visit(MakeCXCursor(Size, StmtParent, TU, RegionOfInterest));
16067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
16077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return false;
16087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
16097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
161012df246d6dea2ee1f92c186f922f1afcf499647aReid Klecknerbool CursorVisitor::VisitDecayedTypeLoc(DecayedTypeLoc TL) {
161112df246d6dea2ee1f92c186f922f1afcf499647aReid Kleckner  return Visit(TL.getOriginalLoc());
161212df246d6dea2ee1f92c186f922f1afcf499647aReid Kleckner}
161312df246d6dea2ee1f92c186f922f1afcf499647aReid Kleckner
1614651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesbool CursorVisitor::VisitAdjustedTypeLoc(AdjustedTypeLoc TL) {
1615651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return Visit(TL.getOriginalLoc());
1616651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
1617651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
16187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitTemplateSpecializationTypeLoc(
16197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                             TemplateSpecializationTypeLoc TL) {
16207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Visit the template name.
16217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (VisitTemplateName(TL.getTypePtr()->getTemplateName(),
16227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                        TL.getTemplateNameLoc()))
16237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return true;
16247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
16257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Visit the template arguments.
16267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  for (unsigned I = 0, N = TL.getNumArgs(); I != N; ++I)
16277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (VisitTemplateArgumentLoc(TL.getArgLoc(I)))
16287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return true;
16297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
16307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return false;
16317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
16327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
16337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) {
16347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return Visit(MakeCXCursor(TL.getUnderlyingExpr(), StmtParent, TU));
16357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
16367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
16377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) {
16387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (TypeSourceInfo *TSInfo = TL.getUnderlyingTInfo())
16397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return Visit(TSInfo->getTypeLoc());
16407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
16417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return false;
16427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
16437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
16447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) {
16457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (TypeSourceInfo *TSInfo = TL.getUnderlyingTInfo())
16467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return Visit(TSInfo->getTypeLoc());
16477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
16487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return false;
16497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
16507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
16517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) {
165287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return VisitNestedNameSpecifierLoc(TL.getQualifierLoc());
16537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
16547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
16557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitDependentTemplateSpecializationTypeLoc(
16567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                    DependentTemplateSpecializationTypeLoc TL) {
16577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Visit the nested-name-specifier, if there is one.
16587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (TL.getQualifierLoc() &&
16597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      VisitNestedNameSpecifierLoc(TL.getQualifierLoc()))
16607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return true;
16617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
16627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Visit the template arguments.
16637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  for (unsigned I = 0, N = TL.getNumArgs(); I != N; ++I)
16647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (VisitTemplateArgumentLoc(TL.getArgLoc(I)))
16657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return true;
16667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
16677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return false;
16687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
16697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
16707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitElaboratedTypeLoc(ElaboratedTypeLoc TL) {
16717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (VisitNestedNameSpecifierLoc(TL.getQualifierLoc()))
16727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return true;
16737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
16747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return Visit(TL.getNamedTypeLoc());
16757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
16767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
16777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) {
16787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return Visit(TL.getPatternLoc());
16797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
16807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
16817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitDecltypeTypeLoc(DecltypeTypeLoc TL) {
16827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (Expr *E = TL.getUnderlyingExpr())
16837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return Visit(MakeCXCursor(E, StmtParent, TU));
16847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
16857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return false;
16867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
16877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
16887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitInjectedClassNameTypeLoc(InjectedClassNameTypeLoc TL) {
16897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return Visit(MakeCursorTypeRef(TL.getDecl(), TL.getNameLoc(), TU));
16907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
16917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
16927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitAtomicTypeLoc(AtomicTypeLoc TL) {
16937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return Visit(TL.getValueLoc());
16947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
16957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
16964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarbool CursorVisitor::VisitPipeTypeLoc(PipeTypeLoc TL) {
16974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  return Visit(TL.getValueLoc());
16984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
16994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
17007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define DEFAULT_TYPELOC_IMPL(CLASS, PARENT) \
17017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::Visit##CLASS##TypeLoc(CLASS##TypeLoc TL) { \
17027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return Visit##PARENT##Loc(TL); \
17037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
17047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
17057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiDEFAULT_TYPELOC_IMPL(Complex, Type)
17067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiDEFAULT_TYPELOC_IMPL(ConstantArray, ArrayType)
17077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiDEFAULT_TYPELOC_IMPL(IncompleteArray, ArrayType)
17087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiDEFAULT_TYPELOC_IMPL(VariableArray, ArrayType)
17097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiDEFAULT_TYPELOC_IMPL(DependentSizedArray, ArrayType)
17107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiDEFAULT_TYPELOC_IMPL(DependentSizedExtVector, Type)
17117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiDEFAULT_TYPELOC_IMPL(Vector, Type)
17127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiDEFAULT_TYPELOC_IMPL(ExtVector, VectorType)
17137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiDEFAULT_TYPELOC_IMPL(FunctionProto, FunctionType)
17147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiDEFAULT_TYPELOC_IMPL(FunctionNoProto, FunctionType)
17157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiDEFAULT_TYPELOC_IMPL(Record, TagType)
17167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiDEFAULT_TYPELOC_IMPL(Enum, TagType)
17177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiDEFAULT_TYPELOC_IMPL(SubstTemplateTypeParm, Type)
17187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiDEFAULT_TYPELOC_IMPL(SubstTemplateTypeParmPack, Type)
17197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiDEFAULT_TYPELOC_IMPL(Auto, Type)
17207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
17217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitCXXRecordDecl(CXXRecordDecl *D) {
17227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Visit the nested-name-specifier, if present.
17237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (NestedNameSpecifierLoc QualifierLoc = D->getQualifierLoc())
17247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (VisitNestedNameSpecifierLoc(QualifierLoc))
17257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return true;
17267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
17277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (D->isCompleteDefinition()) {
1728651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    for (const auto &I : D->bases()) {
1729651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      if (Visit(cxcursor::MakeCursorCXXBaseSpecifier(&I, TU)))
17307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        return true;
17317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
17327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
17337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
17347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return VisitTagDecl(D);
17357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
17367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
17377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::VisitAttributes(Decl *D) {
1738651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  for (const auto *I : D->attrs())
1739651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (Visit(MakeCXCursor(I, D, TU)))
17407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        return true;
17417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
17427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return false;
17437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
17447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
17457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----------------------------------------------------------------------===//
17467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// Data-recursive visitor methods.
17477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----------------------------------------------------------------------===//
17487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
17497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeinamespace {
17507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define DEF_JOB(NAME, DATA, KIND)\
17517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiclass NAME : public VisitorJob {\
17527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeipublic:\
1753ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  NAME(const DATA *d, CXCursor parent) : \
1754ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko      VisitorJob(parent, VisitorJob::KIND, d) {} \
17557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  static bool classof(const VisitorJob *VJ) { return VJ->getKind() == KIND; }\
1756ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  const DATA *get() const { return static_cast<const DATA*>(data[0]); }\
17577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei};
17587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
17597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiDEF_JOB(StmtVisit, Stmt, StmtVisitKind)
17607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiDEF_JOB(MemberExprParts, MemberExpr, MemberExprPartsKind)
17617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiDEF_JOB(DeclRefExprParts, DeclRefExpr, DeclRefExprPartsKind)
17627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiDEF_JOB(OverloadExprParts, OverloadExpr, OverloadExprPartsKind)
17637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiDEF_JOB(SizeOfPackExprParts, SizeOfPackExpr, SizeOfPackExprPartsKind)
17647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiDEF_JOB(LambdaExprParts, LambdaExpr, LambdaExprPartsKind)
17657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiDEF_JOB(PostChildrenVisit, void, PostChildrenVisitKind)
17667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#undef DEF_JOB
17677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
17684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarclass ExplicitTemplateArgsVisit : public VisitorJob {
17694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarpublic:
17704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ExplicitTemplateArgsVisit(const TemplateArgumentLoc *Begin,
17714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                            const TemplateArgumentLoc *End, CXCursor parent)
17724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      : VisitorJob(parent, VisitorJob::ExplicitTemplateArgsVisitKind, Begin,
17734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                   End) {}
17744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  static bool classof(const VisitorJob *VJ) {
17754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return VJ->getKind() == ExplicitTemplateArgsVisitKind;
17764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
17774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  const TemplateArgumentLoc *begin() const {
17784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return static_cast<const TemplateArgumentLoc *>(data[0]);
17794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
17804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  const TemplateArgumentLoc *end() {
17814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return static_cast<const TemplateArgumentLoc *>(data[1]);
17824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
17834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar};
17847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiclass DeclVisit : public VisitorJob {
17857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeipublic:
1786ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  DeclVisit(const Decl *D, CXCursor parent, bool isFirst) :
17877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    VisitorJob(parent, VisitorJob::DeclVisitKind,
1788c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines               D, isFirst ? (void*) 1 : (void*) nullptr) {}
17897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  static bool classof(const VisitorJob *VJ) {
17907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return VJ->getKind() == DeclVisitKind;
17917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
1792ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  const Decl *get() const { return static_cast<const Decl *>(data[0]); }
17933ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  bool isFirst() const { return data[1] != nullptr; }
17947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei};
17957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiclass TypeLocVisit : public VisitorJob {
17967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeipublic:
17977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  TypeLocVisit(TypeLoc tl, CXCursor parent) :
17987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    VisitorJob(parent, VisitorJob::TypeLocVisitKind,
17997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei               tl.getType().getAsOpaquePtr(), tl.getOpaqueData()) {}
18007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
18017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  static bool classof(const VisitorJob *VJ) {
18027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return VJ->getKind() == TypeLocVisitKind;
18037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
18047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
18057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  TypeLoc get() const {
18067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    QualType T = QualType::getFromOpaquePtr(data[0]);
1807ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko    return TypeLoc(T, const_cast<void *>(data[1]));
18087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
18097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei};
18107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
18117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiclass LabelRefVisit : public VisitorJob {
18127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeipublic:
18137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  LabelRefVisit(LabelDecl *LD, SourceLocation labelLoc, CXCursor parent)
18147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    : VisitorJob(parent, VisitorJob::LabelRefVisitKind, LD,
18157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                 labelLoc.getPtrEncoding()) {}
18167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
18177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  static bool classof(const VisitorJob *VJ) {
18187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return VJ->getKind() == VisitorJob::LabelRefVisitKind;
18197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
1820ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  const LabelDecl *get() const {
1821ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko    return static_cast<const LabelDecl *>(data[0]);
1822ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  }
18237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  SourceLocation getLoc() const {
18247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return SourceLocation::getFromPtrEncoding(data[1]); }
18257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei};
18267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
18277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiclass NestedNameSpecifierLocVisit : public VisitorJob {
18287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeipublic:
18297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  NestedNameSpecifierLocVisit(NestedNameSpecifierLoc Qualifier, CXCursor parent)
18307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    : VisitorJob(parent, VisitorJob::NestedNameSpecifierLocVisitKind,
18317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                 Qualifier.getNestedNameSpecifier(),
18327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                 Qualifier.getOpaqueData()) { }
18337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
18347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  static bool classof(const VisitorJob *VJ) {
18357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return VJ->getKind() == VisitorJob::NestedNameSpecifierLocVisitKind;
18367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
18377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
18387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  NestedNameSpecifierLoc get() const {
1839ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko    return NestedNameSpecifierLoc(
1840ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko            const_cast<NestedNameSpecifier *>(
1841ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko              static_cast<const NestedNameSpecifier *>(data[0])),
1842ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko            const_cast<void *>(data[1]));
18437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
18447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei};
18457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
18467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiclass DeclarationNameInfoVisit : public VisitorJob {
18477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeipublic:
1848ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  DeclarationNameInfoVisit(const Stmt *S, CXCursor parent)
1849a376f8774a73cfeb1c48bf2fe0baa8c2731cfaccDmitri Gribenko    : VisitorJob(parent, VisitorJob::DeclarationNameInfoVisitKind, S) {}
18507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  static bool classof(const VisitorJob *VJ) {
18517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return VJ->getKind() == VisitorJob::DeclarationNameInfoVisitKind;
18527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
18537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  DeclarationNameInfo get() const {
1854ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko    const Stmt *S = static_cast<const Stmt *>(data[0]);
18557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    switch (S->getStmtClass()) {
18567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    default:
18577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      llvm_unreachable("Unhandled Stmt");
18587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case clang::Stmt::MSDependentExistsStmtClass:
18597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return cast<MSDependentExistsStmt>(S)->getNameInfo();
18607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case Stmt::CXXDependentScopeMemberExprClass:
18617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return cast<CXXDependentScopeMemberExpr>(S)->getMemberNameInfo();
18627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case Stmt::DependentScopeDeclRefExprClass:
18637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return cast<DependentScopeDeclRefExpr>(S)->getNameInfo();
1864176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    case Stmt::OMPCriticalDirectiveClass:
1865176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      return cast<OMPCriticalDirective>(S)->getDirectiveName();
18667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
18677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
18687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei};
18697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiclass MemberRefVisit : public VisitorJob {
18707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeipublic:
1871ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  MemberRefVisit(const FieldDecl *D, SourceLocation L, CXCursor parent)
18727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    : VisitorJob(parent, VisitorJob::MemberRefVisitKind, D,
18737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                 L.getPtrEncoding()) {}
18747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  static bool classof(const VisitorJob *VJ) {
18757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return VJ->getKind() == VisitorJob::MemberRefVisitKind;
18767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
1877ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  const FieldDecl *get() const {
1878ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko    return static_cast<const FieldDecl *>(data[0]);
18797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
18807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  SourceLocation getLoc() const {
18817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return SourceLocation::getFromRawEncoding((unsigned)(uintptr_t) data[1]);
18827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
18837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei};
1884ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkoclass EnqueueVisitor : public ConstStmtVisitor<EnqueueVisitor, void> {
18854fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  friend class OMPClauseEnqueue;
18867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  VisitorWorkList &WL;
18877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  CXCursor Parent;
18887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeipublic:
18897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  EnqueueVisitor(VisitorWorkList &wl, CXCursor parent)
18907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    : WL(wl), Parent(parent) {}
18917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
1892ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitAddrLabelExpr(const AddrLabelExpr *E);
1893ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitBlockExpr(const BlockExpr *B);
1894ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitCompoundLiteralExpr(const CompoundLiteralExpr *E);
1895ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitCompoundStmt(const CompoundStmt *S);
1896ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitCXXDefaultArgExpr(const CXXDefaultArgExpr *E) { /* Do nothing. */ }
1897ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitMSDependentExistsStmt(const MSDependentExistsStmt *S);
1898ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitCXXDependentScopeMemberExpr(const CXXDependentScopeMemberExpr *E);
1899ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitCXXNewExpr(const CXXNewExpr *E);
1900ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitCXXScalarValueInitExpr(const CXXScalarValueInitExpr *E);
1901ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitCXXOperatorCallExpr(const CXXOperatorCallExpr *E);
1902ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitCXXPseudoDestructorExpr(const CXXPseudoDestructorExpr *E);
1903ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitCXXTemporaryObjectExpr(const CXXTemporaryObjectExpr *E);
1904ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitCXXTypeidExpr(const CXXTypeidExpr *E);
1905ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitCXXUnresolvedConstructExpr(const CXXUnresolvedConstructExpr *E);
1906ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitCXXUuidofExpr(const CXXUuidofExpr *E);
1907ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitCXXCatchStmt(const CXXCatchStmt *S);
1908176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  void VisitCXXForRangeStmt(const CXXForRangeStmt *S);
1909ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitDeclRefExpr(const DeclRefExpr *D);
1910ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitDeclStmt(const DeclStmt *S);
1911ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitDependentScopeDeclRefExpr(const DependentScopeDeclRefExpr *E);
1912ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitDesignatedInitExpr(const DesignatedInitExpr *E);
1913ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitExplicitCastExpr(const ExplicitCastExpr *E);
1914ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitForStmt(const ForStmt *FS);
1915ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitGotoStmt(const GotoStmt *GS);
1916ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitIfStmt(const IfStmt *If);
1917ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitInitListExpr(const InitListExpr *IE);
1918ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitMemberExpr(const MemberExpr *M);
1919ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitOffsetOfExpr(const OffsetOfExpr *E);
1920ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitObjCEncodeExpr(const ObjCEncodeExpr *E);
1921ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitObjCMessageExpr(const ObjCMessageExpr *M);
1922ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitOverloadExpr(const OverloadExpr *E);
1923ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitUnaryExprOrTypeTraitExpr(const UnaryExprOrTypeTraitExpr *E);
1924ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitStmt(const Stmt *S);
1925ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitSwitchStmt(const SwitchStmt *S);
1926ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitWhileStmt(const WhileStmt *W);
1927ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitTypeTraitExpr(const TypeTraitExpr *E);
1928ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitArrayTypeTraitExpr(const ArrayTypeTraitExpr *E);
1929ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitExpressionTraitExpr(const ExpressionTraitExpr *E);
1930ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitUnresolvedMemberExpr(const UnresolvedMemberExpr *U);
1931ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitVAArgExpr(const VAArgExpr *E);
1932ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitSizeOfPackExpr(const SizeOfPackExpr *E);
1933ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitPseudoObjectExpr(const PseudoObjectExpr *E);
1934ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitOpaqueValueExpr(const OpaqueValueExpr *E);
1935ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void VisitLambdaExpr(const LambdaExpr *E);
19364fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  void VisitOMPExecutableDirective(const OMPExecutableDirective *D);
1937176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  void VisitOMPLoopDirective(const OMPLoopDirective *D);
19384fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  void VisitOMPParallelDirective(const OMPParallelDirective *D);
1939651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void VisitOMPSimdDirective(const OMPSimdDirective *D);
1940c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  void VisitOMPForDirective(const OMPForDirective *D);
1941176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  void VisitOMPForSimdDirective(const OMPForSimdDirective *D);
1942c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  void VisitOMPSectionsDirective(const OMPSectionsDirective *D);
1943c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  void VisitOMPSectionDirective(const OMPSectionDirective *D);
1944c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  void VisitOMPSingleDirective(const OMPSingleDirective *D);
1945176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  void VisitOMPMasterDirective(const OMPMasterDirective *D);
1946176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  void VisitOMPCriticalDirective(const OMPCriticalDirective *D);
1947c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  void VisitOMPParallelForDirective(const OMPParallelForDirective *D);
1948176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  void VisitOMPParallelForSimdDirective(const OMPParallelForSimdDirective *D);
1949c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  void VisitOMPParallelSectionsDirective(const OMPParallelSectionsDirective *D);
1950176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  void VisitOMPTaskDirective(const OMPTaskDirective *D);
1951176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  void VisitOMPTaskyieldDirective(const OMPTaskyieldDirective *D);
1952176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  void VisitOMPBarrierDirective(const OMPBarrierDirective *D);
1953176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  void VisitOMPTaskwaitDirective(const OMPTaskwaitDirective *D);
195487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  void VisitOMPTaskgroupDirective(const OMPTaskgroupDirective *D);
195587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  void
195687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  VisitOMPCancellationPointDirective(const OMPCancellationPointDirective *D);
195787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  void VisitOMPCancelDirective(const OMPCancelDirective *D);
1958176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  void VisitOMPFlushDirective(const OMPFlushDirective *D);
1959176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  void VisitOMPOrderedDirective(const OMPOrderedDirective *D);
1960176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  void VisitOMPAtomicDirective(const OMPAtomicDirective *D);
1961176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  void VisitOMPTargetDirective(const OMPTargetDirective *D);
196287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  void VisitOMPTargetDataDirective(const OMPTargetDataDirective *D);
19634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  void VisitOMPTargetEnterDataDirective(const OMPTargetEnterDataDirective *D);
19644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  void VisitOMPTargetExitDataDirective(const OMPTargetExitDataDirective *D);
19654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  void VisitOMPTargetParallelDirective(const OMPTargetParallelDirective *D);
19664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  void
19674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  VisitOMPTargetParallelForDirective(const OMPTargetParallelForDirective *D);
1968176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  void VisitOMPTeamsDirective(const OMPTeamsDirective *D);
196987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  void VisitOMPTaskLoopDirective(const OMPTaskLoopDirective *D);
197087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  void VisitOMPTaskLoopSimdDirective(const OMPTaskLoopSimdDirective *D);
197187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  void VisitOMPDistributeDirective(const OMPDistributeDirective *D);
19724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  void VisitOMPDistributeParallelForDirective(
19734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      const OMPDistributeParallelForDirective *D);
19744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  void VisitOMPDistributeParallelForSimdDirective(
19754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      const OMPDistributeParallelForSimdDirective *D);
19764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  void VisitOMPDistributeSimdDirective(const OMPDistributeSimdDirective *D);
19774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  void VisitOMPTargetParallelForSimdDirective(
19784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      const OMPTargetParallelForSimdDirective *D);
1979ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko
19807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiprivate:
1981ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void AddDeclarationNameInfo(const Stmt *S);
19827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  void AddNestedNameSpecifierLoc(NestedNameSpecifierLoc Qualifier);
19834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  void AddExplicitTemplateArgs(const TemplateArgumentLoc *A,
19844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                               unsigned NumTemplateArgs);
1985ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void AddMemberRef(const FieldDecl *D, SourceLocation L);
1986ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void AddStmt(const Stmt *S);
1987ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void AddDecl(const Decl *D, bool isFirst = true);
19887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  void AddTypeLoc(TypeSourceInfo *TI);
1989ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  void EnqueueChildren(const Stmt *S);
19904fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  void EnqueueChildren(const OMPClause *S);
19917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei};
19927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} // end anonyous namespace
19937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
1994ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::AddDeclarationNameInfo(const Stmt *S) {
19957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // 'S' should always be non-null, since it comes from the
19967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // statement we are visiting.
19977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  WL.push_back(DeclarationNameInfoVisit(S, Parent));
19987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
19997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
20007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid
20017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiEnqueueVisitor::AddNestedNameSpecifierLoc(NestedNameSpecifierLoc Qualifier) {
20027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (Qualifier)
20037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    WL.push_back(NestedNameSpecifierLocVisit(Qualifier, Parent));
20047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
20057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
2006ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::AddStmt(const Stmt *S) {
20077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (S)
20087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    WL.push_back(StmtVisit(S, Parent));
20097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
2010ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::AddDecl(const Decl *D, bool isFirst) {
20117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (D)
20127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    WL.push_back(DeclVisit(D, Parent, isFirst));
20137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
20144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid EnqueueVisitor::AddExplicitTemplateArgs(const TemplateArgumentLoc *A,
20154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                             unsigned NumTemplateArgs) {
20164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  WL.push_back(ExplicitTemplateArgsVisit(A, A + NumTemplateArgs, Parent));
20177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
2018ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::AddMemberRef(const FieldDecl *D, SourceLocation L) {
20197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (D)
20207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    WL.push_back(MemberRefVisit(D, L, Parent));
20217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
20227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid EnqueueVisitor::AddTypeLoc(TypeSourceInfo *TI) {
20237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (TI)
20247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    WL.push_back(TypeLocVisit(TI->getTypeLoc(), Parent));
20257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei }
2026ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::EnqueueChildren(const Stmt *S) {
20277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  unsigned size = WL.size();
202887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  for (const Stmt *SubStmt : S->children()) {
202987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    AddStmt(SubStmt);
20307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
20317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (size == WL.size())
20327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return;
20337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Now reverse the entries we just added.  This will match the DFS
20347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // ordering performed by the worklist.
20357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  VisitorWorkList::iterator I = WL.begin() + size, E = WL.end();
20367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  std::reverse(I, E);
20377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
20384fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataevnamespace {
20394fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataevclass OMPClauseEnqueue : public ConstOMPClauseVisitor<OMPClauseEnqueue> {
20404fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  EnqueueVisitor *Visitor;
2041543c4ae954f2bce5ac58ed22080f23cbd94794d2Alexey Bataev  /// \brief Process clauses with list of variables.
2042543c4ae954f2bce5ac58ed22080f23cbd94794d2Alexey Bataev  template <typename T>
2043543c4ae954f2bce5ac58ed22080f23cbd94794d2Alexey Bataev  void VisitOMPClauseList(T *Node);
20444fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataevpublic:
20454fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  OMPClauseEnqueue(EnqueueVisitor *Visitor) : Visitor(Visitor) { }
20464fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev#define OPENMP_CLAUSE(Name, Class)                                             \
20474fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  void Visit##Class(const Class *C);
20484fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev#include "clang/Basic/OpenMPKinds.def"
20494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  void VisitOMPClauseWithPreInit(const OMPClauseWithPreInit *C);
20504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  void VisitOMPClauseWithPostUpdate(const OMPClauseWithPostUpdate *C);
20514fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev};
20524fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev
20534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid OMPClauseEnqueue::VisitOMPClauseWithPreInit(
20544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    const OMPClauseWithPreInit *C) {
20554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Visitor->AddStmt(C->getPreInitStmt());
20564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
20574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
20584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid OMPClauseEnqueue::VisitOMPClauseWithPostUpdate(
20594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    const OMPClauseWithPostUpdate *C) {
20604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  VisitOMPClauseWithPreInit(C);
20614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Visitor->AddStmt(C->getPostUpdateExpr());
20624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
20634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
2064651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid OMPClauseEnqueue::VisitOMPIfClause(const OMPIfClause *C) {
2065651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  Visitor->AddStmt(C->getCondition());
2066651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
2067651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
2068176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid OMPClauseEnqueue::VisitOMPFinalClause(const OMPFinalClause *C) {
2069176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  Visitor->AddStmt(C->getCondition());
2070176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
2071176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
2072651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid OMPClauseEnqueue::VisitOMPNumThreadsClause(const OMPNumThreadsClause *C) {
2073651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  Visitor->AddStmt(C->getNumThreads());
2074651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
2075651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
2076651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid OMPClauseEnqueue::VisitOMPSafelenClause(const OMPSafelenClause *C) {
2077651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  Visitor->AddStmt(C->getSafelen());
2078651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
2079651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
208087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarvoid OMPClauseEnqueue::VisitOMPSimdlenClause(const OMPSimdlenClause *C) {
208187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  Visitor->AddStmt(C->getSimdlen());
208287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
208387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
20846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesvoid OMPClauseEnqueue::VisitOMPCollapseClause(const OMPCollapseClause *C) {
20856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  Visitor->AddStmt(C->getNumForLoops());
20866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
20876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
20884fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataevvoid OMPClauseEnqueue::VisitOMPDefaultClause(const OMPDefaultClause *C) { }
2089543c4ae954f2bce5ac58ed22080f23cbd94794d2Alexey Bataev
20906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesvoid OMPClauseEnqueue::VisitOMPProcBindClause(const OMPProcBindClause *C) { }
20916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
2092c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesvoid OMPClauseEnqueue::VisitOMPScheduleClause(const OMPScheduleClause *C) {
20934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  VisitOMPClauseWithPreInit(C);
2094c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  Visitor->AddStmt(C->getChunkSize());
2095c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines}
2096c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
209787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarvoid OMPClauseEnqueue::VisitOMPOrderedClause(const OMPOrderedClause *C) {
209887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  Visitor->AddStmt(C->getNumForLoops());
209987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
2100c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
2101c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesvoid OMPClauseEnqueue::VisitOMPNowaitClause(const OMPNowaitClause *) {}
2102c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
2103176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid OMPClauseEnqueue::VisitOMPUntiedClause(const OMPUntiedClause *) {}
2104176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
2105176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid OMPClauseEnqueue::VisitOMPMergeableClause(const OMPMergeableClause *) {}
2106176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
2107176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid OMPClauseEnqueue::VisitOMPReadClause(const OMPReadClause *) {}
2108176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
2109176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid OMPClauseEnqueue::VisitOMPWriteClause(const OMPWriteClause *) {}
2110176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
2111176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid OMPClauseEnqueue::VisitOMPUpdateClause(const OMPUpdateClause *) {}
2112176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
2113176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid OMPClauseEnqueue::VisitOMPCaptureClause(const OMPCaptureClause *) {}
2114176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
2115176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid OMPClauseEnqueue::VisitOMPSeqCstClause(const OMPSeqCstClause *) {}
2116176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
211787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarvoid OMPClauseEnqueue::VisitOMPThreadsClause(const OMPThreadsClause *) {}
211887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
211987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarvoid OMPClauseEnqueue::VisitOMPSIMDClause(const OMPSIMDClause *) {}
212087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
212187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarvoid OMPClauseEnqueue::VisitOMPNogroupClause(const OMPNogroupClause *) {}
212287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
212387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarvoid OMPClauseEnqueue::VisitOMPDeviceClause(const OMPDeviceClause *C) {
212487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  Visitor->AddStmt(C->getDevice());
212587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
212687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
212787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarvoid OMPClauseEnqueue::VisitOMPNumTeamsClause(const OMPNumTeamsClause *C) {
212887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  Visitor->AddStmt(C->getNumTeams());
212987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
213087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
213187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarvoid OMPClauseEnqueue::VisitOMPThreadLimitClause(const OMPThreadLimitClause *C) {
213287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  Visitor->AddStmt(C->getThreadLimit());
213387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
213487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
213587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarvoid OMPClauseEnqueue::VisitOMPPriorityClause(const OMPPriorityClause *C) {
213687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  Visitor->AddStmt(C->getPriority());
213787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
213887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
213987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarvoid OMPClauseEnqueue::VisitOMPGrainsizeClause(const OMPGrainsizeClause *C) {
214087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  Visitor->AddStmt(C->getGrainsize());
214187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
214287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
214387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarvoid OMPClauseEnqueue::VisitOMPNumTasksClause(const OMPNumTasksClause *C) {
214487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  Visitor->AddStmt(C->getNumTasks());
214587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
214687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
214787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarvoid OMPClauseEnqueue::VisitOMPHintClause(const OMPHintClause *C) {
214887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  Visitor->AddStmt(C->getHint());
214987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
215087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
2151543c4ae954f2bce5ac58ed22080f23cbd94794d2Alexey Bataevtemplate<typename T>
2152543c4ae954f2bce5ac58ed22080f23cbd94794d2Alexey Bataevvoid OMPClauseEnqueue::VisitOMPClauseList(T *Node) {
2153176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  for (const auto *I : Node->varlists()) {
2154651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    Visitor->AddStmt(I);
2155176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
2156543c4ae954f2bce5ac58ed22080f23cbd94794d2Alexey Bataev}
21574fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev
21584fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataevvoid OMPClauseEnqueue::VisitOMPPrivateClause(const OMPPrivateClause *C) {
2159543c4ae954f2bce5ac58ed22080f23cbd94794d2Alexey Bataev  VisitOMPClauseList(C);
2160176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  for (const auto *E : C->private_copies()) {
2161176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    Visitor->AddStmt(E);
2162176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
21634fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev}
2164d195bc38fd424b0c928e3c354038a8ca6e2ccac3Alexey Bataevvoid OMPClauseEnqueue::VisitOMPFirstprivateClause(
2165d195bc38fd424b0c928e3c354038a8ca6e2ccac3Alexey Bataev                                        const OMPFirstprivateClause *C) {
2166d195bc38fd424b0c928e3c354038a8ca6e2ccac3Alexey Bataev  VisitOMPClauseList(C);
21674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  VisitOMPClauseWithPreInit(C);
21684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (const auto *E : C->private_copies()) {
21694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    Visitor->AddStmt(E);
21704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
21714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (const auto *E : C->inits()) {
21724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    Visitor->AddStmt(E);
21734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
2174d195bc38fd424b0c928e3c354038a8ca6e2ccac3Alexey Bataev}
2175c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesvoid OMPClauseEnqueue::VisitOMPLastprivateClause(
2176c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines                                        const OMPLastprivateClause *C) {
2177c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  VisitOMPClauseList(C);
21784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  VisitOMPClauseWithPostUpdate(C);
217958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  for (auto *E : C->private_copies()) {
218058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar    Visitor->AddStmt(E);
218158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  }
218258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  for (auto *E : C->source_exprs()) {
218358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar    Visitor->AddStmt(E);
218458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  }
218558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  for (auto *E : C->destination_exprs()) {
218658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar    Visitor->AddStmt(E);
218758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  }
218858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  for (auto *E : C->assignment_ops()) {
218958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar    Visitor->AddStmt(E);
219058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  }
2191c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines}
21920c018357b8bbb1f96bbf622a5807421e626b4228Alexey Bataevvoid OMPClauseEnqueue::VisitOMPSharedClause(const OMPSharedClause *C) {
2193543c4ae954f2bce5ac58ed22080f23cbd94794d2Alexey Bataev  VisitOMPClauseList(C);
21940c018357b8bbb1f96bbf622a5807421e626b4228Alexey Bataev}
2195c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesvoid OMPClauseEnqueue::VisitOMPReductionClause(const OMPReductionClause *C) {
2196c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  VisitOMPClauseList(C);
21974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  VisitOMPClauseWithPostUpdate(C);
219887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  for (auto *E : C->privates()) {
219987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    Visitor->AddStmt(E);
220087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
220158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  for (auto *E : C->lhs_exprs()) {
220258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar    Visitor->AddStmt(E);
220358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  }
220458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  for (auto *E : C->rhs_exprs()) {
220558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar    Visitor->AddStmt(E);
220658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  }
220758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  for (auto *E : C->reduction_ops()) {
220858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar    Visitor->AddStmt(E);
220958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  }
2210c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines}
22116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesvoid OMPClauseEnqueue::VisitOMPLinearClause(const OMPLinearClause *C) {
22126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  VisitOMPClauseList(C);
22134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  VisitOMPClauseWithPostUpdate(C);
221487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  for (const auto *E : C->privates()) {
221587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    Visitor->AddStmt(E);
221687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
22173ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  for (const auto *E : C->inits()) {
22183ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    Visitor->AddStmt(E);
22193ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  }
22203ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  for (const auto *E : C->updates()) {
22213ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    Visitor->AddStmt(E);
22223ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  }
22233ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  for (const auto *E : C->finals()) {
22243ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    Visitor->AddStmt(E);
22253ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  }
22266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  Visitor->AddStmt(C->getStep());
22273ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  Visitor->AddStmt(C->getCalcStep());
22286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
2229c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesvoid OMPClauseEnqueue::VisitOMPAlignedClause(const OMPAlignedClause *C) {
2230c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  VisitOMPClauseList(C);
2231c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  Visitor->AddStmt(C->getAlignment());
2232c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines}
2233651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid OMPClauseEnqueue::VisitOMPCopyinClause(const OMPCopyinClause *C) {
2234651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  VisitOMPClauseList(C);
223558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  for (auto *E : C->source_exprs()) {
223658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar    Visitor->AddStmt(E);
223758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  }
223858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  for (auto *E : C->destination_exprs()) {
223958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar    Visitor->AddStmt(E);
224058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  }
224158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  for (auto *E : C->assignment_ops()) {
224258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar    Visitor->AddStmt(E);
224358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  }
2244651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
2245c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesvoid
2246c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen HinesOMPClauseEnqueue::VisitOMPCopyprivateClause(const OMPCopyprivateClause *C) {
2247c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  VisitOMPClauseList(C);
22483ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  for (auto *E : C->source_exprs()) {
22493ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    Visitor->AddStmt(E);
22503ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  }
22513ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  for (auto *E : C->destination_exprs()) {
22523ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    Visitor->AddStmt(E);
22533ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  }
22543ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  for (auto *E : C->assignment_ops()) {
22553ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    Visitor->AddStmt(E);
22563ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  }
2257c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines}
2258176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid OMPClauseEnqueue::VisitOMPFlushClause(const OMPFlushClause *C) {
2259176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  VisitOMPClauseList(C);
2260176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
226187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarvoid OMPClauseEnqueue::VisitOMPDependClause(const OMPDependClause *C) {
226287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  VisitOMPClauseList(C);
226387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
226487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarvoid OMPClauseEnqueue::VisitOMPMapClause(const OMPMapClause *C) {
226587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  VisitOMPClauseList(C);
226687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
22674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid OMPClauseEnqueue::VisitOMPDistScheduleClause(
22684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    const OMPDistScheduleClause *C) {
22694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  VisitOMPClauseWithPreInit(C);
22704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Visitor->AddStmt(C->getChunkSize());
22714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
22724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid OMPClauseEnqueue::VisitOMPDefaultmapClause(
22734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    const OMPDefaultmapClause * /*C*/) {}
22744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid OMPClauseEnqueue::VisitOMPToClause(const OMPToClause *C) {
22754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  VisitOMPClauseList(C);
22764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
22774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid OMPClauseEnqueue::VisitOMPFromClause(const OMPFromClause *C) {
22784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  VisitOMPClauseList(C);
22794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
22804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid OMPClauseEnqueue::VisitOMPUseDevicePtrClause(const OMPUseDevicePtrClause *C) {
22814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  VisitOMPClauseList(C);
22824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
22834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid OMPClauseEnqueue::VisitOMPIsDevicePtrClause(const OMPIsDevicePtrClause *C) {
22844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  VisitOMPClauseList(C);
22854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
22864fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev}
2287543c4ae954f2bce5ac58ed22080f23cbd94794d2Alexey Bataev
22884fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataevvoid EnqueueVisitor::EnqueueChildren(const OMPClause *S) {
22894fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  unsigned size = WL.size();
22904fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  OMPClauseEnqueue Visitor(this);
22914fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  Visitor.Visit(S);
22924fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  if (size == WL.size())
22934fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev    return;
22944fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  // Now reverse the entries we just added.  This will match the DFS
22954fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  // ordering performed by the worklist.
22964fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  VisitorWorkList::iterator I = WL.begin() + size, E = WL.end();
22974fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  std::reverse(I, E);
22984fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev}
2299ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::VisitAddrLabelExpr(const AddrLabelExpr *E) {
23007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  WL.push_back(LabelRefVisit(E->getLabel(), E->getLabelLoc(), Parent));
23017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
2302ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::VisitBlockExpr(const BlockExpr *B) {
23037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddDecl(B->getBlockDecl());
23047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
2305ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::VisitCompoundLiteralExpr(const CompoundLiteralExpr *E) {
23067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  EnqueueChildren(E);
23077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddTypeLoc(E->getTypeSourceInfo());
23087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
2309ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::VisitCompoundStmt(const CompoundStmt *S) {
231087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  for (auto &I : llvm::reverse(S->body()))
231187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    AddStmt(I);
23127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
23137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid EnqueueVisitor::
2314ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri GribenkoVisitMSDependentExistsStmt(const MSDependentExistsStmt *S) {
23157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddStmt(S->getSubStmt());
23167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddDeclarationNameInfo(S);
23177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (NestedNameSpecifierLoc QualifierLoc = S->getQualifierLoc())
23187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    AddNestedNameSpecifierLoc(QualifierLoc);
23197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
23207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
23217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid EnqueueVisitor::
2322ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri GribenkoVisitCXXDependentScopeMemberExpr(const CXXDependentScopeMemberExpr *E) {
23234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  if (E->hasExplicitTemplateArgs())
23244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    AddExplicitTemplateArgs(E->getTemplateArgs(), E->getNumTemplateArgs());
23257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddDeclarationNameInfo(E);
23267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc())
23277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    AddNestedNameSpecifierLoc(QualifierLoc);
23287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!E->isImplicitAccess())
23297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    AddStmt(E->getBase());
23307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
2331ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::VisitCXXNewExpr(const CXXNewExpr *E) {
23327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Enqueue the initializer , if any.
23337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddStmt(E->getInitializer());
23347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Enqueue the array size, if any.
23357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddStmt(E->getArraySize());
23367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Enqueue the allocated type.
23377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddTypeLoc(E->getAllocatedTypeSourceInfo());
23387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Enqueue the placement arguments.
23397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  for (unsigned I = E->getNumPlacementArgs(); I > 0; --I)
23407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    AddStmt(E->getPlacementArg(I-1));
23417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
2342ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::VisitCXXOperatorCallExpr(const CXXOperatorCallExpr *CE) {
23437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  for (unsigned I = CE->getNumArgs(); I > 1 /* Yes, this is 1 */; --I)
23447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    AddStmt(CE->getArg(I-1));
23457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddStmt(CE->getCallee());
23467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddStmt(CE->getArg(0));
23477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
2348ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::VisitCXXPseudoDestructorExpr(
2349ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko                                        const CXXPseudoDestructorExpr *E) {
23507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Visit the name of the type being destroyed.
23517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddTypeLoc(E->getDestroyedTypeInfo());
23527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Visit the scope type that looks disturbingly like the nested-name-specifier
23537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // but isn't.
23547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddTypeLoc(E->getScopeTypeInfo());
23557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Visit the nested-name-specifier.
23567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc())
23577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    AddNestedNameSpecifierLoc(QualifierLoc);
23587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Visit base expression.
23597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddStmt(E->getBase());
23607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
2361ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::VisitCXXScalarValueInitExpr(
2362ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko                                        const CXXScalarValueInitExpr *E) {
23637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddTypeLoc(E->getTypeSourceInfo());
23647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
2365ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::VisitCXXTemporaryObjectExpr(
2366ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko                                        const CXXTemporaryObjectExpr *E) {
23677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  EnqueueChildren(E);
23687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddTypeLoc(E->getTypeSourceInfo());
23697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
2370ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::VisitCXXTypeidExpr(const CXXTypeidExpr *E) {
23717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  EnqueueChildren(E);
23727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (E->isTypeOperand())
23737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    AddTypeLoc(E->getTypeOperandSourceInfo());
23747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
23757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
2376ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::VisitCXXUnresolvedConstructExpr(
2377ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko                                        const CXXUnresolvedConstructExpr *E) {
23787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  EnqueueChildren(E);
23797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddTypeLoc(E->getTypeSourceInfo());
23807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
2381ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::VisitCXXUuidofExpr(const CXXUuidofExpr *E) {
23827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  EnqueueChildren(E);
23837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (E->isTypeOperand())
23847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    AddTypeLoc(E->getTypeOperandSourceInfo());
23857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
23867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
2387ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::VisitCXXCatchStmt(const CXXCatchStmt *S) {
23887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  EnqueueChildren(S);
23897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddDecl(S->getExceptionDecl());
23907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
23917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
2392176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid EnqueueVisitor::VisitCXXForRangeStmt(const CXXForRangeStmt *S) {
2393176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  AddStmt(S->getBody());
2394176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  AddStmt(S->getRangeInit());
2395176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  AddDecl(S->getLoopVariable());
2396176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
2397176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
2398ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::VisitDeclRefExpr(const DeclRefExpr *DR) {
23994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  if (DR->hasExplicitTemplateArgs())
24004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    AddExplicitTemplateArgs(DR->getTemplateArgs(), DR->getNumTemplateArgs());
24017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  WL.push_back(DeclRefExprParts(DR, Parent));
24027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
2403ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::VisitDependentScopeDeclRefExpr(
2404ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko                                        const DependentScopeDeclRefExpr *E) {
24054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  if (E->hasExplicitTemplateArgs())
24064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    AddExplicitTemplateArgs(E->getTemplateArgs(), E->getNumTemplateArgs());
24077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddDeclarationNameInfo(E);
24087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddNestedNameSpecifierLoc(E->getQualifierLoc());
24097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
2410ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::VisitDeclStmt(const DeclStmt *S) {
24117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  unsigned size = WL.size();
24127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  bool isFirst = true;
2413651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  for (const auto *D : S->decls()) {
2414651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    AddDecl(D, isFirst);
24157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    isFirst = false;
24167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
24177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (size == WL.size())
24187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return;
24197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Now reverse the entries we just added.  This will match the DFS
24207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // ordering performed by the worklist.
24217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  VisitorWorkList::iterator I = WL.begin() + size, E = WL.end();
24227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  std::reverse(I, E);
24237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
2424ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::VisitDesignatedInitExpr(const DesignatedInitExpr *E) {
24257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddStmt(E->getInit());
24264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (const DesignatedInitExpr::Designator &D :
24274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar       llvm::reverse(E->designators())) {
24284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    if (D.isFieldDesignator()) {
24294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      if (FieldDecl *Field = D.getField())
24304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        AddMemberRef(Field, D.getFieldLoc());
24317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      continue;
24327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
24334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    if (D.isArrayDesignator()) {
24344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      AddStmt(E->getArrayIndex(D));
24357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      continue;
24367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
24374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    assert(D.isArrayRangeDesignator() && "Unknown designator kind");
24384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    AddStmt(E->getArrayRangeEnd(D));
24394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    AddStmt(E->getArrayRangeStart(D));
24407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
24417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
2442ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::VisitExplicitCastExpr(const ExplicitCastExpr *E) {
24437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  EnqueueChildren(E);
24447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddTypeLoc(E->getTypeInfoAsWritten());
24457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
2446ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::VisitForStmt(const ForStmt *FS) {
24477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddStmt(FS->getBody());
24487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddStmt(FS->getInc());
24497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddStmt(FS->getCond());
24507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddDecl(FS->getConditionVariable());
24517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddStmt(FS->getInit());
24527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
2453ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::VisitGotoStmt(const GotoStmt *GS) {
24547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  WL.push_back(LabelRefVisit(GS->getLabel(), GS->getLabelLoc(), Parent));
24557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
2456ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::VisitIfStmt(const IfStmt *If) {
24577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddStmt(If->getElse());
24587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddStmt(If->getThen());
24597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddStmt(If->getCond());
24607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddDecl(If->getConditionVariable());
24617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
2462ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::VisitInitListExpr(const InitListExpr *IE) {
24637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // We care about the syntactic form of the initializer list, only.
24647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (InitListExpr *Syntactic = IE->getSyntacticForm())
24657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    IE = Syntactic;
24667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  EnqueueChildren(IE);
24677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
2468ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::VisitMemberExpr(const MemberExpr *M) {
24697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  WL.push_back(MemberExprParts(M, Parent));
24707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
24717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // If the base of the member access expression is an implicit 'this', don't
24727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // visit it.
24737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // FIXME: If we ever want to show these implicit accesses, this will be
24747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // unfortunate. However, clang_getCursor() relies on this behavior.
24753ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  if (M->isImplicitAccess())
24763ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    return;
24773ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar
24783ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // Ignore base anonymous struct/union fields, otherwise they will shadow the
24793ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // real field that that we are interested in.
24803ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  if (auto *SubME = dyn_cast<MemberExpr>(M->getBase())) {
24813ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    if (auto *FD = dyn_cast_or_null<FieldDecl>(SubME->getMemberDecl())) {
24823ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar      if (FD->isAnonymousStructOrUnion()) {
24833ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar        AddStmt(SubME->getBase());
24843ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar        return;
24853ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar      }
24863ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    }
24873ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  }
24883ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar
24893ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  AddStmt(M->getBase());
24907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
2491ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::VisitObjCEncodeExpr(const ObjCEncodeExpr *E) {
24927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddTypeLoc(E->getEncodedTypeSourceInfo());
24937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
2494ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::VisitObjCMessageExpr(const ObjCMessageExpr *M) {
24957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  EnqueueChildren(M);
24967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddTypeLoc(M->getClassReceiverTypeInfo());
24977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
2498ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::VisitOffsetOfExpr(const OffsetOfExpr *E) {
24997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Visit the components of the offsetof expression.
25007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  for (unsigned N = E->getNumComponents(), I = N; I > 0; --I) {
25017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    const OffsetOfNode &Node = E->getComponent(I-1);
25027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    switch (Node.getKind()) {
25037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case OffsetOfNode::Array:
25047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      AddStmt(E->getIndexExpr(Node.getArrayExprIndex()));
25057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      break;
25067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case OffsetOfNode::Field:
25077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      AddMemberRef(Node.getField(), Node.getSourceRange().getEnd());
25087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      break;
25097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case OffsetOfNode::Identifier:
25107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case OffsetOfNode::Base:
25117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      continue;
25127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
25137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
25147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Visit the type into which we're computing the offset.
25157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddTypeLoc(E->getTypeSourceInfo());
25167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
2517ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::VisitOverloadExpr(const OverloadExpr *E) {
25184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  if (E->hasExplicitTemplateArgs())
25194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    AddExplicitTemplateArgs(E->getTemplateArgs(), E->getNumTemplateArgs());
25207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  WL.push_back(OverloadExprParts(E, Parent));
25217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
25227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid EnqueueVisitor::VisitUnaryExprOrTypeTraitExpr(
2523ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko                                        const UnaryExprOrTypeTraitExpr *E) {
25247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  EnqueueChildren(E);
25257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (E->isArgumentType())
25267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    AddTypeLoc(E->getArgumentTypeInfo());
25277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
2528ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::VisitStmt(const Stmt *S) {
25297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  EnqueueChildren(S);
25307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
2531ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::VisitSwitchStmt(const SwitchStmt *S) {
25327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddStmt(S->getBody());
25337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddStmt(S->getCond());
25347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddDecl(S->getConditionVariable());
25357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
25367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
2537ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::VisitWhileStmt(const WhileStmt *W) {
25387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddStmt(W->getBody());
25397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddStmt(W->getCond());
25407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddDecl(W->getConditionVariable());
25417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
25427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
2543ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::VisitTypeTraitExpr(const TypeTraitExpr *E) {
25447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  for (unsigned I = E->getNumArgs(); I > 0; --I)
25457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    AddTypeLoc(E->getArg(I-1));
25467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
25477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
2548ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::VisitArrayTypeTraitExpr(const ArrayTypeTraitExpr *E) {
25497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddTypeLoc(E->getQueriedTypeSourceInfo());
25507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
25517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
2552ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::VisitExpressionTraitExpr(const ExpressionTraitExpr *E) {
25537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  EnqueueChildren(E);
25547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
25557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
2556ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::VisitUnresolvedMemberExpr(const UnresolvedMemberExpr *U) {
25577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  VisitOverloadExpr(U);
25587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!U->isImplicitAccess())
25597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    AddStmt(U->getBase());
25607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
2561ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::VisitVAArgExpr(const VAArgExpr *E) {
25627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddStmt(E->getSubExpr());
25637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddTypeLoc(E->getWrittenTypeInfo());
25647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
2565ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::VisitSizeOfPackExpr(const SizeOfPackExpr *E) {
25667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  WL.push_back(SizeOfPackExprParts(E, Parent));
25677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
2568ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::VisitOpaqueValueExpr(const OpaqueValueExpr *E) {
25697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // If the opaque value has a source expression, just transparently
25707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // visit that.  This is useful for (e.g.) pseudo-object expressions.
25717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (Expr *SourceExpr = E->getSourceExpr())
25727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return Visit(SourceExpr);
25737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
2574ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::VisitLambdaExpr(const LambdaExpr *E) {
25757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AddStmt(E->getBody());
25767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  WL.push_back(LambdaExprParts(E, Parent));
25777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
2578ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid EnqueueVisitor::VisitPseudoObjectExpr(const PseudoObjectExpr *E) {
25797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Treat the expression like its syntactic form.
25807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  Visit(E->getSyntacticForm());
25817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
25827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
25834fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataevvoid EnqueueVisitor::VisitOMPExecutableDirective(
25844fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  const OMPExecutableDirective *D) {
25854fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  EnqueueChildren(D);
25864fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  for (ArrayRef<OMPClause *>::iterator I = D->clauses().begin(),
25874fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev                                       E = D->clauses().end();
25884fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev       I != E; ++I)
25894fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev    EnqueueChildren(*I);
25904fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev}
25914fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev
2592176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid EnqueueVisitor::VisitOMPLoopDirective(const OMPLoopDirective *D) {
2593176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  VisitOMPExecutableDirective(D);
2594176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
2595176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
25964fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataevvoid EnqueueVisitor::VisitOMPParallelDirective(const OMPParallelDirective *D) {
25974fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  VisitOMPExecutableDirective(D);
25984fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev}
25994fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev
2600651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid EnqueueVisitor::VisitOMPSimdDirective(const OMPSimdDirective *D) {
2601176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  VisitOMPLoopDirective(D);
2602651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
2603651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
2604c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesvoid EnqueueVisitor::VisitOMPForDirective(const OMPForDirective *D) {
2605176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  VisitOMPLoopDirective(D);
2606176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
2607176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
2608176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid EnqueueVisitor::VisitOMPForSimdDirective(const OMPForSimdDirective *D) {
2609176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  VisitOMPLoopDirective(D);
2610c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines}
2611c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
2612c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesvoid EnqueueVisitor::VisitOMPSectionsDirective(const OMPSectionsDirective *D) {
2613c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  VisitOMPExecutableDirective(D);
2614c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines}
2615c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
2616c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesvoid EnqueueVisitor::VisitOMPSectionDirective(const OMPSectionDirective *D) {
2617c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  VisitOMPExecutableDirective(D);
2618c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines}
2619c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
2620c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesvoid EnqueueVisitor::VisitOMPSingleDirective(const OMPSingleDirective *D) {
2621c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  VisitOMPExecutableDirective(D);
2622c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines}
2623c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
2624176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid EnqueueVisitor::VisitOMPMasterDirective(const OMPMasterDirective *D) {
2625176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  VisitOMPExecutableDirective(D);
2626176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
2627176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
2628176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid EnqueueVisitor::VisitOMPCriticalDirective(const OMPCriticalDirective *D) {
2629176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  VisitOMPExecutableDirective(D);
2630176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  AddDeclarationNameInfo(D);
2631176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
2632176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
2633c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesvoid
2634c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen HinesEnqueueVisitor::VisitOMPParallelForDirective(const OMPParallelForDirective *D) {
2635176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  VisitOMPLoopDirective(D);
2636176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
2637176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
2638176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid EnqueueVisitor::VisitOMPParallelForSimdDirective(
2639176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    const OMPParallelForSimdDirective *D) {
2640176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  VisitOMPLoopDirective(D);
2641c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines}
2642c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
2643c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesvoid EnqueueVisitor::VisitOMPParallelSectionsDirective(
2644c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    const OMPParallelSectionsDirective *D) {
2645c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  VisitOMPExecutableDirective(D);
2646c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines}
2647c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
2648176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid EnqueueVisitor::VisitOMPTaskDirective(const OMPTaskDirective *D) {
2649176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  VisitOMPExecutableDirective(D);
2650176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
2651176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
2652176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid
2653176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesEnqueueVisitor::VisitOMPTaskyieldDirective(const OMPTaskyieldDirective *D) {
2654176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  VisitOMPExecutableDirective(D);
2655176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
2656176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
2657176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid EnqueueVisitor::VisitOMPBarrierDirective(const OMPBarrierDirective *D) {
2658176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  VisitOMPExecutableDirective(D);
2659176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
2660176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
2661176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid EnqueueVisitor::VisitOMPTaskwaitDirective(const OMPTaskwaitDirective *D) {
2662176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  VisitOMPExecutableDirective(D);
2663176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
2664176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
266587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarvoid EnqueueVisitor::VisitOMPTaskgroupDirective(
266687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    const OMPTaskgroupDirective *D) {
266787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  VisitOMPExecutableDirective(D);
266887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
266987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
2670176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid EnqueueVisitor::VisitOMPFlushDirective(const OMPFlushDirective *D) {
2671176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  VisitOMPExecutableDirective(D);
2672176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
2673176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
2674176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid EnqueueVisitor::VisitOMPOrderedDirective(const OMPOrderedDirective *D) {
2675176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  VisitOMPExecutableDirective(D);
2676176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
2677176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
2678176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid EnqueueVisitor::VisitOMPAtomicDirective(const OMPAtomicDirective *D) {
2679176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  VisitOMPExecutableDirective(D);
2680176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
2681176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
2682176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid EnqueueVisitor::VisitOMPTargetDirective(const OMPTargetDirective *D) {
2683176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  VisitOMPExecutableDirective(D);
2684176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
2685176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
268687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarvoid EnqueueVisitor::VisitOMPTargetDataDirective(const
268787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                                                 OMPTargetDataDirective *D) {
268887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  VisitOMPExecutableDirective(D);
268987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
269087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
26914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid EnqueueVisitor::VisitOMPTargetEnterDataDirective(
26924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    const OMPTargetEnterDataDirective *D) {
26934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  VisitOMPExecutableDirective(D);
26944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
26954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
26964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid EnqueueVisitor::VisitOMPTargetExitDataDirective(
26974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    const OMPTargetExitDataDirective *D) {
26984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  VisitOMPExecutableDirective(D);
26994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
27004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
27014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid EnqueueVisitor::VisitOMPTargetParallelDirective(
27024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    const OMPTargetParallelDirective *D) {
27034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  VisitOMPExecutableDirective(D);
27044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
27054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
27064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid EnqueueVisitor::VisitOMPTargetParallelForDirective(
27074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    const OMPTargetParallelForDirective *D) {
27084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  VisitOMPLoopDirective(D);
27094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
27104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
2711176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid EnqueueVisitor::VisitOMPTeamsDirective(const OMPTeamsDirective *D) {
2712176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  VisitOMPExecutableDirective(D);
2713176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
2714176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
271587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarvoid EnqueueVisitor::VisitOMPCancellationPointDirective(
271687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    const OMPCancellationPointDirective *D) {
271787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  VisitOMPExecutableDirective(D);
271887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
271987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
272087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarvoid EnqueueVisitor::VisitOMPCancelDirective(const OMPCancelDirective *D) {
272187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  VisitOMPExecutableDirective(D);
272287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
272387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
272487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarvoid EnqueueVisitor::VisitOMPTaskLoopDirective(const OMPTaskLoopDirective *D) {
272587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  VisitOMPLoopDirective(D);
272687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
272787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
272887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarvoid EnqueueVisitor::VisitOMPTaskLoopSimdDirective(
272987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    const OMPTaskLoopSimdDirective *D) {
273087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  VisitOMPLoopDirective(D);
273187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
273287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
273387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarvoid EnqueueVisitor::VisitOMPDistributeDirective(
273487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    const OMPDistributeDirective *D) {
273587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  VisitOMPLoopDirective(D);
273687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
273787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
27384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid EnqueueVisitor::VisitOMPDistributeParallelForDirective(
27394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    const OMPDistributeParallelForDirective *D) {
27404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  VisitOMPLoopDirective(D);
27414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
27424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
27434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid EnqueueVisitor::VisitOMPDistributeParallelForSimdDirective(
27444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    const OMPDistributeParallelForSimdDirective *D) {
27454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  VisitOMPLoopDirective(D);
27464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
27474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
27484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid EnqueueVisitor::VisitOMPDistributeSimdDirective(
27494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    const OMPDistributeSimdDirective *D) {
27504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  VisitOMPLoopDirective(D);
27514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
27524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
27534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid EnqueueVisitor::VisitOMPTargetParallelForSimdDirective(
27544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    const OMPTargetParallelForSimdDirective *D) {
27554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  VisitOMPLoopDirective(D);
27564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
27574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
2758ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkovoid CursorVisitor::EnqueueWorkList(VisitorWorkList &WL, const Stmt *S) {
27597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  EnqueueVisitor(WL, MakeCXCursor(S, StmtParent, TU,RegionOfInterest)).Visit(S);
27607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
27617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
27627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::IsInRegionOfInterest(CXCursor C) {
27637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (RegionOfInterest.isValid()) {
27647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    SourceRange Range = getRawCursorExtent(C);
27657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (Range.isInvalid() || CompareRegionOfInterest(Range))
27667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return false;
27677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
27687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return true;
27697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
27707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
27717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CursorVisitor::RunVisitorWorkList(VisitorWorkList &WL) {
27727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  while (!WL.empty()) {
27737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // Dequeue the worklist item.
2774344472ebeded2fca2ed5013b9e87f81d09bfa908Robert Wilhelm    VisitorJob LI = WL.pop_back_val();
27757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
27767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // Set the Parent field, then back to its old value once we're done.
27777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    SetParentRAII SetParent(Parent, StmtParent, LI.getParent());
27787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
27797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    switch (LI.getKind()) {
27807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      case VisitorJob::DeclVisitKind: {
2781ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko        const Decl *D = cast<DeclVisit>(&LI)->get();
27827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        if (!D)
27837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          continue;
27847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
27857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        // For now, perform default visitation for Decls.
27867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        if (Visit(MakeCXCursor(D, TU, RegionOfInterest,
27877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                               cast<DeclVisit>(&LI)->isFirst())))
27887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            return true;
27897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
27907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        continue;
27917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      }
27927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      case VisitorJob::ExplicitTemplateArgsVisitKind: {
27934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        for (const TemplateArgumentLoc &Arg :
27944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar             *cast<ExplicitTemplateArgsVisit>(&LI)) {
27954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar          if (VisitTemplateArgumentLoc(Arg))
27967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            return true;
27977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        }
27987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        continue;
27997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      }
28007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      case VisitorJob::TypeLocVisitKind: {
28017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        // Perform default visitation for TypeLocs.
28027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        if (Visit(cast<TypeLocVisit>(&LI)->get()))
28037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          return true;
28047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        continue;
28057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      }
28067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      case VisitorJob::LabelRefVisitKind: {
2807ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko        const LabelDecl *LS = cast<LabelRefVisit>(&LI)->get();
28087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        if (LabelStmt *stmt = LS->getStmt()) {
28097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          if (Visit(MakeCursorLabelRef(stmt, cast<LabelRefVisit>(&LI)->getLoc(),
28107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                       TU))) {
28117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            return true;
28127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          }
28137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        }
28147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        continue;
28157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      }
28167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
28177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      case VisitorJob::NestedNameSpecifierLocVisitKind: {
28187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        NestedNameSpecifierLocVisit *V = cast<NestedNameSpecifierLocVisit>(&LI);
28197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        if (VisitNestedNameSpecifierLoc(V->get()))
28207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          return true;
28217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        continue;
28227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      }
28237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
28247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      case VisitorJob::DeclarationNameInfoVisitKind: {
28257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        if (VisitDeclarationNameInfo(cast<DeclarationNameInfoVisit>(&LI)
28267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                     ->get()))
28277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          return true;
28287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        continue;
28297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      }
28307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      case VisitorJob::MemberRefVisitKind: {
28317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        MemberRefVisit *V = cast<MemberRefVisit>(&LI);
28327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        if (Visit(MakeCursorMemberRef(V->get(), V->getLoc(), TU)))
28337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          return true;
28347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        continue;
28357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      }
28367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      case VisitorJob::StmtVisitKind: {
2837ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko        const Stmt *S = cast<StmtVisit>(&LI)->get();
28387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        if (!S)
28397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          continue;
28407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
28417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        // Update the current cursor.
28427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        CXCursor Cursor = MakeCXCursor(S, StmtParent, TU, RegionOfInterest);
28437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        if (!IsInRegionOfInterest(Cursor))
28447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          continue;
28457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        switch (Visitor(Cursor, Parent, ClientData)) {
28467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          case CXChildVisit_Break: return true;
28477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          case CXChildVisit_Continue: break;
28487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          case CXChildVisit_Recurse:
28497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            if (PostChildrenVisitor)
2850c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines              WL.push_back(PostChildrenVisit(nullptr, Cursor));
28517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            EnqueueWorkList(WL, S);
28527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            break;
28537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        }
28547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        continue;
28557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      }
28567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      case VisitorJob::MemberExprPartsKind: {
28577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        // Handle the other pieces in the MemberExpr besides the base.
2858ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko        const MemberExpr *M = cast<MemberExprParts>(&LI)->get();
28597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
28607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        // Visit the nested-name-specifier
28617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        if (NestedNameSpecifierLoc QualifierLoc = M->getQualifierLoc())
28627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          if (VisitNestedNameSpecifierLoc(QualifierLoc))
28637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            return true;
28647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
28657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        // Visit the declaration name.
28667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        if (VisitDeclarationNameInfo(M->getMemberNameInfo()))
28677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          return true;
28687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
28697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        // Visit the explicitly-specified template arguments, if any.
28707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        if (M->hasExplicitTemplateArgs()) {
28717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          for (const TemplateArgumentLoc *Arg = M->getTemplateArgs(),
28727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei               *ArgEnd = Arg + M->getNumTemplateArgs();
28737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei               Arg != ArgEnd; ++Arg) {
28747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            if (VisitTemplateArgumentLoc(*Arg))
28757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei              return true;
28767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          }
28777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        }
28787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        continue;
28797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      }
28807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      case VisitorJob::DeclRefExprPartsKind: {
2881ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko        const DeclRefExpr *DR = cast<DeclRefExprParts>(&LI)->get();
28827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        // Visit nested-name-specifier, if present.
28837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        if (NestedNameSpecifierLoc QualifierLoc = DR->getQualifierLoc())
28847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          if (VisitNestedNameSpecifierLoc(QualifierLoc))
28857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            return true;
28867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        // Visit declaration name.
28877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        if (VisitDeclarationNameInfo(DR->getNameInfo()))
28887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          return true;
28897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        continue;
28907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      }
28917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      case VisitorJob::OverloadExprPartsKind: {
2892ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko        const OverloadExpr *O = cast<OverloadExprParts>(&LI)->get();
28937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        // Visit the nested-name-specifier.
28947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        if (NestedNameSpecifierLoc QualifierLoc = O->getQualifierLoc())
28957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          if (VisitNestedNameSpecifierLoc(QualifierLoc))
28967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            return true;
28977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        // Visit the declaration name.
28987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        if (VisitDeclarationNameInfo(O->getNameInfo()))
28997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          return true;
29007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        // Visit the overloaded declaration reference.
29017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        if (Visit(MakeCursorOverloadedDeclRef(O, TU)))
29027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          return true;
29037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        continue;
29047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      }
29057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      case VisitorJob::SizeOfPackExprPartsKind: {
2906ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko        const SizeOfPackExpr *E = cast<SizeOfPackExprParts>(&LI)->get();
29077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        NamedDecl *Pack = E->getPack();
29087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        if (isa<TemplateTypeParmDecl>(Pack)) {
29097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          if (Visit(MakeCursorTypeRef(cast<TemplateTypeParmDecl>(Pack),
29107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                      E->getPackLoc(), TU)))
29117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            return true;
29127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
29137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          continue;
29147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        }
29157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
29167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        if (isa<TemplateTemplateParmDecl>(Pack)) {
29177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          if (Visit(MakeCursorTemplateRef(cast<TemplateTemplateParmDecl>(Pack),
29187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                          E->getPackLoc(), TU)))
29197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            return true;
29207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
29217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          continue;
29227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        }
29237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
29247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        // Non-type template parameter packs and function parameter packs are
29257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        // treated like DeclRefExpr cursors.
29267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        continue;
29277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      }
29287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
29297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      case VisitorJob::LambdaExprPartsKind: {
29307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        // Visit captures.
2931ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko        const LambdaExpr *E = cast<LambdaExprParts>(&LI)->get();
29327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        for (LambdaExpr::capture_iterator C = E->explicit_capture_begin(),
29337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                       CEnd = E->explicit_capture_end();
29347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei             C != CEnd; ++C) {
29350d8e9646bc000bab521ce52ed294209a92298cefRichard Smith          // FIXME: Lambda init-captures.
29360d8e9646bc000bab521ce52ed294209a92298cefRichard Smith          if (!C->capturesVariable())
29377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            continue;
29380d8e9646bc000bab521ce52ed294209a92298cefRichard Smith
29397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          if (Visit(MakeCursorVariableRef(C->getCapturedVar(),
29407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                          C->getLocation(),
29417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                          TU)))
29427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            return true;
29437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        }
29447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
29457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        // Visit parameters and return type, if present.
29467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        if (E->hasExplicitParameters() || E->hasExplicitResultType()) {
29477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          TypeLoc TL = E->getCallOperator()->getTypeSourceInfo()->getTypeLoc();
29487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          if (E->hasExplicitParameters() && E->hasExplicitResultType()) {
29497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            // Visit the whole type.
29507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            if (Visit(TL))
29517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei              return true;
295239e6ab4be93d9c5e729a578ddd9d415cd2d49872David Blaikie          } else if (FunctionProtoTypeLoc Proto =
295339e6ab4be93d9c5e729a578ddd9d415cd2d49872David Blaikie                         TL.getAs<FunctionProtoTypeLoc>()) {
29547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            if (E->hasExplicitParameters()) {
29557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei              // Visit parameters.
2956651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines              for (unsigned I = 0, N = Proto.getNumParams(); I != N; ++I)
2957651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                if (Visit(MakeCXCursor(Proto.getParam(I), TU)))
29587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                  return true;
29597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            } else {
29607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei              // Visit result type.
2961651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines              if (Visit(Proto.getReturnLoc()))
29627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                return true;
29637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            }
29647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          }
29657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        }
29667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        break;
29677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      }
29687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
29697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      case VisitorJob::PostChildrenVisitKind:
29707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        if (PostChildrenVisitor(Parent, ClientData))
29717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          return true;
29727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        break;
29737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
29747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
29757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return false;
29767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
29777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
2978ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkobool CursorVisitor::Visit(const Stmt *S) {
2979c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  VisitorWorkList *WL = nullptr;
29807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!WorkListFreeList.empty()) {
29817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    WL = WorkListFreeList.back();
29827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    WL->clear();
29837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    WorkListFreeList.pop_back();
29847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
29857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  else {
29867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    WL = new VisitorWorkList();
29877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    WorkListCache.push_back(WL);
29887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
29897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  EnqueueWorkList(*WL, S);
29907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  bool result = RunVisitorWorkList(*WL);
29917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  WorkListFreeList.push_back(WL);
29927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return result;
29937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
29947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
29957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeinamespace {
2996cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenkotypedef SmallVector<SourceRange, 4> RefNamePieces;
29974967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarRefNamePieces buildPieces(unsigned NameFlags, bool IsMemberRefExpr,
29984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                          const DeclarationNameInfo &NI, SourceRange QLoc,
29994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                          const SourceRange *TemplateArgsLoc = nullptr) {
30007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  const bool WantQualifier = NameFlags & CXNameRange_WantQualifier;
30017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  const bool WantTemplateArgs = NameFlags & CXNameRange_WantTemplateArgs;
30027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  const bool WantSinglePiece = NameFlags & CXNameRange_WantSinglePiece;
30037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
30047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  const DeclarationName::NameKind Kind = NI.getName().getNameKind();
30057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
30067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  RefNamePieces Pieces;
30077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
30087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (WantQualifier && QLoc.isValid())
30097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    Pieces.push_back(QLoc);
30107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
30117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (Kind != DeclarationName::CXXOperatorName || IsMemberRefExpr)
30127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    Pieces.push_back(NI.getLoc());
30134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
30144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  if (WantTemplateArgs && TemplateArgsLoc && TemplateArgsLoc->isValid())
30154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    Pieces.push_back(*TemplateArgsLoc);
30164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
30177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (Kind == DeclarationName::CXXOperatorName) {
30187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    Pieces.push_back(SourceLocation::getFromRawEncoding(
30197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                       NI.getInfo().CXXOperatorName.BeginOpNameLoc));
30207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    Pieces.push_back(SourceLocation::getFromRawEncoding(
30217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                       NI.getInfo().CXXOperatorName.EndOpNameLoc));
30227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
30237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
30247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (WantSinglePiece) {
30257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    SourceRange R(Pieces.front().getBegin(), Pieces.back().getEnd());
30267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    Pieces.clear();
30277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    Pieces.push_back(R);
30287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
30297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
30307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return Pieces;
30317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
30327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
30337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
30347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----------------------------------------------------------------------===//
30357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// Misc. API hooks.
30367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----------------------------------------------------------------------===//
30377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
30389083628fec737679eb95abe8e2e5e23717a96e18Chad Rosierstatic void fatal_error_handler(void *user_data, const std::string& reason,
30399083628fec737679eb95abe8e2e5e23717a96e18Chad Rosier                                bool gen_crash_diag) {
30407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Write the result out to stderr avoiding errs() because raw_ostreams can
30417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // call report_fatal_error.
30427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  fprintf(stderr, "LIBCLANG FATAL ERROR: %s\n", reason.c_str());
30437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  ::abort();
30447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
30457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3046c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesnamespace {
3047c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesstruct RegisterFatalErrorHandler {
3048c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  RegisterFatalErrorHandler() {
3049c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    llvm::install_fatal_error_handler(fatal_error_handler, nullptr);
3050c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  }
3051c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines};
3052c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines}
3053c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
3054c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesstatic llvm::ManagedStatic<RegisterFatalErrorHandler> RegisterFatalErrorHandlerOnce;
3055c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
30567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiextern "C" {
30577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXIndex clang_createIndex(int excludeDeclarationsFromPCH,
30587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                          int displayDiagnostics) {
30597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // We use crash recovery to make some of our APIs more reliable, implicitly
30607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // enable it.
3061651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (!getenv("LIBCLANG_DISABLE_CRASH_RECOVERY"))
3062651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    llvm::CrashRecoveryContext::Enable();
30637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3064c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  // Look through the managed static to trigger construction of the managed
3065c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  // static which registers our fatal error handler. This ensures it is only
3066c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  // registered once.
3067c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  (void)*RegisterFatalErrorHandlerOnce;
30687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
306987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // Initialize targets for clang module support.
307087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  llvm::InitializeAllTargets();
307187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  llvm::InitializeAllTargetMCs();
307287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  llvm::InitializeAllAsmPrinters();
307387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  llvm::InitializeAllAsmParsers();
307487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
30757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  CIndexer *CIdxr = new CIndexer();
307687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
30777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (excludeDeclarationsFromPCH)
30787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    CIdxr->setOnlyLocalDecls();
30797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (displayDiagnostics)
30807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    CIdxr->setDisplayDiagnostics();
30817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
30827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (getenv("LIBCLANG_BGPRIO_INDEX"))
30837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    CIdxr->setCXGlobalOptFlags(CIdxr->getCXGlobalOptFlags() |
30847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                               CXGlobalOpt_ThreadBackgroundPriorityForIndexing);
30857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (getenv("LIBCLANG_BGPRIO_EDIT"))
30867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    CIdxr->setCXGlobalOptFlags(CIdxr->getCXGlobalOptFlags() |
30877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                               CXGlobalOpt_ThreadBackgroundPriorityForEditing);
30887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
30897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return CIdxr;
30907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
30917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
30927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid clang_disposeIndex(CXIndex CIdx) {
30937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (CIdx)
30947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    delete static_cast<CIndexer *>(CIdx);
30957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
30967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
30977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid clang_CXIndex_setGlobalOptions(CXIndex CIdx, unsigned options) {
30987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (CIdx)
30997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    static_cast<CIndexer *>(CIdx)->setCXGlobalOptFlags(options);
31007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
31017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
31027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiunsigned clang_CXIndex_getGlobalOptions(CXIndex CIdx) {
31037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (CIdx)
31047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return static_cast<CIndexer *>(CIdx)->getCXGlobalOptFlags();
31057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return 0;
31067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
31077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
31087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid clang_toggleCrashRecovery(unsigned isEnabled) {
31097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (isEnabled)
31107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    llvm::CrashRecoveryContext::Enable();
31117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  else
31127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    llvm::CrashRecoveryContext::Disable();
31137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
3114651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
31157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXTranslationUnit clang_createTranslationUnit(CXIndex CIdx,
31167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                              const char *ast_filename) {
3117651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  CXTranslationUnit TU;
3118651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  enum CXErrorCode Result =
3119651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      clang_createTranslationUnit2(CIdx, ast_filename, &TU);
3120651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  (void)Result;
3121651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  assert((TU && Result == CXError_Success) ||
3122651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines         (!TU && Result != CXError_Success));
3123651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return TU;
3124651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
3125651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
3126651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesenum CXErrorCode clang_createTranslationUnit2(CXIndex CIdx,
3127651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                              const char *ast_filename,
3128651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                              CXTranslationUnit *out_TU) {
3129651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (out_TU)
3130c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    *out_TU = nullptr;
3131651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
3132651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (!CIdx || !ast_filename || !out_TU)
3133651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return CXError_InvalidArguments;
31347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
31354c9f58f617faec246d3111868ae7aee5edb9f546Argyrios Kyrtzidis  LOG_FUNC_SECTION {
31364c9f58f617faec246d3111868ae7aee5edb9f546Argyrios Kyrtzidis    *Log << ast_filename;
31374c9f58f617faec246d3111868ae7aee5edb9f546Argyrios Kyrtzidis  }
31384c9f58f617faec246d3111868ae7aee5edb9f546Argyrios Kyrtzidis
31397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  CIndexer *CXXIdx = static_cast<CIndexer *>(CIdx);
31407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  FileSystemOptions FileSystemOpts;
31417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3142176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  IntrusiveRefCntPtr<DiagnosticsEngine> Diags =
3143176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      CompilerInstance::createDiagnostics(new DiagnosticOptions());
3144176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  std::unique_ptr<ASTUnit> AU = ASTUnit::LoadFromASTFile(
314587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      ast_filename, CXXIdx->getPCHContainerOperations()->getRawReader(), Diags,
314687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      FileSystemOpts, /*UseDebugInfo=*/false,
314787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      CXXIdx->getOnlyLocalDecls(), None,
3148176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      /*CaptureDiagnostics=*/true,
3149176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      /*AllowPCHWithCompilerErrors=*/true,
3150176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      /*UserFilesAreVolatile=*/true);
3151176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  *out_TU = MakeCXTranslationUnit(CXXIdx, AU.release());
3152651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return *out_TU ? CXError_Success : CXError_Failure;
31537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
31547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
31557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiunsigned clang_defaultEditingTranslationUnitOptions() {
31567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return CXTranslationUnit_PrecompiledPreamble |
31577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei         CXTranslationUnit_CacheCompletionResults;
31587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
3159651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
31607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXTranslationUnit
31617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiclang_createTranslationUnitFromSourceFile(CXIndex CIdx,
31627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                          const char *source_filename,
31637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                          int num_command_line_args,
31647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                          const char * const *command_line_args,
31657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                          unsigned num_unsaved_files,
31667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                          struct CXUnsavedFile *unsaved_files) {
31677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  unsigned Options = CXTranslationUnit_DetailedPreprocessingRecord;
31687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return clang_parseTranslationUnit(CIdx, source_filename,
31697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                    command_line_args, num_command_line_args,
31707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                    unsaved_files, num_unsaved_files,
31717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                    Options);
31727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
31737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
317487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarstatic CXErrorCode
317587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarclang_parseTranslationUnit_Impl(CXIndex CIdx, const char *source_filename,
317687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                                const char *const *command_line_args,
317787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                                int num_command_line_args,
317887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                                ArrayRef<CXUnsavedFile> unsaved_files,
317987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                                unsigned options, CXTranslationUnit *out_TU) {
3180651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // Set up the initial return values.
3181651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (out_TU)
3182c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    *out_TU = nullptr;
31837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3184651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // Check arguments.
318587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  if (!CIdx || !out_TU)
318687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return CXError_InvalidArguments;
31877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
31887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  CIndexer *CXXIdx = static_cast<CIndexer *>(CIdx);
31897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
31907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (CXXIdx->isOptEnabled(CXGlobalOpt_ThreadBackgroundPriorityForIndexing))
31917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    setThreadBackgroundPriority();
31927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
31937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  bool PrecompilePreamble = options & CXTranslationUnit_PrecompiledPreamble;
319487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  bool CreatePreambleOnFirstParse =
319587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      options & CXTranslationUnit_CreatePreambleOnFirstParse;
31967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // FIXME: Add a flag for modules.
31977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  TranslationUnitKind TUKind
31987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    = (options & CXTranslationUnit_Incomplete)? TU_Prefix : TU_Complete;
3199651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  bool CacheCodeCompletionResults
32007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    = options & CXTranslationUnit_CacheCompletionResults;
32017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  bool IncludeBriefCommentsInCodeCompletion
32027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    = options & CXTranslationUnit_IncludeBriefCommentsInCodeCompletion;
32037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  bool SkipFunctionBodies = options & CXTranslationUnit_SkipFunctionBodies;
32047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  bool ForSerialization = options & CXTranslationUnit_ForSerialization;
32057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
32067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Configure the diagnostics.
32077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  IntrusiveRefCntPtr<DiagnosticsEngine>
3208d47afb96a3f988e6d21a92fe4dfe875ab227c7c0Sean Silva    Diags(CompilerInstance::createDiagnostics(new DiagnosticOptions));
32097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
32104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  if (options & CXTranslationUnit_KeepGoing)
32114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    Diags->setFatalsAsError(true);
32124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
32137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Recover resources if we crash before exiting this function.
32147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  llvm::CrashRecoveryContextCleanupRegistrar<DiagnosticsEngine,
32157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    llvm::CrashRecoveryContextReleaseRefCleanup<DiagnosticsEngine> >
3216c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    DiagCleanup(Diags.get());
32177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3218651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  std::unique_ptr<std::vector<ASTUnit::RemappedFile>> RemappedFiles(
3219651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      new std::vector<ASTUnit::RemappedFile>());
32207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
32217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Recover resources if we crash before exiting this function.
32227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  llvm::CrashRecoveryContextCleanupRegistrar<
32237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    std::vector<ASTUnit::RemappedFile> > RemappedCleanup(RemappedFiles.get());
32247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
322587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  for (auto &UF : unsaved_files) {
3226176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    std::unique_ptr<llvm::MemoryBuffer> MB =
3227c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines        llvm::MemoryBuffer::getMemBufferCopy(getContents(UF), UF.Filename);
3228176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    RemappedFiles->push_back(std::make_pair(UF.Filename, MB.release()));
32297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
32307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3231651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  std::unique_ptr<std::vector<const char *>> Args(
3232651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      new std::vector<const char *>());
32337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
32347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Recover resources if we crash before exiting this method.
32357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  llvm::CrashRecoveryContextCleanupRegistrar<std::vector<const char*> >
32367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    ArgsCleanup(Args.get());
32377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
32387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Since the Clang C library is primarily used by batch tools dealing with
32397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // (often very broken) source code, where spell-checking can have a
32407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // significant negative impact on performance (particularly when
32417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // precompiled headers are involved), we disable it by default.
32427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Only do this if we haven't found a spell-checking-related argument.
32437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  bool FoundSpellCheckingArgument = false;
32447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  for (int I = 0; I != num_command_line_args; ++I) {
32457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (strcmp(command_line_args[I], "-fno-spell-checking") == 0 ||
32467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        strcmp(command_line_args[I], "-fspell-checking") == 0) {
32477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      FoundSpellCheckingArgument = true;
32487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      break;
32497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
32507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
32517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  Args->insert(Args->end(), command_line_args,
32527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei               command_line_args + num_command_line_args);
32537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
325487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  if (!FoundSpellCheckingArgument)
325587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    Args->insert(Args->begin() + 1, "-fno-spell-checking");
325687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
32577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // The 'source_filename' argument is optional.  If the caller does not
32587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // specify it then it is assumed that the source file is specified
32597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // in the actual argument list.
32607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Put the source file after command_line_args otherwise if '-x' flag is
32617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // present it will be unused.
32627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (source_filename)
32637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    Args->push_back(source_filename);
32647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
32657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Do we need the detailed preprocessing record?
32667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (options & CXTranslationUnit_DetailedPreprocessingRecord) {
32677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    Args->push_back("-Xclang");
32687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    Args->push_back("-detailed-preprocessing-record");
32697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
32707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
32717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  unsigned NumErrors = Diags->getClient()->getNumErrors();
3272651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  std::unique_ptr<ASTUnit> ErrUnit;
327387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // Unless the user specified that they want the preamble on the first parse
327487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // set it up to be created on the first reparse. This makes the first parse
327587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // faster, trading for a slower (first) reparse.
327687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  unsigned PrecompilePreambleAfterNParses =
327787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      !PrecompilePreamble ? 0 : 2 - CreatePreambleOnFirstParse;
3278651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  std::unique_ptr<ASTUnit> Unit(ASTUnit::LoadFromCommandLine(
327987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      Args->data(), Args->data() + Args->size(),
328087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      CXXIdx->getPCHContainerOperations(), Diags,
3281651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      CXXIdx->getClangResourcesPath(), CXXIdx->getOnlyLocalDecls(),
3282651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      /*CaptureDiagnostics=*/true, *RemappedFiles.get(),
328387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      /*RemappedFilesKeepOriginalName=*/true, PrecompilePreambleAfterNParses,
328487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      TUKind, CacheCodeCompletionResults, IncludeBriefCommentsInCodeCompletion,
3285651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      /*AllowPCHWithCompilerErrors=*/true, SkipFunctionBodies,
328687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      /*UserFilesAreVolatile=*/true, ForSerialization,
328787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      CXXIdx->getPCHContainerOperations()->getRawReader().getFormat(),
328887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      &ErrUnit));
328987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
329087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // Early failures in LoadFromCommandLine may return with ErrUnit unset.
329187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  if (!Unit && !ErrUnit)
329287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return CXError_ASTReadError;
32937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
32947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (NumErrors != Diags->getClient()->getNumErrors()) {
32957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // Make sure to check that 'Unit' is non-NULL.
32967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (CXXIdx->getDisplayDiagnostics())
32977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      printDiagsToStderr(Unit ? Unit.get() : ErrUnit.get());
32987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
32997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
330087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  if (isASTReadError(Unit ? Unit.get() : ErrUnit.get()))
330187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return CXError_ASTReadError;
330287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
330387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  *out_TU = MakeCXTranslationUnit(CXXIdx, Unit.release());
330487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return *out_TU ? CXError_Success : CXError_Failure;
33057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
3306651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
3307651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesCXTranslationUnit
3308651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesclang_parseTranslationUnit(CXIndex CIdx,
3309651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                           const char *source_filename,
3310651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                           const char *const *command_line_args,
3311651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                           int num_command_line_args,
3312651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                           struct CXUnsavedFile *unsaved_files,
3313651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                           unsigned num_unsaved_files,
3314651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                           unsigned options) {
3315651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  CXTranslationUnit TU;
3316651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  enum CXErrorCode Result = clang_parseTranslationUnit2(
3317651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      CIdx, source_filename, command_line_args, num_command_line_args,
3318651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      unsaved_files, num_unsaved_files, options, &TU);
3319651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  (void)Result;
3320651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  assert((TU && Result == CXError_Success) ||
3321651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines         (!TU && Result != CXError_Success));
3322651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return TU;
3323651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
3324651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
3325651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesenum CXErrorCode clang_parseTranslationUnit2(
332687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    CXIndex CIdx, const char *source_filename,
332787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    const char *const *command_line_args, int num_command_line_args,
332887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    struct CXUnsavedFile *unsaved_files, unsigned num_unsaved_files,
332987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    unsigned options, CXTranslationUnit *out_TU) {
333087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  SmallVector<const char *, 4> Args;
333187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  Args.push_back("clang");
333287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  Args.append(command_line_args, command_line_args + num_command_line_args);
333387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return clang_parseTranslationUnit2FullArgv(
333487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      CIdx, source_filename, Args.data(), Args.size(), unsaved_files,
333587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      num_unsaved_files, options, out_TU);
333687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
333787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
333887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarenum CXErrorCode clang_parseTranslationUnit2FullArgv(
333987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    CXIndex CIdx, const char *source_filename,
334087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    const char *const *command_line_args, int num_command_line_args,
334187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    struct CXUnsavedFile *unsaved_files, unsigned num_unsaved_files,
334287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    unsigned options, CXTranslationUnit *out_TU) {
3343c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  LOG_FUNC_SECTION {
3344c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis    *Log << source_filename << ": ";
3345c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis    for (int i = 0; i != num_command_line_args; ++i)
3346c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis      *Log << command_line_args[i] << " ";
3347c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  }
3348c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis
3349c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  if (num_unsaved_files && !unsaved_files)
3350c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    return CXError_InvalidArguments;
3351c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
3352c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  CXErrorCode result = CXError_Failure;
335387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  auto ParseTranslationUnitImpl = [=, &result] {
335487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    result = clang_parseTranslationUnit_Impl(
335587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar        CIdx, source_filename, command_line_args, num_command_line_args,
335687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar        llvm::makeArrayRef(unsaved_files, num_unsaved_files), options, out_TU);
335787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  };
33587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  llvm::CrashRecoveryContext CRC;
33597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
336087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  if (!RunSafely(CRC, ParseTranslationUnitImpl)) {
33617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    fprintf(stderr, "libclang: crash detected during parsing: {\n");
33627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    fprintf(stderr, "  'source_filename' : '%s'\n", source_filename);
33637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    fprintf(stderr, "  'command_line_args' : [");
33647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    for (int i = 0; i != num_command_line_args; ++i) {
33657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (i)
33667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        fprintf(stderr, ", ");
33677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      fprintf(stderr, "'%s'", command_line_args[i]);
33687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
33697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    fprintf(stderr, "],\n");
33707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    fprintf(stderr, "  'unsaved_files' : [");
33717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    for (unsigned i = 0; i != num_unsaved_files; ++i) {
33727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (i)
33737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        fprintf(stderr, ", ");
33747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      fprintf(stderr, "('%s', '...', %ld)", unsaved_files[i].Filename,
33757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei              unsaved_files[i].Length);
33767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
33777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    fprintf(stderr, "],\n");
33787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    fprintf(stderr, "  'options' : %d,\n", options);
33797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    fprintf(stderr, "}\n");
3380651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
3381651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return CXError_Crashed;
33827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  } else if (getenv("LIBCLANG_RESOURCE_USAGE")) {
338387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    if (CXTranslationUnit *TU = out_TU)
3384651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      PrintLibclangResourceUsage(*TU);
33857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
3386c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
3387c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  return result;
33887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
33897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
33904967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarCXString clang_Type_getObjCEncoding(CXType CT) {
33914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  CXTranslationUnit tu = static_cast<CXTranslationUnit>(CT.data[1]);
33924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ASTContext &Ctx = getASTUnit(tu)->getASTContext();
33934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string encoding;
33944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Ctx.getObjCEncodingForType(QualType::getFromOpaquePtr(CT.data[0]),
33954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                             encoding);
33964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
33974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  return cxstring::createDup(encoding);
33984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
33994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
34004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarstatic const IdentifierInfo *getMacroIdentifier(CXCursor C) {
34014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  if (C.kind == CXCursor_MacroDefinition) {
34024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    if (const MacroDefinitionRecord *MDR = getCursorMacroDefinition(C))
34034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      return MDR->getName();
34044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  } else if (C.kind == CXCursor_MacroExpansion) {
34054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    MacroExpansionCursor ME = getCursorMacroExpansion(C);
34064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return ME.getName();
34074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
34084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  return nullptr;
34094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
34104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
34114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarunsigned clang_Cursor_isMacroFunctionLike(CXCursor C) {
34124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  const IdentifierInfo *II = getMacroIdentifier(C);
34134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  if (!II) {
34144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return false;
34154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
34164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ASTUnit *ASTU = getCursorASTUnit(C);
34174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Preprocessor &PP = ASTU->getPreprocessor();
34184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  if (const MacroInfo *MI = PP.getMacroInfo(II))
34194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return MI->isFunctionLike();
34204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  return false;
34214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
34224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
34234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarunsigned clang_Cursor_isMacroBuiltin(CXCursor C) {
34244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  const IdentifierInfo *II = getMacroIdentifier(C);
34254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  if (!II) {
34264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return false;
34274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
34284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ASTUnit *ASTU = getCursorASTUnit(C);
34294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Preprocessor &PP = ASTU->getPreprocessor();
34304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  if (const MacroInfo *MI = PP.getMacroInfo(II))
34314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return MI->isBuiltinMacro();
34324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  return false;
34334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
34344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
34354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarunsigned clang_Cursor_isFunctionInlined(CXCursor C) {
34364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  const Decl *D = getCursorDecl(C);
34374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D);
34384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  if (!FD) {
34394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return false;
34404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
34414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  return FD->isInlined();
34424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
34434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
34444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarstatic StringLiteral* getCFSTR_value(CallExpr *callExpr) {
34454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  if (callExpr->getNumArgs() != 1) {
34464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return nullptr;
34474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
34484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
34494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  StringLiteral *S = nullptr;
34504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  auto *arg = callExpr->getArg(0);
34514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  if (arg->getStmtClass() == Stmt::ImplicitCastExprClass) {
34524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    ImplicitCastExpr *I = static_cast<ImplicitCastExpr *>(arg);
34534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    auto *subExpr = I->getSubExprAsWritten();
34544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
34554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    if(subExpr->getStmtClass() != Stmt::StringLiteralClass){
34564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      return nullptr;
34574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    }
34584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
34594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    S = static_cast<StringLiteral *>(I->getSubExprAsWritten());
34604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  } else if (arg->getStmtClass() == Stmt::StringLiteralClass) {
34614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    S = static_cast<StringLiteral *>(callExpr->getArg(0));
34624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  } else {
34634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return nullptr;
34644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
34654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  return S;
34664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
34674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
34684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarstruct ExprEvalResult {
34694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  CXEvalResultKind EvalType;
34704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  union {
34714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    int intVal;
34724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    double floatVal;
34734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    char *stringVal;
34744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  } EvalData;
34754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ~ExprEvalResult() {
34764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    if (EvalType != CXEval_UnExposed && EvalType != CXEval_Float &&
34774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        EvalType != CXEval_Int) {
34784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      delete EvalData.stringVal;
34794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    }
34804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
34814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar};
34824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
34834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid clang_EvalResult_dispose(CXEvalResult E) {
34844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  delete static_cast<ExprEvalResult *>(E);
34854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
34864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
34874967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarCXEvalResultKind clang_EvalResult_getKind(CXEvalResult E) {
34884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  if (!E) {
34894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return CXEval_UnExposed;
34904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
34914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  return ((ExprEvalResult *)E)->EvalType;
34924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
34934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
34944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarint clang_EvalResult_getAsInt(CXEvalResult E) {
34954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  if (!E) {
34964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return 0;
34974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
34984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  return ((ExprEvalResult *)E)->EvalData.intVal;
34994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
35004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
35014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainardouble clang_EvalResult_getAsDouble(CXEvalResult E) {
35024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  if (!E) {
35034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return 0;
35044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
35054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  return ((ExprEvalResult *)E)->EvalData.floatVal;
35064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
35074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
35084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarconst char* clang_EvalResult_getAsStr(CXEvalResult E) {
35094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  if (!E) {
35104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return nullptr;
35114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
35124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  return ((ExprEvalResult *)E)->EvalData.stringVal;
35134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
35144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
35154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarstatic const ExprEvalResult* evaluateExpr(Expr *expr, CXCursor C) {
35164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Expr::EvalResult ER;
35174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ASTContext &ctx = getCursorContext(C);
35184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  if (!expr)
35194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return nullptr;
35204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
35214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  expr = expr->IgnoreParens();
35224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  if (!expr->EvaluateAsRValue(ER, ctx))
35234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return nullptr;
35244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
35254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  QualType rettype;
35264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  CallExpr *callExpr;
35274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  auto result = llvm::make_unique<ExprEvalResult>();
35284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  result->EvalType = CXEval_UnExposed;
35294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
35304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  if (ER.Val.isInt()) {
35314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    result->EvalType = CXEval_Int;
35324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    result->EvalData.intVal = ER.Val.getInt().getExtValue();
35334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return result.release();
35344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
35354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
35364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  if (ER.Val.isFloat()) {
35374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    llvm::SmallVector<char, 100> Buffer;
35384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    ER.Val.getFloat().toString(Buffer);
35394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    std::string floatStr(Buffer.data(), Buffer.size());
35404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    result->EvalType = CXEval_Float;
35414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    bool ignored;
35424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    llvm::APFloat apFloat = ER.Val.getFloat();
35434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    apFloat.convert(llvm::APFloat::IEEEdouble,
35444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                    llvm::APFloat::rmNearestTiesToEven, &ignored);
35454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    result->EvalData.floatVal = apFloat.convertToDouble();
35464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return result.release();
35474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
35484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
35494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  if (expr->getStmtClass() == Stmt::ImplicitCastExprClass) {
35504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    const ImplicitCastExpr *I = dyn_cast<ImplicitCastExpr>(expr);
35514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    auto *subExpr = I->getSubExprAsWritten();
35524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    if (subExpr->getStmtClass() == Stmt::StringLiteralClass ||
35534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        subExpr->getStmtClass() == Stmt::ObjCStringLiteralClass) {
35544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      const StringLiteral *StrE = nullptr;
35554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      const ObjCStringLiteral *ObjCExpr;
35564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      ObjCExpr = dyn_cast<ObjCStringLiteral>(subExpr);
35574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
35584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      if (ObjCExpr) {
35594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        StrE = ObjCExpr->getString();
35604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        result->EvalType = CXEval_ObjCStrLiteral;
35614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      } else {
35624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        StrE = cast<StringLiteral>(I->getSubExprAsWritten());
35634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        result->EvalType = CXEval_StrLiteral;
35644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      }
35654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
35664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      std::string strRef(StrE->getString().str());
35674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      result->EvalData.stringVal = new char[strRef.size() + 1];
35684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      strncpy((char *)result->EvalData.stringVal, strRef.c_str(),
35694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar              strRef.size());
35704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      result->EvalData.stringVal[strRef.size()] = '\0';
35714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      return result.release();
35724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    }
35734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  } else if (expr->getStmtClass() == Stmt::ObjCStringLiteralClass ||
35744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar             expr->getStmtClass() == Stmt::StringLiteralClass) {
35754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    const StringLiteral *StrE = nullptr;
35764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    const ObjCStringLiteral *ObjCExpr;
35774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    ObjCExpr = dyn_cast<ObjCStringLiteral>(expr);
35784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
35794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    if (ObjCExpr) {
35804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      StrE = ObjCExpr->getString();
35814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      result->EvalType = CXEval_ObjCStrLiteral;
35824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    } else {
35834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      StrE = cast<StringLiteral>(expr);
35844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      result->EvalType = CXEval_StrLiteral;
35854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    }
35864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
35874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    std::string strRef(StrE->getString().str());
35884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    result->EvalData.stringVal = new char[strRef.size() + 1];
35894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    strncpy((char *)result->EvalData.stringVal, strRef.c_str(), strRef.size());
35904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    result->EvalData.stringVal[strRef.size()] = '\0';
35914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return result.release();
35924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
35934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
35944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  if (expr->getStmtClass() == Stmt::CStyleCastExprClass) {
35954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    CStyleCastExpr *CC = static_cast<CStyleCastExpr *>(expr);
35964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
35974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    rettype = CC->getType();
35984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    if (rettype.getAsString() == "CFStringRef" &&
35994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        CC->getSubExpr()->getStmtClass() == Stmt::CallExprClass) {
36004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
36014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      callExpr = static_cast<CallExpr *>(CC->getSubExpr());
36024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      StringLiteral *S = getCFSTR_value(callExpr);
36034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      if (S) {
36044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        std::string strLiteral(S->getString().str());
36054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        result->EvalType = CXEval_CFStr;
36064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
36074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        result->EvalData.stringVal = new char[strLiteral.size() + 1];
36084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        strncpy((char *)result->EvalData.stringVal, strLiteral.c_str(),
36094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                strLiteral.size());
36104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        result->EvalData.stringVal[strLiteral.size()] = '\0';
36114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        return result.release();
36124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      }
36134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    }
36144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
36154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  } else if (expr->getStmtClass() == Stmt::CallExprClass) {
36164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    callExpr = static_cast<CallExpr *>(expr);
36174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    rettype = callExpr->getCallReturnType(ctx);
36184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
36194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    if (rettype->isVectorType() || callExpr->getNumArgs() > 1)
36204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      return nullptr;
36214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
36224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    if (rettype->isIntegralType(ctx) || rettype->isRealFloatingType()) {
36234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      if (callExpr->getNumArgs() == 1 &&
36244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar          !callExpr->getArg(0)->getType()->isIntegralType(ctx))
36254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        return nullptr;
36264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    } else if (rettype.getAsString() == "CFStringRef") {
36274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
36284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      StringLiteral *S = getCFSTR_value(callExpr);
36294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      if (S) {
36304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        std::string strLiteral(S->getString().str());
36314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        result->EvalType = CXEval_CFStr;
36324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        result->EvalData.stringVal = new char[strLiteral.size() + 1];
36334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        strncpy((char *)result->EvalData.stringVal, strLiteral.c_str(),
36344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                strLiteral.size());
36354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        result->EvalData.stringVal[strLiteral.size()] = '\0';
36364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        return result.release();
36374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      }
36384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    }
36394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  } else if (expr->getStmtClass() == Stmt::DeclRefExprClass) {
36404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    DeclRefExpr *D = static_cast<DeclRefExpr *>(expr);
36414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    ValueDecl *V = D->getDecl();
36424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    if (V->getKind() == Decl::Function) {
36434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      std::string strName = V->getNameAsString();
36444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      result->EvalType = CXEval_Other;
36454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      result->EvalData.stringVal = new char[strName.size() + 1];
36464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      strncpy(result->EvalData.stringVal, strName.c_str(), strName.size());
36474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      result->EvalData.stringVal[strName.size()] = '\0';
36484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      return result.release();
36494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    }
36504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
36514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
36524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  return nullptr;
36534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
36544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
36554967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarCXEvalResult clang_Cursor_Evaluate(CXCursor C) {
36564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  const Decl *D = getCursorDecl(C);
36574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  if (D) {
36584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    const Expr *expr = nullptr;
36594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    if (auto *Var = dyn_cast<VarDecl>(D)) {
36604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      expr = Var->getInit();
36614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    } else if (auto *Field = dyn_cast<FieldDecl>(D)) {
36624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      expr = Field->getInClassInitializer();
36634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    }
36644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    if (expr)
36654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      return const_cast<CXEvalResult>(reinterpret_cast<const void *>(
36664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar          evaluateExpr(const_cast<Expr *>(expr), C)));
36674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return nullptr;
36684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
36694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
36704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  const CompoundStmt *compoundStmt = dyn_cast_or_null<CompoundStmt>(getCursorStmt(C));
36714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  if (compoundStmt) {
36724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    Expr *expr = nullptr;
36734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    for (auto *bodyIterator : compoundStmt->body()) {
36744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      if ((expr = dyn_cast<Expr>(bodyIterator))) {
36754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        break;
36764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      }
36774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    }
36784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    if (expr)
36794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      return const_cast<CXEvalResult>(
36804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar          reinterpret_cast<const void *>(evaluateExpr(expr, C)));
36814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
36824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  return nullptr;
36834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
36844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
36854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarunsigned clang_Cursor_hasAttrs(CXCursor C) {
36864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  const Decl *D = getCursorDecl(C);
36874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  if (!D) {
36884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return 0;
36894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
36904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
36914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  if (D->hasAttrs()) {
36924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return 1;
36934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
36944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
36954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  return 0;
36964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
36977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiunsigned clang_defaultSaveOptions(CXTranslationUnit TU) {
36987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return CXSaveTranslationUnit_None;
36997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
37007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
370187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarstatic CXSaveError clang_saveTranslationUnit_Impl(CXTranslationUnit TU,
370287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                                                  const char *FileName,
370387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                                                  unsigned options) {
370487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  CIndexer *CXXIdx = TU->CIdx;
37057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (CXXIdx->isOptEnabled(CXGlobalOpt_ThreadBackgroundPriorityForIndexing))
37067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    setThreadBackgroundPriority();
37077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
370887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  bool hadError = cxtu::getASTUnit(TU)->Save(FileName);
370987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return hadError ? CXSaveError_Unknown : CXSaveError_None;
37107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
37117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
37127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiint clang_saveTranslationUnit(CXTranslationUnit TU, const char *FileName,
37137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                              unsigned options) {
3714c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  LOG_FUNC_SECTION {
3715c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis    *Log << TU << ' ' << FileName;
3716c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  }
3717c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis
3718651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (isNotUsableTU(TU)) {
3719651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    LOG_BAD_TU(TU);
37207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return CXSaveError_InvalidTU;
3721651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
37227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
37235694feb5ccd6eb862cb600b55753cecc13794471Dmitri Gribenko  ASTUnit *CXXUnit = cxtu::getASTUnit(TU);
37247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  ASTUnit::ConcurrencyCheck Check(*CXXUnit);
37257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!CXXUnit->hasSema())
37267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return CXSaveError_InvalidTU;
37277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
372887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  CXSaveError result;
372987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  auto SaveTranslationUnitImpl = [=, &result]() {
373087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    result = clang_saveTranslationUnit_Impl(TU, FileName, options);
373187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  };
37327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
37337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!CXXUnit->getDiagnostics().hasUnrecoverableErrorOccurred() ||
37347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      getenv("LIBCLANG_NOTHREADS")) {
373587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    SaveTranslationUnitImpl();
37367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
37377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (getenv("LIBCLANG_RESOURCE_USAGE"))
37387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      PrintLibclangResourceUsage(TU);
37397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
374087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return result;
37417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
37427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
37437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // We have an AST that has invalid nodes due to compiler errors.
37447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Use a crash recovery thread for protection.
37457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
37467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  llvm::CrashRecoveryContext CRC;
37477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
374887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  if (!RunSafely(CRC, SaveTranslationUnitImpl)) {
37497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    fprintf(stderr, "libclang: crash detected during AST saving: {\n");
37507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    fprintf(stderr, "  'filename' : '%s'\n", FileName);
37517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    fprintf(stderr, "  'options' : %d,\n", options);
37527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    fprintf(stderr, "}\n");
37537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
37547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return CXSaveError_Unknown;
37557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
37567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  } else if (getenv("LIBCLANG_RESOURCE_USAGE")) {
37577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    PrintLibclangResourceUsage(TU);
37587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
37597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
376087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return result;
37617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
37627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
37637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid clang_disposeTranslationUnit(CXTranslationUnit CTUnit) {
37647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (CTUnit) {
37657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // If the translation unit has been marked as unsafe to free, just discard
37667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // it.
3767651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    ASTUnit *Unit = cxtu::getASTUnit(CTUnit);
3768651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (Unit && Unit->isUnsafeToFree())
37697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return;
37707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
37715694feb5ccd6eb862cb600b55753cecc13794471Dmitri Gribenko    delete cxtu::getASTUnit(CTUnit);
37729c48d16a11872624410ab3a5944edcba0f32818cDmitri Gribenko    delete CTUnit->StringPool;
37737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    delete static_cast<CXDiagnosticSetImpl *>(CTUnit->Diagnostics);
37747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    disposeOverridenCXCursorsPool(CTUnit->OverridenCursorsPool);
377586cfda2fcccc84e92fb7f27e85b58312440ca8deDmitri Gribenko    delete CTUnit->CommentToXML;
37767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    delete CTUnit;
37777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
37787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
37797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
37807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiunsigned clang_defaultReparseOptions(CXTranslationUnit TU) {
37817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return CXReparse_None;
37827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
37837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
378487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarstatic CXErrorCode
378587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarclang_reparseTranslationUnit_Impl(CXTranslationUnit TU,
378687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                                  ArrayRef<CXUnsavedFile> unsaved_files,
378787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                                  unsigned options) {
3788651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // Check arguments.
3789651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (isNotUsableTU(TU)) {
3790651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    LOG_BAD_TU(TU);
379187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return CXError_InvalidArguments;
3792651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
37937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
37947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Reset the associated diagnostics.
37957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  delete static_cast<CXDiagnosticSetImpl*>(TU->Diagnostics);
3796c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  TU->Diagnostics = nullptr;
37977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
37988c718e7d87018919b5b84b0d545fe477b2d532d1Dmitri Gribenko  CIndexer *CXXIdx = TU->CIdx;
37997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (CXXIdx->isOptEnabled(CXGlobalOpt_ThreadBackgroundPriorityForEditing))
38007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    setThreadBackgroundPriority();
38017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
38025694feb5ccd6eb862cb600b55753cecc13794471Dmitri Gribenko  ASTUnit *CXXUnit = cxtu::getASTUnit(TU);
38037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  ASTUnit::ConcurrencyCheck Check(*CXXUnit);
3804651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
3805651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  std::unique_ptr<std::vector<ASTUnit::RemappedFile>> RemappedFiles(
3806651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      new std::vector<ASTUnit::RemappedFile>());
3807651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
38087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Recover resources if we crash before exiting this function.
38097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  llvm::CrashRecoveryContextCleanupRegistrar<
38107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    std::vector<ASTUnit::RemappedFile> > RemappedCleanup(RemappedFiles.get());
3811c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
381287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  for (auto &UF : unsaved_files) {
3813176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    std::unique_ptr<llvm::MemoryBuffer> MB =
3814c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines        llvm::MemoryBuffer::getMemBufferCopy(getContents(UF), UF.Filename);
3815176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    RemappedFiles->push_back(std::make_pair(UF.Filename, MB.release()));
38167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
3817651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
381887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  if (!CXXUnit->Reparse(CXXIdx->getPCHContainerOperations(),
381987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                        *RemappedFiles.get()))
382087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return CXError_Success;
382187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  if (isASTReadError(CXXUnit))
382287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return CXError_ASTReadError;
382387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return CXError_Failure;
38247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
38257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
38267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiint clang_reparseTranslationUnit(CXTranslationUnit TU,
38277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                 unsigned num_unsaved_files,
38287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                 struct CXUnsavedFile *unsaved_files,
38297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                 unsigned options) {
3830c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  LOG_FUNC_SECTION {
3831c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis    *Log << TU;
3832c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  }
3833c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis
3834c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  if (num_unsaved_files && !unsaved_files)
3835c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    return CXError_InvalidArguments;
3836c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
383787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  CXErrorCode result;
383887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  auto ReparseTranslationUnitImpl = [=, &result]() {
383987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    result = clang_reparseTranslationUnit_Impl(
384087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar        TU, llvm::makeArrayRef(unsaved_files, num_unsaved_files), options);
384187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  };
38427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
38437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (getenv("LIBCLANG_NOTHREADS")) {
384487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    ReparseTranslationUnitImpl();
3845c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    return result;
38467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
38477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
38487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  llvm::CrashRecoveryContext CRC;
38497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
385087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  if (!RunSafely(CRC, ReparseTranslationUnitImpl)) {
38517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    fprintf(stderr, "libclang: crash detected during reparsing\n");
38525694feb5ccd6eb862cb600b55753cecc13794471Dmitri Gribenko    cxtu::getASTUnit(TU)->setUnsafeToFree(true);
3853651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return CXError_Crashed;
38547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  } else if (getenv("LIBCLANG_RESOURCE_USAGE"))
38557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    PrintLibclangResourceUsage(TU);
38567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3857c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  return result;
38587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
38597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
38607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
38617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXString clang_getTranslationUnitSpelling(CXTranslationUnit CTUnit) {
3862651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (isNotUsableTU(CTUnit)) {
3863651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    LOG_BAD_TU(CTUnit);
3864dc66adb40ee871b4c578ba615f45d82476c7119eDmitri Gribenko    return cxstring::createEmpty();
3865651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
38667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
38675694feb5ccd6eb862cb600b55753cecc13794471Dmitri Gribenko  ASTUnit *CXXUnit = cxtu::getASTUnit(CTUnit);
38685595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko  return cxstring::createDup(CXXUnit->getOriginalSourceFileName());
38697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
38707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
38717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXCursor clang_getTranslationUnitCursor(CXTranslationUnit TU) {
3872651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (isNotUsableTU(TU)) {
3873651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    LOG_BAD_TU(TU);
38740b602836c63e702b2ba893e8439996b226fc248fArgyrios Kyrtzidis    return clang_getNullCursor();
3875651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
38760b602836c63e702b2ba893e8439996b226fc248fArgyrios Kyrtzidis
38775694feb5ccd6eb862cb600b55753cecc13794471Dmitri Gribenko  ASTUnit *CXXUnit = cxtu::getASTUnit(TU);
38787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return MakeCXCursor(CXXUnit->getASTContext().getTranslationUnitDecl(), TU);
38797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
38807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
38817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} // end: extern "C"
38827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
38837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----------------------------------------------------------------------===//
38847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// CXFile Operations.
38857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----------------------------------------------------------------------===//
38867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
38877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiextern "C" {
38887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXString clang_getFileName(CXFile SFile) {
38897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!SFile)
3890dad4c1a9ac4ef1aa591ac2ef20dc4c30d96f9f2aDmitri Gribenko    return cxstring::createNull();
38917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
38927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  FileEntry *FEnt = static_cast<FileEntry *>(SFile);
38930c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko  return cxstring::createRef(FEnt->getName());
38947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
38957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
38967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeitime_t clang_getFileTime(CXFile SFile) {
38977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!SFile)
38987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return 0;
38997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
39007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  FileEntry *FEnt = static_cast<FileEntry *>(SFile);
39017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return FEnt->getModificationTime();
39027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
39037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
39045694feb5ccd6eb862cb600b55753cecc13794471Dmitri GribenkoCXFile clang_getFile(CXTranslationUnit TU, const char *file_name) {
3905651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (isNotUsableTU(TU)) {
3906651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    LOG_BAD_TU(TU);
3907c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    return nullptr;
3908651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
39097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
39105694feb5ccd6eb862cb600b55753cecc13794471Dmitri Gribenko  ASTUnit *CXXUnit = cxtu::getASTUnit(TU);
39117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
39127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  FileManager &FMgr = CXXUnit->getFileManager();
39137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return const_cast<FileEntry *>(FMgr.getFile(file_name));
39147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
39157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3916651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesunsigned clang_isFileMultipleIncludeGuarded(CXTranslationUnit TU,
3917651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                            CXFile file) {
3918651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (isNotUsableTU(TU)) {
3919651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    LOG_BAD_TU(TU);
3920651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return 0;
3921651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
3922651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
3923651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (!file)
39247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return 0;
39257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
39265694feb5ccd6eb862cb600b55753cecc13794471Dmitri Gribenko  ASTUnit *CXXUnit = cxtu::getASTUnit(TU);
39277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  FileEntry *FEnt = static_cast<FileEntry *>(file);
39287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return CXXUnit->getPreprocessor().getHeaderSearchInfo()
39297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                          .isFileMultipleIncludeGuarded(FEnt);
39307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
39317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3932db84e7a44dce24c3a8e4e0fc84434c00fc2da168Argyrios Kyrtzidisint clang_getFileUniqueID(CXFile file, CXFileUniqueID *outID) {
3933db84e7a44dce24c3a8e4e0fc84434c00fc2da168Argyrios Kyrtzidis  if (!file || !outID)
3934db84e7a44dce24c3a8e4e0fc84434c00fc2da168Argyrios Kyrtzidis    return 1;
3935db84e7a44dce24c3a8e4e0fc84434c00fc2da168Argyrios Kyrtzidis
3936db84e7a44dce24c3a8e4e0fc84434c00fc2da168Argyrios Kyrtzidis  FileEntry *FEnt = static_cast<FileEntry *>(file);
39370fda0f75f053ad9afdb2bb8d4ea72c5e6a49d657Rafael Espindola  const llvm::sys::fs::UniqueID &ID = FEnt->getUniqueID();
39380fda0f75f053ad9afdb2bb8d4ea72c5e6a49d657Rafael Espindola  outID->data[0] = ID.getDevice();
39390fda0f75f053ad9afdb2bb8d4ea72c5e6a49d657Rafael Espindola  outID->data[1] = ID.getFile();
3940db84e7a44dce24c3a8e4e0fc84434c00fc2da168Argyrios Kyrtzidis  outID->data[2] = FEnt->getModificationTime();
3941db84e7a44dce24c3a8e4e0fc84434c00fc2da168Argyrios Kyrtzidis  return 0;
3942db84e7a44dce24c3a8e4e0fc84434c00fc2da168Argyrios Kyrtzidis}
3943db84e7a44dce24c3a8e4e0fc84434c00fc2da168Argyrios Kyrtzidis
3944176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesint clang_File_isEqual(CXFile file1, CXFile file2) {
3945176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  if (file1 == file2)
3946176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    return true;
3947176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
3948176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  if (!file1 || !file2)
3949176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    return false;
3950176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
3951176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  FileEntry *FEnt1 = static_cast<FileEntry *>(file1);
3952176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  FileEntry *FEnt2 = static_cast<FileEntry *>(file2);
3953176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  return FEnt1->getUniqueID() == FEnt2->getUniqueID();
3954176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
3955176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
39567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} // end: extern "C"
39577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
39587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----------------------------------------------------------------------===//
39597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// CXCursor Operations.
39607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----------------------------------------------------------------------===//
39617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3962e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenkostatic const Decl *getDeclFromExpr(const Stmt *E) {
3963e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko  if (const ImplicitCastExpr *CE = dyn_cast<ImplicitCastExpr>(E))
39647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return getDeclFromExpr(CE->getSubExpr());
39657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3966e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko  if (const DeclRefExpr *RefExpr = dyn_cast<DeclRefExpr>(E))
39677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return RefExpr->getDecl();
3968e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko  if (const MemberExpr *ME = dyn_cast<MemberExpr>(E))
39697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return ME->getMemberDecl();
3970e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko  if (const ObjCIvarRefExpr *RE = dyn_cast<ObjCIvarRefExpr>(E))
39717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return RE->getDecl();
3972e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko  if (const ObjCPropertyRefExpr *PRE = dyn_cast<ObjCPropertyRefExpr>(E)) {
39737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (PRE->isExplicitProperty())
39747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return PRE->getExplicitProperty();
39757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // It could be messaging both getter and setter as in:
39767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // ++myobj.myprop;
39777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // in which case prefer to associate the setter since it is less obvious
39787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // from inspecting the source that the setter is going to get called.
39797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (PRE->isMessagingSetter())
39807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return PRE->getImplicitPropertySetter();
39817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return PRE->getImplicitPropertyGetter();
39827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
3983e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko  if (const PseudoObjectExpr *POE = dyn_cast<PseudoObjectExpr>(E))
39847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return getDeclFromExpr(POE->getSyntacticForm());
3985e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko  if (const OpaqueValueExpr *OVE = dyn_cast<OpaqueValueExpr>(E))
39867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (Expr *Src = OVE->getSourceExpr())
39877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return getDeclFromExpr(Src);
39887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
3989e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko  if (const CallExpr *CE = dyn_cast<CallExpr>(E))
39907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return getDeclFromExpr(CE->getCallee());
3991e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko  if (const CXXConstructExpr *CE = dyn_cast<CXXConstructExpr>(E))
39927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (!CE->isElidable())
39937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return CE->getConstructor();
39944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  if (const CXXInheritedCtorInitExpr *CE =
39954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar          dyn_cast<CXXInheritedCtorInitExpr>(E))
39964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return CE->getConstructor();
3997e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko  if (const ObjCMessageExpr *OME = dyn_cast<ObjCMessageExpr>(E))
39987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return OME->getMethodDecl();
39997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
4000e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko  if (const ObjCProtocolExpr *PE = dyn_cast<ObjCProtocolExpr>(E))
40017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return PE->getProtocol();
4002e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko  if (const SubstNonTypeTemplateParmPackExpr *NTTP
40037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                              = dyn_cast<SubstNonTypeTemplateParmPackExpr>(E))
40047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return NTTP->getParameterPack();
4005e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko  if (const SizeOfPackExpr *SizeOfPack = dyn_cast<SizeOfPackExpr>(E))
40067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (isa<NonTypeTemplateParmDecl>(SizeOfPack->getPack()) ||
40077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        isa<ParmVarDecl>(SizeOfPack->getPack()))
40087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return SizeOfPack->getPack();
4009c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
4010c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  return nullptr;
40117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
40127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
4013ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenkostatic SourceLocation getLocationFromExpr(const Expr *E) {
4014ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  if (const ImplicitCastExpr *CE = dyn_cast<ImplicitCastExpr>(E))
40157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return getLocationFromExpr(CE->getSubExpr());
40167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
4017ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  if (const ObjCMessageExpr *Msg = dyn_cast<ObjCMessageExpr>(E))
40187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return /*FIXME:*/Msg->getLeftLoc();
4019ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E))
40207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return DRE->getLocation();
4021ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  if (const MemberExpr *Member = dyn_cast<MemberExpr>(E))
40227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return Member->getMemberLoc();
4023ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  if (const ObjCIvarRefExpr *Ivar = dyn_cast<ObjCIvarRefExpr>(E))
40247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return Ivar->getLocation();
4025ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  if (const SizeOfPackExpr *SizeOfPack = dyn_cast<SizeOfPackExpr>(E))
40267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return SizeOfPack->getPackLoc();
4027ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko  if (const ObjCPropertyRefExpr *PropRef = dyn_cast<ObjCPropertyRefExpr>(E))
40287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return PropRef->getLocation();
40297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
40307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return E->getLocStart();
40317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
40327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
40337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiextern "C" {
40347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
40357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiunsigned clang_visitChildren(CXCursor parent,
40367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                             CXCursorVisitor visitor,
40377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                             CXClientData client_data) {
40387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  CursorVisitor CursorVis(getCursorTU(parent), visitor, client_data,
40397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                          /*VisitPreprocessorLast=*/false);
40407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return CursorVis.VisitChildren(parent);
40417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
40427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
40437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#ifndef __has_feature
40447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define __has_feature(x) 0
40457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#endif
40467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#if __has_feature(blocks)
40477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeitypedef enum CXChildVisitResult
40487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei     (^CXCursorVisitorBlock)(CXCursor cursor, CXCursor parent);
40497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
40507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic enum CXChildVisitResult visitWithBlock(CXCursor cursor, CXCursor parent,
40517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    CXClientData client_data) {
40527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  CXCursorVisitorBlock block = (CXCursorVisitorBlock)client_data;
40537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return block(cursor, parent);
40547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
40557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#else
40567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// If we are compiled with a compiler that doesn't have native blocks support,
40577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// define and call the block manually, so the
40587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeitypedef struct _CXChildVisitResult
40597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei{
40607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei	void *isa;
40617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei	int flags;
40627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei	int reserved;
40637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei	enum CXChildVisitResult(*invoke)(struct _CXChildVisitResult*, CXCursor,
40647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                         CXCursor);
40657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} *CXCursorVisitorBlock;
40667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
40677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic enum CXChildVisitResult visitWithBlock(CXCursor cursor, CXCursor parent,
40687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    CXClientData client_data) {
40697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  CXCursorVisitorBlock block = (CXCursorVisitorBlock)client_data;
40707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return block->invoke(block, cursor, parent);
40717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
40727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#endif
40737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
40747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
40757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiunsigned clang_visitChildrenWithBlock(CXCursor parent,
40767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                      CXCursorVisitorBlock block) {
40777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return clang_visitChildren(parent, visitWithBlock, block);
40787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
40797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
4080e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenkostatic CXString getDeclSpelling(const Decl *D) {
40817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!D)
4082dc66adb40ee871b4c578ba615f45d82476c7119eDmitri Gribenko    return cxstring::createEmpty();
40837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
4084e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko  const NamedDecl *ND = dyn_cast<NamedDecl>(D);
40857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!ND) {
4086e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko    if (const ObjCPropertyImplDecl *PropImpl =
4087e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko            dyn_cast<ObjCPropertyImplDecl>(D))
40887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (ObjCPropertyDecl *Property = PropImpl->getPropertyDecl())
40895595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko        return cxstring::createDup(Property->getIdentifier()->getName());
40907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
4091e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko    if (const ImportDecl *ImportD = dyn_cast<ImportDecl>(D))
40927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (Module *Mod = ImportD->getImportedModule())
40935595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko        return cxstring::createDup(Mod->getFullModuleName());
40947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
4095dc66adb40ee871b4c578ba615f45d82476c7119eDmitri Gribenko    return cxstring::createEmpty();
40967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
40977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
4098e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko  if (const ObjCMethodDecl *OMD = dyn_cast<ObjCMethodDecl>(ND))
40995595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko    return cxstring::createDup(OMD->getSelector().getAsString());
41007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
4101e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko  if (const ObjCCategoryImplDecl *CIMP = dyn_cast<ObjCCategoryImplDecl>(ND))
41027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // No, this isn't the same as the code below. getIdentifier() is non-virtual
41037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // and returns different names. NamedDecl returns the class name and
41047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // ObjCCategoryImplDecl returns the category name.
41050c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko    return cxstring::createRef(CIMP->getIdentifier()->getNameStart());
41067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
41077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (isa<UsingDirectiveDecl>(D))
4108dc66adb40ee871b4c578ba615f45d82476c7119eDmitri Gribenko    return cxstring::createEmpty();
41097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
41107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  SmallString<1024> S;
41117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  llvm::raw_svector_ostream os(S);
41127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  ND->printName(os);
41137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
41145595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko  return cxstring::createDup(os.str());
41157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
41167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
41177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXString clang_getCursorSpelling(CXCursor C) {
41187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (clang_isTranslationUnit(C.kind))
411946f92523918fd4ac4df5489265c7f85c1b28baeaDmitri Gribenko    return clang_getTranslationUnitSpelling(getCursorTU(C));
41207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
41217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (clang_isReference(C.kind)) {
41227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    switch (C.kind) {
41237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_ObjCSuperClassRef: {
412467812b2f94f4b5e7d2596db1705ffa1149ddc45aDmitri Gribenko      const ObjCInterfaceDecl *Super = getCursorObjCSuperClassRef(C).first;
41250c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef(Super->getIdentifier()->getNameStart());
41267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
41277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_ObjCClassRef: {
412867812b2f94f4b5e7d2596db1705ffa1149ddc45aDmitri Gribenko      const ObjCInterfaceDecl *Class = getCursorObjCClassRef(C).first;
41290c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef(Class->getIdentifier()->getNameStart());
41307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
41317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_ObjCProtocolRef: {
413267812b2f94f4b5e7d2596db1705ffa1149ddc45aDmitri Gribenko      const ObjCProtocolDecl *OID = getCursorObjCProtocolRef(C).first;
41337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      assert(OID && "getCursorSpelling(): Missing protocol decl");
41340c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef(OID->getIdentifier()->getNameStart());
41357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
41367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_CXXBaseSpecifier: {
413767812b2f94f4b5e7d2596db1705ffa1149ddc45aDmitri Gribenko      const CXXBaseSpecifier *B = getCursorCXXBaseSpecifier(C);
41385595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko      return cxstring::createDup(B->getType().getAsString());
41397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
41407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_TypeRef: {
414167812b2f94f4b5e7d2596db1705ffa1149ddc45aDmitri Gribenko      const TypeDecl *Type = getCursorTypeRef(C).first;
41427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      assert(Type && "Missing type decl");
41437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
41445595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko      return cxstring::createDup(getCursorContext(C).getTypeDeclType(Type).
41457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                              getAsString());
41467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
41477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_TemplateRef: {
414867812b2f94f4b5e7d2596db1705ffa1149ddc45aDmitri Gribenko      const TemplateDecl *Template = getCursorTemplateRef(C).first;
41497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      assert(Template && "Missing template decl");
41507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
41515595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko      return cxstring::createDup(Template->getNameAsString());
41527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
41537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
41547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_NamespaceRef: {
415567812b2f94f4b5e7d2596db1705ffa1149ddc45aDmitri Gribenko      const NamedDecl *NS = getCursorNamespaceRef(C).first;
41567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      assert(NS && "Missing namespace decl");
41577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
41585595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko      return cxstring::createDup(NS->getNameAsString());
41597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
41607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
41617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_MemberRef: {
416267812b2f94f4b5e7d2596db1705ffa1149ddc45aDmitri Gribenko      const FieldDecl *Field = getCursorMemberRef(C).first;
41637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      assert(Field && "Missing member decl");
41647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
41655595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko      return cxstring::createDup(Field->getNameAsString());
41667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
41677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
41687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_LabelRef: {
416967812b2f94f4b5e7d2596db1705ffa1149ddc45aDmitri Gribenko      const LabelStmt *Label = getCursorLabelRef(C).first;
41707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      assert(Label && "Missing label");
41717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
41720c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef(Label->getName());
41737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
41747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
41757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_OverloadedDeclRef: {
41767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      OverloadedDeclRefStorage Storage = getCursorOverloadedDeclRef(C).first;
4177e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko      if (const Decl *D = Storage.dyn_cast<const Decl *>()) {
4178e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko        if (const NamedDecl *ND = dyn_cast<NamedDecl>(D))
41795595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko          return cxstring::createDup(ND->getNameAsString());
4180dc66adb40ee871b4c578ba615f45d82476c7119eDmitri Gribenko        return cxstring::createEmpty();
41817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      }
4182e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko      if (const OverloadExpr *E = Storage.dyn_cast<const OverloadExpr *>())
41835595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko        return cxstring::createDup(E->getName().getAsString());
41847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      OverloadedTemplateStorage *Ovl
41857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        = Storage.get<OverloadedTemplateStorage*>();
41867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (Ovl->size() == 0)
4187dc66adb40ee871b4c578ba615f45d82476c7119eDmitri Gribenko        return cxstring::createEmpty();
41885595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko      return cxstring::createDup((*Ovl->begin())->getNameAsString());
41897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
41907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
41917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_VariableRef: {
419267812b2f94f4b5e7d2596db1705ffa1149ddc45aDmitri Gribenko      const VarDecl *Var = getCursorVariableRef(C).first;
41937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      assert(Var && "Missing variable decl");
41947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
41955595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko      return cxstring::createDup(Var->getNameAsString());
41967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
41977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
41987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    default:
41990c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("<not implemented>");
42007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
42017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
42027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
42037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (clang_isExpression(C.kind)) {
4204651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    const Expr *E = getCursorExpr(C);
4205651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
4206651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (C.kind == CXCursor_ObjCStringLiteral ||
4207651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        C.kind == CXCursor_StringLiteral) {
4208651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      const StringLiteral *SLit;
4209651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      if (const ObjCStringLiteral *OSL = dyn_cast<ObjCStringLiteral>(E)) {
4210651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        SLit = OSL->getString();
4211651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      } else {
4212651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        SLit = cast<StringLiteral>(E);
4213651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      }
4214651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      SmallString<256> Buf;
4215651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      llvm::raw_svector_ostream OS(Buf);
4216651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      SLit->outputString(OS);
4217651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      return cxstring::createDup(OS.str());
4218651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    }
4219651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
4220e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko    const Decl *D = getDeclFromExpr(getCursorExpr(C));
42217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (D)
42227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return getDeclSpelling(D);
4223dc66adb40ee871b4c578ba615f45d82476c7119eDmitri Gribenko    return cxstring::createEmpty();
42247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
42257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
42267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (clang_isStatement(C.kind)) {
4227ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko    const Stmt *S = getCursorStmt(C);
4228ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko    if (const LabelStmt *Label = dyn_cast_or_null<LabelStmt>(S))
42290c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef(Label->getName());
42307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
4231dc66adb40ee871b4c578ba615f45d82476c7119eDmitri Gribenko    return cxstring::createEmpty();
42327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
42337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
42347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (C.kind == CXCursor_MacroExpansion)
42350c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko    return cxstring::createRef(getCursorMacroExpansion(C).getName()
42367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                                           ->getNameStart());
42377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
42387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (C.kind == CXCursor_MacroDefinition)
42390c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko    return cxstring::createRef(getCursorMacroDefinition(C)->getName()
42407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                                           ->getNameStart());
42417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
42427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (C.kind == CXCursor_InclusionDirective)
42435595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko    return cxstring::createDup(getCursorInclusionDirective(C)->getFileName());
42447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
42457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (clang_isDeclaration(C.kind))
42467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return getDeclSpelling(getCursorDecl(C));
42477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
42487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (C.kind == CXCursor_AnnotateAttr) {
42497d91438047450869d7b881e1c63868c4b52a3cc2Dmitri Gribenko    const AnnotateAttr *AA = cast<AnnotateAttr>(cxcursor::getCursorAttr(C));
42505595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko    return cxstring::createDup(AA->getAnnotation());
42517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
42527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
42537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (C.kind == CXCursor_AsmLabelAttr) {
42547d91438047450869d7b881e1c63868c4b52a3cc2Dmitri Gribenko    const AsmLabelAttr *AA = cast<AsmLabelAttr>(cxcursor::getCursorAttr(C));
42555595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko    return cxstring::createDup(AA->getLabel());
42567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
42577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
4258513371129c834c143a50c3ca09bb581b7f0f6344Argyrios Kyrtzidis  if (C.kind == CXCursor_PackedAttr) {
4259513371129c834c143a50c3ca09bb581b7f0f6344Argyrios Kyrtzidis    return cxstring::createRef("packed");
4260513371129c834c143a50c3ca09bb581b7f0f6344Argyrios Kyrtzidis  }
4261513371129c834c143a50c3ca09bb581b7f0f6344Argyrios Kyrtzidis
426287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  if (C.kind == CXCursor_VisibilityAttr) {
426387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    const VisibilityAttr *AA = cast<VisibilityAttr>(cxcursor::getCursorAttr(C));
426487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    switch (AA->getVisibility()) {
426587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    case VisibilityAttr::VisibilityType::Default:
426687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      return cxstring::createRef("default");
426787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    case VisibilityAttr::VisibilityType::Hidden:
426887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      return cxstring::createRef("hidden");
426987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    case VisibilityAttr::VisibilityType::Protected:
427087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      return cxstring::createRef("protected");
427187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    }
427287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    llvm_unreachable("unknown visibility type");
427387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
427487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
4275dc66adb40ee871b4c578ba615f45d82476c7119eDmitri Gribenko  return cxstring::createEmpty();
42767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
42777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
42787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXSourceRange clang_Cursor_getSpellingNameRange(CXCursor C,
42797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                                unsigned pieceIndex,
42807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                                unsigned options) {
42817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (clang_Cursor_isNull(C))
42827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return clang_getNullRange();
42837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
42847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  ASTContext &Ctx = getCursorContext(C);
42857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
42867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (clang_isStatement(C.kind)) {
4287ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko    const Stmt *S = getCursorStmt(C);
4288ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko    if (const LabelStmt *Label = dyn_cast_or_null<LabelStmt>(S)) {
42897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (pieceIndex > 0)
42907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        return clang_getNullRange();
42917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return cxloc::translateSourceRange(Ctx, Label->getIdentLoc());
42927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
42937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
42947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return clang_getNullRange();
42957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
42967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
42977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (C.kind == CXCursor_ObjCMessageExpr) {
4298ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko    if (const ObjCMessageExpr *
42997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          ME = dyn_cast_or_null<ObjCMessageExpr>(getCursorExpr(C))) {
43007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (pieceIndex >= ME->getNumSelectorLocs())
43017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        return clang_getNullRange();
43027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return cxloc::translateSourceRange(Ctx, ME->getSelectorLoc(pieceIndex));
43037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
43047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
43057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
43067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (C.kind == CXCursor_ObjCInstanceMethodDecl ||
43077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      C.kind == CXCursor_ObjCClassMethodDecl) {
4308e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko    if (const ObjCMethodDecl *
43097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          MD = dyn_cast_or_null<ObjCMethodDecl>(getCursorDecl(C))) {
43107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (pieceIndex >= MD->getNumSelectorLocs())
43117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        return clang_getNullRange();
43127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return cxloc::translateSourceRange(Ctx, MD->getSelectorLoc(pieceIndex));
43137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
43147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
43157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
43167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (C.kind == CXCursor_ObjCCategoryDecl ||
43177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      C.kind == CXCursor_ObjCCategoryImplDecl) {
43187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (pieceIndex > 0)
43197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return clang_getNullRange();
4320e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko    if (const ObjCCategoryDecl *
43217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          CD = dyn_cast_or_null<ObjCCategoryDecl>(getCursorDecl(C)))
43227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return cxloc::translateSourceRange(Ctx, CD->getCategoryNameLoc());
4323e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko    if (const ObjCCategoryImplDecl *
43247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          CID = dyn_cast_or_null<ObjCCategoryImplDecl>(getCursorDecl(C)))
43257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return cxloc::translateSourceRange(Ctx, CID->getCategoryNameLoc());
43267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
43277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
43287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (C.kind == CXCursor_ModuleImportDecl) {
43297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (pieceIndex > 0)
43307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return clang_getNullRange();
4331e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko    if (const ImportDecl *ImportD =
4332e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko            dyn_cast_or_null<ImportDecl>(getCursorDecl(C))) {
43337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      ArrayRef<SourceLocation> Locs = ImportD->getIdentifierLocs();
43347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (!Locs.empty())
43357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        return cxloc::translateSourceRange(Ctx,
43367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                         SourceRange(Locs.front(), Locs.back()));
43377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
43387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return clang_getNullRange();
43397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
43407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
4341176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  if (C.kind == CXCursor_CXXMethod || C.kind == CXCursor_Destructor ||
4342176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      C.kind == CXCursor_ConversionFunction) {
4343176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    if (pieceIndex > 0)
4344176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      return clang_getNullRange();
4345176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    if (const FunctionDecl *FD =
4346176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines            dyn_cast_or_null<FunctionDecl>(getCursorDecl(C))) {
4347176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      DeclarationNameInfo FunctionName = FD->getNameInfo();
4348176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      return cxloc::translateSourceRange(Ctx, FunctionName.getSourceRange());
4349176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
4350176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    return clang_getNullRange();
4351176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
4352176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
43537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // FIXME: A CXCursor_InclusionDirective should give the location of the
43547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // filename, but we don't keep track of this.
43557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
43567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // FIXME: A CXCursor_AnnotateAttr should give the location of the annotation
43577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // but we don't keep track of this.
43587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
43597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // FIXME: A CXCursor_AsmLabelAttr should give the location of the label
43607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // but we don't keep track of this.
43617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
43627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Default handling, give the location of the cursor.
43637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
43647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (pieceIndex > 0)
43657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return clang_getNullRange();
43667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
43677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  CXSourceLocation CXLoc = clang_getCursorLocation(C);
43687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  SourceLocation Loc = cxloc::translateSourceLocation(CXLoc);
43697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return cxloc::translateSourceRange(Ctx, Loc);
43707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
43717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
4372176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesCXString clang_Cursor_getMangling(CXCursor C) {
4373176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  if (clang_isInvalid(C.kind) || !clang_isDeclaration(C.kind))
4374176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    return cxstring::createEmpty();
4375176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
4376176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // Mangling only works for functions and variables.
4377176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  const Decl *D = getCursorDecl(C);
4378176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  if (!D || !(isa<FunctionDecl>(D) || isa<VarDecl>(D)))
4379176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    return cxstring::createEmpty();
4380176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
43814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ASTContext &Ctx = D->getASTContext();
43824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  index::CodegenNameGenerator CGNameGen(Ctx);
43834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  return cxstring::createDup(CGNameGen.getName(D));
4384176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
4385176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
438687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga NainarCXStringSet *clang_Cursor_getCXXManglings(CXCursor C) {
438787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  if (clang_isInvalid(C.kind) || !clang_isDeclaration(C.kind))
438887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return nullptr;
438987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
439087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  const Decl *D = getCursorDecl(C);
439187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  if (!(isa<CXXRecordDecl>(D) || isa<CXXMethodDecl>(D)))
439287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return nullptr;
439387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
43944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ASTContext &Ctx = D->getASTContext();
43954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  index::CodegenNameGenerator CGNameGen(Ctx);
43964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::vector<std::string> Manglings = CGNameGen.getAllManglings(D);
439787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return cxstring::createSet(Manglings);
439887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
439987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
44007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXString clang_getCursorDisplayName(CXCursor C) {
44017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!clang_isDeclaration(C.kind))
44027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return clang_getCursorSpelling(C);
44037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
4404e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko  const Decl *D = getCursorDecl(C);
44057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!D)
4406dc66adb40ee871b4c578ba615f45d82476c7119eDmitri Gribenko    return cxstring::createEmpty();
44077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
44087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  PrintingPolicy Policy = getCursorContext(C).getPrintingPolicy();
4409e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko  if (const FunctionTemplateDecl *FunTmpl = dyn_cast<FunctionTemplateDecl>(D))
44107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    D = FunTmpl->getTemplatedDecl();
44117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
4412e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko  if (const FunctionDecl *Function = dyn_cast<FunctionDecl>(D)) {
44137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    SmallString<64> Str;
44147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    llvm::raw_svector_ostream OS(Str);
44157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    OS << *Function;
44167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (Function->getPrimaryTemplate())
44177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      OS << "<>";
44187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    OS << "(";
44197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    for (unsigned I = 0, N = Function->getNumParams(); I != N; ++I) {
44207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (I)
44217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        OS << ", ";
44227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      OS << Function->getParamDecl(I)->getType().getAsString(Policy);
44237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
44247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
44257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (Function->isVariadic()) {
44267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (Function->getNumParams())
44277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        OS << ", ";
44287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      OS << "...";
44297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
44307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    OS << ")";
44315595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko    return cxstring::createDup(OS.str());
44327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
44337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
4434e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko  if (const ClassTemplateDecl *ClassTemplate = dyn_cast<ClassTemplateDecl>(D)) {
44357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    SmallString<64> Str;
44367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    llvm::raw_svector_ostream OS(Str);
44377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    OS << *ClassTemplate;
44387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    OS << "<";
44397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    TemplateParameterList *Params = ClassTemplate->getTemplateParameters();
44407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    for (unsigned I = 0, N = Params->size(); I != N; ++I) {
44417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (I)
44427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        OS << ", ";
44437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
44447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      NamedDecl *Param = Params->getParam(I);
44457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (Param->getIdentifier()) {
44467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        OS << Param->getIdentifier()->getName();
44477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        continue;
44487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      }
44497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
44507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // There is no parameter name, which makes this tricky. Try to come up
44517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // with something useful that isn't too long.
44527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(Param))
44537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        OS << (TTP->wasDeclaredWithTypename()? "typename" : "class");
44547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      else if (NonTypeTemplateParmDecl *NTTP
44557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                    = dyn_cast<NonTypeTemplateParmDecl>(Param))
44567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        OS << NTTP->getType().getAsString(Policy);
44577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      else
44587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        OS << "template<...> class";
44597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
44607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
44617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    OS << ">";
44625595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko    return cxstring::createDup(OS.str());
44637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
44647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
4465e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko  if (const ClassTemplateSpecializationDecl *ClassSpec
44667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                              = dyn_cast<ClassTemplateSpecializationDecl>(D)) {
44677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // If the type was explicitly written, use that.
44687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (TypeSourceInfo *TSInfo = ClassSpec->getTypeAsWritten())
44695595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko      return cxstring::createDup(TSInfo->getType().getAsString(Policy));
44707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
44715eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer    SmallString<128> Str;
44727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    llvm::raw_svector_ostream OS(Str);
44737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    OS << *ClassSpec;
44744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    TemplateSpecializationType::PrintTemplateArgumentList(
44754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        OS, ClassSpec->getTemplateArgs().asArray(), Policy);
44765595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko    return cxstring::createDup(OS.str());
44777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
44787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
44797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return clang_getCursorSpelling(C);
44807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
44817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
44827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXString clang_getCursorKindSpelling(enum CXCursorKind Kind) {
44837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  switch (Kind) {
44847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_FunctionDecl:
44850c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("FunctionDecl");
44867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_TypedefDecl:
44870c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("TypedefDecl");
44887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_EnumDecl:
44890c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("EnumDecl");
44907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_EnumConstantDecl:
44910c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("EnumConstantDecl");
44927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_StructDecl:
44930c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("StructDecl");
44947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_UnionDecl:
44950c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("UnionDecl");
44967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_ClassDecl:
44970c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("ClassDecl");
44987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_FieldDecl:
44990c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("FieldDecl");
45007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_VarDecl:
45010c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("VarDecl");
45027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_ParmDecl:
45030c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("ParmDecl");
45047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_ObjCInterfaceDecl:
45050c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("ObjCInterfaceDecl");
45067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_ObjCCategoryDecl:
45070c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("ObjCCategoryDecl");
45087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_ObjCProtocolDecl:
45090c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("ObjCProtocolDecl");
45107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_ObjCPropertyDecl:
45110c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("ObjCPropertyDecl");
45127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_ObjCIvarDecl:
45130c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("ObjCIvarDecl");
45147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_ObjCInstanceMethodDecl:
45150c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("ObjCInstanceMethodDecl");
45167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_ObjCClassMethodDecl:
45170c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("ObjCClassMethodDecl");
45187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_ObjCImplementationDecl:
45190c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("ObjCImplementationDecl");
45207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_ObjCCategoryImplDecl:
45210c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("ObjCCategoryImplDecl");
45227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_CXXMethod:
45230c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("CXXMethod");
45247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_UnexposedDecl:
45250c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("UnexposedDecl");
45267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_ObjCSuperClassRef:
45270c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("ObjCSuperClassRef");
45287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_ObjCProtocolRef:
45290c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("ObjCProtocolRef");
45307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_ObjCClassRef:
45310c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("ObjCClassRef");
45327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_TypeRef:
45330c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("TypeRef");
45347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_TemplateRef:
45350c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("TemplateRef");
45367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_NamespaceRef:
45370c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko    return cxstring::createRef("NamespaceRef");
45387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_MemberRef:
45390c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko    return cxstring::createRef("MemberRef");
45407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_LabelRef:
45410c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko    return cxstring::createRef("LabelRef");
45427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_OverloadedDeclRef:
45430c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko    return cxstring::createRef("OverloadedDeclRef");
45447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_VariableRef:
45450c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko    return cxstring::createRef("VariableRef");
45467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_IntegerLiteral:
45470c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("IntegerLiteral");
45487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_FloatingLiteral:
45490c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("FloatingLiteral");
45507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_ImaginaryLiteral:
45510c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("ImaginaryLiteral");
45527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_StringLiteral:
45530c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("StringLiteral");
45547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_CharacterLiteral:
45550c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("CharacterLiteral");
45567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_ParenExpr:
45570c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("ParenExpr");
45587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_UnaryOperator:
45590c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("UnaryOperator");
45607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_ArraySubscriptExpr:
45610c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("ArraySubscriptExpr");
456287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  case CXCursor_OMPArraySectionExpr:
456387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      return cxstring::createRef("OMPArraySectionExpr");
45647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_BinaryOperator:
45650c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("BinaryOperator");
45667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_CompoundAssignOperator:
45670c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("CompoundAssignOperator");
45687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_ConditionalOperator:
45690c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("ConditionalOperator");
45707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_CStyleCastExpr:
45710c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("CStyleCastExpr");
45727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_CompoundLiteralExpr:
45730c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("CompoundLiteralExpr");
45747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_InitListExpr:
45750c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("InitListExpr");
45767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_AddrLabelExpr:
45770c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("AddrLabelExpr");
45787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_StmtExpr:
45790c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("StmtExpr");
45807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_GenericSelectionExpr:
45810c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("GenericSelectionExpr");
45827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_GNUNullExpr:
45830c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("GNUNullExpr");
45847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_CXXStaticCastExpr:
45850c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("CXXStaticCastExpr");
45867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_CXXDynamicCastExpr:
45870c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("CXXDynamicCastExpr");
45887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_CXXReinterpretCastExpr:
45890c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("CXXReinterpretCastExpr");
45907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_CXXConstCastExpr:
45910c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("CXXConstCastExpr");
45927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_CXXFunctionalCastExpr:
45930c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("CXXFunctionalCastExpr");
45947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_CXXTypeidExpr:
45950c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("CXXTypeidExpr");
45967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_CXXBoolLiteralExpr:
45970c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("CXXBoolLiteralExpr");
45987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_CXXNullPtrLiteralExpr:
45990c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("CXXNullPtrLiteralExpr");
46007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_CXXThisExpr:
46010c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("CXXThisExpr");
46027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_CXXThrowExpr:
46030c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("CXXThrowExpr");
46047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_CXXNewExpr:
46050c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("CXXNewExpr");
46067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_CXXDeleteExpr:
46070c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("CXXDeleteExpr");
46087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_UnaryExpr:
46090c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("UnaryExpr");
46107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_ObjCStringLiteral:
46110c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("ObjCStringLiteral");
46127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_ObjCBoolLiteralExpr:
46130c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("ObjCBoolLiteralExpr");
4614edab047e10d745a65d12c8cb36be2ba9e96c9e0eArgyrios Kyrtzidis  case CXCursor_ObjCSelfExpr:
4615edab047e10d745a65d12c8cb36be2ba9e96c9e0eArgyrios Kyrtzidis      return cxstring::createRef("ObjCSelfExpr");
46167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_ObjCEncodeExpr:
46170c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("ObjCEncodeExpr");
46187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_ObjCSelectorExpr:
46190c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("ObjCSelectorExpr");
46207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_ObjCProtocolExpr:
46210c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("ObjCProtocolExpr");
46227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_ObjCBridgedCastExpr:
46230c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("ObjCBridgedCastExpr");
46247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_BlockExpr:
46250c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("BlockExpr");
46267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_PackExpansionExpr:
46270c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("PackExpansionExpr");
46287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_SizeOfPackExpr:
46290c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("SizeOfPackExpr");
46307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_LambdaExpr:
46310c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko    return cxstring::createRef("LambdaExpr");
46327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_UnexposedExpr:
46330c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("UnexposedExpr");
46347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_DeclRefExpr:
46350c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("DeclRefExpr");
46367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_MemberRefExpr:
46370c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("MemberRefExpr");
46387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_CallExpr:
46390c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("CallExpr");
46407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_ObjCMessageExpr:
46410c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("ObjCMessageExpr");
46427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_UnexposedStmt:
46430c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("UnexposedStmt");
46447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_DeclStmt:
46450c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("DeclStmt");
46467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_LabelStmt:
46470c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("LabelStmt");
46487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_CompoundStmt:
46490c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("CompoundStmt");
46507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_CaseStmt:
46510c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("CaseStmt");
46527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_DefaultStmt:
46530c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("DefaultStmt");
46547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_IfStmt:
46550c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("IfStmt");
46567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_SwitchStmt:
46570c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("SwitchStmt");
46587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_WhileStmt:
46590c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("WhileStmt");
46607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_DoStmt:
46610c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("DoStmt");
46627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_ForStmt:
46630c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("ForStmt");
46647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_GotoStmt:
46650c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("GotoStmt");
46667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_IndirectGotoStmt:
46670c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("IndirectGotoStmt");
46687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_ContinueStmt:
46690c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("ContinueStmt");
46707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_BreakStmt:
46710c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("BreakStmt");
46727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_ReturnStmt:
46730c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("ReturnStmt");
46747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_GCCAsmStmt:
46750c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("GCCAsmStmt");
46767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_MSAsmStmt:
46770c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("MSAsmStmt");
46787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_ObjCAtTryStmt:
46790c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("ObjCAtTryStmt");
46807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_ObjCAtCatchStmt:
46810c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("ObjCAtCatchStmt");
46827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_ObjCAtFinallyStmt:
46830c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("ObjCAtFinallyStmt");
46847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_ObjCAtThrowStmt:
46850c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("ObjCAtThrowStmt");
46867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_ObjCAtSynchronizedStmt:
46870c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("ObjCAtSynchronizedStmt");
46887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_ObjCAutoreleasePoolStmt:
46890c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("ObjCAutoreleasePoolStmt");
46907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_ObjCForCollectionStmt:
46910c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("ObjCForCollectionStmt");
46927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_CXXCatchStmt:
46930c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("CXXCatchStmt");
46947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_CXXTryStmt:
46950c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("CXXTryStmt");
46967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_CXXForRangeStmt:
46970c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("CXXForRangeStmt");
46987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_SEHTryStmt:
46990c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("SEHTryStmt");
47007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_SEHExceptStmt:
47010c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("SEHExceptStmt");
47027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_SEHFinallyStmt:
47030c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("SEHFinallyStmt");
4704c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  case CXCursor_SEHLeaveStmt:
4705c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines      return cxstring::createRef("SEHLeaveStmt");
47067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_NullStmt:
47070c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("NullStmt");
47087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_InvalidFile:
47090c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("InvalidFile");
47107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_InvalidCode:
47110c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko    return cxstring::createRef("InvalidCode");
47127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_NoDeclFound:
47130c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("NoDeclFound");
47147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_NotImplemented:
47150c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("NotImplemented");
47167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_TranslationUnit:
47170c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("TranslationUnit");
47187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_UnexposedAttr:
47190c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("UnexposedAttr");
47207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_IBActionAttr:
47210c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("attribute(ibaction)");
47227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_IBOutletAttr:
47230c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko     return cxstring::createRef("attribute(iboutlet)");
47247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_IBOutletCollectionAttr:
47250c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("attribute(iboutletcollection)");
47267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_CXXFinalAttr:
47270c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("attribute(final)");
47287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_CXXOverrideAttr:
47290c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko      return cxstring::createRef("attribute(override)");
47307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_AnnotateAttr:
47310c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko    return cxstring::createRef("attribute(annotate)");
47327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_AsmLabelAttr:
47330c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko    return cxstring::createRef("asm label");
4734513371129c834c143a50c3ca09bb581b7f0f6344Argyrios Kyrtzidis  case CXCursor_PackedAttr:
4735513371129c834c143a50c3ca09bb581b7f0f6344Argyrios Kyrtzidis    return cxstring::createRef("attribute(packed)");
47366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  case CXCursor_PureAttr:
47376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    return cxstring::createRef("attribute(pure)");
47386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  case CXCursor_ConstAttr:
47396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    return cxstring::createRef("attribute(const)");
47406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  case CXCursor_NoDuplicateAttr:
47416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    return cxstring::createRef("attribute(noduplicate)");
4742c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  case CXCursor_CUDAConstantAttr:
4743c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    return cxstring::createRef("attribute(constant)");
4744c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  case CXCursor_CUDADeviceAttr:
4745c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    return cxstring::createRef("attribute(device)");
4746c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  case CXCursor_CUDAGlobalAttr:
4747c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    return cxstring::createRef("attribute(global)");
4748c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  case CXCursor_CUDAHostAttr:
4749c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    return cxstring::createRef("attribute(host)");
4750176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  case CXCursor_CUDASharedAttr:
4751176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    return cxstring::createRef("attribute(shared)");
475287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  case CXCursor_VisibilityAttr:
475387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return cxstring::createRef("attribute(visibility)");
475487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  case CXCursor_DLLExport:
475587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return cxstring::createRef("attribute(dllexport)");
475687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  case CXCursor_DLLImport:
475787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return cxstring::createRef("attribute(dllimport)");
47587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_PreprocessingDirective:
47590c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko    return cxstring::createRef("preprocessing directive");
47607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_MacroDefinition:
47610c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko    return cxstring::createRef("macro definition");
47627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_MacroExpansion:
47630c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko    return cxstring::createRef("macro expansion");
47647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_InclusionDirective:
47650c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko    return cxstring::createRef("inclusion directive");
47667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_Namespace:
47670c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko    return cxstring::createRef("Namespace");
47687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_LinkageSpec:
47690c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko    return cxstring::createRef("LinkageSpec");
47707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_CXXBaseSpecifier:
47710c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko    return cxstring::createRef("C++ base class specifier");
47727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_Constructor:
47730c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko    return cxstring::createRef("CXXConstructor");
47747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_Destructor:
47750c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko    return cxstring::createRef("CXXDestructor");
47767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_ConversionFunction:
47770c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko    return cxstring::createRef("CXXConversion");
47787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_TemplateTypeParameter:
47790c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko    return cxstring::createRef("TemplateTypeParameter");
47807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_NonTypeTemplateParameter:
47810c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko    return cxstring::createRef("NonTypeTemplateParameter");
47827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_TemplateTemplateParameter:
47830c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko    return cxstring::createRef("TemplateTemplateParameter");
47847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_FunctionTemplate:
47850c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko    return cxstring::createRef("FunctionTemplate");
47867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_ClassTemplate:
47870c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko    return cxstring::createRef("ClassTemplate");
47887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_ClassTemplatePartialSpecialization:
47890c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko    return cxstring::createRef("ClassTemplatePartialSpecialization");
47907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_NamespaceAlias:
47910c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko    return cxstring::createRef("NamespaceAlias");
47927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_UsingDirective:
47930c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko    return cxstring::createRef("UsingDirective");
47947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_UsingDeclaration:
47950c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko    return cxstring::createRef("UsingDeclaration");
47967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_TypeAliasDecl:
47970c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko    return cxstring::createRef("TypeAliasDecl");
47987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_ObjCSynthesizeDecl:
47990c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko    return cxstring::createRef("ObjCSynthesizeDecl");
48007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_ObjCDynamicDecl:
48010c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko    return cxstring::createRef("ObjCDynamicDecl");
48027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_CXXAccessSpecifier:
48030c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko    return cxstring::createRef("CXXAccessSpecifier");
48047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_ModuleImportDecl:
48050c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko    return cxstring::createRef("ModuleImport");
48064fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  case CXCursor_OMPParallelDirective:
4807651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return cxstring::createRef("OMPParallelDirective");
4808651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  case CXCursor_OMPSimdDirective:
4809651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return cxstring::createRef("OMPSimdDirective");
4810c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  case CXCursor_OMPForDirective:
4811c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    return cxstring::createRef("OMPForDirective");
4812176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  case CXCursor_OMPForSimdDirective:
4813176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    return cxstring::createRef("OMPForSimdDirective");
4814c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  case CXCursor_OMPSectionsDirective:
4815c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    return cxstring::createRef("OMPSectionsDirective");
4816c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  case CXCursor_OMPSectionDirective:
4817c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    return cxstring::createRef("OMPSectionDirective");
4818c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  case CXCursor_OMPSingleDirective:
4819c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    return cxstring::createRef("OMPSingleDirective");
4820176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  case CXCursor_OMPMasterDirective:
4821176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    return cxstring::createRef("OMPMasterDirective");
4822176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  case CXCursor_OMPCriticalDirective:
4823176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    return cxstring::createRef("OMPCriticalDirective");
4824c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  case CXCursor_OMPParallelForDirective:
4825c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    return cxstring::createRef("OMPParallelForDirective");
4826176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  case CXCursor_OMPParallelForSimdDirective:
4827176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    return cxstring::createRef("OMPParallelForSimdDirective");
4828c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  case CXCursor_OMPParallelSectionsDirective:
4829c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    return cxstring::createRef("OMPParallelSectionsDirective");
4830176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  case CXCursor_OMPTaskDirective:
4831176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    return cxstring::createRef("OMPTaskDirective");
4832176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  case CXCursor_OMPTaskyieldDirective:
4833176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    return cxstring::createRef("OMPTaskyieldDirective");
4834176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  case CXCursor_OMPBarrierDirective:
4835176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    return cxstring::createRef("OMPBarrierDirective");
4836176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  case CXCursor_OMPTaskwaitDirective:
4837176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    return cxstring::createRef("OMPTaskwaitDirective");
483887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  case CXCursor_OMPTaskgroupDirective:
483987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return cxstring::createRef("OMPTaskgroupDirective");
4840176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  case CXCursor_OMPFlushDirective:
4841176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    return cxstring::createRef("OMPFlushDirective");
4842176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  case CXCursor_OMPOrderedDirective:
4843176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    return cxstring::createRef("OMPOrderedDirective");
4844176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  case CXCursor_OMPAtomicDirective:
4845176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    return cxstring::createRef("OMPAtomicDirective");
4846176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  case CXCursor_OMPTargetDirective:
4847176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    return cxstring::createRef("OMPTargetDirective");
484887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  case CXCursor_OMPTargetDataDirective:
484987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return cxstring::createRef("OMPTargetDataDirective");
48504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  case CXCursor_OMPTargetEnterDataDirective:
48514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return cxstring::createRef("OMPTargetEnterDataDirective");
48524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  case CXCursor_OMPTargetExitDataDirective:
48534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return cxstring::createRef("OMPTargetExitDataDirective");
48544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  case CXCursor_OMPTargetParallelDirective:
48554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return cxstring::createRef("OMPTargetParallelDirective");
48564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  case CXCursor_OMPTargetParallelForDirective:
48574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return cxstring::createRef("OMPTargetParallelForDirective");
48584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  case CXCursor_OMPTargetUpdateDirective:
48594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return cxstring::createRef("OMPTargetUpdateDirective");
4860176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  case CXCursor_OMPTeamsDirective:
4861176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    return cxstring::createRef("OMPTeamsDirective");
486287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  case CXCursor_OMPCancellationPointDirective:
486387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return cxstring::createRef("OMPCancellationPointDirective");
486487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  case CXCursor_OMPCancelDirective:
486587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return cxstring::createRef("OMPCancelDirective");
486687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  case CXCursor_OMPTaskLoopDirective:
486787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return cxstring::createRef("OMPTaskLoopDirective");
486887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  case CXCursor_OMPTaskLoopSimdDirective:
486987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return cxstring::createRef("OMPTaskLoopSimdDirective");
487087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  case CXCursor_OMPDistributeDirective:
487187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return cxstring::createRef("OMPDistributeDirective");
48724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  case CXCursor_OMPDistributeParallelForDirective:
48734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return cxstring::createRef("OMPDistributeParallelForDirective");
48744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  case CXCursor_OMPDistributeParallelForSimdDirective:
48754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return cxstring::createRef("OMPDistributeParallelForSimdDirective");
48764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  case CXCursor_OMPDistributeSimdDirective:
48774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return cxstring::createRef("OMPDistributeSimdDirective");
48784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  case CXCursor_OMPTargetParallelForSimdDirective:
48794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return cxstring::createRef("OMPTargetParallelForSimdDirective");
48800e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  case CXCursor_OverloadCandidate:
48810e2c34f92f00628d48968dfea096d36381f494cbStephen Hines      return cxstring::createRef("OverloadCandidate");
488287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  case CXCursor_TypeAliasTemplateDecl:
488387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      return cxstring::createRef("TypeAliasTemplateDecl");
48844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  case CXCursor_StaticAssert:
48854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      return cxstring::createRef("StaticAssert");
48867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
48877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
48887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  llvm_unreachable("Unhandled CXCursorKind");
48897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
48907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
48917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistruct GetCursorData {
48927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  SourceLocation TokenBeginLoc;
48937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  bool PointsAtMacroArgExpansion;
48947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  bool VisitedObjCPropertyImplDecl;
48957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  SourceLocation VisitedDeclaratorDeclStartLoc;
48967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  CXCursor &BestCursor;
48977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
48987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  GetCursorData(SourceManager &SM,
48997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                SourceLocation tokenBegin, CXCursor &outputCursor)
49007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    : TokenBeginLoc(tokenBegin), BestCursor(outputCursor) {
49017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    PointsAtMacroArgExpansion = SM.isMacroArgExpansion(tokenBegin);
49027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    VisitedObjCPropertyImplDecl = false;
49037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
49047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei};
49057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
49067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic enum CXChildVisitResult GetCursorVisitor(CXCursor cursor,
49077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                                CXCursor parent,
49087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                                CXClientData client_data) {
49097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  GetCursorData *Data = static_cast<GetCursorData *>(client_data);
49107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  CXCursor *BestCursor = &Data->BestCursor;
49117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
49127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // If we point inside a macro argument we should provide info of what the
49137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // token is so use the actual cursor, don't replace it with a macro expansion
49147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // cursor.
49157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (cursor.kind == CXCursor_MacroExpansion && Data->PointsAtMacroArgExpansion)
49167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return CXChildVisit_Recurse;
49177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
49187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (clang_isDeclaration(cursor.kind)) {
49197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // Avoid having the implicit methods override the property decls.
4920e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko    if (const ObjCMethodDecl *MD
49217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          = dyn_cast_or_null<ObjCMethodDecl>(getCursorDecl(cursor))) {
49227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (MD->isImplicit())
49237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        return CXChildVisit_Break;
49247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
4925e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko    } else if (const ObjCInterfaceDecl *ID
49267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                 = dyn_cast_or_null<ObjCInterfaceDecl>(getCursorDecl(cursor))) {
49277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // Check that when we have multiple @class references in the same line,
49287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // that later ones do not override the previous ones.
49297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // If we have:
49307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // @class Foo, Bar;
49317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // source ranges for both start at '@', so 'Bar' will end up overriding
49327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // 'Foo' even though the cursor location was at 'Foo'.
49337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (BestCursor->kind == CXCursor_ObjCInterfaceDecl ||
49347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          BestCursor->kind == CXCursor_ObjCClassRef)
4935e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko        if (const ObjCInterfaceDecl *PrevID
49367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei             = dyn_cast_or_null<ObjCInterfaceDecl>(getCursorDecl(*BestCursor))){
49377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei         if (PrevID != ID &&
49387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei             !PrevID->isThisDeclarationADefinition() &&
49397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei             !ID->isThisDeclarationADefinition())
49407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei           return CXChildVisit_Break;
49417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        }
49427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
4943e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko    } else if (const DeclaratorDecl *DD
49447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                    = dyn_cast_or_null<DeclaratorDecl>(getCursorDecl(cursor))) {
49457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      SourceLocation StartLoc = DD->getSourceRange().getBegin();
49467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // Check that when we have multiple declarators in the same line,
49477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // that later ones do not override the previous ones.
49487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // If we have:
49497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // int Foo, Bar;
49507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // source ranges for both start at 'int', so 'Bar' will end up overriding
49517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // 'Foo' even though the cursor location was at 'Foo'.
49527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (Data->VisitedDeclaratorDeclStartLoc == StartLoc)
49537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        return CXChildVisit_Break;
49547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      Data->VisitedDeclaratorDeclStartLoc = StartLoc;
49557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
4956e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko    } else if (const ObjCPropertyImplDecl *PropImp
49577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei              = dyn_cast_or_null<ObjCPropertyImplDecl>(getCursorDecl(cursor))) {
49587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      (void)PropImp;
49597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // Check that when we have multiple @synthesize in the same line,
49607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // that later ones do not override the previous ones.
49617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // If we have:
49627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // @synthesize Foo, Bar;
49637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // source ranges for both start at '@', so 'Bar' will end up overriding
49647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // 'Foo' even though the cursor location was at 'Foo'.
49657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (Data->VisitedObjCPropertyImplDecl)
49667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        return CXChildVisit_Break;
49677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      Data->VisitedObjCPropertyImplDecl = true;
49687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
49697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
49707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
49717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (clang_isExpression(cursor.kind) &&
49727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      clang_isDeclaration(BestCursor->kind)) {
4973e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko    if (const Decl *D = getCursorDecl(*BestCursor)) {
49747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // Avoid having the cursor of an expression replace the declaration cursor
49757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // when the expression source range overlaps the declaration range.
49767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // This can happen for C++ constructor expressions whose range generally
49777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // include the variable declaration, e.g.:
49787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      //  MyCXXClass foo; // Make sure pointing at 'foo' returns a VarDecl cursor.
49797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (D->getLocation().isValid() && Data->TokenBeginLoc.isValid() &&
49807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          D->getLocation() == Data->TokenBeginLoc)
49817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        return CXChildVisit_Break;
49827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
49837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
49847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
49857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // If our current best cursor is the construction of a temporary object,
49867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // don't replace that cursor with a type reference, because we want
49877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // clang_getCursor() to point at the constructor.
49887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (clang_isExpression(BestCursor->kind) &&
49897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      isa<CXXTemporaryObjectExpr>(getCursorExpr(*BestCursor)) &&
49907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      cursor.kind == CXCursor_TypeRef) {
49917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // Keep the cursor pointing at CXXTemporaryObjectExpr but also mark it
49927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // as having the actual point on the type reference.
49937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    *BestCursor = getTypeRefedCallExprCursor(*BestCursor);
49947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return CXChildVisit_Recurse;
49957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
499687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
499787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // If we already have an Objective-C superclass reference, don't
499887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // update it further.
499987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  if (BestCursor->kind == CXCursor_ObjCSuperClassRef)
500087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return CXChildVisit_Break;
500187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
50027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  *BestCursor = cursor;
50037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return CXChildVisit_Recurse;
50047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
50057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
50067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXCursor clang_getCursor(CXTranslationUnit TU, CXSourceLocation Loc) {
5007651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (isNotUsableTU(TU)) {
5008651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    LOG_BAD_TU(TU);
50097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return clang_getNullCursor();
5010651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
50117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
50125694feb5ccd6eb862cb600b55753cecc13794471Dmitri Gribenko  ASTUnit *CXXUnit = cxtu::getASTUnit(TU);
50137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  ASTUnit::ConcurrencyCheck Check(*CXXUnit);
50147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
50157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  SourceLocation SLoc = cxloc::translateSourceLocation(Loc);
50167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  CXCursor Result = cxcursor::getCursor(TU, SLoc);
50177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
5018c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  LOG_FUNC_SECTION {
50197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    CXFile SearchFile;
50207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    unsigned SearchLine, SearchColumn;
50217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    CXFile ResultFile;
50227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    unsigned ResultLine, ResultColumn;
50237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    CXString SearchFileName, ResultFileName, KindSpelling, USR;
50247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    const char *IsDef = clang_isCursorDefinition(Result)? " (Definition)" : "";
50257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    CXSourceLocation ResultLoc = clang_getCursorLocation(Result);
5026c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
5027c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    clang_getFileLocation(Loc, &SearchFile, &SearchLine, &SearchColumn,
5028c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines                          nullptr);
5029c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis    clang_getFileLocation(ResultLoc, &ResultFile, &ResultLine,
5030c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines                          &ResultColumn, nullptr);
50317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    SearchFileName = clang_getFileName(SearchFile);
50327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    ResultFileName = clang_getFileName(ResultFile);
50337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    KindSpelling = clang_getCursorKindSpelling(Result.kind);
50347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    USR = clang_getCursorUSR(Result);
5035c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis    *Log << llvm::format("(%s:%d:%d) = %s",
5036c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis                   clang_getCString(SearchFileName), SearchLine, SearchColumn,
5037c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis                   clang_getCString(KindSpelling))
5038c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis        << llvm::format("(%s:%d:%d):%s%s",
5039c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis                     clang_getCString(ResultFileName), ResultLine, ResultColumn,
5040c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis                     clang_getCString(USR), IsDef);
50417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    clang_disposeString(SearchFileName);
50427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    clang_disposeString(ResultFileName);
50437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    clang_disposeString(KindSpelling);
50447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    clang_disposeString(USR);
50457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
50467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    CXCursor Definition = clang_getCursorDefinition(Result);
50477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (!clang_equalCursors(Definition, clang_getNullCursor())) {
50487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      CXSourceLocation DefinitionLoc = clang_getCursorLocation(Definition);
50497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      CXString DefinitionKindSpelling
50507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                = clang_getCursorKindSpelling(Definition.kind);
50517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      CXFile DefinitionFile;
50527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      unsigned DefinitionLine, DefinitionColumn;
5053c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis      clang_getFileLocation(DefinitionLoc, &DefinitionFile,
5054c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines                            &DefinitionLine, &DefinitionColumn, nullptr);
50557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      CXString DefinitionFileName = clang_getFileName(DefinitionFile);
5056c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis      *Log << llvm::format("  -> %s(%s:%d:%d)",
5057c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis                     clang_getCString(DefinitionKindSpelling),
5058c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis                     clang_getCString(DefinitionFileName),
5059c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis                     DefinitionLine, DefinitionColumn);
50607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      clang_disposeString(DefinitionFileName);
50617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      clang_disposeString(DefinitionKindSpelling);
50627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
50637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
50647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
50657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return Result;
50667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
50677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
50687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXCursor clang_getNullCursor(void) {
50697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return MakeCXCursorInvalid(CXCursor_InvalidFile);
50707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
50717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
50727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiunsigned clang_equalCursors(CXCursor X, CXCursor Y) {
5073d1d9df688baf384f1ca1220e51104c3b30d6a81aArgyrios Kyrtzidis  // Clear out the "FirstInDeclGroup" part in a declaration cursor, since we
5074d1d9df688baf384f1ca1220e51104c3b30d6a81aArgyrios Kyrtzidis  // can't set consistently. For example, when visiting a DeclStmt we will set
5075d1d9df688baf384f1ca1220e51104c3b30d6a81aArgyrios Kyrtzidis  // it but we don't set it on the result of clang_getCursorDefinition for
5076d1d9df688baf384f1ca1220e51104c3b30d6a81aArgyrios Kyrtzidis  // a reference of the same declaration.
5077d1d9df688baf384f1ca1220e51104c3b30d6a81aArgyrios Kyrtzidis  // FIXME: Setting "FirstInDeclGroup" in CXCursors is a hack that only works
5078d1d9df688baf384f1ca1220e51104c3b30d6a81aArgyrios Kyrtzidis  // when visiting a DeclStmt currently, the AST should be enhanced to be able
5079d1d9df688baf384f1ca1220e51104c3b30d6a81aArgyrios Kyrtzidis  // to provide that kind of info.
5080d1d9df688baf384f1ca1220e51104c3b30d6a81aArgyrios Kyrtzidis  if (clang_isDeclaration(X.kind))
5081c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    X.data[1] = nullptr;
5082d1d9df688baf384f1ca1220e51104c3b30d6a81aArgyrios Kyrtzidis  if (clang_isDeclaration(Y.kind))
5083c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    Y.data[1] = nullptr;
5084d1d9df688baf384f1ca1220e51104c3b30d6a81aArgyrios Kyrtzidis
50857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return X == Y;
50867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
50877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
50887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiunsigned clang_hashCursor(CXCursor C) {
50897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  unsigned Index = 0;
50907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (clang_isExpression(C.kind) || clang_isStatement(C.kind))
50917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    Index = 1;
50927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
509367812b2f94f4b5e7d2596db1705ffa1149ddc45aDmitri Gribenko  return llvm::DenseMapInfo<std::pair<unsigned, const void*> >::getHashValue(
50947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                        std::make_pair(C.kind, C.data[Index]));
50957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
50967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
50977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiunsigned clang_isInvalid(enum CXCursorKind K) {
50987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return K >= CXCursor_FirstInvalid && K <= CXCursor_LastInvalid;
50997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
51007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
51017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiunsigned clang_isDeclaration(enum CXCursorKind K) {
51027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return (K >= CXCursor_FirstDecl && K <= CXCursor_LastDecl) ||
51037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei         (K >= CXCursor_FirstExtraDecl && K <= CXCursor_LastExtraDecl);
51047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
51057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
51067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiunsigned clang_isReference(enum CXCursorKind K) {
51077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return K >= CXCursor_FirstRef && K <= CXCursor_LastRef;
51087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
51097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
51107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiunsigned clang_isExpression(enum CXCursorKind K) {
51117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return K >= CXCursor_FirstExpr && K <= CXCursor_LastExpr;
51127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
51137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
51147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiunsigned clang_isStatement(enum CXCursorKind K) {
51157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return K >= CXCursor_FirstStmt && K <= CXCursor_LastStmt;
51167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
51177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
51187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiunsigned clang_isAttribute(enum CXCursorKind K) {
51197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return K >= CXCursor_FirstAttr && K <= CXCursor_LastAttr;
51207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
51217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
51227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiunsigned clang_isTranslationUnit(enum CXCursorKind K) {
51237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return K == CXCursor_TranslationUnit;
51247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
51257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
51267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiunsigned clang_isPreprocessing(enum CXCursorKind K) {
51277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return K >= CXCursor_FirstPreprocessing && K <= CXCursor_LastPreprocessing;
51287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
51297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
51307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiunsigned clang_isUnexposed(enum CXCursorKind K) {
51317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  switch (K) {
51327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_UnexposedDecl:
51337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_UnexposedExpr:
51347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_UnexposedStmt:
51357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_UnexposedAttr:
51367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return true;
51377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    default:
51387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return false;
51397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
51407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
51417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
51427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXCursorKind clang_getCursorKind(CXCursor C) {
51437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return C.kind;
51447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
51457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
51467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXSourceLocation clang_getCursorLocation(CXCursor C) {
51477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (clang_isReference(C.kind)) {
51487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    switch (C.kind) {
51497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_ObjCSuperClassRef: {
515067812b2f94f4b5e7d2596db1705ffa1149ddc45aDmitri Gribenko      std::pair<const ObjCInterfaceDecl *, SourceLocation> P
51517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        = getCursorObjCSuperClassRef(C);
51527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return cxloc::translateSourceLocation(P.first->getASTContext(), P.second);
51537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
51547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
51557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_ObjCProtocolRef: {
515667812b2f94f4b5e7d2596db1705ffa1149ddc45aDmitri Gribenko      std::pair<const ObjCProtocolDecl *, SourceLocation> P
51577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        = getCursorObjCProtocolRef(C);
51587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return cxloc::translateSourceLocation(P.first->getASTContext(), P.second);
51597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
51607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
51617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_ObjCClassRef: {
516267812b2f94f4b5e7d2596db1705ffa1149ddc45aDmitri Gribenko      std::pair<const ObjCInterfaceDecl *, SourceLocation> P
51637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        = getCursorObjCClassRef(C);
51647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return cxloc::translateSourceLocation(P.first->getASTContext(), P.second);
51657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
51667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
51677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_TypeRef: {
516867812b2f94f4b5e7d2596db1705ffa1149ddc45aDmitri Gribenko      std::pair<const TypeDecl *, SourceLocation> P = getCursorTypeRef(C);
51697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return cxloc::translateSourceLocation(P.first->getASTContext(), P.second);
51707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
51717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
51727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_TemplateRef: {
517367812b2f94f4b5e7d2596db1705ffa1149ddc45aDmitri Gribenko      std::pair<const TemplateDecl *, SourceLocation> P =
517467812b2f94f4b5e7d2596db1705ffa1149ddc45aDmitri Gribenko          getCursorTemplateRef(C);
51757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return cxloc::translateSourceLocation(P.first->getASTContext(), P.second);
51767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
51777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
51787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_NamespaceRef: {
517967812b2f94f4b5e7d2596db1705ffa1149ddc45aDmitri Gribenko      std::pair<const NamedDecl *, SourceLocation> P = getCursorNamespaceRef(C);
51807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return cxloc::translateSourceLocation(P.first->getASTContext(), P.second);
51817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
51827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
51837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_MemberRef: {
518467812b2f94f4b5e7d2596db1705ffa1149ddc45aDmitri Gribenko      std::pair<const FieldDecl *, SourceLocation> P = getCursorMemberRef(C);
51857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return cxloc::translateSourceLocation(P.first->getASTContext(), P.second);
51867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
51877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
51887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_VariableRef: {
518967812b2f94f4b5e7d2596db1705ffa1149ddc45aDmitri Gribenko      std::pair<const VarDecl *, SourceLocation> P = getCursorVariableRef(C);
51907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return cxloc::translateSourceLocation(P.first->getASTContext(), P.second);
51917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
51927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
51937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_CXXBaseSpecifier: {
519467812b2f94f4b5e7d2596db1705ffa1149ddc45aDmitri Gribenko      const CXXBaseSpecifier *BaseSpec = getCursorCXXBaseSpecifier(C);
51957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (!BaseSpec)
51967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        return clang_getNullLocation();
51977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
51987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (TypeSourceInfo *TSInfo = BaseSpec->getTypeSourceInfo())
51997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        return cxloc::translateSourceLocation(getCursorContext(C),
52007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                            TSInfo->getTypeLoc().getBeginLoc());
52017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
52027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return cxloc::translateSourceLocation(getCursorContext(C),
52037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                        BaseSpec->getLocStart());
52047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
52057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
52067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_LabelRef: {
520767812b2f94f4b5e7d2596db1705ffa1149ddc45aDmitri Gribenko      std::pair<const LabelStmt *, SourceLocation> P = getCursorLabelRef(C);
52087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return cxloc::translateSourceLocation(getCursorContext(C), P.second);
52097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
52107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
52117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_OverloadedDeclRef:
52127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return cxloc::translateSourceLocation(getCursorContext(C),
52137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                          getCursorOverloadedDeclRef(C).second);
52147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
52157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    default:
52167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // FIXME: Need a way to enumerate all non-reference cases.
52177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      llvm_unreachable("Missed a reference kind");
52187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
52197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
52207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
52217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (clang_isExpression(C.kind))
52227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return cxloc::translateSourceLocation(getCursorContext(C),
52237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                   getLocationFromExpr(getCursorExpr(C)));
52247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
52257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (clang_isStatement(C.kind))
52267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return cxloc::translateSourceLocation(getCursorContext(C),
52277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                          getCursorStmt(C)->getLocStart());
52287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
52297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (C.kind == CXCursor_PreprocessingDirective) {
52307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    SourceLocation L = cxcursor::getCursorPreprocessingDirective(C).getBegin();
52317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return cxloc::translateSourceLocation(getCursorContext(C), L);
52327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
52337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
52347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (C.kind == CXCursor_MacroExpansion) {
52357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    SourceLocation L
5236664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis      = cxcursor::getCursorMacroExpansion(C).getSourceRange().getBegin();
52377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return cxloc::translateSourceLocation(getCursorContext(C), L);
52387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
52397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
52407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (C.kind == CXCursor_MacroDefinition) {
52417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    SourceLocation L = cxcursor::getCursorMacroDefinition(C)->getLocation();
52427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return cxloc::translateSourceLocation(getCursorContext(C), L);
52437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
52447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
52457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (C.kind == CXCursor_InclusionDirective) {
52467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    SourceLocation L
52477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      = cxcursor::getCursorInclusionDirective(C)->getSourceRange().getBegin();
52487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return cxloc::translateSourceLocation(getCursorContext(C), L);
52497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
52507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
5251513371129c834c143a50c3ca09bb581b7f0f6344Argyrios Kyrtzidis  if (clang_isAttribute(C.kind)) {
5252513371129c834c143a50c3ca09bb581b7f0f6344Argyrios Kyrtzidis    SourceLocation L
5253513371129c834c143a50c3ca09bb581b7f0f6344Argyrios Kyrtzidis      = cxcursor::getCursorAttr(C)->getLocation();
5254513371129c834c143a50c3ca09bb581b7f0f6344Argyrios Kyrtzidis    return cxloc::translateSourceLocation(getCursorContext(C), L);
5255513371129c834c143a50c3ca09bb581b7f0f6344Argyrios Kyrtzidis  }
5256513371129c834c143a50c3ca09bb581b7f0f6344Argyrios Kyrtzidis
52577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!clang_isDeclaration(C.kind))
52587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return clang_getNullLocation();
52597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
5260e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko  const Decl *D = getCursorDecl(C);
52617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!D)
52627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return clang_getNullLocation();
52637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
52647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  SourceLocation Loc = D->getLocation();
52657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // FIXME: Multiple variables declared in a single declaration
52667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // currently lack the information needed to correctly determine their
52677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // ranges when accounting for the type-specifier.  We use context
52687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // stored in the CXCursor to determine if the VarDecl is in a DeclGroup,
52697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // and if so, whether it is the first decl.
5270e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko  if (const VarDecl *VD = dyn_cast<VarDecl>(D)) {
52717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (!cxcursor::isFirstInDeclGroup(C))
52727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      Loc = VD->getLocation();
52737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
52747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
52757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // For ObjC methods, give the start location of the method name.
5276e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko  if (const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(D))
52777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    Loc = MD->getSelectorStartLoc();
52787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
52797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return cxloc::translateSourceLocation(getCursorContext(C), Loc);
52807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
52817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
52827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} // end extern "C"
52837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
52847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXCursor cxcursor::getCursor(CXTranslationUnit TU, SourceLocation SLoc) {
52857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  assert(TU);
52867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
52877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Guard against an invalid SourceLocation, or we may assert in one
52887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // of the following calls.
52897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (SLoc.isInvalid())
52907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return clang_getNullCursor();
52917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
52925694feb5ccd6eb862cb600b55753cecc13794471Dmitri Gribenko  ASTUnit *CXXUnit = cxtu::getASTUnit(TU);
52937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
52947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Translate the given source location to make it point at the beginning of
52957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // the token under the cursor.
52967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  SLoc = Lexer::GetBeginningOfToken(SLoc, CXXUnit->getSourceManager(),
52977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                    CXXUnit->getASTContext().getLangOpts());
52987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
52997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  CXCursor Result = MakeCXCursorInvalid(CXCursor_NoDeclFound);
53007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (SLoc.isValid()) {
53017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    GetCursorData ResultData(CXXUnit->getSourceManager(), SLoc, Result);
53027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    CursorVisitor CursorVis(TU, GetCursorVisitor, &ResultData,
53037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                            /*VisitPreprocessorLast=*/true,
53047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                            /*VisitIncludedEntities=*/false,
53057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                            SourceLocation(SLoc));
53067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    CursorVis.visitFileRegion();
53077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
53087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
53097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return Result;
53107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
53117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
53127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic SourceRange getRawCursorExtent(CXCursor C) {
53137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (clang_isReference(C.kind)) {
53147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    switch (C.kind) {
53157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_ObjCSuperClassRef:
53167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return  getCursorObjCSuperClassRef(C).second;
53177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
53187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_ObjCProtocolRef:
53197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return getCursorObjCProtocolRef(C).second;
53207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
53217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_ObjCClassRef:
53227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return getCursorObjCClassRef(C).second;
53237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
53247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_TypeRef:
53257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return getCursorTypeRef(C).second;
53267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
53277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_TemplateRef:
53287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return getCursorTemplateRef(C).second;
53297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
53307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_NamespaceRef:
53317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return getCursorNamespaceRef(C).second;
53327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
53337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_MemberRef:
53347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return getCursorMemberRef(C).second;
53357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
53367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_CXXBaseSpecifier:
53377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return getCursorCXXBaseSpecifier(C)->getSourceRange();
53387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
53397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_LabelRef:
53407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return getCursorLabelRef(C).second;
53417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
53427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_OverloadedDeclRef:
53437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return getCursorOverloadedDeclRef(C).second;
53447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
53457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_VariableRef:
53467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return getCursorVariableRef(C).second;
53477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
53487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    default:
53497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // FIXME: Need a way to enumerate all non-reference cases.
53507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      llvm_unreachable("Missed a reference kind");
53517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
53527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
53537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
53547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (clang_isExpression(C.kind))
53557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return getCursorExpr(C)->getSourceRange();
53567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
53577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (clang_isStatement(C.kind))
53587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return getCursorStmt(C)->getSourceRange();
53597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
53607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (clang_isAttribute(C.kind))
53617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return getCursorAttr(C)->getRange();
53627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
53637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (C.kind == CXCursor_PreprocessingDirective)
53647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return cxcursor::getCursorPreprocessingDirective(C);
53657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
53667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (C.kind == CXCursor_MacroExpansion) {
53677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    ASTUnit *TU = getCursorASTUnit(C);
5368664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis    SourceRange Range = cxcursor::getCursorMacroExpansion(C).getSourceRange();
53697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return TU->mapRangeFromPreamble(Range);
53707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
53717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
53727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (C.kind == CXCursor_MacroDefinition) {
53737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    ASTUnit *TU = getCursorASTUnit(C);
53747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    SourceRange Range = cxcursor::getCursorMacroDefinition(C)->getSourceRange();
53757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return TU->mapRangeFromPreamble(Range);
53767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
53777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
53787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (C.kind == CXCursor_InclusionDirective) {
53797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    ASTUnit *TU = getCursorASTUnit(C);
53807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    SourceRange Range = cxcursor::getCursorInclusionDirective(C)->getSourceRange();
53817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return TU->mapRangeFromPreamble(Range);
53827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
53837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
53847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (C.kind == CXCursor_TranslationUnit) {
53857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    ASTUnit *TU = getCursorASTUnit(C);
53867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    FileID MainID = TU->getSourceManager().getMainFileID();
53877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    SourceLocation Start = TU->getSourceManager().getLocForStartOfFile(MainID);
53887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    SourceLocation End = TU->getSourceManager().getLocForEndOfFile(MainID);
53897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return SourceRange(Start, End);
53907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
53917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
53927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (clang_isDeclaration(C.kind)) {
5393e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko    const Decl *D = cxcursor::getCursorDecl(C);
53947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (!D)
53957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return SourceRange();
53967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
53977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    SourceRange R = D->getSourceRange();
53987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // FIXME: Multiple variables declared in a single declaration
53997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // currently lack the information needed to correctly determine their
54007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // ranges when accounting for the type-specifier.  We use context
54017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // stored in the CXCursor to determine if the VarDecl is in a DeclGroup,
54027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // and if so, whether it is the first decl.
5403e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko    if (const VarDecl *VD = dyn_cast<VarDecl>(D)) {
54047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (!cxcursor::isFirstInDeclGroup(C))
54057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        R.setBegin(VD->getLocation());
54067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
54077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return R;
54087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
54097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return SourceRange();
54107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
54117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
54127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \brief Retrieves the "raw" cursor extent, which is then extended to include
54137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// the decl-specifier-seq for declarations.
54147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic SourceRange getFullCursorExtent(CXCursor C, SourceManager &SrcMgr) {
54157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (clang_isDeclaration(C.kind)) {
5416e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko    const Decl *D = cxcursor::getCursorDecl(C);
54177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (!D)
54187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return SourceRange();
54197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
54207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    SourceRange R = D->getSourceRange();
54217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
54227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // Adjust the start of the location for declarations preceded by
54237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // declaration specifiers.
54247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    SourceLocation StartLoc;
54257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (const DeclaratorDecl *DD = dyn_cast<DeclaratorDecl>(D)) {
54267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (TypeSourceInfo *TI = DD->getTypeSourceInfo())
54277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        StartLoc = TI->getTypeLoc().getLocStart();
5428e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko    } else if (const TypedefDecl *Typedef = dyn_cast<TypedefDecl>(D)) {
54297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (TypeSourceInfo *TI = Typedef->getTypeSourceInfo())
54307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        StartLoc = TI->getTypeLoc().getLocStart();
54317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
54327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
54337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (StartLoc.isValid() && R.getBegin().isValid() &&
54347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        SrcMgr.isBeforeInTranslationUnit(StartLoc, R.getBegin()))
54357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      R.setBegin(StartLoc);
54367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
54377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // FIXME: Multiple variables declared in a single declaration
54387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // currently lack the information needed to correctly determine their
54397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // ranges when accounting for the type-specifier.  We use context
54407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // stored in the CXCursor to determine if the VarDecl is in a DeclGroup,
54417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // and if so, whether it is the first decl.
5442e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko    if (const VarDecl *VD = dyn_cast<VarDecl>(D)) {
54437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (!cxcursor::isFirstInDeclGroup(C))
54447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        R.setBegin(VD->getLocation());
54457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
54467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
54477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return R;
54487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
54497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
54507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return getRawCursorExtent(C);
54517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
54527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
54537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiextern "C" {
54547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
54557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXSourceRange clang_getCursorExtent(CXCursor C) {
54567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  SourceRange R = getRawCursorExtent(C);
54577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (R.isInvalid())
54587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return clang_getNullRange();
54597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
54607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return cxloc::translateSourceRange(getCursorContext(C), R);
54617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
54627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
54637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXCursor clang_getCursorReferenced(CXCursor C) {
54647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (clang_isInvalid(C.kind))
54657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return clang_getNullCursor();
54667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
54677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  CXTranslationUnit tu = getCursorTU(C);
54687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (clang_isDeclaration(C.kind)) {
5469e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko    const Decl *D = getCursorDecl(C);
54707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (!D)
54717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return clang_getNullCursor();
5472e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko    if (const UsingDecl *Using = dyn_cast<UsingDecl>(D))
54737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return MakeCursorOverloadedDeclRef(Using, D->getLocation(), tu);
5474e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko    if (const ObjCPropertyImplDecl *PropImpl =
5475e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko            dyn_cast<ObjCPropertyImplDecl>(D))
54767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (ObjCPropertyDecl *Property = PropImpl->getPropertyDecl())
54777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        return MakeCXCursor(Property, tu);
54787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
54797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return C;
54807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
54817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
54827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (clang_isExpression(C.kind)) {
5483e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko    const Expr *E = getCursorExpr(C);
5484e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko    const Decl *D = getDeclFromExpr(E);
54857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (D) {
54867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      CXCursor declCursor = MakeCXCursor(D, tu);
54877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      declCursor = getSelectorIdentifierCursor(getSelectorIdentifierIndex(C),
54887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                               declCursor);
54897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return declCursor;
54907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
54917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
5492e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko    if (const OverloadExpr *Ovl = dyn_cast_or_null<OverloadExpr>(E))
54937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return MakeCursorOverloadedDeclRef(Ovl, tu);
54947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
54957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return clang_getNullCursor();
54967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
54977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
54987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (clang_isStatement(C.kind)) {
5499ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko    const Stmt *S = getCursorStmt(C);
5500ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko    if (const GotoStmt *Goto = dyn_cast_or_null<GotoStmt>(S))
55017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (LabelDecl *label = Goto->getLabel())
55027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        if (LabelStmt *labelS = label->getStmt())
55037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        return MakeCXCursor(labelS, getCursorDecl(C), tu);
55047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
55057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return clang_getNullCursor();
55067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
5507b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar
55087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (C.kind == CXCursor_MacroExpansion) {
5509b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar    if (const MacroDefinitionRecord *Def =
5510b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar            getCursorMacroExpansion(C).getDefinition())
55117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return MakeMacroDefinitionCursor(Def, tu);
55127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
55137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
55147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!clang_isReference(C.kind))
55157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return clang_getNullCursor();
55167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
55177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  switch (C.kind) {
55187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_ObjCSuperClassRef:
55197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return MakeCXCursor(getCursorObjCSuperClassRef(C).first, tu);
55207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
55217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_ObjCProtocolRef: {
552267812b2f94f4b5e7d2596db1705ffa1149ddc45aDmitri Gribenko      const ObjCProtocolDecl *Prot = getCursorObjCProtocolRef(C).first;
552367812b2f94f4b5e7d2596db1705ffa1149ddc45aDmitri Gribenko      if (const ObjCProtocolDecl *Def = Prot->getDefinition())
55247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        return MakeCXCursor(Def, tu);
55257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
55267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return MakeCXCursor(Prot, tu);
55277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
55287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
55297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_ObjCClassRef: {
553067812b2f94f4b5e7d2596db1705ffa1149ddc45aDmitri Gribenko      const ObjCInterfaceDecl *Class = getCursorObjCClassRef(C).first;
553167812b2f94f4b5e7d2596db1705ffa1149ddc45aDmitri Gribenko      if (const ObjCInterfaceDecl *Def = Class->getDefinition())
55327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        return MakeCXCursor(Def, tu);
55337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
55347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return MakeCXCursor(Class, tu);
55357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
55367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
55377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_TypeRef:
55387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return MakeCXCursor(getCursorTypeRef(C).first, tu );
55397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
55407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_TemplateRef:
55417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return MakeCXCursor(getCursorTemplateRef(C).first, tu );
55427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
55437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_NamespaceRef:
55447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return MakeCXCursor(getCursorNamespaceRef(C).first, tu );
55457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
55467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_MemberRef:
55477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return MakeCXCursor(getCursorMemberRef(C).first, tu );
55487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
55497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_CXXBaseSpecifier: {
555067812b2f94f4b5e7d2596db1705ffa1149ddc45aDmitri Gribenko      const CXXBaseSpecifier *B = cxcursor::getCursorCXXBaseSpecifier(C);
55517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return clang_getTypeDeclaration(cxtype::MakeCXType(B->getType(),
55527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                                         tu ));
55537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
55547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
55557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_LabelRef:
55567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // FIXME: We end up faking the "parent" declaration here because we
55577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // don't want to make CXCursor larger.
55585694feb5ccd6eb862cb600b55753cecc13794471Dmitri Gribenko      return MakeCXCursor(getCursorLabelRef(C).first,
55595694feb5ccd6eb862cb600b55753cecc13794471Dmitri Gribenko                          cxtu::getASTUnit(tu)->getASTContext()
55605694feb5ccd6eb862cb600b55753cecc13794471Dmitri Gribenko                              .getTranslationUnitDecl(),
55617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                          tu);
55627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
55637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_OverloadedDeclRef:
55647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return C;
55657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
55667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXCursor_VariableRef:
55677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return MakeCXCursor(getCursorVariableRef(C).first, tu);
55687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
55697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    default:
55707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // We would prefer to enumerate all non-reference cursor kinds here.
55717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      llvm_unreachable("Unhandled reference cursor kind");
55727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
55737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
55747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
55757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXCursor clang_getCursorDefinition(CXCursor C) {
55767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (clang_isInvalid(C.kind))
55777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return clang_getNullCursor();
55787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
55797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  CXTranslationUnit TU = getCursorTU(C);
55807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
55817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  bool WasReference = false;
55827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (clang_isReference(C.kind) || clang_isExpression(C.kind)) {
55837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    C = clang_getCursorReferenced(C);
55847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    WasReference = true;
55857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
55867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
55877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (C.kind == CXCursor_MacroExpansion)
55887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return clang_getCursorReferenced(C);
55897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
55907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!clang_isDeclaration(C.kind))
55917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return clang_getNullCursor();
55927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
5593e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko  const Decl *D = getCursorDecl(C);
55947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!D)
55957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return clang_getNullCursor();
55967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
55977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  switch (D->getKind()) {
55987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Declaration kinds that don't really separate the notions of
55997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // declaration and definition.
56007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::Namespace:
56017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::Typedef:
56027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::TypeAlias:
56037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::TypeAliasTemplate:
56047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::TemplateTypeParm:
56057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::EnumConstant:
56067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::Field:
560776da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  case Decl::MSProperty:
56087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::IndirectField:
56097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::ObjCIvar:
56107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::ObjCAtDefsField:
56117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::ImplicitParam:
56127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::ParmVar:
56137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::NonTypeTemplateParm:
56147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::TemplateTemplateParm:
56157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::ObjCCategoryImpl:
56167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::ObjCImplementation:
56177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::AccessSpec:
56187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::LinkageSpec:
56197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::ObjCPropertyImpl:
56207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::FileScopeAsm:
56217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::StaticAssert:
56227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::Block:
56236afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. Siraj  case Decl::Captured:
56244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  case Decl::OMPCapturedExpr:
56257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::Label:  // FIXME: Is this right??
56267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::ClassScopeFunctionSpecialization:
56277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::Import:
5628c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev  case Decl::OMPThreadPrivate:
56294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  case Decl::OMPDeclareReduction:
563087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  case Decl::ObjCTypeParam:
563187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  case Decl::BuiltinTemplate:
56324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  case Decl::PragmaComment:
56334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  case Decl::PragmaDetectMismatch:
56347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return C;
56357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
56367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Declaration kinds that don't make any sense here, but are
56377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // nonetheless harmless.
5638f23546a913825bdc1f972f21f638a6ee472aab20David Blaikie  case Decl::Empty:
56397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::TranslationUnit:
56403ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  case Decl::ExternCContext:
56417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    break;
56427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
56437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Declaration kinds for which the definition is not resolvable.
56447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::UnresolvedUsingTypename:
56457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::UnresolvedUsingValue:
56467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    break;
56477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
56487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::UsingDirective:
56497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return MakeCXCursor(cast<UsingDirectiveDecl>(D)->getNominatedNamespace(),
56507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                        TU);
56517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
56527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::NamespaceAlias:
56537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return MakeCXCursor(cast<NamespaceAliasDecl>(D)->getNamespace(), TU);
56547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
56557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::Enum:
56567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::Record:
56577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::CXXRecord:
56587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::ClassTemplateSpecialization:
56597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::ClassTemplatePartialSpecialization:
56607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (TagDecl *Def = cast<TagDecl>(D)->getDefinition())
56617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return MakeCXCursor(Def, TU);
56627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return clang_getNullCursor();
56637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
56647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::Function:
56657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::CXXMethod:
56667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::CXXConstructor:
56677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::CXXDestructor:
56687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::CXXConversion: {
5669c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    const FunctionDecl *Def = nullptr;
56707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (cast<FunctionDecl>(D)->getBody(Def))
567105756dc8d11cd2054e0cb94f0302e4eb39acc68eDmitri Gribenko      return MakeCXCursor(Def, TU);
56727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return clang_getNullCursor();
56737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
56747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
5675ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  case Decl::Var:
5676ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  case Decl::VarTemplateSpecialization:
5677ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  case Decl::VarTemplatePartialSpecialization: {
56787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // Ask the variable if it has a definition.
5679e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko    if (const VarDecl *Def = cast<VarDecl>(D)->getDefinition())
56807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return MakeCXCursor(Def, TU);
56817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return clang_getNullCursor();
56827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
56837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
56847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::FunctionTemplate: {
5685c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    const FunctionDecl *Def = nullptr;
56867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (cast<FunctionTemplateDecl>(D)->getTemplatedDecl()->getBody(Def))
56877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return MakeCXCursor(Def->getDescribedFunctionTemplate(), TU);
56887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return clang_getNullCursor();
56897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
56907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
56917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::ClassTemplate: {
56927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (RecordDecl *Def = cast<ClassTemplateDecl>(D)->getTemplatedDecl()
56937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                                            ->getDefinition())
56947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return MakeCXCursor(cast<CXXRecordDecl>(Def)->getDescribedClassTemplate(),
56957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                          TU);
56967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return clang_getNullCursor();
56977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
56987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
5699ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  case Decl::VarTemplate: {
5700ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    if (VarDecl *Def =
5701ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo            cast<VarTemplateDecl>(D)->getTemplatedDecl()->getDefinition())
5702ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo      return MakeCXCursor(cast<VarDecl>(Def)->getDescribedVarTemplate(), TU);
5703ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    return clang_getNullCursor();
5704ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  }
5705ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
57067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::Using:
57077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return MakeCursorOverloadedDeclRef(cast<UsingDecl>(D),
57087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                       D->getLocation(), TU);
57097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
57107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::UsingShadow:
57114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  case Decl::ConstructorUsingShadow:
57127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return clang_getCursorDefinition(
57137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                       MakeCXCursor(cast<UsingShadowDecl>(D)->getTargetDecl(),
57147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                    TU));
57157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
57167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::ObjCMethod: {
5717e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko    const ObjCMethodDecl *Method = cast<ObjCMethodDecl>(D);
57187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (Method->isThisDeclarationADefinition())
57197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return C;
57207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
57217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // Dig out the method definition in the associated
57227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // @implementation, if we have it.
57237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // FIXME: The ASTs should make finding the definition easier.
5724e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko    if (const ObjCInterfaceDecl *Class
57257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                       = dyn_cast<ObjCInterfaceDecl>(Method->getDeclContext()))
57267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (ObjCImplementationDecl *ClassImpl = Class->getImplementation())
57277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        if (ObjCMethodDecl *Def = ClassImpl->getMethod(Method->getSelector(),
57287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                                  Method->isInstanceMethod()))
57297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          if (Def->isThisDeclarationADefinition())
57307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            return MakeCXCursor(Def, TU);
57317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
57327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return clang_getNullCursor();
57337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
57347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
57357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::ObjCCategory:
57367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (ObjCCategoryImplDecl *Impl
57377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                               = cast<ObjCCategoryDecl>(D)->getImplementation())
57387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return MakeCXCursor(Impl, TU);
57397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return clang_getNullCursor();
57407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
57417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::ObjCProtocol:
5742e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko    if (const ObjCProtocolDecl *Def = cast<ObjCProtocolDecl>(D)->getDefinition())
57437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return MakeCXCursor(Def, TU);
57447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return clang_getNullCursor();
57457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
57467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::ObjCInterface: {
57477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // There are two notions of a "definition" for an Objective-C
57487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // class: the interface and its implementation. When we resolved a
57497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // reference to an Objective-C class, produce the @interface as
57507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // the definition; when we were provided with the interface,
57517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // produce the @implementation as the definition.
5752e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko    const ObjCInterfaceDecl *IFace = cast<ObjCInterfaceDecl>(D);
57537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (WasReference) {
5754e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko      if (const ObjCInterfaceDecl *Def = IFace->getDefinition())
57557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        return MakeCXCursor(Def, TU);
57567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    } else if (ObjCImplementationDecl *Impl = IFace->getImplementation())
57577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return MakeCXCursor(Impl, TU);
57587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return clang_getNullCursor();
57597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
57607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
57617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::ObjCProperty:
57627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // FIXME: We don't really know where to find the
57637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // ObjCPropertyImplDecls that implement this property.
57647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return clang_getNullCursor();
57657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
57667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::ObjCCompatibleAlias:
5767e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko    if (const ObjCInterfaceDecl *Class
57687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          = cast<ObjCCompatibleAliasDecl>(D)->getClassInterface())
5769e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko      if (const ObjCInterfaceDecl *Def = Class->getDefinition())
57707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        return MakeCXCursor(Def, TU);
57717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
57727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return clang_getNullCursor();
57737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
57747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::Friend:
57757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (NamedDecl *Friend = cast<FriendDecl>(D)->getFriendDecl())
57767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return clang_getCursorDefinition(MakeCXCursor(Friend, TU));
57777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return clang_getNullCursor();
57787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
57797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case Decl::FriendTemplate:
57807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (NamedDecl *Friend = cast<FriendTemplateDecl>(D)->getFriendDecl())
57817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return clang_getCursorDefinition(MakeCXCursor(Friend, TU));
57827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return clang_getNullCursor();
57837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
57847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
57857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return clang_getNullCursor();
57867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
57877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
57887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiunsigned clang_isCursorDefinition(CXCursor C) {
57897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!clang_isDeclaration(C.kind))
57907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return 0;
57917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
57927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return clang_getCursorDefinition(C) == C;
57937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
57947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
57957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXCursor clang_getCanonicalCursor(CXCursor C) {
57967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!clang_isDeclaration(C.kind))
57977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return C;
57987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
5799e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko  if (const Decl *D = getCursorDecl(C)) {
5800e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko    if (const ObjCCategoryImplDecl *CatImplD = dyn_cast<ObjCCategoryImplDecl>(D))
58017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (ObjCCategoryDecl *CatD = CatImplD->getCategoryDecl())
58027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        return MakeCXCursor(CatD, getCursorTU(C));
58037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
5804e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko    if (const ObjCImplDecl *ImplD = dyn_cast<ObjCImplDecl>(D))
5805e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko      if (const ObjCInterfaceDecl *IFD = ImplD->getClassInterface())
58067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        return MakeCXCursor(IFD, getCursorTU(C));
58077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
58087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return MakeCXCursor(D->getCanonicalDecl(), getCursorTU(C));
58097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
58107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
58117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return C;
58127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
58137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
58147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiint clang_Cursor_getObjCSelectorIndex(CXCursor cursor) {
58157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return cxcursor::getSelectorIdentifierIndexAndLoc(cursor).first;
58167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
58177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
58187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiunsigned clang_getNumOverloadedDecls(CXCursor C) {
58197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (C.kind != CXCursor_OverloadedDeclRef)
58207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return 0;
58217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
58227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  OverloadedDeclRefStorage Storage = getCursorOverloadedDeclRef(C).first;
5823e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko  if (const OverloadExpr *E = Storage.dyn_cast<const OverloadExpr *>())
58247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return E->getNumDecls();
58257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
58267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (OverloadedTemplateStorage *S
58277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                              = Storage.dyn_cast<OverloadedTemplateStorage*>())
58287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return S->size();
58297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
5830e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko  const Decl *D = Storage.get<const Decl *>();
5831e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko  if (const UsingDecl *Using = dyn_cast<UsingDecl>(D))
58327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return Using->shadow_size();
58337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
58347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return 0;
58357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
58367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
58377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXCursor clang_getOverloadedDecl(CXCursor cursor, unsigned index) {
58387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (cursor.kind != CXCursor_OverloadedDeclRef)
58397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return clang_getNullCursor();
58407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
58417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (index >= clang_getNumOverloadedDecls(cursor))
58427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return clang_getNullCursor();
58437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
58447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  CXTranslationUnit TU = getCursorTU(cursor);
58457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  OverloadedDeclRefStorage Storage = getCursorOverloadedDeclRef(cursor).first;
5846e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko  if (const OverloadExpr *E = Storage.dyn_cast<const OverloadExpr *>())
58477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return MakeCXCursor(E->decls_begin()[index], TU);
58487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
58497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (OverloadedTemplateStorage *S
58507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                              = Storage.dyn_cast<OverloadedTemplateStorage*>())
58517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return MakeCXCursor(S->begin()[index], TU);
58527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
5853e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko  const Decl *D = Storage.get<const Decl *>();
5854e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko  if (const UsingDecl *Using = dyn_cast<UsingDecl>(D)) {
58557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // FIXME: This is, unfortunately, linear time.
58567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    UsingDecl::shadow_iterator Pos = Using->shadow_begin();
58577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    std::advance(Pos, index);
58587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return MakeCXCursor(cast<UsingShadowDecl>(*Pos)->getTargetDecl(), TU);
58597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
58607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
58617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return clang_getNullCursor();
58627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
58637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
58647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid clang_getDefinitionSpellingAndExtent(CXCursor C,
58657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                          const char **startBuf,
58667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                          const char **endBuf,
58677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                          unsigned *startLine,
58687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                          unsigned *startColumn,
58697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                          unsigned *endLine,
58707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                          unsigned *endColumn) {
58717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  assert(getCursorDecl(C) && "CXCursor has null decl");
5872e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko  const FunctionDecl *FD = dyn_cast<FunctionDecl>(getCursorDecl(C));
58737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  CompoundStmt *Body = dyn_cast<CompoundStmt>(FD->getBody());
58747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
58757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  SourceManager &SM = FD->getASTContext().getSourceManager();
58767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  *startBuf = SM.getCharacterData(Body->getLBracLoc());
58777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  *endBuf = SM.getCharacterData(Body->getRBracLoc());
58787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  *startLine = SM.getSpellingLineNumber(Body->getLBracLoc());
58797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  *startColumn = SM.getSpellingColumnNumber(Body->getLBracLoc());
58807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  *endLine = SM.getSpellingLineNumber(Body->getRBracLoc());
58817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  *endColumn = SM.getSpellingColumnNumber(Body->getRBracLoc());
58827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
58837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
58847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
58857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXSourceRange clang_getCursorReferenceNameRange(CXCursor C, unsigned NameFlags,
58867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                                unsigned PieceIndex) {
58877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  RefNamePieces Pieces;
58887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
58897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  switch (C.kind) {
58907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_MemberRefExpr:
5891ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko    if (const MemberExpr *E = dyn_cast<MemberExpr>(getCursorExpr(C)))
58927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      Pieces = buildPieces(NameFlags, true, E->getMemberNameInfo(),
58937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                           E->getQualifierLoc().getSourceRange());
58947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    break;
58957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
58967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_DeclRefExpr:
58974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    if (const DeclRefExpr *E = dyn_cast<DeclRefExpr>(getCursorExpr(C))) {
58984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      SourceRange TemplateArgLoc(E->getLAngleLoc(), E->getRAngleLoc());
58994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      Pieces =
59004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar          buildPieces(NameFlags, false, E->getNameInfo(),
59014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      E->getQualifierLoc().getSourceRange(), &TemplateArgLoc);
59024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    }
59037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    break;
59047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
59057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXCursor_CallExpr:
5906ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko    if (const CXXOperatorCallExpr *OCE =
59077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        dyn_cast<CXXOperatorCallExpr>(getCursorExpr(C))) {
5908ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko      const Expr *Callee = OCE->getCallee();
5909ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko      if (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Callee))
59107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        Callee = ICE->getSubExpr();
59117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
5912ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko      if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee))
59137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        Pieces = buildPieces(NameFlags, false, DRE->getNameInfo(),
59147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                             DRE->getQualifierLoc().getSourceRange());
59157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
59167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    break;
59177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
59187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  default:
59197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    break;
59207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
59217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
59227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (Pieces.empty()) {
59237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (PieceIndex == 0)
59247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return clang_getCursorExtent(C);
59257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  } else if (PieceIndex < Pieces.size()) {
59267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      SourceRange R = Pieces[PieceIndex];
59277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (R.isValid())
59287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        return cxloc::translateSourceRange(getCursorContext(C), R);
59297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
59307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
59317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return clang_getNullRange();
59327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
59337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
59347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid clang_enableStackTraces(void) {
59354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // FIXME: Provide an argv0 here so we can find llvm-symbolizer.
59364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  llvm::sys::PrintStackTraceOnErrorSignal(StringRef());
59377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
59387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
59397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid clang_executeOnThread(void (*fn)(void*), void *user_data,
59407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                           unsigned stack_size) {
59417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  llvm::llvm_execute_on_thread(fn, user_data, stack_size);
59427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
59437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
59447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} // end: extern "C"
59457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
59467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----------------------------------------------------------------------===//
59477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// Token-based Operations.
59487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----------------------------------------------------------------------===//
59497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
59507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/* CXToken layout:
59517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei *   int_data[0]: a CXTokenKind
59527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei *   int_data[1]: starting token location
59537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei *   int_data[2]: token length
59547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei *   int_data[3]: reserved
59557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei *   ptr_data: for identifiers and keywords, an IdentifierInfo*.
59567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei *   otherwise unused.
59577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei */
59587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiextern "C" {
59597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
59607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXTokenKind clang_getTokenKind(CXToken CXTok) {
59617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return static_cast<CXTokenKind>(CXTok.int_data[0]);
59627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
59637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
59647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXString clang_getTokenSpelling(CXTranslationUnit TU, CXToken CXTok) {
59657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  switch (clang_getTokenKind(CXTok)) {
59667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXToken_Identifier:
59677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXToken_Keyword:
59687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // We know we have an IdentifierInfo*, so use that.
59690c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko    return cxstring::createRef(static_cast<IdentifierInfo *>(CXTok.ptr_data)
59707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                            ->getNameStart());
59717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
59727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXToken_Literal: {
59737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // We have stashed the starting pointer in the ptr_data field. Use it.
59747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    const char *Text = static_cast<const char *>(CXTok.ptr_data);
59755595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko    return cxstring::createDup(StringRef(Text, CXTok.int_data[2]));
59767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
59777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
59787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXToken_Punctuation:
59797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  case CXToken_Comment:
59807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    break;
59817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
59827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
5983651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (isNotUsableTU(TU)) {
5984651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    LOG_BAD_TU(TU);
5985651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return cxstring::createEmpty();
5986651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
5987651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
59887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // We have to find the starting buffer pointer the hard way, by
59897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // deconstructing the source location.
59905694feb5ccd6eb862cb600b55753cecc13794471Dmitri Gribenko  ASTUnit *CXXUnit = cxtu::getASTUnit(TU);
59917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!CXXUnit)
5992dc66adb40ee871b4c578ba615f45d82476c7119eDmitri Gribenko    return cxstring::createEmpty();
59937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
59947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  SourceLocation Loc = SourceLocation::getFromRawEncoding(CXTok.int_data[1]);
59957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  std::pair<FileID, unsigned> LocInfo
59967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    = CXXUnit->getSourceManager().getDecomposedSpellingLoc(Loc);
59977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  bool Invalid = false;
59987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  StringRef Buffer
59997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    = CXXUnit->getSourceManager().getBufferData(LocInfo.first, &Invalid);
60007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (Invalid)
6001dc66adb40ee871b4c578ba615f45d82476c7119eDmitri Gribenko    return cxstring::createEmpty();
60027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
60035595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko  return cxstring::createDup(Buffer.substr(LocInfo.second, CXTok.int_data[2]));
60047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
60057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
60067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXSourceLocation clang_getTokenLocation(CXTranslationUnit TU, CXToken CXTok) {
6007651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (isNotUsableTU(TU)) {
6008651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    LOG_BAD_TU(TU);
6009651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return clang_getNullLocation();
6010651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
6011651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
60125694feb5ccd6eb862cb600b55753cecc13794471Dmitri Gribenko  ASTUnit *CXXUnit = cxtu::getASTUnit(TU);
60137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!CXXUnit)
60147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return clang_getNullLocation();
60157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
60167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return cxloc::translateSourceLocation(CXXUnit->getASTContext(),
60177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                        SourceLocation::getFromRawEncoding(CXTok.int_data[1]));
60187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
60197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
60207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXSourceRange clang_getTokenExtent(CXTranslationUnit TU, CXToken CXTok) {
6021651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (isNotUsableTU(TU)) {
6022651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    LOG_BAD_TU(TU);
6023651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return clang_getNullRange();
6024651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
6025651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
60265694feb5ccd6eb862cb600b55753cecc13794471Dmitri Gribenko  ASTUnit *CXXUnit = cxtu::getASTUnit(TU);
60277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!CXXUnit)
60287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return clang_getNullRange();
60297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
60307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return cxloc::translateSourceRange(CXXUnit->getASTContext(),
60317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                        SourceLocation::getFromRawEncoding(CXTok.int_data[1]));
60327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
60337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
60347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic void getTokens(ASTUnit *CXXUnit, SourceRange Range,
60357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                      SmallVectorImpl<CXToken> &CXTokens) {
60367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  SourceManager &SourceMgr = CXXUnit->getSourceManager();
60377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  std::pair<FileID, unsigned> BeginLocInfo
603882064213e9ef308e9a929ecfb31f4698a834ecddArgyrios Kyrtzidis    = SourceMgr.getDecomposedSpellingLoc(Range.getBegin());
60397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  std::pair<FileID, unsigned> EndLocInfo
604082064213e9ef308e9a929ecfb31f4698a834ecddArgyrios Kyrtzidis    = SourceMgr.getDecomposedSpellingLoc(Range.getEnd());
60417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
60427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Cannot tokenize across files.
60437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (BeginLocInfo.first != EndLocInfo.first)
60447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return;
60457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
60467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Create a lexer
60477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  bool Invalid = false;
60487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  StringRef Buffer
60497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    = SourceMgr.getBufferData(BeginLocInfo.first, &Invalid);
60507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (Invalid)
60517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return;
60527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
60537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  Lexer Lex(SourceMgr.getLocForStartOfFile(BeginLocInfo.first),
60547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            CXXUnit->getASTContext().getLangOpts(),
60557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            Buffer.begin(), Buffer.data() + BeginLocInfo.second, Buffer.end());
60567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  Lex.SetCommentRetentionState(true);
60577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
60587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Lex tokens until we hit the end of the range.
60597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  const char *EffectiveBufferEnd = Buffer.data() + EndLocInfo.second;
60607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  Token Tok;
60617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  bool previousWasAt = false;
60627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  do {
60637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // Lex the next token
60647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    Lex.LexFromRawLexer(Tok);
60657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (Tok.is(tok::eof))
60667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      break;
60677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
60687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // Initialize the CXToken.
60697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    CXToken CXTok;
60707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
60717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    //   - Common fields
60727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    CXTok.int_data[1] = Tok.getLocation().getRawEncoding();
60737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    CXTok.int_data[2] = Tok.getLength();
60747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    CXTok.int_data[3] = 0;
60757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
60767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    //   - Kind-specific fields
60777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (Tok.isLiteral()) {
60787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      CXTok.int_data[0] = CXToken_Literal;
6079e4ea879fe73581bc70a9bfbfddc7ca06b5c0768bDmitri Gribenko      CXTok.ptr_data = const_cast<char *>(Tok.getLiteralData());
60807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    } else if (Tok.is(tok::raw_identifier)) {
60817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // Lookup the identifier to determine whether we have a keyword.
60827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      IdentifierInfo *II
60837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        = CXXUnit->getPreprocessor().LookUpIdentifierInfo(Tok);
60847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
60857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if ((II->getObjCKeywordID() != tok::objc_not_keyword) && previousWasAt) {
60867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        CXTok.int_data[0] = CXToken_Keyword;
60877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      }
60887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      else {
60897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        CXTok.int_data[0] = Tok.is(tok::identifier)
60907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          ? CXToken_Identifier
60917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          : CXToken_Keyword;
60927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      }
60937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      CXTok.ptr_data = II;
60947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    } else if (Tok.is(tok::comment)) {
60957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      CXTok.int_data[0] = CXToken_Comment;
6096c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines      CXTok.ptr_data = nullptr;
60977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    } else {
60987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      CXTok.int_data[0] = CXToken_Punctuation;
6099c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines      CXTok.ptr_data = nullptr;
61007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
61017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    CXTokens.push_back(CXTok);
61027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    previousWasAt = Tok.is(tok::at);
61037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  } while (Lex.getBufferLocation() <= EffectiveBufferEnd);
61047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
61057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
61067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid clang_tokenize(CXTranslationUnit TU, CXSourceRange Range,
61077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                    CXToken **Tokens, unsigned *NumTokens) {
6108c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  LOG_FUNC_SECTION {
6109c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis    *Log << TU << ' ' << Range;
6110c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  }
6111c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis
61127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (Tokens)
6113c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    *Tokens = nullptr;
61147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (NumTokens)
61157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    *NumTokens = 0;
61167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
6117651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (isNotUsableTU(TU)) {
6118651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    LOG_BAD_TU(TU);
61190b602836c63e702b2ba893e8439996b226fc248fArgyrios Kyrtzidis    return;
6120651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
61210b602836c63e702b2ba893e8439996b226fc248fArgyrios Kyrtzidis
61225694feb5ccd6eb862cb600b55753cecc13794471Dmitri Gribenko  ASTUnit *CXXUnit = cxtu::getASTUnit(TU);
61237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!CXXUnit || !Tokens || !NumTokens)
61247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return;
61257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
61267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  ASTUnit::ConcurrencyCheck Check(*CXXUnit);
61277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
61287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  SourceRange R = cxloc::translateCXSourceRange(Range);
61297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (R.isInvalid())
61307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return;
61317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
61327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  SmallVector<CXToken, 32> CXTokens;
61337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  getTokens(CXXUnit, R, CXTokens);
61347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
61357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (CXTokens.empty())
61367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return;
61377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
61387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  *Tokens = (CXToken *)malloc(sizeof(CXToken) * CXTokens.size());
61397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  memmove(*Tokens, CXTokens.data(), sizeof(CXToken) * CXTokens.size());
61407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  *NumTokens = CXTokens.size();
61417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
61427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
61437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid clang_disposeTokens(CXTranslationUnit TU,
61447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                         CXToken *Tokens, unsigned NumTokens) {
61457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  free(Tokens);
61467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
61477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
61487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} // end: extern "C"
61497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
61507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----------------------------------------------------------------------===//
61517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// Token annotation APIs.
61527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----------------------------------------------------------------------===//
61537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
61547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic enum CXChildVisitResult AnnotateTokensVisitor(CXCursor cursor,
61557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                                     CXCursor parent,
61567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                                     CXClientData client_data);
61577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic bool AnnotateTokensPostChildrenVisitor(CXCursor cursor,
61587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                              CXClientData client_data);
61597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
61607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeinamespace {
61617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiclass AnnotateTokensWorker {
61627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  CXToken *Tokens;
61637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  CXCursor *Cursors;
61647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  unsigned NumTokens;
61657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  unsigned TokIdx;
61667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  unsigned PreprocessingTokIdx;
61677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  CursorVisitor AnnotateVis;
61687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  SourceManager &SrcMgr;
61697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  bool HasContextSensitiveKeywords;
61707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
61717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  struct PostChildrenInfo {
61727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    CXCursor Cursor;
61737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    SourceRange CursorRange;
6174a86b37e223a21647175619096e67d0f650add351Argyrios Kyrtzidis    unsigned BeforeReachingCursorIdx;
61757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    unsigned BeforeChildrenTokenIdx;
61767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  };
6177cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko  SmallVector<PostChildrenInfo, 8> PostChildrenInfos;
6178651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
6179651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  CXToken &getTok(unsigned Idx) {
6180651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    assert(Idx < NumTokens);
6181651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return Tokens[Idx];
6182651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
6183651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  const CXToken &getTok(unsigned Idx) const {
6184651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    assert(Idx < NumTokens);
6185651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return Tokens[Idx];
6186651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
61877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  bool MoreTokens() const { return TokIdx < NumTokens; }
61887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  unsigned NextToken() const { return TokIdx; }
61897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  void AdvanceToken() { ++TokIdx; }
61907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  SourceLocation GetTokenLoc(unsigned tokI) {
6191651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return SourceLocation::getFromRawEncoding(getTok(tokI).int_data[1]);
61927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
61937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  bool isFunctionMacroToken(unsigned tokI) const {
6194651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return getTok(tokI).int_data[3] != 0;
61957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
61967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  SourceLocation getFunctionMacroTokenLoc(unsigned tokI) const {
6197651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return SourceLocation::getFromRawEncoding(getTok(tokI).int_data[3]);
61987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
61997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
62007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  void annotateAndAdvanceTokens(CXCursor, RangeComparisonResult, SourceRange);
6201a86b37e223a21647175619096e67d0f650add351Argyrios Kyrtzidis  bool annotateAndAdvanceFunctionMacroTokens(CXCursor, RangeComparisonResult,
62027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                             SourceRange);
62037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
62047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeipublic:
6205c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis  AnnotateTokensWorker(CXToken *tokens, CXCursor *cursors, unsigned numTokens,
62065694feb5ccd6eb862cb600b55753cecc13794471Dmitri Gribenko                       CXTranslationUnit TU, SourceRange RegionOfInterest)
6207c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis    : Tokens(tokens), Cursors(cursors),
62087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      NumTokens(numTokens), TokIdx(0), PreprocessingTokIdx(0),
62095694feb5ccd6eb862cb600b55753cecc13794471Dmitri Gribenko      AnnotateVis(TU,
62107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                  AnnotateTokensVisitor, this,
62117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                  /*VisitPreprocessorLast=*/true,
62127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                  /*VisitIncludedEntities=*/false,
62137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                  RegionOfInterest,
62147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                  /*VisitDeclsOnly=*/false,
62157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                  AnnotateTokensPostChildrenVisitor),
62165694feb5ccd6eb862cb600b55753cecc13794471Dmitri Gribenko      SrcMgr(cxtu::getASTUnit(TU)->getSourceManager()),
62177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      HasContextSensitiveKeywords(false) { }
62187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
62197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  void VisitChildren(CXCursor C) { AnnotateVis.VisitChildren(C); }
62207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  enum CXChildVisitResult Visit(CXCursor cursor, CXCursor parent);
62217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  bool postVisitChildren(CXCursor cursor);
62227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  void AnnotateTokens();
62237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
62247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  /// \brief Determine whether the annotator saw any cursors that have
62257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  /// context-sensitive keywords.
62267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  bool hasContextSensitiveKeywords() const {
62277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return HasContextSensitiveKeywords;
62287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
62297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
62307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  ~AnnotateTokensWorker() {
62317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    assert(PostChildrenInfos.empty());
62327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
62337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei};
62347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
62357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
62367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid AnnotateTokensWorker::AnnotateTokens() {
62377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Walk the AST within the region of interest, annotating tokens
62387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // along the way.
62397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  AnnotateVis.visitFileRegion();
6240c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis}
62417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
6242c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidisstatic inline void updateCursorAnnotation(CXCursor &Cursor,
6243c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis                                          const CXCursor &updateC) {
6244a86b37e223a21647175619096e67d0f650add351Argyrios Kyrtzidis  if (clang_isInvalid(updateC.kind) || !clang_isInvalid(Cursor.kind))
62457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return;
6246c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis  Cursor = updateC;
62477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
62487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
62497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \brief It annotates and advances tokens with a cursor until the comparison
62507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//// between the cursor location and the source range is the same as
62517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \arg compResult.
62527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei///
62537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// Pass RangeBefore to annotate tokens with a cursor until a range is reached.
62547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// Pass RangeOverlap to annotate tokens inside a range.
62557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid AnnotateTokensWorker::annotateAndAdvanceTokens(CXCursor updateC,
62567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                               RangeComparisonResult compResult,
62577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                               SourceRange range) {
62587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  while (MoreTokens()) {
62597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    const unsigned I = NextToken();
62607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (isFunctionMacroToken(I))
6261a86b37e223a21647175619096e67d0f650add351Argyrios Kyrtzidis      if (!annotateAndAdvanceFunctionMacroTokens(updateC, compResult, range))
6262a86b37e223a21647175619096e67d0f650add351Argyrios Kyrtzidis        return;
62637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
62647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    SourceLocation TokLoc = GetTokenLoc(I);
62657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (LocationCompare(SrcMgr, TokLoc, range) == compResult) {
6266c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis      updateCursorAnnotation(Cursors[I], updateC);
62677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      AdvanceToken();
62687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      continue;
62697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
62707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    break;
62717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
62727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
62737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
62747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \brief Special annotation handling for macro argument tokens.
6275a86b37e223a21647175619096e67d0f650add351Argyrios Kyrtzidis/// \returns true if it advanced beyond all macro tokens, false otherwise.
6276a86b37e223a21647175619096e67d0f650add351Argyrios Kyrtzidisbool AnnotateTokensWorker::annotateAndAdvanceFunctionMacroTokens(
62777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                               CXCursor updateC,
62787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                               RangeComparisonResult compResult,
62797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                               SourceRange range) {
62807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  assert(MoreTokens());
62817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  assert(isFunctionMacroToken(NextToken()) &&
62827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei         "Should be called only for macro arg tokens");
62837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
62847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // This works differently than annotateAndAdvanceTokens; because expanded
62857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // macro arguments can have arbitrary translation-unit source order, we do not
62867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // advance the token index one by one until a token fails the range test.
62877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // We only advance once past all of the macro arg tokens if all of them
62887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // pass the range test. If one of them fails we keep the token index pointing
62897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // at the start of the macro arg tokens so that the failing token will be
62907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // annotated by a subsequent annotation try.
62917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
62927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  bool atLeastOneCompFail = false;
62937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
62947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  unsigned I = NextToken();
62957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  for (; I < NumTokens && isFunctionMacroToken(I); ++I) {
62967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    SourceLocation TokLoc = getFunctionMacroTokenLoc(I);
62977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (TokLoc.isFileID())
62987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      continue; // not macro arg token, it's parens or comma.
62997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (LocationCompare(SrcMgr, TokLoc, range) == compResult) {
63007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (clang_isInvalid(clang_getCursorKind(Cursors[I])))
63017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        Cursors[I] = updateC;
63027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    } else
63037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      atLeastOneCompFail = true;
63047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
63057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
6306a86b37e223a21647175619096e67d0f650add351Argyrios Kyrtzidis  if (atLeastOneCompFail)
6307a86b37e223a21647175619096e67d0f650add351Argyrios Kyrtzidis    return false;
6308a86b37e223a21647175619096e67d0f650add351Argyrios Kyrtzidis
6309a86b37e223a21647175619096e67d0f650add351Argyrios Kyrtzidis  TokIdx = I; // All of the tokens were handled, advance beyond all of them.
6310a86b37e223a21647175619096e67d0f650add351Argyrios Kyrtzidis  return true;
63117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
63127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
63137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeienum CXChildVisitResult
63147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiAnnotateTokensWorker::Visit(CXCursor cursor, CXCursor parent) {
63157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  SourceRange cursorRange = getRawCursorExtent(cursor);
63167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (cursorRange.isInvalid())
63177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return CXChildVisit_Recurse;
63187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
63197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!HasContextSensitiveKeywords) {
63207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // Objective-C properties can have context-sensitive keywords.
63217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (cursor.kind == CXCursor_ObjCPropertyDecl) {
6322e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko      if (const ObjCPropertyDecl *Property
63237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                  = dyn_cast_or_null<ObjCPropertyDecl>(getCursorDecl(cursor)))
63247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        HasContextSensitiveKeywords = Property->getPropertyAttributesAsWritten() != 0;
63257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
63267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // Objective-C methods can have context-sensitive keywords.
63277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    else if (cursor.kind == CXCursor_ObjCInstanceMethodDecl ||
63287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei             cursor.kind == CXCursor_ObjCClassMethodDecl) {
6329e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko      if (const ObjCMethodDecl *Method
63307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            = dyn_cast_or_null<ObjCMethodDecl>(getCursorDecl(cursor))) {
63317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        if (Method->getObjCDeclQualifier())
63327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          HasContextSensitiveKeywords = true;
63337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        else {
63344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar          for (const auto *P : Method->parameters()) {
6335651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines            if (P->getObjCDeclQualifier()) {
63367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei              HasContextSensitiveKeywords = true;
63377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei              break;
63387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            }
63397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          }
63407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        }
63417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      }
63427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
63437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // C++ methods can have context-sensitive keywords.
63447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    else if (cursor.kind == CXCursor_CXXMethod) {
6345e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko      if (const CXXMethodDecl *Method
63467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                  = dyn_cast_or_null<CXXMethodDecl>(getCursorDecl(cursor))) {
63477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        if (Method->hasAttr<FinalAttr>() || Method->hasAttr<OverrideAttr>())
63487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          HasContextSensitiveKeywords = true;
63497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      }
63507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
63517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // C++ classes can have context-sensitive keywords.
63527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    else if (cursor.kind == CXCursor_StructDecl ||
63537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei             cursor.kind == CXCursor_ClassDecl ||
63547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei             cursor.kind == CXCursor_ClassTemplate ||
63557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei             cursor.kind == CXCursor_ClassTemplatePartialSpecialization) {
6356e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko      if (const Decl *D = getCursorDecl(cursor))
63577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        if (D->hasAttr<FinalAttr>())
63587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          HasContextSensitiveKeywords = true;
63597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
63607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
636125cd4a284307ea5431f646087dee2e93dd4b3d7aArgyrios Kyrtzidis
636225cd4a284307ea5431f646087dee2e93dd4b3d7aArgyrios Kyrtzidis  // Don't override a property annotation with its getter/setter method.
636325cd4a284307ea5431f646087dee2e93dd4b3d7aArgyrios Kyrtzidis  if (cursor.kind == CXCursor_ObjCInstanceMethodDecl &&
636425cd4a284307ea5431f646087dee2e93dd4b3d7aArgyrios Kyrtzidis      parent.kind == CXCursor_ObjCPropertyDecl)
636525cd4a284307ea5431f646087dee2e93dd4b3d7aArgyrios Kyrtzidis    return CXChildVisit_Continue;
63667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
63677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (clang_isPreprocessing(cursor.kind)) {
63687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // Items in the preprocessing record are kept separate from items in
63697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // declarations, so we keep a separate token index.
63707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    unsigned SavedTokIdx = TokIdx;
63717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    TokIdx = PreprocessingTokIdx;
63727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
63737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // Skip tokens up until we catch up to the beginning of the preprocessing
63747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // entry.
63757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    while (MoreTokens()) {
63767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      const unsigned I = NextToken();
63777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      SourceLocation TokLoc = GetTokenLoc(I);
63787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      switch (LocationCompare(SrcMgr, TokLoc, cursorRange)) {
63797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      case RangeBefore:
63807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        AdvanceToken();
63817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        continue;
63827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      case RangeAfter:
63837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      case RangeOverlap:
63847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        break;
63857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      }
63867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      break;
63877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
63887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
63897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // Look at all of the tokens within this range.
63907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    while (MoreTokens()) {
63917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      const unsigned I = NextToken();
63927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      SourceLocation TokLoc = GetTokenLoc(I);
63937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      switch (LocationCompare(SrcMgr, TokLoc, cursorRange)) {
63947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      case RangeBefore:
63957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        llvm_unreachable("Infeasible");
63967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      case RangeAfter:
63977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        break;
63987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      case RangeOverlap:
639982064213e9ef308e9a929ecfb31f4698a834ecddArgyrios Kyrtzidis        // For macro expansions, just note where the beginning of the macro
640082064213e9ef308e9a929ecfb31f4698a834ecddArgyrios Kyrtzidis        // expansion occurs.
640182064213e9ef308e9a929ecfb31f4698a834ecddArgyrios Kyrtzidis        if (cursor.kind == CXCursor_MacroExpansion) {
640282064213e9ef308e9a929ecfb31f4698a834ecddArgyrios Kyrtzidis          if (TokLoc == cursorRange.getBegin())
640382064213e9ef308e9a929ecfb31f4698a834ecddArgyrios Kyrtzidis            Cursors[I] = cursor;
640482064213e9ef308e9a929ecfb31f4698a834ecddArgyrios Kyrtzidis          AdvanceToken();
640582064213e9ef308e9a929ecfb31f4698a834ecddArgyrios Kyrtzidis          break;
640682064213e9ef308e9a929ecfb31f4698a834ecddArgyrios Kyrtzidis        }
6407c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis        // We may have already annotated macro names inside macro definitions.
6408c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis        if (Cursors[I].kind != CXCursor_MacroExpansion)
6409c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis          Cursors[I] = cursor;
64107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        AdvanceToken();
64117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        continue;
64127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      }
64137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      break;
64147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
64157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
64167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // Save the preprocessing token index; restore the non-preprocessing
64177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // token index.
64187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    PreprocessingTokIdx = TokIdx;
64197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    TokIdx = SavedTokIdx;
64207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return CXChildVisit_Recurse;
64217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
64227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
64237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (cursorRange.isInvalid())
64247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return CXChildVisit_Continue;
6425a86b37e223a21647175619096e67d0f650add351Argyrios Kyrtzidis
6426a86b37e223a21647175619096e67d0f650add351Argyrios Kyrtzidis  unsigned BeforeReachingCursorIdx = NextToken();
64277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  const enum CXCursorKind cursorK = clang_getCursorKind(cursor);
64287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  const enum CXCursorKind K = clang_getCursorKind(parent);
64297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  const CXCursor updateC =
6430a86b37e223a21647175619096e67d0f650add351Argyrios Kyrtzidis    (clang_isInvalid(K) || K == CXCursor_TranslationUnit ||
6431a86b37e223a21647175619096e67d0f650add351Argyrios Kyrtzidis     // Attributes are annotated out-of-order, skip tokens until we reach it.
6432a86b37e223a21647175619096e67d0f650add351Argyrios Kyrtzidis     clang_isAttribute(cursor.kind))
64337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei     ? clang_getNullCursor() : parent;
64347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
64357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  annotateAndAdvanceTokens(updateC, RangeBefore, cursorRange);
64367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
64377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Avoid having the cursor of an expression "overwrite" the annotation of the
64387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // variable declaration that it belongs to.
64397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // This can happen for C++ constructor expressions whose range generally
64407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // include the variable declaration, e.g.:
64417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  //  MyCXXClass foo; // Make sure we don't annotate 'foo' as a CallExpr cursor.
6442651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (clang_isExpression(cursorK) && MoreTokens()) {
6443ff74f9683943c0db9cb075423596b00ea3b38c5dDmitri Gribenko    const Expr *E = getCursorExpr(cursor);
6444404628caa53a3f898047d73b38647d6fbb827e00Dmitri Gribenko    if (const Decl *D = getCursorParentDecl(cursor)) {
64457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      const unsigned I = NextToken();
64467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (E->getLocStart().isValid() && D->getLocation().isValid() &&
64477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          E->getLocStart() == D->getLocation() &&
64487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          E->getLocStart() == GetTokenLoc(I)) {
6449c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis        updateCursorAnnotation(Cursors[I], updateC);
64507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        AdvanceToken();
64517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      }
64527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
64537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
64547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
64557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Before recursing into the children keep some state that we are going
64567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // to use in the AnnotateTokensWorker::postVisitChildren callback to do some
64577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // extra work after the child nodes are visited.
64587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Note that we don't call VisitChildren here to avoid traversing statements
64597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // code-recursively which can blow the stack.
64607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
64617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  PostChildrenInfo Info;
64627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  Info.Cursor = cursor;
64637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  Info.CursorRange = cursorRange;
6464a86b37e223a21647175619096e67d0f650add351Argyrios Kyrtzidis  Info.BeforeReachingCursorIdx = BeforeReachingCursorIdx;
64657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  Info.BeforeChildrenTokenIdx = NextToken();
64667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  PostChildrenInfos.push_back(Info);
64677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
64687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return CXChildVisit_Recurse;
64697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
64707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
64717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool AnnotateTokensWorker::postVisitChildren(CXCursor cursor) {
64727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (PostChildrenInfos.empty())
64737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return false;
64747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  const PostChildrenInfo &Info = PostChildrenInfos.back();
64757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!clang_equalCursors(Info.Cursor, cursor))
64767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return false;
64777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
64787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  const unsigned BeforeChildren = Info.BeforeChildrenTokenIdx;
64797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  const unsigned AfterChildren = NextToken();
64807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  SourceRange cursorRange = Info.CursorRange;
64817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
64827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Scan the tokens that are at the end of the cursor, but are not captured
64837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // but the child cursors.
64847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  annotateAndAdvanceTokens(cursor, RangeOverlap, cursorRange);
64857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
64867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Scan the tokens that are at the beginning of the cursor, but are not
64877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // capture by the child cursors.
64887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  for (unsigned I = BeforeChildren; I != AfterChildren; ++I) {
64897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (!clang_isInvalid(clang_getCursorKind(Cursors[I])))
64907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      break;
64917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
64927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    Cursors[I] = cursor;
64937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
64947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
6495a86b37e223a21647175619096e67d0f650add351Argyrios Kyrtzidis  // Attributes are annotated out-of-order, rewind TokIdx to when we first
6496a86b37e223a21647175619096e67d0f650add351Argyrios Kyrtzidis  // encountered the attribute cursor.
6497a86b37e223a21647175619096e67d0f650add351Argyrios Kyrtzidis  if (clang_isAttribute(cursor.kind))
6498a86b37e223a21647175619096e67d0f650add351Argyrios Kyrtzidis    TokIdx = Info.BeforeReachingCursorIdx;
6499a86b37e223a21647175619096e67d0f650add351Argyrios Kyrtzidis
65007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  PostChildrenInfos.pop_back();
65017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return false;
65027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
65037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
65047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic enum CXChildVisitResult AnnotateTokensVisitor(CXCursor cursor,
65057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                                     CXCursor parent,
65067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                                     CXClientData client_data) {
65077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return static_cast<AnnotateTokensWorker*>(client_data)->Visit(cursor, parent);
65087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
65097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
65107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic bool AnnotateTokensPostChildrenVisitor(CXCursor cursor,
65117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                              CXClientData client_data) {
65127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return static_cast<AnnotateTokensWorker*>(client_data)->
65137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                                      postVisitChildren(cursor);
65147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
65157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
65167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeinamespace {
65177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
65187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \brief Uses the macro expansions in the preprocessing record to find
65197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// and mark tokens that are macro arguments. This info is used by the
65207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// AnnotateTokensWorker.
65217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiclass MarkMacroArgTokensVisitor {
65227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  SourceManager &SM;
65237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  CXToken *Tokens;
65247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  unsigned NumTokens;
65257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  unsigned CurIdx;
65267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
65277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeipublic:
65287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  MarkMacroArgTokensVisitor(SourceManager &SM,
65297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                            CXToken *tokens, unsigned numTokens)
65307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    : SM(SM), Tokens(tokens), NumTokens(numTokens), CurIdx(0) { }
65317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
65327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  CXChildVisitResult visit(CXCursor cursor, CXCursor parent) {
65337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (cursor.kind != CXCursor_MacroExpansion)
65347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return CXChildVisit_Continue;
65357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
6536664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis    SourceRange macroRange = getCursorMacroExpansion(cursor).getSourceRange();
65377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (macroRange.getBegin() == macroRange.getEnd())
65387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return CXChildVisit_Continue; // it's not a function macro.
65397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
65407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    for (; CurIdx < NumTokens; ++CurIdx) {
65417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (!SM.isBeforeInTranslationUnit(getTokenLoc(CurIdx),
65427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                        macroRange.getBegin()))
65437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        break;
65447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
65457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
65467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (CurIdx == NumTokens)
65477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return CXChildVisit_Break;
65487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
65497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    for (; CurIdx < NumTokens; ++CurIdx) {
65507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      SourceLocation tokLoc = getTokenLoc(CurIdx);
65517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (!SM.isBeforeInTranslationUnit(tokLoc, macroRange.getEnd()))
65527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        break;
65537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
65547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      setFunctionMacroTokenLoc(CurIdx, SM.getMacroArgExpandedLocation(tokLoc));
65557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
65567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
65577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (CurIdx == NumTokens)
65587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return CXChildVisit_Break;
65597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
65607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return CXChildVisit_Continue;
65617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
65627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
65637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiprivate:
6564651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  CXToken &getTok(unsigned Idx) {
6565651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    assert(Idx < NumTokens);
6566651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return Tokens[Idx];
6567651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
6568651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  const CXToken &getTok(unsigned Idx) const {
6569651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    assert(Idx < NumTokens);
6570651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return Tokens[Idx];
6571651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
6572651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
65737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  SourceLocation getTokenLoc(unsigned tokI) {
6574651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return SourceLocation::getFromRawEncoding(getTok(tokI).int_data[1]);
65757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
65767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
65777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  void setFunctionMacroTokenLoc(unsigned tokI, SourceLocation loc) {
65787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // The third field is reserved and currently not used. Use it here
65797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // to mark macro arg expanded tokens with their expanded locations.
6580651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    getTok(tokI).int_data[3] = loc.getRawEncoding();
65817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
65827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei};
65837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
65847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} // end anonymous namespace
65857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
65867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic CXChildVisitResult
65877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiMarkMacroArgTokensVisitorDelegate(CXCursor cursor, CXCursor parent,
65887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                  CXClientData client_data) {
65897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return static_cast<MarkMacroArgTokensVisitor*>(client_data)->visit(cursor,
65907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                                                     parent);
65917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
65927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
6593c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis/// \brief Used by \c annotatePreprocessorTokens.
6594c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis/// \returns true if lexing was finished, false otherwise.
6595c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidisstatic bool lexNext(Lexer &Lex, Token &Tok,
6596c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis                   unsigned &NextIdx, unsigned NumTokens) {
6597c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis  if (NextIdx >= NumTokens)
6598c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis    return true;
6599c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis
6600c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis  ++NextIdx;
6601c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis  Lex.LexFromRawLexer(Tok);
66024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  return Tok.is(tok::eof);
6603c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis}
6604c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis
66057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic void annotatePreprocessorTokens(CXTranslationUnit TU,
66067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                       SourceRange RegionOfInterest,
6607c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis                                       CXCursor *Cursors,
6608c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis                                       CXToken *Tokens,
6609c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis                                       unsigned NumTokens) {
66105694feb5ccd6eb862cb600b55753cecc13794471Dmitri Gribenko  ASTUnit *CXXUnit = cxtu::getASTUnit(TU);
66117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
66123453bf7da9ac88cd2421b7fdccebf5cd2b8a9d87Argyrios Kyrtzidis  Preprocessor &PP = CXXUnit->getPreprocessor();
66137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  SourceManager &SourceMgr = CXXUnit->getSourceManager();
66147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  std::pair<FileID, unsigned> BeginLocInfo
661582064213e9ef308e9a929ecfb31f4698a834ecddArgyrios Kyrtzidis    = SourceMgr.getDecomposedSpellingLoc(RegionOfInterest.getBegin());
66167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  std::pair<FileID, unsigned> EndLocInfo
661782064213e9ef308e9a929ecfb31f4698a834ecddArgyrios Kyrtzidis    = SourceMgr.getDecomposedSpellingLoc(RegionOfInterest.getEnd());
66187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
66197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (BeginLocInfo.first != EndLocInfo.first)
66207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return;
66217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
66227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  StringRef Buffer;
66237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  bool Invalid = false;
66247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  Buffer = SourceMgr.getBufferData(BeginLocInfo.first, &Invalid);
66257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (Buffer.empty() || Invalid)
66267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return;
66277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
66287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  Lexer Lex(SourceMgr.getLocForStartOfFile(BeginLocInfo.first),
66297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            CXXUnit->getASTContext().getLangOpts(),
66307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            Buffer.begin(), Buffer.data() + BeginLocInfo.second,
66317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            Buffer.end());
66327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  Lex.SetCommentRetentionState(true);
66337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
6634c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis  unsigned NextIdx = 0;
66357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Lex tokens in raw mode until we hit the end of the range, to avoid
66367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // entering #includes or expanding macros.
66377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  while (true) {
66387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    Token Tok;
6639c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis    if (lexNext(Lex, Tok, NextIdx, NumTokens))
6640c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis      break;
6641c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis    unsigned TokIdx = NextIdx-1;
6642c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis    assert(Tok.getLocation() ==
6643c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis             SourceLocation::getFromRawEncoding(Tokens[TokIdx].int_data[1]));
66447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
66457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  reprocess:
66467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (Tok.is(tok::hash) && Tok.isAtStartOfLine()) {
6647c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis      // We have found a preprocessing directive. Annotate the tokens
6648c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis      // appropriately.
66497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      //
66507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // FIXME: Some simple tests here could identify macro definitions and
66517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      // #undefs, to provide specific cursor kinds for those.
6652c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis
6653c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis      SourceLocation BeginLoc = Tok.getLocation();
66543453bf7da9ac88cd2421b7fdccebf5cd2b8a9d87Argyrios Kyrtzidis      if (lexNext(Lex, Tok, NextIdx, NumTokens))
66553453bf7da9ac88cd2421b7fdccebf5cd2b8a9d87Argyrios Kyrtzidis        break;
66563453bf7da9ac88cd2421b7fdccebf5cd2b8a9d87Argyrios Kyrtzidis
6657c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines      MacroInfo *MI = nullptr;
66586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      if (Tok.is(tok::raw_identifier) && Tok.getRawIdentifier() == "define") {
66593453bf7da9ac88cd2421b7fdccebf5cd2b8a9d87Argyrios Kyrtzidis        if (lexNext(Lex, Tok, NextIdx, NumTokens))
66603453bf7da9ac88cd2421b7fdccebf5cd2b8a9d87Argyrios Kyrtzidis          break;
66613453bf7da9ac88cd2421b7fdccebf5cd2b8a9d87Argyrios Kyrtzidis
66623453bf7da9ac88cd2421b7fdccebf5cd2b8a9d87Argyrios Kyrtzidis        if (Tok.is(tok::raw_identifier)) {
66636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines          IdentifierInfo &II =
66646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines              PP.getIdentifierTable().get(Tok.getRawIdentifier());
66653453bf7da9ac88cd2421b7fdccebf5cd2b8a9d87Argyrios Kyrtzidis          SourceLocation MappedTokLoc =
66663453bf7da9ac88cd2421b7fdccebf5cd2b8a9d87Argyrios Kyrtzidis              CXXUnit->mapLocationToPreamble(Tok.getLocation());
66673453bf7da9ac88cd2421b7fdccebf5cd2b8a9d87Argyrios Kyrtzidis          MI = getMacroInfo(II, MappedTokLoc, TU);
66683453bf7da9ac88cd2421b7fdccebf5cd2b8a9d87Argyrios Kyrtzidis        }
66693453bf7da9ac88cd2421b7fdccebf5cd2b8a9d87Argyrios Kyrtzidis      }
66703453bf7da9ac88cd2421b7fdccebf5cd2b8a9d87Argyrios Kyrtzidis
6671c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis      bool finished = false;
66727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      do {
6673c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis        if (lexNext(Lex, Tok, NextIdx, NumTokens)) {
6674c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis          finished = true;
6675c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis          break;
6676c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis        }
66773453bf7da9ac88cd2421b7fdccebf5cd2b8a9d87Argyrios Kyrtzidis        // If we are in a macro definition, check if the token was ever a
66783453bf7da9ac88cd2421b7fdccebf5cd2b8a9d87Argyrios Kyrtzidis        // macro name and annotate it if that's the case.
66793453bf7da9ac88cd2421b7fdccebf5cd2b8a9d87Argyrios Kyrtzidis        if (MI) {
66803453bf7da9ac88cd2421b7fdccebf5cd2b8a9d87Argyrios Kyrtzidis          SourceLocation SaveLoc = Tok.getLocation();
66813453bf7da9ac88cd2421b7fdccebf5cd2b8a9d87Argyrios Kyrtzidis          Tok.setLocation(CXXUnit->mapLocationToPreamble(SaveLoc));
6682b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar          MacroDefinitionRecord *MacroDef =
6683b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar              checkForMacroInMacroDefinition(MI, Tok, TU);
66843453bf7da9ac88cd2421b7fdccebf5cd2b8a9d87Argyrios Kyrtzidis          Tok.setLocation(SaveLoc);
66853453bf7da9ac88cd2421b7fdccebf5cd2b8a9d87Argyrios Kyrtzidis          if (MacroDef)
6686b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar            Cursors[NextIdx - 1] =
6687b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar                MakeMacroExpansionCursor(MacroDef, Tok.getLocation(), TU);
66883453bf7da9ac88cd2421b7fdccebf5cd2b8a9d87Argyrios Kyrtzidis        }
6689c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis      } while (!Tok.isAtStartOfLine());
6690c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis
6691c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis      unsigned LastIdx = finished ? NextIdx-1 : NextIdx-2;
6692c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis      assert(TokIdx <= LastIdx);
6693c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis      SourceLocation EndLoc =
6694c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis          SourceLocation::getFromRawEncoding(Tokens[LastIdx].int_data[1]);
6695c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis      CXCursor Cursor =
6696c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis          MakePreprocessingDirectiveCursor(SourceRange(BeginLoc, EndLoc), TU);
6697c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis
6698c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis      for (; TokIdx <= LastIdx; ++TokIdx)
66993453bf7da9ac88cd2421b7fdccebf5cd2b8a9d87Argyrios Kyrtzidis        updateCursorAnnotation(Cursors[TokIdx], Cursor);
67007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
6701c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis      if (finished)
6702c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis        break;
6703c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis      goto reprocess;
67047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
67057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
67067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
67077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
67087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// This gets run a separate thread to avoid stack blowout.
670987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarstatic void clang_annotateTokensImpl(CXTranslationUnit TU, ASTUnit *CXXUnit,
671087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                                     CXToken *Tokens, unsigned NumTokens,
671187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                                     CXCursor *Cursors) {
67128c718e7d87018919b5b84b0d545fe477b2d532d1Dmitri Gribenko  CIndexer *CXXIdx = TU->CIdx;
67137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (CXXIdx->isOptEnabled(CXGlobalOpt_ThreadBackgroundPriorityForEditing))
67147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    setThreadBackgroundPriority();
67157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
67167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Determine the region of interest, which contains all of the tokens.
67177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  SourceRange RegionOfInterest;
67187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  RegionOfInterest.setBegin(
67197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    cxloc::translateSourceLocation(clang_getTokenLocation(TU, Tokens[0])));
67207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  RegionOfInterest.setEnd(
67217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    cxloc::translateSourceLocation(clang_getTokenLocation(TU,
67227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                                         Tokens[NumTokens-1])));
67237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
67247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Relex the tokens within the source range to look for preprocessing
67257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // directives.
6726c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis  annotatePreprocessorTokens(TU, RegionOfInterest, Cursors, Tokens, NumTokens);
672782064213e9ef308e9a929ecfb31f4698a834ecddArgyrios Kyrtzidis
672882064213e9ef308e9a929ecfb31f4698a834ecddArgyrios Kyrtzidis  // If begin location points inside a macro argument, set it to the expansion
672982064213e9ef308e9a929ecfb31f4698a834ecddArgyrios Kyrtzidis  // location so we can have the full context when annotating semantically.
673082064213e9ef308e9a929ecfb31f4698a834ecddArgyrios Kyrtzidis  {
673182064213e9ef308e9a929ecfb31f4698a834ecddArgyrios Kyrtzidis    SourceManager &SM = CXXUnit->getSourceManager();
673282064213e9ef308e9a929ecfb31f4698a834ecddArgyrios Kyrtzidis    SourceLocation Loc =
673382064213e9ef308e9a929ecfb31f4698a834ecddArgyrios Kyrtzidis        SM.getMacroArgExpandedLocation(RegionOfInterest.getBegin());
673482064213e9ef308e9a929ecfb31f4698a834ecddArgyrios Kyrtzidis    if (Loc.isMacroID())
673582064213e9ef308e9a929ecfb31f4698a834ecddArgyrios Kyrtzidis      RegionOfInterest.setBegin(SM.getExpansionLoc(Loc));
673682064213e9ef308e9a929ecfb31f4698a834ecddArgyrios Kyrtzidis  }
673782064213e9ef308e9a929ecfb31f4698a834ecddArgyrios Kyrtzidis
67387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (CXXUnit->getPreprocessor().getPreprocessingRecord()) {
67397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // Search and mark tokens that are macro argument expansions.
67407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    MarkMacroArgTokensVisitor Visitor(CXXUnit->getSourceManager(),
67417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                      Tokens, NumTokens);
67427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    CursorVisitor MacroArgMarker(TU,
67437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                 MarkMacroArgTokensVisitorDelegate, &Visitor,
67447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                 /*VisitPreprocessorLast=*/true,
67457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                 /*VisitIncludedEntities=*/false,
67467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                 RegionOfInterest);
67477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    MacroArgMarker.visitPreprocessedEntitiesInRegion();
67487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
67497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
67507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Annotate all of the source locations in the region of interest that map to
67517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // a specific cursor.
6752c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis  AnnotateTokensWorker W(Tokens, Cursors, NumTokens, TU, RegionOfInterest);
67537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
67547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // FIXME: We use a ridiculous stack size here because the data-recursion
67557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // algorithm uses a large stack frame than the non-data recursive version,
67567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // and AnnotationTokensWorker currently transforms the data-recursion
67577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // algorithm back into a traditional recursion by explicitly calling
67587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // VisitChildren().  We will need to remove this explicit recursive call.
67597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  W.AnnotateTokens();
67607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
67617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // If we ran into any entities that involve context-sensitive keywords,
67627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // take another pass through the tokens to mark them as such.
67637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (W.hasContextSensitiveKeywords()) {
67647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    for (unsigned I = 0; I != NumTokens; ++I) {
67657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (clang_getTokenKind(Tokens[I]) != CXToken_Identifier)
67667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        continue;
67677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
67687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (Cursors[I].kind == CXCursor_ObjCPropertyDecl) {
67697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        IdentifierInfo *II = static_cast<IdentifierInfo *>(Tokens[I].ptr_data);
6770e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko        if (const ObjCPropertyDecl *Property
67717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            = dyn_cast_or_null<ObjCPropertyDecl>(getCursorDecl(Cursors[I]))) {
67727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          if (Property->getPropertyAttributesAsWritten() != 0 &&
67737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei              llvm::StringSwitch<bool>(II->getName())
67747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei              .Case("readonly", true)
67757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei              .Case("assign", true)
67767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei              .Case("unsafe_unretained", true)
67777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei              .Case("readwrite", true)
67787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei              .Case("retain", true)
67797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei              .Case("copy", true)
67807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei              .Case("nonatomic", true)
67817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei              .Case("atomic", true)
67827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei              .Case("getter", true)
67837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei              .Case("setter", true)
67847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei              .Case("strong", true)
67857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei              .Case("weak", true)
67864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar              .Case("class", true)
67877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei              .Default(false))
67887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            Tokens[I].int_data[0] = CXToken_Keyword;
67897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        }
67907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        continue;
67917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      }
67927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
67937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (Cursors[I].kind == CXCursor_ObjCInstanceMethodDecl ||
67947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          Cursors[I].kind == CXCursor_ObjCClassMethodDecl) {
67957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        IdentifierInfo *II = static_cast<IdentifierInfo *>(Tokens[I].ptr_data);
67967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        if (llvm::StringSwitch<bool>(II->getName())
67977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            .Case("in", true)
67987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            .Case("out", true)
67997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            .Case("inout", true)
68007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            .Case("oneway", true)
68017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            .Case("bycopy", true)
68027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            .Case("byref", true)
68037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            .Default(false))
68047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          Tokens[I].int_data[0] = CXToken_Keyword;
68057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        continue;
68067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      }
68077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
68087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (Cursors[I].kind == CXCursor_CXXFinalAttr ||
68097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          Cursors[I].kind == CXCursor_CXXOverrideAttr) {
68107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        Tokens[I].int_data[0] = CXToken_Keyword;
68117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        continue;
68127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      }
68137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
68147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
68157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
68167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
68177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiextern "C" {
68187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
68197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid clang_annotateTokens(CXTranslationUnit TU,
68207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                          CXToken *Tokens, unsigned NumTokens,
68217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                          CXCursor *Cursors) {
6822651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (isNotUsableTU(TU)) {
6823651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    LOG_BAD_TU(TU);
6824651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return;
6825651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
6826651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (NumTokens == 0 || !Tokens || !Cursors) {
6827c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis    LOG_FUNC_SECTION { *Log << "<null input>"; }
68287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return;
6829c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  }
6830c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis
6831c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  LOG_FUNC_SECTION {
6832c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis    *Log << TU << ' ';
6833c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis    CXSourceLocation bloc = clang_getTokenLocation(TU, Tokens[0]);
6834c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis    CXSourceLocation eloc = clang_getTokenLocation(TU, Tokens[NumTokens-1]);
6835c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis    *Log << clang_getRange(bloc, eloc);
6836c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  }
68377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
68387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Any token we don't specifically annotate will have a NULL cursor.
68397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  CXCursor C = clang_getNullCursor();
68407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  for (unsigned I = 0; I != NumTokens; ++I)
68417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    Cursors[I] = C;
68427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
68435694feb5ccd6eb862cb600b55753cecc13794471Dmitri Gribenko  ASTUnit *CXXUnit = cxtu::getASTUnit(TU);
68447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!CXXUnit)
68457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return;
68467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
68477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  ASTUnit::ConcurrencyCheck Check(*CXXUnit);
684887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
684987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  auto AnnotateTokensImpl = [=]() {
685087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    clang_annotateTokensImpl(TU, CXXUnit, Tokens, NumTokens, Cursors);
685187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  };
68527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  llvm::CrashRecoveryContext CRC;
685387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  if (!RunSafely(CRC, AnnotateTokensImpl, GetSafetyThreadStackSize() * 2)) {
68547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    fprintf(stderr, "libclang: crash detected while annotating tokens\n");
68557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
68567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
68577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
68587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} // end: extern "C"
68597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
68607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----------------------------------------------------------------------===//
68617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// Operations for querying linkage of a cursor.
68627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----------------------------------------------------------------------===//
68637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
68647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiextern "C" {
68657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXLinkageKind clang_getCursorLinkage(CXCursor cursor) {
68667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!clang_isDeclaration(cursor.kind))
68677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return CXLinkage_Invalid;
68687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
6869e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko  const Decl *D = cxcursor::getCursorDecl(cursor);
6870e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko  if (const NamedDecl *ND = dyn_cast_or_null<NamedDecl>(D))
6871181e3ecc0907ae0103586a9f4db52241995a8267Rafael Espindola    switch (ND->getLinkageInternal()) {
6872a99ecbcc4c431d52df0b01539035ab5281d54656Rafael Espindola      case NoLinkage:
6873a99ecbcc4c431d52df0b01539035ab5281d54656Rafael Espindola      case VisibleNoLinkage: return CXLinkage_NoLinkage;
68747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      case InternalLinkage: return CXLinkage_Internal;
68757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      case UniqueExternalLinkage: return CXLinkage_UniqueExternal;
68767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      case ExternalLinkage: return CXLinkage_External;
68777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    };
68787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
68797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return CXLinkage_Invalid;
68807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
68817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} // end: extern "C"
68827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
68837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----------------------------------------------------------------------===//
688487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// Operations for querying visibility of a cursor.
688587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar//===----------------------------------------------------------------------===//
688687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
688787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarextern "C" {
688887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga NainarCXVisibilityKind clang_getCursorVisibility(CXCursor cursor) {
688987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  if (!clang_isDeclaration(cursor.kind))
689087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return CXVisibility_Invalid;
689187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
689287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  const Decl *D = cxcursor::getCursorDecl(cursor);
689387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  if (const NamedDecl *ND = dyn_cast_or_null<NamedDecl>(D))
689487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    switch (ND->getVisibility()) {
689587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      case HiddenVisibility: return CXVisibility_Hidden;
689687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      case ProtectedVisibility: return CXVisibility_Protected;
689787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      case DefaultVisibility: return CXVisibility_Default;
689887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    };
689987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
690087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return CXVisibility_Invalid;
690187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
690287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar} // end: extern "C"
690387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
690487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar//===----------------------------------------------------------------------===//
69057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// Operations for querying language of a cursor.
69067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----------------------------------------------------------------------===//
69077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
69087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic CXLanguageKind getDeclLanguage(const Decl *D) {
69097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!D)
69107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return CXLanguage_C;
69117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
69127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  switch (D->getKind()) {
69137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    default:
69147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      break;
69157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case Decl::ImplicitParam:
69167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case Decl::ObjCAtDefsField:
69177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case Decl::ObjCCategory:
69187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case Decl::ObjCCategoryImpl:
69197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case Decl::ObjCCompatibleAlias:
69207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case Decl::ObjCImplementation:
69217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case Decl::ObjCInterface:
69227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case Decl::ObjCIvar:
69237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case Decl::ObjCMethod:
69247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case Decl::ObjCProperty:
69257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case Decl::ObjCPropertyImpl:
69267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case Decl::ObjCProtocol:
692787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    case Decl::ObjCTypeParam:
69287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return CXLanguage_ObjC;
69297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case Decl::CXXConstructor:
69307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case Decl::CXXConversion:
69317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case Decl::CXXDestructor:
69327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case Decl::CXXMethod:
69337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case Decl::CXXRecord:
69347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case Decl::ClassTemplate:
69357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case Decl::ClassTemplatePartialSpecialization:
69367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case Decl::ClassTemplateSpecialization:
69377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case Decl::Friend:
69387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case Decl::FriendTemplate:
69397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case Decl::FunctionTemplate:
69407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case Decl::LinkageSpec:
69417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case Decl::Namespace:
69427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case Decl::NamespaceAlias:
69437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case Decl::NonTypeTemplateParm:
69447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case Decl::StaticAssert:
69457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case Decl::TemplateTemplateParm:
69467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case Decl::TemplateTypeParm:
69477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case Decl::UnresolvedUsingTypename:
69487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case Decl::UnresolvedUsingValue:
69497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case Decl::Using:
69507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case Decl::UsingDirective:
69517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case Decl::UsingShadow:
69527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return CXLanguage_CPlusPlus;
69537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
69547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
69557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return CXLanguage_C;
69567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
69577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
69587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiextern "C" {
69592bf1c0127382709a935ce87646c0662def3a0707Argyrios Kyrtzidis
69602bf1c0127382709a935ce87646c0662def3a0707Argyrios Kyrtzidisstatic CXAvailabilityKind getCursorAvailabilityForDecl(const Decl *D) {
69612bf1c0127382709a935ce87646c0662def3a0707Argyrios Kyrtzidis  if (isa<FunctionDecl>(D) && cast<FunctionDecl>(D)->isDeleted())
696287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return CXAvailability_NotAvailable;
69637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
69642bf1c0127382709a935ce87646c0662def3a0707Argyrios Kyrtzidis  switch (D->getAvailability()) {
69652bf1c0127382709a935ce87646c0662def3a0707Argyrios Kyrtzidis  case AR_Available:
69662bf1c0127382709a935ce87646c0662def3a0707Argyrios Kyrtzidis  case AR_NotYetIntroduced:
69672bf1c0127382709a935ce87646c0662def3a0707Argyrios Kyrtzidis    if (const EnumConstantDecl *EnumConst = dyn_cast<EnumConstantDecl>(D))
6968f0598303822047e6b9ad327ffce929c1e61fc065Benjamin Kramer      return getCursorAvailabilityForDecl(
6969f0598303822047e6b9ad327ffce929c1e61fc065Benjamin Kramer          cast<Decl>(EnumConst->getDeclContext()));
69702bf1c0127382709a935ce87646c0662def3a0707Argyrios Kyrtzidis    return CXAvailability_Available;
69717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
69722bf1c0127382709a935ce87646c0662def3a0707Argyrios Kyrtzidis  case AR_Deprecated:
69732bf1c0127382709a935ce87646c0662def3a0707Argyrios Kyrtzidis    return CXAvailability_Deprecated;
69747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
69752bf1c0127382709a935ce87646c0662def3a0707Argyrios Kyrtzidis  case AR_Unavailable:
69762bf1c0127382709a935ce87646c0662def3a0707Argyrios Kyrtzidis    return CXAvailability_NotAvailable;
69772bf1c0127382709a935ce87646c0662def3a0707Argyrios Kyrtzidis  }
6978f0598303822047e6b9ad327ffce929c1e61fc065Benjamin Kramer
6979f0598303822047e6b9ad327ffce929c1e61fc065Benjamin Kramer  llvm_unreachable("Unknown availability kind!");
69802bf1c0127382709a935ce87646c0662def3a0707Argyrios Kyrtzidis}
69812bf1c0127382709a935ce87646c0662def3a0707Argyrios Kyrtzidis
69822bf1c0127382709a935ce87646c0662def3a0707Argyrios Kyrtzidisenum CXAvailabilityKind clang_getCursorAvailability(CXCursor cursor) {
69832bf1c0127382709a935ce87646c0662def3a0707Argyrios Kyrtzidis  if (clang_isDeclaration(cursor.kind))
69842bf1c0127382709a935ce87646c0662def3a0707Argyrios Kyrtzidis    if (const Decl *D = cxcursor::getCursorDecl(cursor))
69852bf1c0127382709a935ce87646c0662def3a0707Argyrios Kyrtzidis      return getCursorAvailabilityForDecl(D);
69867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
69877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return CXAvailability_Available;
69887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
69897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
69907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic CXVersion convertVersion(VersionTuple In) {
69917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  CXVersion Out = { -1, -1, -1 };
69927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (In.empty())
69937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return Out;
69947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
69957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  Out.Major = In.getMajor();
69967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
69974a3012d4dd9748b18b53b90e855989d98308f990NAKAMURA Takumi  Optional<unsigned> Minor = In.getMinor();
69984a3012d4dd9748b18b53b90e855989d98308f990NAKAMURA Takumi  if (Minor.hasValue())
69997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    Out.Minor = *Minor;
70007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  else
70017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return Out;
70027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
70034a3012d4dd9748b18b53b90e855989d98308f990NAKAMURA Takumi  Optional<unsigned> Subminor = In.getSubminor();
70044a3012d4dd9748b18b53b90e855989d98308f990NAKAMURA Takumi  if (Subminor.hasValue())
70057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    Out.Subminor = *Subminor;
70067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
70077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return Out;
70087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
70092bf1c0127382709a935ce87646c0662def3a0707Argyrios Kyrtzidis
70102bf1c0127382709a935ce87646c0662def3a0707Argyrios Kyrtzidisstatic int getCursorPlatformAvailabilityForDecl(const Decl *D,
70112bf1c0127382709a935ce87646c0662def3a0707Argyrios Kyrtzidis                                                int *always_deprecated,
70122bf1c0127382709a935ce87646c0662def3a0707Argyrios Kyrtzidis                                                CXString *deprecated_message,
70132bf1c0127382709a935ce87646c0662def3a0707Argyrios Kyrtzidis                                                int *always_unavailable,
70142bf1c0127382709a935ce87646c0662def3a0707Argyrios Kyrtzidis                                                CXString *unavailable_message,
70152bf1c0127382709a935ce87646c0662def3a0707Argyrios Kyrtzidis                                           CXPlatformAvailability *availability,
70162bf1c0127382709a935ce87646c0662def3a0707Argyrios Kyrtzidis                                                int availability_size) {
70172bf1c0127382709a935ce87646c0662def3a0707Argyrios Kyrtzidis  bool HadAvailAttr = false;
70187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  int N = 0;
7019651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  for (auto A : D->attrs()) {
7020651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (DeprecatedAttr *Deprecated = dyn_cast<DeprecatedAttr>(A)) {
70212bf1c0127382709a935ce87646c0662def3a0707Argyrios Kyrtzidis      HadAvailAttr = true;
70227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (always_deprecated)
70237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        *always_deprecated = 1;
70246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      if (deprecated_message) {
70256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines        clang_disposeString(*deprecated_message);
70265595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko        *deprecated_message = cxstring::createDup(Deprecated->getMessage());
70276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      }
70287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      continue;
70297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
70307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
7031651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (UnavailableAttr *Unavailable = dyn_cast<UnavailableAttr>(A)) {
70322bf1c0127382709a935ce87646c0662def3a0707Argyrios Kyrtzidis      HadAvailAttr = true;
70337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (always_unavailable)
70347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        *always_unavailable = 1;
70357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (unavailable_message) {
70366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines        clang_disposeString(*unavailable_message);
70375595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko        *unavailable_message = cxstring::createDup(Unavailable->getMessage());
70387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      }
70397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      continue;
70407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
70417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
7042651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (AvailabilityAttr *Avail = dyn_cast<AvailabilityAttr>(A)) {
70432bf1c0127382709a935ce87646c0662def3a0707Argyrios Kyrtzidis      HadAvailAttr = true;
70447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (N < availability_size) {
70457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        availability[N].Platform
70465595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko          = cxstring::createDup(Avail->getPlatform()->getName());
70477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        availability[N].Introduced = convertVersion(Avail->getIntroduced());
70487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        availability[N].Deprecated = convertVersion(Avail->getDeprecated());
70497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        availability[N].Obsoleted = convertVersion(Avail->getObsoleted());
70507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        availability[N].Unavailable = Avail->getUnavailable();
70515595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko        availability[N].Message = cxstring::createDup(Avail->getMessage());
70527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      }
70537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      ++N;
70547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
70557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
70562bf1c0127382709a935ce87646c0662def3a0707Argyrios Kyrtzidis
70572bf1c0127382709a935ce87646c0662def3a0707Argyrios Kyrtzidis  if (!HadAvailAttr)
70582bf1c0127382709a935ce87646c0662def3a0707Argyrios Kyrtzidis    if (const EnumConstantDecl *EnumConst = dyn_cast<EnumConstantDecl>(D))
70592bf1c0127382709a935ce87646c0662def3a0707Argyrios Kyrtzidis      return getCursorPlatformAvailabilityForDecl(
70602bf1c0127382709a935ce87646c0662def3a0707Argyrios Kyrtzidis                                        cast<Decl>(EnumConst->getDeclContext()),
70612bf1c0127382709a935ce87646c0662def3a0707Argyrios Kyrtzidis                                                  always_deprecated,
70622bf1c0127382709a935ce87646c0662def3a0707Argyrios Kyrtzidis                                                  deprecated_message,
70632bf1c0127382709a935ce87646c0662def3a0707Argyrios Kyrtzidis                                                  always_unavailable,
70642bf1c0127382709a935ce87646c0662def3a0707Argyrios Kyrtzidis                                                  unavailable_message,
70652bf1c0127382709a935ce87646c0662def3a0707Argyrios Kyrtzidis                                                  availability,
70662bf1c0127382709a935ce87646c0662def3a0707Argyrios Kyrtzidis                                                  availability_size);
70677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
70687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return N;
70697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
70702bf1c0127382709a935ce87646c0662def3a0707Argyrios Kyrtzidis
70712bf1c0127382709a935ce87646c0662def3a0707Argyrios Kyrtzidisint clang_getCursorPlatformAvailability(CXCursor cursor,
70722bf1c0127382709a935ce87646c0662def3a0707Argyrios Kyrtzidis                                        int *always_deprecated,
70732bf1c0127382709a935ce87646c0662def3a0707Argyrios Kyrtzidis                                        CXString *deprecated_message,
70742bf1c0127382709a935ce87646c0662def3a0707Argyrios Kyrtzidis                                        int *always_unavailable,
70752bf1c0127382709a935ce87646c0662def3a0707Argyrios Kyrtzidis                                        CXString *unavailable_message,
70762bf1c0127382709a935ce87646c0662def3a0707Argyrios Kyrtzidis                                        CXPlatformAvailability *availability,
70772bf1c0127382709a935ce87646c0662def3a0707Argyrios Kyrtzidis                                        int availability_size) {
70782bf1c0127382709a935ce87646c0662def3a0707Argyrios Kyrtzidis  if (always_deprecated)
70792bf1c0127382709a935ce87646c0662def3a0707Argyrios Kyrtzidis    *always_deprecated = 0;
70802bf1c0127382709a935ce87646c0662def3a0707Argyrios Kyrtzidis  if (deprecated_message)
70812bf1c0127382709a935ce87646c0662def3a0707Argyrios Kyrtzidis    *deprecated_message = cxstring::createEmpty();
70822bf1c0127382709a935ce87646c0662def3a0707Argyrios Kyrtzidis  if (always_unavailable)
70832bf1c0127382709a935ce87646c0662def3a0707Argyrios Kyrtzidis    *always_unavailable = 0;
70842bf1c0127382709a935ce87646c0662def3a0707Argyrios Kyrtzidis  if (unavailable_message)
70852bf1c0127382709a935ce87646c0662def3a0707Argyrios Kyrtzidis    *unavailable_message = cxstring::createEmpty();
70862bf1c0127382709a935ce87646c0662def3a0707Argyrios Kyrtzidis
70872bf1c0127382709a935ce87646c0662def3a0707Argyrios Kyrtzidis  if (!clang_isDeclaration(cursor.kind))
70882bf1c0127382709a935ce87646c0662def3a0707Argyrios Kyrtzidis    return 0;
70892bf1c0127382709a935ce87646c0662def3a0707Argyrios Kyrtzidis
70902bf1c0127382709a935ce87646c0662def3a0707Argyrios Kyrtzidis  const Decl *D = cxcursor::getCursorDecl(cursor);
70912bf1c0127382709a935ce87646c0662def3a0707Argyrios Kyrtzidis  if (!D)
70922bf1c0127382709a935ce87646c0662def3a0707Argyrios Kyrtzidis    return 0;
70932bf1c0127382709a935ce87646c0662def3a0707Argyrios Kyrtzidis
70942bf1c0127382709a935ce87646c0662def3a0707Argyrios Kyrtzidis  return getCursorPlatformAvailabilityForDecl(D, always_deprecated,
70952bf1c0127382709a935ce87646c0662def3a0707Argyrios Kyrtzidis                                              deprecated_message,
70962bf1c0127382709a935ce87646c0662def3a0707Argyrios Kyrtzidis                                              always_unavailable,
70972bf1c0127382709a935ce87646c0662def3a0707Argyrios Kyrtzidis                                              unavailable_message,
70982bf1c0127382709a935ce87646c0662def3a0707Argyrios Kyrtzidis                                              availability,
70992bf1c0127382709a935ce87646c0662def3a0707Argyrios Kyrtzidis                                              availability_size);
71002bf1c0127382709a935ce87646c0662def3a0707Argyrios Kyrtzidis}
71017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
71027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid clang_disposeCXPlatformAvailability(CXPlatformAvailability *availability) {
71037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  clang_disposeString(availability->Platform);
71047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  clang_disposeString(availability->Message);
71057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
71067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
71077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXLanguageKind clang_getCursorLanguage(CXCursor cursor) {
71087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (clang_isDeclaration(cursor.kind))
71097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return getDeclLanguage(cxcursor::getCursorDecl(cursor));
71107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
71117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return CXLanguage_Invalid;
71127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
71137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
71147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /// \brief If the given cursor is the "templated" declaration
71157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /// descibing a class or function template, return the class or
71167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /// function template.
7117e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenkostatic const Decl *maybeGetTemplateCursor(const Decl *D) {
71187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!D)
7119c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    return nullptr;
71207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
7121e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko  if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D))
71227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (FunctionTemplateDecl *FunTmpl = FD->getDescribedFunctionTemplate())
71237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return FunTmpl;
71247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
7125e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko  if (const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(D))
71267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    if (ClassTemplateDecl *ClassTmpl = RD->getDescribedClassTemplate())
71277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return ClassTmpl;
71287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
71297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return D;
71307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
71317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
7132176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
7133176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesenum CX_StorageClass clang_Cursor_getStorageClass(CXCursor C) {
7134176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  StorageClass sc = SC_None;
7135176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  const Decl *D = getCursorDecl(C);
7136176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  if (D) {
7137176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
7138176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      sc = FD->getStorageClass();
7139176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    } else if (const VarDecl *VD = dyn_cast<VarDecl>(D)) {
7140176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      sc = VD->getStorageClass();
7141176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    } else {
7142176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      return CX_SC_Invalid;
7143176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
7144176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  } else {
7145176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    return CX_SC_Invalid;
7146176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
7147176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  switch (sc) {
7148176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  case SC_None:
7149176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    return CX_SC_None;
7150176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  case SC_Extern:
7151176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    return CX_SC_Extern;
7152176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  case SC_Static:
7153176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    return CX_SC_Static;
7154176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  case SC_PrivateExtern:
7155176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    return CX_SC_PrivateExtern;
7156176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  case SC_Auto:
7157176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    return CX_SC_Auto;
7158176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  case SC_Register:
7159176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    return CX_SC_Register;
7160176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
7161176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  llvm_unreachable("Unhandled storage class!");
7162176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
7163176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
71647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXCursor clang_getCursorSemanticParent(CXCursor cursor) {
71657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (clang_isDeclaration(cursor.kind)) {
7166e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko    if (const Decl *D = getCursorDecl(cursor)) {
7167e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko      const DeclContext *DC = D->getDeclContext();
71687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (!DC)
71697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        return clang_getNullCursor();
71707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
71717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return MakeCXCursor(maybeGetTemplateCursor(cast<Decl>(DC)),
71727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                          getCursorTU(cursor));
71737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
71747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
71757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
71767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (clang_isStatement(cursor.kind) || clang_isExpression(cursor.kind)) {
7177e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko    if (const Decl *D = getCursorDecl(cursor))
71787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return MakeCXCursor(D, getCursorTU(cursor));
71797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
71807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
71817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return clang_getNullCursor();
71827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
71837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
71847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXCursor clang_getCursorLexicalParent(CXCursor cursor) {
71857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (clang_isDeclaration(cursor.kind)) {
7186e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko    if (const Decl *D = getCursorDecl(cursor)) {
7187e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko      const DeclContext *DC = D->getLexicalDeclContext();
71887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      if (!DC)
71897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei        return clang_getNullCursor();
71907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
71917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return MakeCXCursor(maybeGetTemplateCursor(cast<Decl>(DC)),
71927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                          getCursorTU(cursor));
71937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    }
71947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
71957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
71967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // FIXME: Note that we can't easily compute the lexical context of a
71977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // statement or expression, so we return nothing.
71987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return clang_getNullCursor();
71997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
72007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
72017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXFile clang_getIncludedFile(CXCursor cursor) {
72027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (cursor.kind != CXCursor_InclusionDirective)
7203c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    return nullptr;
7204c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
720567812b2f94f4b5e7d2596db1705ffa1149ddc45aDmitri Gribenko  const InclusionDirective *ID = getCursorInclusionDirective(cursor);
7206e4ea879fe73581bc70a9bfbfddc7ca06b5c0768bDmitri Gribenko  return const_cast<FileEntry *>(ID->getFile());
72077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
72087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
72099ee6a66d19aacc35397bbdc4fd535e3944301856Argyrios Kyrtzidisunsigned clang_Cursor_getObjCPropertyAttributes(CXCursor C, unsigned reserved) {
72109ee6a66d19aacc35397bbdc4fd535e3944301856Argyrios Kyrtzidis  if (C.kind != CXCursor_ObjCPropertyDecl)
72119ee6a66d19aacc35397bbdc4fd535e3944301856Argyrios Kyrtzidis    return CXObjCPropertyAttr_noattr;
72129ee6a66d19aacc35397bbdc4fd535e3944301856Argyrios Kyrtzidis
72139ee6a66d19aacc35397bbdc4fd535e3944301856Argyrios Kyrtzidis  unsigned Result = CXObjCPropertyAttr_noattr;
72149ee6a66d19aacc35397bbdc4fd535e3944301856Argyrios Kyrtzidis  const ObjCPropertyDecl *PD = dyn_cast<ObjCPropertyDecl>(getCursorDecl(C));
72159ee6a66d19aacc35397bbdc4fd535e3944301856Argyrios Kyrtzidis  ObjCPropertyDecl::PropertyAttributeKind Attr =
72169ee6a66d19aacc35397bbdc4fd535e3944301856Argyrios Kyrtzidis      PD->getPropertyAttributesAsWritten();
72179ee6a66d19aacc35397bbdc4fd535e3944301856Argyrios Kyrtzidis
72189ee6a66d19aacc35397bbdc4fd535e3944301856Argyrios Kyrtzidis#define SET_CXOBJCPROP_ATTR(A) \
72199ee6a66d19aacc35397bbdc4fd535e3944301856Argyrios Kyrtzidis  if (Attr & ObjCPropertyDecl::OBJC_PR_##A) \
72209ee6a66d19aacc35397bbdc4fd535e3944301856Argyrios Kyrtzidis    Result |= CXObjCPropertyAttr_##A
72219ee6a66d19aacc35397bbdc4fd535e3944301856Argyrios Kyrtzidis  SET_CXOBJCPROP_ATTR(readonly);
72229ee6a66d19aacc35397bbdc4fd535e3944301856Argyrios Kyrtzidis  SET_CXOBJCPROP_ATTR(getter);
72239ee6a66d19aacc35397bbdc4fd535e3944301856Argyrios Kyrtzidis  SET_CXOBJCPROP_ATTR(assign);
72249ee6a66d19aacc35397bbdc4fd535e3944301856Argyrios Kyrtzidis  SET_CXOBJCPROP_ATTR(readwrite);
72259ee6a66d19aacc35397bbdc4fd535e3944301856Argyrios Kyrtzidis  SET_CXOBJCPROP_ATTR(retain);
72269ee6a66d19aacc35397bbdc4fd535e3944301856Argyrios Kyrtzidis  SET_CXOBJCPROP_ATTR(copy);
72279ee6a66d19aacc35397bbdc4fd535e3944301856Argyrios Kyrtzidis  SET_CXOBJCPROP_ATTR(nonatomic);
72289ee6a66d19aacc35397bbdc4fd535e3944301856Argyrios Kyrtzidis  SET_CXOBJCPROP_ATTR(setter);
72299ee6a66d19aacc35397bbdc4fd535e3944301856Argyrios Kyrtzidis  SET_CXOBJCPROP_ATTR(atomic);
72309ee6a66d19aacc35397bbdc4fd535e3944301856Argyrios Kyrtzidis  SET_CXOBJCPROP_ATTR(weak);
72319ee6a66d19aacc35397bbdc4fd535e3944301856Argyrios Kyrtzidis  SET_CXOBJCPROP_ATTR(strong);
72329ee6a66d19aacc35397bbdc4fd535e3944301856Argyrios Kyrtzidis  SET_CXOBJCPROP_ATTR(unsafe_unretained);
72334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  SET_CXOBJCPROP_ATTR(class);
72349ee6a66d19aacc35397bbdc4fd535e3944301856Argyrios Kyrtzidis#undef SET_CXOBJCPROP_ATTR
72359ee6a66d19aacc35397bbdc4fd535e3944301856Argyrios Kyrtzidis
72369ee6a66d19aacc35397bbdc4fd535e3944301856Argyrios Kyrtzidis  return Result;
72379ee6a66d19aacc35397bbdc4fd535e3944301856Argyrios Kyrtzidis}
72389ee6a66d19aacc35397bbdc4fd535e3944301856Argyrios Kyrtzidis
723938dbad233bfc7906e38e028707ffe5925b9ca46cArgyrios Kyrtzidisunsigned clang_Cursor_getObjCDeclQualifiers(CXCursor C) {
724038dbad233bfc7906e38e028707ffe5925b9ca46cArgyrios Kyrtzidis  if (!clang_isDeclaration(C.kind))
724138dbad233bfc7906e38e028707ffe5925b9ca46cArgyrios Kyrtzidis    return CXObjCDeclQualifier_None;
724238dbad233bfc7906e38e028707ffe5925b9ca46cArgyrios Kyrtzidis
724338dbad233bfc7906e38e028707ffe5925b9ca46cArgyrios Kyrtzidis  Decl::ObjCDeclQualifier QT = Decl::OBJC_TQ_None;
724438dbad233bfc7906e38e028707ffe5925b9ca46cArgyrios Kyrtzidis  const Decl *D = getCursorDecl(C);
724538dbad233bfc7906e38e028707ffe5925b9ca46cArgyrios Kyrtzidis  if (const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(D))
724638dbad233bfc7906e38e028707ffe5925b9ca46cArgyrios Kyrtzidis    QT = MD->getObjCDeclQualifier();
724738dbad233bfc7906e38e028707ffe5925b9ca46cArgyrios Kyrtzidis  else if (const ParmVarDecl *PD = dyn_cast<ParmVarDecl>(D))
724838dbad233bfc7906e38e028707ffe5925b9ca46cArgyrios Kyrtzidis    QT = PD->getObjCDeclQualifier();
724938dbad233bfc7906e38e028707ffe5925b9ca46cArgyrios Kyrtzidis  if (QT == Decl::OBJC_TQ_None)
725038dbad233bfc7906e38e028707ffe5925b9ca46cArgyrios Kyrtzidis    return CXObjCDeclQualifier_None;
725138dbad233bfc7906e38e028707ffe5925b9ca46cArgyrios Kyrtzidis
725238dbad233bfc7906e38e028707ffe5925b9ca46cArgyrios Kyrtzidis  unsigned Result = CXObjCDeclQualifier_None;
725338dbad233bfc7906e38e028707ffe5925b9ca46cArgyrios Kyrtzidis  if (QT & Decl::OBJC_TQ_In) Result |= CXObjCDeclQualifier_In;
725438dbad233bfc7906e38e028707ffe5925b9ca46cArgyrios Kyrtzidis  if (QT & Decl::OBJC_TQ_Inout) Result |= CXObjCDeclQualifier_Inout;
725538dbad233bfc7906e38e028707ffe5925b9ca46cArgyrios Kyrtzidis  if (QT & Decl::OBJC_TQ_Out) Result |= CXObjCDeclQualifier_Out;
725638dbad233bfc7906e38e028707ffe5925b9ca46cArgyrios Kyrtzidis  if (QT & Decl::OBJC_TQ_Bycopy) Result |= CXObjCDeclQualifier_Bycopy;
725738dbad233bfc7906e38e028707ffe5925b9ca46cArgyrios Kyrtzidis  if (QT & Decl::OBJC_TQ_Byref) Result |= CXObjCDeclQualifier_Byref;
725838dbad233bfc7906e38e028707ffe5925b9ca46cArgyrios Kyrtzidis  if (QT & Decl::OBJC_TQ_Oneway) Result |= CXObjCDeclQualifier_Oneway;
725938dbad233bfc7906e38e028707ffe5925b9ca46cArgyrios Kyrtzidis
726038dbad233bfc7906e38e028707ffe5925b9ca46cArgyrios Kyrtzidis  return Result;
726138dbad233bfc7906e38e028707ffe5925b9ca46cArgyrios Kyrtzidis}
726238dbad233bfc7906e38e028707ffe5925b9ca46cArgyrios Kyrtzidis
7263514afc7255a2aaa88498b3374c944a2c497c1c55Argyrios Kyrtzidisunsigned clang_Cursor_isObjCOptional(CXCursor C) {
7264514afc7255a2aaa88498b3374c944a2c497c1c55Argyrios Kyrtzidis  if (!clang_isDeclaration(C.kind))
7265514afc7255a2aaa88498b3374c944a2c497c1c55Argyrios Kyrtzidis    return 0;
7266514afc7255a2aaa88498b3374c944a2c497c1c55Argyrios Kyrtzidis
7267514afc7255a2aaa88498b3374c944a2c497c1c55Argyrios Kyrtzidis  const Decl *D = getCursorDecl(C);
7268514afc7255a2aaa88498b3374c944a2c497c1c55Argyrios Kyrtzidis  if (const ObjCPropertyDecl *PD = dyn_cast<ObjCPropertyDecl>(D))
7269514afc7255a2aaa88498b3374c944a2c497c1c55Argyrios Kyrtzidis    return PD->getPropertyImplementation() == ObjCPropertyDecl::Optional;
7270514afc7255a2aaa88498b3374c944a2c497c1c55Argyrios Kyrtzidis  if (const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(D))
7271514afc7255a2aaa88498b3374c944a2c497c1c55Argyrios Kyrtzidis    return MD->getImplementationControl() == ObjCMethodDecl::Optional;
7272514afc7255a2aaa88498b3374c944a2c497c1c55Argyrios Kyrtzidis
7273514afc7255a2aaa88498b3374c944a2c497c1c55Argyrios Kyrtzidis  return 0;
7274514afc7255a2aaa88498b3374c944a2c497c1c55Argyrios Kyrtzidis}
7275514afc7255a2aaa88498b3374c944a2c497c1c55Argyrios Kyrtzidis
727680e1acaeb7040548cb494e609b120b134e22a193Argyrios Kyrtzidisunsigned clang_Cursor_isVariadic(CXCursor C) {
727780e1acaeb7040548cb494e609b120b134e22a193Argyrios Kyrtzidis  if (!clang_isDeclaration(C.kind))
727880e1acaeb7040548cb494e609b120b134e22a193Argyrios Kyrtzidis    return 0;
727980e1acaeb7040548cb494e609b120b134e22a193Argyrios Kyrtzidis
728080e1acaeb7040548cb494e609b120b134e22a193Argyrios Kyrtzidis  const Decl *D = getCursorDecl(C);
728180e1acaeb7040548cb494e609b120b134e22a193Argyrios Kyrtzidis  if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D))
728280e1acaeb7040548cb494e609b120b134e22a193Argyrios Kyrtzidis    return FD->isVariadic();
728380e1acaeb7040548cb494e609b120b134e22a193Argyrios Kyrtzidis  if (const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(D))
728480e1acaeb7040548cb494e609b120b134e22a193Argyrios Kyrtzidis    return MD->isVariadic();
728580e1acaeb7040548cb494e609b120b134e22a193Argyrios Kyrtzidis
728680e1acaeb7040548cb494e609b120b134e22a193Argyrios Kyrtzidis  return 0;
728780e1acaeb7040548cb494e609b120b134e22a193Argyrios Kyrtzidis}
728880e1acaeb7040548cb494e609b120b134e22a193Argyrios Kyrtzidis
72897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXSourceRange clang_Cursor_getCommentRange(CXCursor C) {
72907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!clang_isDeclaration(C.kind))
72917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return clang_getNullRange();
72927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
72937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  const Decl *D = getCursorDecl(C);
72947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  ASTContext &Context = getCursorContext(C);
72957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  const RawComment *RC = Context.getRawCommentForAnyRedecl(D);
72967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!RC)
72977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return clang_getNullRange();
72987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
72997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return cxloc::translateSourceRange(Context, RC->getSourceRange());
73007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
73017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
73027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXString clang_Cursor_getRawCommentText(CXCursor C) {
73037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!clang_isDeclaration(C.kind))
7304dad4c1a9ac4ef1aa591ac2ef20dc4c30d96f9f2aDmitri Gribenko    return cxstring::createNull();
73057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
73067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  const Decl *D = getCursorDecl(C);
73077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  ASTContext &Context = getCursorContext(C);
73087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  const RawComment *RC = Context.getRawCommentForAnyRedecl(D);
73097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  StringRef RawText = RC ? RC->getRawText(Context.getSourceManager()) :
73107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                           StringRef();
73117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
73127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // Don't duplicate the string because RawText points directly into source
73137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // code.
73145595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko  return cxstring::createRef(RawText);
73157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
73167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
73177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXString clang_Cursor_getBriefCommentText(CXCursor C) {
73187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!clang_isDeclaration(C.kind))
7319dad4c1a9ac4ef1aa591ac2ef20dc4c30d96f9f2aDmitri Gribenko    return cxstring::createNull();
73207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
73217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  const Decl *D = getCursorDecl(C);
73227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  const ASTContext &Context = getCursorContext(C);
73237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  const RawComment *RC = Context.getRawCommentForAnyRedecl(D);
73247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
73257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (RC) {
73267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    StringRef BriefText = RC->getBriefText(Context);
73277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
73287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // Don't duplicate the string because RawComment ensures that this memory
73297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    // will not go away.
73305595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko    return cxstring::createRef(BriefText);
73317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
73327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
7333dad4c1a9ac4ef1aa591ac2ef20dc4c30d96f9f2aDmitri Gribenko  return cxstring::createNull();
73347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
73357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
73367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXModule clang_Cursor_getModule(CXCursor C) {
73377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (C.kind == CXCursor_ModuleImportDecl) {
7338e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko    if (const ImportDecl *ImportD =
7339e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko            dyn_cast_or_null<ImportDecl>(getCursorDecl(C)))
73407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      return ImportD->getImportedModule();
73417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
73427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
7343c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  return nullptr;
73447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
73457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
73466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesCXModule clang_getModuleForFile(CXTranslationUnit TU, CXFile File) {
73476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (isNotUsableTU(TU)) {
73486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    LOG_BAD_TU(TU);
73496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    return nullptr;
73506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  }
73516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (!File)
73526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    return nullptr;
73536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  FileEntry *FE = static_cast<FileEntry *>(File);
73546bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
73556bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  ASTUnit &Unit = *cxtu::getASTUnit(TU);
73566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  HeaderSearch &HS = Unit.getPreprocessor().getHeaderSearchInfo();
73576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  ModuleMap::KnownHeader Header = HS.findModuleForHeader(FE);
73586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
7359176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  return Header.getModule();
73606bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
73616bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
7362e858e667c14ce4a9df5a4bbae770a0a3a3c8723eArgyrios KyrtzidisCXFile clang_Module_getASTFile(CXModule CXMod) {
7363e858e667c14ce4a9df5a4bbae770a0a3a3c8723eArgyrios Kyrtzidis  if (!CXMod)
7364c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    return nullptr;
7365e858e667c14ce4a9df5a4bbae770a0a3a3c8723eArgyrios Kyrtzidis  Module *Mod = static_cast<Module*>(CXMod);
7366e858e667c14ce4a9df5a4bbae770a0a3a3c8723eArgyrios Kyrtzidis  return const_cast<FileEntry *>(Mod->getASTFile());
7367e858e667c14ce4a9df5a4bbae770a0a3a3c8723eArgyrios Kyrtzidis}
7368e858e667c14ce4a9df5a4bbae770a0a3a3c8723eArgyrios Kyrtzidis
73697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXModule clang_Module_getParent(CXModule CXMod) {
73707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!CXMod)
7371c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    return nullptr;
73727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  Module *Mod = static_cast<Module*>(CXMod);
73737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return Mod->Parent;
73747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
73757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
73767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXString clang_Module_getName(CXModule CXMod) {
73777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!CXMod)
7378dc66adb40ee871b4c578ba615f45d82476c7119eDmitri Gribenko    return cxstring::createEmpty();
73797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  Module *Mod = static_cast<Module*>(CXMod);
73805595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko  return cxstring::createDup(Mod->Name);
73817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
73827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
73837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXString clang_Module_getFullName(CXModule CXMod) {
73847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!CXMod)
7385dc66adb40ee871b4c578ba615f45d82476c7119eDmitri Gribenko    return cxstring::createEmpty();
73867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  Module *Mod = static_cast<Module*>(CXMod);
73875595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko  return cxstring::createDup(Mod->getFullModuleName());
73887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
73897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
73906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesint clang_Module_isSystem(CXModule CXMod) {
73916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (!CXMod)
73926bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    return 0;
73936bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  Module *Mod = static_cast<Module*>(CXMod);
73946bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return Mod->IsSystem;
73956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
73966bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
7397c1d22393628a145e54396c0ac66e9625d13a7658Argyrios Kyrtzidisunsigned clang_Module_getNumTopLevelHeaders(CXTranslationUnit TU,
7398c1d22393628a145e54396c0ac66e9625d13a7658Argyrios Kyrtzidis                                            CXModule CXMod) {
7399651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (isNotUsableTU(TU)) {
7400651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    LOG_BAD_TU(TU);
7401651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return 0;
7402651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
7403651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (!CXMod)
74047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return 0;
74057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  Module *Mod = static_cast<Module*>(CXMod);
7406c1d22393628a145e54396c0ac66e9625d13a7658Argyrios Kyrtzidis  FileManager &FileMgr = cxtu::getASTUnit(TU)->getFileManager();
7407c1d22393628a145e54396c0ac66e9625d13a7658Argyrios Kyrtzidis  ArrayRef<const FileEntry *> TopHeaders = Mod->getTopHeaders(FileMgr);
7408c1d22393628a145e54396c0ac66e9625d13a7658Argyrios Kyrtzidis  return TopHeaders.size();
74097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
74107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
7411c1d22393628a145e54396c0ac66e9625d13a7658Argyrios KyrtzidisCXFile clang_Module_getTopLevelHeader(CXTranslationUnit TU,
7412c1d22393628a145e54396c0ac66e9625d13a7658Argyrios Kyrtzidis                                      CXModule CXMod, unsigned Index) {
7413651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (isNotUsableTU(TU)) {
7414651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    LOG_BAD_TU(TU);
7415c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    return nullptr;
7416651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
7417651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (!CXMod)
7418c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    return nullptr;
74197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  Module *Mod = static_cast<Module*>(CXMod);
7420c1d22393628a145e54396c0ac66e9625d13a7658Argyrios Kyrtzidis  FileManager &FileMgr = cxtu::getASTUnit(TU)->getFileManager();
74217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
7422c1d22393628a145e54396c0ac66e9625d13a7658Argyrios Kyrtzidis  ArrayRef<const FileEntry *> TopHeaders = Mod->getTopHeaders(FileMgr);
7423c1d22393628a145e54396c0ac66e9625d13a7658Argyrios Kyrtzidis  if (Index < TopHeaders.size())
7424c1d22393628a145e54396c0ac66e9625d13a7658Argyrios Kyrtzidis    return const_cast<FileEntry *>(TopHeaders[Index]);
74257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
7426c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  return nullptr;
74277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
74287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
74297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} // end: extern "C"
74307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
74317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----------------------------------------------------------------------===//
74327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// C++ AST instrospection.
74337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----------------------------------------------------------------------===//
74347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
74357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiextern "C" {
74364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
74374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarunsigned clang_CXXConstructor_isDefaultConstructor(CXCursor C) {
74384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  if (!clang_isDeclaration(C.kind))
74394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return 0;
74404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
74414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  const Decl *D = cxcursor::getCursorDecl(C);
74424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  const CXXConstructorDecl *Constructor =
74434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      D ? dyn_cast_or_null<CXXConstructorDecl>(D->getAsFunction()) : nullptr;
74444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  return (Constructor && Constructor->isDefaultConstructor()) ? 1 : 0;
74454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
74464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
74474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarunsigned clang_CXXConstructor_isCopyConstructor(CXCursor C) {
74484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  if (!clang_isDeclaration(C.kind))
74494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return 0;
74504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
74514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  const Decl *D = cxcursor::getCursorDecl(C);
74524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  const CXXConstructorDecl *Constructor =
74534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      D ? dyn_cast_or_null<CXXConstructorDecl>(D->getAsFunction()) : nullptr;
74544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  return (Constructor && Constructor->isCopyConstructor()) ? 1 : 0;
74554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
74564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
74574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarunsigned clang_CXXConstructor_isMoveConstructor(CXCursor C) {
74584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  if (!clang_isDeclaration(C.kind))
74594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return 0;
74604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
74614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  const Decl *D = cxcursor::getCursorDecl(C);
74624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  const CXXConstructorDecl *Constructor =
74634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      D ? dyn_cast_or_null<CXXConstructorDecl>(D->getAsFunction()) : nullptr;
74644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  return (Constructor && Constructor->isMoveConstructor()) ? 1 : 0;
74654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
74664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
74674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarunsigned clang_CXXConstructor_isConvertingConstructor(CXCursor C) {
74684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  if (!clang_isDeclaration(C.kind))
74694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return 0;
74704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
74714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  const Decl *D = cxcursor::getCursorDecl(C);
74724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  const CXXConstructorDecl *Constructor =
74734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      D ? dyn_cast_or_null<CXXConstructorDecl>(D->getAsFunction()) : nullptr;
74744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // Passing 'false' excludes constructors marked 'explicit'.
74754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  return (Constructor && Constructor->isConvertingConstructor(false)) ? 1 : 0;
74764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
74774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
747887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarunsigned clang_CXXField_isMutable(CXCursor C) {
747987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  if (!clang_isDeclaration(C.kind))
748087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return 0;
748187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
748287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  if (const auto D = cxcursor::getCursorDecl(C))
748387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    if (const auto FD = dyn_cast_or_null<FieldDecl>(D))
748487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      return FD->isMutable() ? 1 : 0;
748587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return 0;
748687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
748787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
7488c965f76e02d536d875b1e9e3ea96f39452c6bfa2Dmitri Gribenkounsigned clang_CXXMethod_isPureVirtual(CXCursor C) {
7489c965f76e02d536d875b1e9e3ea96f39452c6bfa2Dmitri Gribenko  if (!clang_isDeclaration(C.kind))
7490c965f76e02d536d875b1e9e3ea96f39452c6bfa2Dmitri Gribenko    return 0;
7491c965f76e02d536d875b1e9e3ea96f39452c6bfa2Dmitri Gribenko
7492c965f76e02d536d875b1e9e3ea96f39452c6bfa2Dmitri Gribenko  const Decl *D = cxcursor::getCursorDecl(C);
7493651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  const CXXMethodDecl *Method =
7494c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines      D ? dyn_cast_or_null<CXXMethodDecl>(D->getAsFunction()) : nullptr;
7495c965f76e02d536d875b1e9e3ea96f39452c6bfa2Dmitri Gribenko  return (Method && Method->isVirtual() && Method->isPure()) ? 1 : 0;
7496c965f76e02d536d875b1e9e3ea96f39452c6bfa2Dmitri Gribenko}
7497c965f76e02d536d875b1e9e3ea96f39452c6bfa2Dmitri Gribenko
74986bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesunsigned clang_CXXMethod_isConst(CXCursor C) {
74996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (!clang_isDeclaration(C.kind))
75006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    return 0;
75016bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
75026bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  const Decl *D = cxcursor::getCursorDecl(C);
75036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  const CXXMethodDecl *Method =
7504c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines      D ? dyn_cast_or_null<CXXMethodDecl>(D->getAsFunction()) : nullptr;
75056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return (Method && (Method->getTypeQualifiers() & Qualifiers::Const)) ? 1 : 0;
75066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
75076bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
75084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarunsigned clang_CXXMethod_isDefaulted(CXCursor C) {
75094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  if (!clang_isDeclaration(C.kind))
75104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return 0;
75114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
75124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  const Decl *D = cxcursor::getCursorDecl(C);
75134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  const CXXMethodDecl *Method =
75144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      D ? dyn_cast_or_null<CXXMethodDecl>(D->getAsFunction()) : nullptr;
75154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  return (Method && Method->isDefaulted()) ? 1 : 0;
75164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
75174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
75187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiunsigned clang_CXXMethod_isStatic(CXCursor C) {
75197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!clang_isDeclaration(C.kind))
75207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return 0;
75217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
7522e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko  const Decl *D = cxcursor::getCursorDecl(C);
7523651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  const CXXMethodDecl *Method =
7524c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines      D ? dyn_cast_or_null<CXXMethodDecl>(D->getAsFunction()) : nullptr;
75257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return (Method && Method->isStatic()) ? 1 : 0;
75267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
75277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
75287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiunsigned clang_CXXMethod_isVirtual(CXCursor C) {
75297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!clang_isDeclaration(C.kind))
75307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return 0;
75317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
7532e22339c44bb28d71a2cc97c840d3da0c4bdb4909Dmitri Gribenko  const Decl *D = cxcursor::getCursorDecl(C);
7533651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  const CXXMethodDecl *Method =
7534c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines      D ? dyn_cast_or_null<CXXMethodDecl>(D->getAsFunction()) : nullptr;
75357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return (Method && Method->isVirtual()) ? 1 : 0;
75367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
75377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} // end: extern "C"
75387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
75397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----------------------------------------------------------------------===//
75407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// Attribute introspection.
75417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----------------------------------------------------------------------===//
75427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
75437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiextern "C" {
75447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXType clang_getIBOutletCollectionType(CXCursor C) {
75457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (C.kind != CXCursor_IBOutletCollectionAttr)
75467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return cxtype::MakeCXType(QualType(), cxcursor::getCursorTU(C));
75477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
75487d91438047450869d7b881e1c63868c4b52a3cc2Dmitri Gribenko  const IBOutletCollectionAttr *A =
75497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    cast<IBOutletCollectionAttr>(cxcursor::getCursorAttr(C));
75507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
75517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return cxtype::MakeCXType(A->getInterface(), cxcursor::getCursorTU(C));
75527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
75537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} // end: extern "C"
75547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
75557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----------------------------------------------------------------------===//
75567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// Inspecting memory usage.
75577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----------------------------------------------------------------------===//
75587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
75597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeitypedef std::vector<CXTUResourceUsageEntry> MemUsageEntries;
75607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
75617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic inline void createCXTUResourceUsageEntry(MemUsageEntries &entries,
75627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                              enum CXTUResourceUsageKind k,
75637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                              unsigned long amount) {
75647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  CXTUResourceUsageEntry entry = { k, amount };
75657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  entries.push_back(entry);
75667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
75677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
75687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiextern "C" {
75697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
75707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiconst char *clang_getTUResourceUsageName(CXTUResourceUsageKind kind) {
75717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  const char *str = "";
75727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  switch (kind) {
75737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXTUResourceUsage_AST:
75747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      str = "ASTContext: expressions, declarations, and types";
75757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      break;
75767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXTUResourceUsage_Identifiers:
75777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      str = "ASTContext: identifiers";
75787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      break;
75797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXTUResourceUsage_Selectors:
75807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      str = "ASTContext: selectors";
75817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      break;
75827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXTUResourceUsage_GlobalCompletionResults:
75837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      str = "Code completion: cached global results";
75847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      break;
75857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXTUResourceUsage_SourceManagerContentCache:
75867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      str = "SourceManager: content cache allocator";
75877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      break;
75887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXTUResourceUsage_AST_SideTables:
75897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      str = "ASTContext: side tables";
75907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      break;
75917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXTUResourceUsage_SourceManager_Membuffer_Malloc:
75927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      str = "SourceManager: malloc'ed memory buffers";
75937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      break;
75947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXTUResourceUsage_SourceManager_Membuffer_MMap:
75957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      str = "SourceManager: mmap'ed memory buffers";
75967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      break;
75977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXTUResourceUsage_ExternalASTSource_Membuffer_Malloc:
75987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      str = "ExternalASTSource: malloc'ed memory buffers";
75997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      break;
76007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXTUResourceUsage_ExternalASTSource_Membuffer_MMap:
76017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      str = "ExternalASTSource: mmap'ed memory buffers";
76027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      break;
76037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXTUResourceUsage_Preprocessor:
76047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      str = "Preprocessor: malloc'ed memory";
76057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      break;
76067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXTUResourceUsage_PreprocessingRecord:
76077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      str = "Preprocessor: PreprocessingRecord";
76087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      break;
76097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXTUResourceUsage_SourceManager_DataStructures:
76107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      str = "SourceManager: data structures and tables";
76117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      break;
76127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    case CXTUResourceUsage_Preprocessor_HeaderSearch:
76137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      str = "Preprocessor: header search tables";
76147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      break;
76157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
76167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return str;
76177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
76187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
76197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXTUResourceUsage clang_getCXTUResourceUsage(CXTranslationUnit TU) {
7620651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (isNotUsableTU(TU)) {
7621651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    LOG_BAD_TU(TU);
7622c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    CXTUResourceUsage usage = { (void*) nullptr, 0, nullptr };
76237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return usage;
76247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
76257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
76265694feb5ccd6eb862cb600b55753cecc13794471Dmitri Gribenko  ASTUnit *astUnit = cxtu::getASTUnit(TU);
7627651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  std::unique_ptr<MemUsageEntries> entries(new MemUsageEntries());
76287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  ASTContext &astContext = astUnit->getASTContext();
76297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
76307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // How much memory is used by AST nodes and types?
76317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  createCXTUResourceUsageEntry(*entries, CXTUResourceUsage_AST,
76327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    (unsigned long) astContext.getASTAllocatedMemory());
76337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
76347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // How much memory is used by identifiers?
76357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  createCXTUResourceUsageEntry(*entries, CXTUResourceUsage_Identifiers,
76367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    (unsigned long) astContext.Idents.getAllocator().getTotalMemory());
76377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
76387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // How much memory is used for selectors?
76397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  createCXTUResourceUsageEntry(*entries, CXTUResourceUsage_Selectors,
76407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    (unsigned long) astContext.Selectors.getTotalMemory());
76417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
76427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // How much memory is used by ASTContext's side tables?
76437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  createCXTUResourceUsageEntry(*entries, CXTUResourceUsage_AST_SideTables,
76447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    (unsigned long) astContext.getSideTableAllocatedMemory());
76457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
76467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // How much memory is used for caching global code completion results?
76477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  unsigned long completionBytes = 0;
76487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (GlobalCodeCompletionAllocator *completionAllocator =
7649c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines      astUnit->getCachedCompletionAllocator().get()) {
76507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    completionBytes = completionAllocator->getTotalMemory();
76517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
76527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  createCXTUResourceUsageEntry(*entries,
76537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                               CXTUResourceUsage_GlobalCompletionResults,
76547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                               completionBytes);
76557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
76567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // How much memory is being used by SourceManager's content cache?
76577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  createCXTUResourceUsageEntry(*entries,
76587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          CXTUResourceUsage_SourceManagerContentCache,
76597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei          (unsigned long) astContext.getSourceManager().getContentCacheSize());
76607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
76617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // How much memory is being used by the MemoryBuffer's in SourceManager?
76627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  const SourceManager::MemoryBufferSizes &srcBufs =
76637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    astUnit->getSourceManager().getMemoryBufferSizes();
76647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
76657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  createCXTUResourceUsageEntry(*entries,
76667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                               CXTUResourceUsage_SourceManager_Membuffer_Malloc,
76677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                               (unsigned long) srcBufs.malloc_bytes);
76687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  createCXTUResourceUsageEntry(*entries,
76697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                               CXTUResourceUsage_SourceManager_Membuffer_MMap,
76707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                               (unsigned long) srcBufs.mmap_bytes);
76717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  createCXTUResourceUsageEntry(*entries,
76727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                               CXTUResourceUsage_SourceManager_DataStructures,
76737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                               (unsigned long) astContext.getSourceManager()
76747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                .getDataStructureSizes());
76757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
76767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // How much memory is being used by the ExternalASTSource?
76777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (ExternalASTSource *esrc = astContext.getExternalSource()) {
76787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    const ExternalASTSource::MemoryBufferSizes &sizes =
76797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      esrc->getMemoryBufferSizes();
76807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
76817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    createCXTUResourceUsageEntry(*entries,
76827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      CXTUResourceUsage_ExternalASTSource_Membuffer_Malloc,
76837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                 (unsigned long) sizes.malloc_bytes);
76847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    createCXTUResourceUsageEntry(*entries,
76857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei      CXTUResourceUsage_ExternalASTSource_Membuffer_MMap,
76867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                 (unsigned long) sizes.mmap_bytes);
76877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
76887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
76897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // How much memory is being used by the Preprocessor?
76907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  Preprocessor &pp = astUnit->getPreprocessor();
76917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  createCXTUResourceUsageEntry(*entries,
76927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                               CXTUResourceUsage_Preprocessor,
76937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                               pp.getTotalMemory());
76947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
76957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (PreprocessingRecord *pRec = pp.getPreprocessingRecord()) {
76967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    createCXTUResourceUsageEntry(*entries,
76977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                 CXTUResourceUsage_PreprocessingRecord,
76987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                 pRec->getTotalMemory());
76997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
77007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
77017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  createCXTUResourceUsageEntry(*entries,
77027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                               CXTUResourceUsage_Preprocessor_HeaderSearch,
77037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                               pp.getHeaderSearchInfo().getTotalMemory());
7704c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
77057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  CXTUResourceUsage usage = { (void*) entries.get(),
77067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                            (unsigned) entries->size(),
77070e2c34f92f00628d48968dfea096d36381f494cbStephen Hines                            !entries->empty() ? &(*entries)[0] : nullptr };
7708651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  entries.release();
77097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return usage;
77107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
77117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
77127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid clang_disposeCXTUResourceUsage(CXTUResourceUsage usage) {
77137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (usage.data)
77147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    delete (MemUsageEntries*) usage.data;
77157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
77167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
7717651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesCXSourceRangeList *clang_getSkippedRanges(CXTranslationUnit TU, CXFile file) {
7718651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  CXSourceRangeList *skipped = new CXSourceRangeList;
7719651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  skipped->count = 0;
7720c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  skipped->ranges = nullptr;
7721651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
7722651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (isNotUsableTU(TU)) {
7723651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    LOG_BAD_TU(TU);
7724651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return skipped;
7725651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
7726651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
7727651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (!file)
7728651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return skipped;
7729651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
7730651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ASTUnit *astUnit = cxtu::getASTUnit(TU);
7731651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  PreprocessingRecord *ppRec = astUnit->getPreprocessor().getPreprocessingRecord();
7732651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (!ppRec)
7733651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return skipped;
7734651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
7735651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ASTContext &Ctx = astUnit->getASTContext();
7736651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  SourceManager &sm = Ctx.getSourceManager();
7737651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  FileEntry *fileEntry = static_cast<FileEntry *>(file);
7738651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  FileID wantedFileID = sm.translateFile(fileEntry);
7739651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
7740651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  const std::vector<SourceRange> &SkippedRanges = ppRec->getSkippedRanges();
7741651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  std::vector<SourceRange> wantedRanges;
7742651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  for (std::vector<SourceRange>::const_iterator i = SkippedRanges.begin(), ei = SkippedRanges.end();
7743651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines       i != ei; ++i) {
7744651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (sm.getFileID(i->getBegin()) == wantedFileID || sm.getFileID(i->getEnd()) == wantedFileID)
7745651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      wantedRanges.push_back(*i);
7746651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
7747651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
7748651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  skipped->count = wantedRanges.size();
7749651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  skipped->ranges = new CXSourceRange[skipped->count];
7750651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  for (unsigned i = 0, ei = skipped->count; i != ei; ++i)
7751651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    skipped->ranges[i] = cxloc::translateSourceRange(Ctx, wantedRanges[i]);
7752651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
7753651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return skipped;
7754651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
7755651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
7756651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid clang_disposeSourceRangeList(CXSourceRangeList *ranges) {
7757651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (ranges) {
7758651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    delete[] ranges->ranges;
7759651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    delete ranges;
7760651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
7761651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
7762651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
77637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} // end extern "C"
77647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
77657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid clang::PrintLibclangResourceUsage(CXTranslationUnit TU) {
77667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  CXTUResourceUsage Usage = clang_getCXTUResourceUsage(TU);
77677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  for (unsigned I = 0; I != Usage.numEntries; ++I)
77687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    fprintf(stderr, "  %s: %lu\n",
77697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            clang_getTUResourceUsageName(Usage.entries[I].kind),
77707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei            Usage.entries[I].amount);
77717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
77727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  clang_disposeCXTUResourceUsage(Usage);
77737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
77747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
77757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----------------------------------------------------------------------===//
77767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// Misc. utility functions.
77777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----------------------------------------------------------------------===//
77787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
77797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// Default to using an 8 MB stack size on "safety" threads.
77807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic unsigned SafetyStackThreadSize = 8 << 20;
77817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
77827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeinamespace clang {
77837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
778487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarbool RunSafely(llvm::CrashRecoveryContext &CRC, llvm::function_ref<void()> Fn,
77857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei               unsigned Size) {
77867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!Size)
77877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    Size = GetSafetyThreadStackSize();
77887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (Size)
778987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return CRC.RunSafelyOnThread(Fn, Size);
779087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return CRC.RunSafely(Fn);
77917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
77927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
77937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiunsigned GetSafetyThreadStackSize() {
77947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  return SafetyStackThreadSize;
77957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
77967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
77977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid SetSafetyThreadStackSize(unsigned Value) {
77987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  SafetyStackThreadSize = Value;
77997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
78007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
78017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
78027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
78037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid clang::setThreadBackgroundPriority() {
78047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (getenv("LIBCLANG_BGPRIO_DISABLE"))
78057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return;
78067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
7807c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#ifdef USE_DARWIN_THREADS
78087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  setpriority(PRIO_DARWIN_THREAD, 0, PRIO_DARWIN_BG);
78097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#endif
78107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
78117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
78127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid cxindex::printDiagsToStderr(ASTUnit *Unit) {
78137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  if (!Unit)
78147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    return;
78157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
78167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  for (ASTUnit::stored_diag_iterator D = Unit->stored_diag_begin(),
78177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                  DEnd = Unit->stored_diag_end();
78187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei       D != DEnd; ++D) {
78196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    CXStoredDiagnostic Diag(*D, Unit->getLangOpts());
78207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    CXString Msg = clang_formatDiagnostic(&Diag,
78217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei                                clang_defaultDiagnosticDisplayOptions());
78227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    fprintf(stderr, "%s\n", clang_getCString(Msg));
78237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei    clang_disposeString(Msg);
78247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  }
78257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#ifdef LLVM_ON_WIN32
78267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // On Windows, force a flush, since there may be multiple copies of
78277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // stderr and stdout in the file system, all with different buffers
78287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  // but writing to the same device.
78297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei  fflush(stderr);
78307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#endif
78317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
78327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
7833664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios KyrtzidisMacroInfo *cxindex::getMacroInfo(const IdentifierInfo &II,
7834664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis                                 SourceLocation MacroDefLoc,
7835664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis                                 CXTranslationUnit TU){
7836664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis  if (MacroDefLoc.isInvalid() || !TU)
7837c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    return nullptr;
7838664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis  if (!II.hadMacroDefinition())
7839c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    return nullptr;
7840664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis
78415694feb5ccd6eb862cb600b55753cecc13794471Dmitri Gribenko  ASTUnit *Unit = cxtu::getASTUnit(TU);
7842c059f89d888cd214e18ed09a7b47339201526381Argyrios Kyrtzidis  Preprocessor &PP = Unit->getPreprocessor();
7843b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  MacroDirective *MD = PP.getLocalMacroDirectiveHistory(&II);
7844c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis  if (MD) {
7845c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis    for (MacroDirective::DefInfo
7846c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis           Def = MD->getDefinition(); Def; Def = Def.getPreviousDefinition()) {
7847c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis      if (MacroDefLoc == Def.getMacroInfo()->getDefinitionLoc())
7848c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis        return Def.getMacroInfo();
7849c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis    }
7850664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis  }
7851664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis
7852c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  return nullptr;
7853664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis}
7854664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis
7855b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarconst MacroInfo *cxindex::getMacroInfo(const MacroDefinitionRecord *MacroDef,
785667812b2f94f4b5e7d2596db1705ffa1149ddc45aDmitri Gribenko                                       CXTranslationUnit TU) {
7857664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis  if (!MacroDef || !TU)
7858c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    return nullptr;
7859664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis  const IdentifierInfo *II = MacroDef->getName();
7860664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis  if (!II)
7861c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    return nullptr;
7862664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis
7863664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis  return getMacroInfo(*II, MacroDef->getLocation(), TU);
7864664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis}
7865664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis
7866b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga NainarMacroDefinitionRecord *
7867b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarcxindex::checkForMacroInMacroDefinition(const MacroInfo *MI, const Token &Tok,
7868b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar                                        CXTranslationUnit TU) {
7869664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis  if (!MI || !TU)
7870c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    return nullptr;
7871664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis  if (Tok.isNot(tok::raw_identifier))
7872c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    return nullptr;
7873664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis
7874664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis  if (MI->getNumTokens() == 0)
7875c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    return nullptr;
7876664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis  SourceRange DefRange(MI->getReplacementToken(0).getLocation(),
7877664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis                       MI->getDefinitionEndLoc());
78785694feb5ccd6eb862cb600b55753cecc13794471Dmitri Gribenko  ASTUnit *Unit = cxtu::getASTUnit(TU);
7879664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis
7880664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis  // Check that the token is inside the definition and not its argument list.
7881664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis  SourceManager &SM = Unit->getSourceManager();
7882664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis  if (SM.isBeforeInTranslationUnit(Tok.getLocation(), DefRange.getBegin()))
7883c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    return nullptr;
7884664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis  if (SM.isBeforeInTranslationUnit(DefRange.getEnd(), Tok.getLocation()))
7885c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    return nullptr;
7886664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis
7887664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis  Preprocessor &PP = Unit->getPreprocessor();
7888664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis  PreprocessingRecord *PPRec = PP.getPreprocessingRecord();
7889664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis  if (!PPRec)
7890c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    return nullptr;
7891664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis
78926bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  IdentifierInfo &II = PP.getIdentifierTable().get(Tok.getRawIdentifier());
7893664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis  if (!II.hadMacroDefinition())
7894c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    return nullptr;
7895664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis
7896664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis  // Check that the identifier is not one of the macro arguments.
7897664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis  if (std::find(MI->arg_begin(), MI->arg_end(), &II) != MI->arg_end())
7898c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    return nullptr;
7899664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis
7900b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  MacroDirective *InnerMD = PP.getLocalMacroDirectiveHistory(&II);
79019818a1d443e97677dd3422305de9cc2b1fb2a8c1Argyrios Kyrtzidis  if (!InnerMD)
7902c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    return nullptr;
7903664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis
7904c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis  return PPRec->findMacroDefinition(InnerMD->getMacroInfo());
7905664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis}
7906664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis
7907b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga NainarMacroDefinitionRecord *
7908b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarcxindex::checkForMacroInMacroDefinition(const MacroInfo *MI, SourceLocation Loc,
7909b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar                                        CXTranslationUnit TU) {
7910664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis  if (Loc.isInvalid() || !MI || !TU)
7911c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    return nullptr;
7912664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis
7913664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis  if (MI->getNumTokens() == 0)
7914c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    return nullptr;
79155694feb5ccd6eb862cb600b55753cecc13794471Dmitri Gribenko  ASTUnit *Unit = cxtu::getASTUnit(TU);
7916664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis  Preprocessor &PP = Unit->getPreprocessor();
7917664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis  if (!PP.getPreprocessingRecord())
7918c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    return nullptr;
7919664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis  Loc = Unit->getSourceManager().getSpellingLoc(Loc);
7920664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis  Token Tok;
7921664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis  if (PP.getRawToken(Loc, Tok))
7922c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    return nullptr;
7923664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis
7924664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis  return checkForMacroInMacroDefinition(MI, Tok, TU);
7925664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis}
7926664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis
79277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiextern "C" {
79287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
79297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXString clang_getClangVersion() {
79305595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko  return cxstring::createDup(getClangFullVersion());
79317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}
79327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
79337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} // end: extern "C"
79347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei
7935c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios KyrtzidisLogger &cxindex::Logger::operator<<(CXTranslationUnit TU) {
7936c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  if (TU) {
79375694feb5ccd6eb862cb600b55753cecc13794471Dmitri Gribenko    if (ASTUnit *Unit = cxtu::getASTUnit(TU)) {
7938c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis      LogOS << '<' << Unit->getMainFileName() << '>';
793944f65a587ee39c20e715c9df411c864d328c71b5Argyrios Kyrtzidis      if (Unit->isMainFileAST())
794044f65a587ee39c20e715c9df411c864d328c71b5Argyrios Kyrtzidis        LogOS << " (" << Unit->getASTFileName() << ')';
7941c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis      return *this;
7942c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis    }
7943651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  } else {
7944651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    LogOS << "<NULL TU>";
7945c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  }
7946c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  return *this;
7947c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis}
7948c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis
7949b70e7a83ee55e463d52d175bd68dece2bfd084f4Argyrios KyrtzidisLogger &cxindex::Logger::operator<<(const FileEntry *FE) {
7950b70e7a83ee55e463d52d175bd68dece2bfd084f4Argyrios Kyrtzidis  *this << FE->getName();
7951b70e7a83ee55e463d52d175bd68dece2bfd084f4Argyrios Kyrtzidis  return *this;
7952b70e7a83ee55e463d52d175bd68dece2bfd084f4Argyrios Kyrtzidis}
7953b70e7a83ee55e463d52d175bd68dece2bfd084f4Argyrios Kyrtzidis
7954b70e7a83ee55e463d52d175bd68dece2bfd084f4Argyrios KyrtzidisLogger &cxindex::Logger::operator<<(CXCursor cursor) {
7955b70e7a83ee55e463d52d175bd68dece2bfd084f4Argyrios Kyrtzidis  CXString cursorName = clang_getCursorDisplayName(cursor);
7956b70e7a83ee55e463d52d175bd68dece2bfd084f4Argyrios Kyrtzidis  *this << cursorName << "@" << clang_getCursorLocation(cursor);
7957b70e7a83ee55e463d52d175bd68dece2bfd084f4Argyrios Kyrtzidis  clang_disposeString(cursorName);
7958b70e7a83ee55e463d52d175bd68dece2bfd084f4Argyrios Kyrtzidis  return *this;
7959b70e7a83ee55e463d52d175bd68dece2bfd084f4Argyrios Kyrtzidis}
7960b70e7a83ee55e463d52d175bd68dece2bfd084f4Argyrios Kyrtzidis
7961c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios KyrtzidisLogger &cxindex::Logger::operator<<(CXSourceLocation Loc) {
7962c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  CXFile File;
7963c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  unsigned Line, Column;
7964c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  clang_getFileLocation(Loc, &File, &Line, &Column, nullptr);
7965c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  CXString FileName = clang_getFileName(File);
7966c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  *this << llvm::format("(%s:%d:%d)", clang_getCString(FileName), Line, Column);
7967c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  clang_disposeString(FileName);
7968c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  return *this;
7969c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis}
7970c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis
7971c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios KyrtzidisLogger &cxindex::Logger::operator<<(CXSourceRange range) {
7972c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  CXSourceLocation BLoc = clang_getRangeStart(range);
7973c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  CXSourceLocation ELoc = clang_getRangeEnd(range);
7974c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis
7975c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  CXFile BFile;
7976c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  unsigned BLine, BColumn;
7977c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  clang_getFileLocation(BLoc, &BFile, &BLine, &BColumn, nullptr);
7978c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis
7979c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  CXFile EFile;
7980c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  unsigned ELine, EColumn;
7981c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  clang_getFileLocation(ELoc, &EFile, &ELine, &EColumn, nullptr);
7982c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis
7983c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  CXString BFileName = clang_getFileName(BFile);
7984c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  if (BFile == EFile) {
7985c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis    *this << llvm::format("[%s %d:%d-%d:%d]", clang_getCString(BFileName),
7986c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis                         BLine, BColumn, ELine, EColumn);
7987c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  } else {
7988c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis    CXString EFileName = clang_getFileName(EFile);
7989c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis    *this << llvm::format("[%s:%d:%d - ", clang_getCString(BFileName),
7990c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis                          BLine, BColumn)
7991c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis          << llvm::format("%s:%d:%d]", clang_getCString(EFileName),
7992c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis                          ELine, EColumn);
7993c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis    clang_disposeString(EFileName);
7994c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  }
7995c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  clang_disposeString(BFileName);
7996c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  return *this;
7997c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis}
7998c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis
7999c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios KyrtzidisLogger &cxindex::Logger::operator<<(CXString Str) {
8000c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  *this << clang_getCString(Str);
8001c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  return *this;
8002c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis}
8003c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis
8004c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios KyrtzidisLogger &cxindex::Logger::operator<<(const llvm::format_object_base &Fmt) {
8005c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  LogOS << Fmt;
8006c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  return *this;
8007c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis}
8008c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis
8009c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesstatic llvm::ManagedStatic<llvm::sys::Mutex> LoggingMutex;
8010c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
8011c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidiscxindex::Logger::~Logger() {
8012c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  llvm::sys::ScopedLock L(*LoggingMutex);
8013c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis
8014c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  static llvm::TimeRecord sBeginTR = llvm::TimeRecord::getCurrentTime();
8015c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis
8016cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko  raw_ostream &OS = llvm::errs();
8017c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  OS << "[libclang:" << Name << ':';
8018c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis
8019c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#ifdef USE_DARWIN_THREADS
8020c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  // TODO: Portability.
8021c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  mach_port_t tid = pthread_mach_thread_np(pthread_self());
8022c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  OS << tid << ':';
8023c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis#endif
8024c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis
8025c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  llvm::TimeRecord TR = llvm::TimeRecord::getCurrentTime();
8026c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  OS << llvm::format("%7.4f] ", TR.getWallTime() - sBeginTR.getWallTime());
80273ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  OS << Msg << '\n';
8028c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis
8029c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  if (Trace) {
80303ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    llvm::sys::PrintStackTrace(OS);
8031c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis    OS << "--------------------------------------------------\n";
8032c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis  }
8033c6f5c6a58d34833d1fe458a518d5f59462926c7bArgyrios Kyrtzidis}
80344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
80354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#ifdef CLANG_TOOL_EXTRA_BUILD
80364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// This anchor is used to force the linker to link the clang-tidy plugin.
80374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarextern volatile int ClangTidyPluginAnchorSource;
80384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarstatic int LLVM_ATTRIBUTE_UNUSED ClangTidyPluginAnchorDestination =
80394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    ClangTidyPluginAnchorSource;
80404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#endif
8041