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