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