CIndex.cpp revision 6538227d51df249b07c8ab80ae376f5c1d14403c
1049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project//===- CIndex.cpp - Clang-C Source Indexing Library -----------------------===// 2049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project// 3049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project// The LLVM Compiler Infrastructure 4049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project// 5049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project// This file is distributed under the University of Illinois Open Source 6049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project// License. See LICENSE.TXT for details. 7a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang// 8aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich//===----------------------------------------------------------------------===// 9049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project// 10049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project// This file implements the main API hooks in the Clang-C Source Indexing 11049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project// library. 12049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project// 13049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project//===----------------------------------------------------------------------===// 14049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 15049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "CIndexer.h" 16049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "CXCursor.h" 17049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "CXTranslationUnit.h" 18049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "CXString.h" 19c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner#include "CXType.h" 20c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner#include "CXSourceLocation.h" 21c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner#include "CIndexDiagnostic.h" 22c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner 23049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "clang/Basic/Version.h" 24049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 25049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "clang/AST/DeclVisitor.h" 26049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "clang/AST/StmtVisitor.h" 27049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "clang/AST/TypeLocVisitor.h" 28a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang#include "clang/Basic/Diagnostic.h" 29049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "clang/Frontend/ASTUnit.h" 30049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "clang/Frontend/CompilerInstance.h" 31049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "clang/Frontend/FrontendDiagnostic.h" 32a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang#include "clang/Lex/Lexer.h" 33049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "clang/Lex/PreprocessingRecord.h" 34049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "clang/Lex/Preprocessor.h" 35049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "llvm/ADT/STLExtras.h" 36049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "llvm/ADT/Optional.h" 37049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "clang/Analysis/Support/SaveAndRestore.h" 38049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "llvm/Support/CrashRecoveryContext.h" 39049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "llvm/Support/PrettyStackTrace.h" 40049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "llvm/Support/MemoryBuffer.h" 41049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "llvm/Support/raw_ostream.h" 42049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "llvm/Support/Timer.h" 43049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "llvm/System/Mutex.h" 44049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "llvm/System/Program.h" 45049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "llvm/System/Signals.h" 46049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "llvm/System/Threading.h" 47049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "llvm/Support/Compiler.h" 48049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 49049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectusing namespace clang; 50049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectusing namespace clang::cxcursor; 51a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wangusing namespace clang::cxstring; 52049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 53049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectstatic CXTranslationUnit MakeCXTranslationUnit(ASTUnit *TU) { 54049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (!TU) 55049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return 0; 56049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXTranslationUnit D = new CXTranslationUnitImpl(); 57049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project D->TUData = TU; 58049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project D->StringPool = createCXStringPool(); 59049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return D; 60049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 61049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 62049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/// \brief The result of comparing two source ranges. 63049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectenum RangeComparisonResult { 64049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /// \brief Either the ranges overlap or one of the ranges is invalid. 65049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project RangeOverlap, 66049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 67049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /// \brief The first range ends before the second range starts. 68049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project RangeBefore, 69049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 70049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /// \brief The first range starts after the second range ends. 71049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project RangeAfter 72049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project}; 73049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 74049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/// \brief Compare two source ranges to determine their relative position in 75049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/// the translation unit. 76049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectstatic RangeComparisonResult RangeCompare(SourceManager &SM, 77049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SourceRange R1, 78049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SourceRange R2) { 79049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project assert(R1.isValid() && "First range is invalid?"); 80049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project assert(R2.isValid() && "Second range is invalid?"); 81049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (R1.getEnd() != R2.getBegin() && 82049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SM.isBeforeInTranslationUnit(R1.getEnd(), R2.getBegin())) 83049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return RangeBefore; 84049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (R2.getEnd() != R1.getBegin() && 85049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SM.isBeforeInTranslationUnit(R2.getEnd(), R1.getBegin())) 86049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return RangeAfter; 87049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return RangeOverlap; 88049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 89049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 90049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/// \brief Determine if a source location falls within, before, or after a 91049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/// a given source range. 92049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectstatic RangeComparisonResult LocationCompare(SourceManager &SM, 93049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SourceLocation L, SourceRange R) { 94049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project assert(R.isValid() && "First range is invalid?"); 95049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project assert(L.isValid() && "Second range is invalid?"); 96049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (L == R.getBegin() || L == R.getEnd()) 97049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return RangeOverlap; 98049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (SM.isBeforeInTranslationUnit(L, R.getBegin())) 99049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return RangeBefore; 100049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (SM.isBeforeInTranslationUnit(R.getEnd(), L)) 101049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return RangeAfter; 102049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return RangeOverlap; 103049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 104049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 105049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/// \brief Translate a Clang source range into a CIndex source range. 106049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/// 107049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/// Clang internally represents ranges where the end location points to the 108049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/// start of the token at the end. However, for external clients it is more 109049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/// useful to have a CXSourceRange be a proper half-open interval. This routine 110049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/// does the appropriate translation. 111049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source ProjectCXSourceRange cxloc::translateSourceRange(const SourceManager &SM, 112049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const LangOptions &LangOpts, 113049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const CharSourceRange &R) { 114049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // We want the last character in this location, so we will adjust the 115049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // location accordingly. 116049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SourceLocation EndLoc = R.getEnd(); 117049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (EndLoc.isValid() && EndLoc.isMacroID()) 118049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project EndLoc = SM.getSpellingLoc(EndLoc); 119049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (R.isTokenRange() && !EndLoc.isInvalid() && EndLoc.isFileID()) { 120049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project unsigned Length = Lexer::MeasureTokenLength(EndLoc, SM, LangOpts); 121049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project EndLoc = EndLoc.getFileLocWithOffset(Length); 122049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 123049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 124049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXSourceRange Result = { { (void *)&SM, (void *)&LangOpts }, 125049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project R.getBegin().getRawEncoding(), 126049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project EndLoc.getRawEncoding() }; 127049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return Result; 128049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 129049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 130049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project//===----------------------------------------------------------------------===// 131049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project// Cursor visitor. 132049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project//===----------------------------------------------------------------------===// 133049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 134049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectnamespace { 135a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 136a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wangclass VisitorJob { 137a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wangpublic: 138a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang enum Kind { DeclVisitKind, StmtVisitKind, MemberExprPartsKind, 139a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang TypeLocVisitKind, OverloadExprPartsKind, 140049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DeclRefExprPartsKind, LabelRefVisitKind, 141049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ExplicitTemplateArgsVisitKind, 142049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project NestedNameSpecifierVisitKind, 143049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DeclarationNameInfoVisitKind, 144049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project MemberRefVisitKind }; 145049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectprotected: 146049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project void *data[3]; 147049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXCursor parent; 148049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Kind K; 149049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project VisitorJob(CXCursor C, Kind k, void *d1, void *d2 = 0, void *d3 = 0) 150049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project : parent(C), K(k) { 151049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project data[0] = d1; 152049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project data[1] = d2; 153049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project data[2] = d3; 154049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 155049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectpublic: 156049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Kind getKind() const { return K; } 157049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const CXCursor &getParent() const { return parent; } 158049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static bool classof(VisitorJob *VJ) { return true; } 159049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project}; 160049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 161049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projecttypedef llvm::SmallVector<VisitorJob, 10> VisitorWorkList; 162049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 163049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project// Cursor visitor. 164049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectclass CursorVisitor : public DeclVisitor<CursorVisitor, bool>, 165049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project public TypeLocVisitor<CursorVisitor, bool> 166049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project{ 167049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /// \brief The translation unit we are traversing. 168049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXTranslationUnit TU; 169049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ASTUnit *AU; 170049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 171049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /// \brief The parent cursor whose children we are traversing. 172049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXCursor Parent; 173049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 174049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /// \brief The declaration that serves at the parent of any statement or 175049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /// expression nodes. 176049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Decl *StmtParent; 177049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 178049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /// \brief The visitor function. 179049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXCursorVisitor Visitor; 180049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 181049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /// \brief The opaque client data, to be passed along to the visitor. 182049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXClientData ClientData; 183049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 184049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // MaxPCHLevel - the maximum PCH level of declarations that we will pass on 185049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // to the visitor. Declarations with a PCH level greater than this value will 186049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // be suppressed. 187049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project unsigned MaxPCHLevel; 188049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 189049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /// \brief When valid, a source range to which the cursor should restrict 190049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /// its search. 191049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SourceRange RegionOfInterest; 192049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 193049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // FIXME: Eventually remove. This part of a hack to support proper 194049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // iteration over all Decls contained lexically within an ObjC container. 195049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DeclContext::decl_iterator *DI_current; 196049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DeclContext::decl_iterator DE_current; 197049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 198049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Cache of pre-allocated worklists for data-recursion walk of Stmts. 199049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project llvm::SmallVector<VisitorWorkList*, 5> WorkListFreeList; 200049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project llvm::SmallVector<VisitorWorkList*, 5> WorkListCache; 201049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 202049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project using DeclVisitor<CursorVisitor, bool>::Visit; 203049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project using TypeLocVisitor<CursorVisitor, bool>::Visit; 204049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 205049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /// \brief Determine whether this particular source range comes before, comes 206049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /// after, or overlaps the region of interest. 207049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /// 208049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /// \param R a half-open source range retrieved from the abstract syntax tree. 209049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project RangeComparisonResult CompareRegionOfInterest(SourceRange R); 210049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 211049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project class SetParentRAII { 212049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXCursor &Parent; 213049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Decl *&StmtParent; 214049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXCursor OldParent; 215049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 216049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project public: 217049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SetParentRAII(CXCursor &Parent, Decl *&StmtParent, CXCursor NewParent) 218049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project : Parent(Parent), StmtParent(StmtParent), OldParent(Parent) 219049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 220049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Parent = NewParent; 221049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (clang_isDeclaration(Parent.kind)) 222049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project StmtParent = getCursorDecl(Parent); 223049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 224049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 225049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ~SetParentRAII() { 226049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Parent = OldParent; 227049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (clang_isDeclaration(Parent.kind)) 228049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project StmtParent = getCursorDecl(Parent); 229049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 230049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project }; 231aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 232049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectpublic: 233aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich CursorVisitor(CXTranslationUnit TU, CXCursorVisitor Visitor, 234aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich CXClientData ClientData, 235049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project unsigned MaxPCHLevel, 236a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang SourceRange RegionOfInterest = SourceRange()) 237a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang : TU(TU), AU(static_cast<ASTUnit*>(TU->TUData)), 238a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang Visitor(Visitor), ClientData(ClientData), 239a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang MaxPCHLevel(MaxPCHLevel), RegionOfInterest(RegionOfInterest), 240a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang DI_current(0) 241a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang { 242a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang Parent.kind = CXCursor_NoDeclFound; 243a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang Parent.data[0] = 0; 244049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Parent.data[1] = 0; 245049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Parent.data[2] = 0; 246049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project StmtParent = 0; 247049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 248049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 249049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ~CursorVisitor() { 250049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Free the pre-allocated worklists for data-recursion. 251049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for (llvm::SmallVectorImpl<VisitorWorkList*>::iterator 252049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project I = WorkListCache.begin(), E = WorkListCache.end(); I != E; ++I) { 253049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project delete *I; 254049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 255049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 256049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 257049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ASTUnit *getASTUnit() const { return static_cast<ASTUnit*>(TU->TUData); } 258049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXTranslationUnit getTU() const { return TU; } 259049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 260049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bool Visit(CXCursor Cursor, bool CheckedRegionOfInterest = false); 261049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 262049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project std::pair<PreprocessingRecord::iterator, PreprocessingRecord::iterator> 263049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project getPreprocessedEntities(); 264049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 265049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bool VisitChildren(CXCursor Parent); 266049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 267049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Declaration visitors 268049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bool VisitAttributes(Decl *D); 269049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bool VisitBlockDecl(BlockDecl *B); 270049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bool VisitCXXRecordDecl(CXXRecordDecl *D); 271049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project llvm::Optional<bool> shouldVisitCursor(CXCursor C); 272049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bool VisitDeclContext(DeclContext *DC); 273049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bool VisitTranslationUnitDecl(TranslationUnitDecl *D); 274049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bool VisitTypedefDecl(TypedefDecl *D); 275049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bool VisitTagDecl(TagDecl *D); 276049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bool VisitClassTemplateSpecializationDecl(ClassTemplateSpecializationDecl *D); 277049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bool VisitClassTemplatePartialSpecializationDecl( 278049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ClassTemplatePartialSpecializationDecl *D); 279049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bool VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D); 280049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bool VisitEnumConstantDecl(EnumConstantDecl *D); 281049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bool VisitDeclaratorDecl(DeclaratorDecl *DD); 282049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bool VisitFunctionDecl(FunctionDecl *ND); 283049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bool VisitFieldDecl(FieldDecl *D); 284049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bool VisitVarDecl(VarDecl *); 285049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bool VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D); 286049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bool VisitFunctionTemplateDecl(FunctionTemplateDecl *D); 287049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bool VisitClassTemplateDecl(ClassTemplateDecl *D); 288049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bool VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D); 289049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bool VisitObjCMethodDecl(ObjCMethodDecl *ND); 290049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bool VisitObjCContainerDecl(ObjCContainerDecl *D); 291049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bool VisitObjCCategoryDecl(ObjCCategoryDecl *ND); 292049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bool VisitObjCProtocolDecl(ObjCProtocolDecl *PID); 293049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bool VisitObjCPropertyDecl(ObjCPropertyDecl *PD); 294049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bool VisitObjCInterfaceDecl(ObjCInterfaceDecl *D); 295049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bool VisitObjCImplDecl(ObjCImplDecl *D); 296049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bool VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D); 297049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bool VisitObjCImplementationDecl(ObjCImplementationDecl *D); 298049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // FIXME: ObjCCompatibleAliasDecl requires aliased-class locations. 299049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bool VisitObjCForwardProtocolDecl(ObjCForwardProtocolDecl *D); 300049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bool VisitObjCClassDecl(ObjCClassDecl *D); 301049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bool VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *PD); 302049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bool VisitLinkageSpecDecl(LinkageSpecDecl *D); 303049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bool VisitNamespaceDecl(NamespaceDecl *D); 304049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bool VisitNamespaceAliasDecl(NamespaceAliasDecl *D); 305049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bool VisitUsingDirectiveDecl(UsingDirectiveDecl *D); 306049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bool VisitUsingDecl(UsingDecl *D); 307049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bool VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D); 308049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bool VisitUnresolvedUsingTypenameDecl(UnresolvedUsingTypenameDecl *D); 309049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 310049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Name visitor 311049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bool VisitDeclarationNameInfo(DeclarationNameInfo Name); 312049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bool VisitNestedNameSpecifier(NestedNameSpecifier *NNS, SourceRange Range); 313a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 314049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Template visitors 315049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bool VisitTemplateParameters(const TemplateParameterList *Params); 316049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bool VisitTemplateName(TemplateName Name, SourceLocation Loc); 317049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bool VisitTemplateArgumentLoc(const TemplateArgumentLoc &TAL); 318049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 319049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Type visitors 320049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bool VisitQualifiedTypeLoc(QualifiedTypeLoc TL); 321049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bool VisitBuiltinTypeLoc(BuiltinTypeLoc TL); 322049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bool VisitTypedefTypeLoc(TypedefTypeLoc TL); 323049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bool VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL); 324049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bool VisitTagTypeLoc(TagTypeLoc TL); 325049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bool VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL); 326049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bool VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL); 327049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bool VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL); 328049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bool VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL); 329049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bool VisitPointerTypeLoc(PointerTypeLoc TL); 330049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bool VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL); 331049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bool VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL); 332049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bool VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL); 333049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bool VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL); 334049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bool VisitFunctionTypeLoc(FunctionTypeLoc TL, bool SkipResultType = false); 335049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bool VisitArrayTypeLoc(ArrayTypeLoc TL); 336049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bool VisitTemplateSpecializationTypeLoc(TemplateSpecializationTypeLoc TL); 337049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // FIXME: Implement visitors here when the unimplemented TypeLocs get 338049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // implemented 339049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bool VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL); 340049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bool VisitTypeOfTypeLoc(TypeOfTypeLoc TL); 341049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 342049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Data-recursive visitor functions. 343049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bool IsInRegionOfInterest(CXCursor C); 344049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bool RunVisitorWorkList(VisitorWorkList &WL); 345049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project void EnqueueWorkList(VisitorWorkList &WL, Stmt *S); 346049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project LLVM_ATTRIBUTE_NOINLINE bool Visit(Stmt *S); 347049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project}; 348049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 349a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang} // end anonymous namespace 350049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 351049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectstatic SourceRange getRawCursorExtent(CXCursor C); 352049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectstatic SourceRange getFullCursorExtent(CXCursor C, SourceManager &SrcMgr); 353049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 354049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 355049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source ProjectRangeComparisonResult CursorVisitor::CompareRegionOfInterest(SourceRange R) { 356049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return RangeCompare(AU->getSourceManager(), R, RegionOfInterest); 357049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 358049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 359049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/// \brief Visit the given cursor and, if requested by the visitor, 360049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/// its children. 361049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/// 362049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/// \param Cursor the cursor to visit. 363049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/// 364049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/// \param CheckRegionOfInterest if true, then the caller already checked that 365049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/// this cursor is within the region of interest. 366049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/// 367049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/// \returns true if the visitation should be aborted, false if it 368049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/// should continue. 369049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectbool CursorVisitor::Visit(CXCursor Cursor, bool CheckedRegionOfInterest) { 370049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (clang_isInvalid(Cursor.kind)) 371049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return false; 372049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 373049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (clang_isDeclaration(Cursor.kind)) { 374049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Decl *D = getCursorDecl(Cursor); 375049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project assert(D && "Invalid declaration cursor"); 376049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (D->getPCHLevel() > MaxPCHLevel) 377049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return false; 378049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 379049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (D->isImplicit()) 380049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return false; 381049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 382a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 383049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // If we have a range of interest, and this cursor doesn't intersect with it, 384049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // we're done. 385049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (RegionOfInterest.isValid() && !CheckedRegionOfInterest) { 386049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SourceRange Range = getRawCursorExtent(Cursor); 387049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (Range.isInvalid() || CompareRegionOfInterest(Range)) 388049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return false; 389049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 390049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 391049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project switch (Visitor(Cursor, Parent, ClientData)) { 392049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXChildVisit_Break: 393049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return true; 394049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 395049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXChildVisit_Continue: 396049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return false; 397049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 398049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXChildVisit_Recurse: 399049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return VisitChildren(Cursor); 400049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 401049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 402049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return false; 403049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 404049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 405049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectstd::pair<PreprocessingRecord::iterator, PreprocessingRecord::iterator> 406049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source ProjectCursorVisitor::getPreprocessedEntities() { 407049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project PreprocessingRecord &PPRec 408049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project = *AU->getPreprocessor().getPreprocessingRecord(); 409049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 410049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bool OnlyLocalDecls 411049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project = !AU->isMainFileAST() && AU->getOnlyLocalDecls(); 412049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 413049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // There is no region of interest; we have to walk everything. 414049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (RegionOfInterest.isInvalid()) 415049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return std::make_pair(PPRec.begin(OnlyLocalDecls), 416049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project PPRec.end(OnlyLocalDecls)); 417049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 418049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Find the file in which the region of interest lands. 419049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SourceManager &SM = AU->getSourceManager(); 420049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project std::pair<FileID, unsigned> Begin 421049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project = SM.getDecomposedInstantiationLoc(RegionOfInterest.getBegin()); 422049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project std::pair<FileID, unsigned> End 423049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project = SM.getDecomposedInstantiationLoc(RegionOfInterest.getEnd()); 424049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 425049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // The region of interest spans files; we have to walk everything. 426049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (Begin.first != End.first) 427049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return std::make_pair(PPRec.begin(OnlyLocalDecls), 428049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project PPRec.end(OnlyLocalDecls)); 429049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 430049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ASTUnit::PreprocessedEntitiesByFileMap &ByFileMap 431049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project = AU->getPreprocessedEntitiesByFile(); 432049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (ByFileMap.empty()) { 433049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Build the mapping from files to sets of preprocessed entities. 434049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for (PreprocessingRecord::iterator E = PPRec.begin(OnlyLocalDecls), 435049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project EEnd = PPRec.end(OnlyLocalDecls); 436049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project E != EEnd; ++E) { 437049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project std::pair<FileID, unsigned> P 438049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project = SM.getDecomposedInstantiationLoc((*E)->getSourceRange().getBegin()); 439049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ByFileMap[P.first].push_back(*E); 440a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang } 441049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 442049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 443049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return std::make_pair(ByFileMap[Begin.first].begin(), 444049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ByFileMap[Begin.first].end()); 445049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 446049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 447049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/// \brief Visit the children of the given cursor. 448049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/// 449049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/// \returns true if the visitation should be aborted, false if it 450049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/// should continue. 451049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectbool CursorVisitor::VisitChildren(CXCursor Cursor) { 452049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (clang_isReference(Cursor.kind)) { 453049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // By definition, references have no children. 454049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return false; 455049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 456049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 457049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Set the Parent field to Cursor, then back to its old value once we're 458049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // done. 459049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SetParentRAII SetParent(Parent, StmtParent, Cursor); 460049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 461049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (clang_isDeclaration(Cursor.kind)) { 462049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Decl *D = getCursorDecl(Cursor); 463049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project assert(D && "Invalid declaration cursor"); 464049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return VisitAttributes(D) || Visit(D); 465049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 466049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 467049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (clang_isStatement(Cursor.kind)) 468049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return Visit(getCursorStmt(Cursor)); 469049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (clang_isExpression(Cursor.kind)) 470049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return Visit(getCursorExpr(Cursor)); 471049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 472049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (clang_isTranslationUnit(Cursor.kind)) { 473049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXTranslationUnit tu = getCursorTU(Cursor); 474049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ASTUnit *CXXUnit = static_cast<ASTUnit*>(tu->TUData); 475049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (!CXXUnit->isMainFileAST() && CXXUnit->getOnlyLocalDecls() && 476049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project RegionOfInterest.isInvalid()) { 477049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for (ASTUnit::top_level_iterator TL = CXXUnit->top_level_begin(), 478049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TLEnd = CXXUnit->top_level_end(); 479049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TL != TLEnd; ++TL) { 480049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (Visit(MakeCXCursor(*TL, tu), true)) 481049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return true; 482049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 483049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } else if (VisitDeclContext( 484049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXXUnit->getASTContext().getTranslationUnitDecl())) 485049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return true; 486049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 487049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Walk the preprocessing record. 488049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (CXXUnit->getPreprocessor().getPreprocessingRecord()) { 489049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // FIXME: Once we have the ability to deserialize a preprocessing record, 490a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang // do so. 491049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project PreprocessingRecord::iterator E, EEnd; 492049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for (llvm::tie(E, EEnd) = getPreprocessedEntities(); E != EEnd; ++E) { 4938583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner if (MacroInstantiation *MI = dyn_cast<MacroInstantiation>(*E)) { 494049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (Visit(MakeMacroInstantiationCursor(MI, tu))) 495049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return true; 496049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 497049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project continue; 498049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 499049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 500049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (MacroDefinition *MD = dyn_cast<MacroDefinition>(*E)) { 501049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (Visit(MakeMacroDefinitionCursor(MD, tu))) 502049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return true; 503049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 504049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project continue; 505049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 506049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 507049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (InclusionDirective *ID = dyn_cast<InclusionDirective>(*E)) { 508049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (Visit(MakeInclusionDirectiveCursor(ID, tu))) 509049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return true; 510049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 511049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project continue; 512049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 513049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 514049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 515049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return false; 516049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 517049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 518049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Nothing to visit at the moment. 519049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return false; 520049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 521049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 522049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectbool CursorVisitor::VisitBlockDecl(BlockDecl *B) { 523049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (Visit(B->getSignatureAsWritten()->getTypeLoc())) 524aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich return true; 525049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 526049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (Stmt *Body = B->getBody()) 527049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return Visit(MakeCXCursor(Body, StmtParent, TU)); 528049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 529049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return false; 530049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 531049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 532049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectllvm::Optional<bool> CursorVisitor::shouldVisitCursor(CXCursor Cursor) { 533049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (RegionOfInterest.isValid()) { 534049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SourceRange Range = getFullCursorExtent(Cursor, AU->getSourceManager()); 535049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (Range.isInvalid()) 536049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return llvm::Optional<bool>(); 537049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 538049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project switch (CompareRegionOfInterest(Range)) { 539049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case RangeBefore: 540049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // This declaration comes before the region of interest; skip it. 541049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return llvm::Optional<bool>(); 542a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 543049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case RangeAfter: 544049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // This declaration comes after the region of interest; we're done. 545049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return false; 546049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 547049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case RangeOverlap: 548049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // This declaration overlaps the region of interest; visit it. 549049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 550049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 551049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 552049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return true; 553049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 554049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 555049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectbool CursorVisitor::VisitDeclContext(DeclContext *DC) { 556049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DeclContext::decl_iterator I = DC->decls_begin(), E = DC->decls_end(); 557049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 558049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // FIXME: Eventually remove. This part of a hack to support proper 559049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // iteration over all Decls contained lexically within an ObjC container. 560049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SaveAndRestore<DeclContext::decl_iterator*> DI_saved(DI_current, &I); 561049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SaveAndRestore<DeclContext::decl_iterator> DE_saved(DE_current, E); 562049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 563049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( ; I != E; ++I) { 564049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Decl *D = *I; 565049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (D->getLexicalDeclContext() != DC) 566049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project continue; 567049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXCursor Cursor = MakeCXCursor(D, TU); 568049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const llvm::Optional<bool> &V = shouldVisitCursor(Cursor); 569049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (!V.hasValue()) 570049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project continue; 571049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (!V.getValue()) 572049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return false; 573049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (Visit(Cursor, true)) 574049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return true; 575049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 576049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return false; 577049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 578049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 579049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectbool CursorVisitor::VisitTranslationUnitDecl(TranslationUnitDecl *D) { 580049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project llvm_unreachable("Translation units are visited directly by Visit()"); 581049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return false; 582049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 583049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 584049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectbool CursorVisitor::VisitTypedefDecl(TypedefDecl *D) { 585049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (TypeSourceInfo *TSInfo = D->getTypeSourceInfo()) 586049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return Visit(TSInfo->getTypeLoc()); 587049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 588049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return false; 589049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 590049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 591049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectbool CursorVisitor::VisitTagDecl(TagDecl *D) { 592049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return VisitDeclContext(D); 593049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 594049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 595049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectbool CursorVisitor::VisitClassTemplateSpecializationDecl( 596049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ClassTemplateSpecializationDecl *D) { 597049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bool ShouldVisitBody = false; 598049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project switch (D->getSpecializationKind()) { 599049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case TSK_Undeclared: 600049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case TSK_ImplicitInstantiation: 601049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Nothing to visit 602049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return false; 603049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 604049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case TSK_ExplicitInstantiationDeclaration: 605049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case TSK_ExplicitInstantiationDefinition: 606049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 607049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 608049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case TSK_ExplicitSpecialization: 609049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ShouldVisitBody = true; 6108583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner break; 6118583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner } 6128583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner 6138583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner // Visit the template arguments used in the specialization. 6148583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner if (TypeSourceInfo *SpecType = D->getTypeAsWritten()) { 6158583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner TypeLoc TL = SpecType->getTypeLoc(); 616049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (TemplateSpecializationTypeLoc *TSTLoc 617049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project = dyn_cast<TemplateSpecializationTypeLoc>(&TL)) { 618049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for (unsigned I = 0, N = TSTLoc->getNumArgs(); I != N; ++I) 619049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (VisitTemplateArgumentLoc(TSTLoc->getArgLoc(I))) 620049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return true; 621049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 622049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 623049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 624049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (ShouldVisitBody && VisitCXXRecordDecl(D)) 625049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return true; 626049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 627049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return false; 628049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 629049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 630049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectbool CursorVisitor::VisitClassTemplatePartialSpecializationDecl( 631049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ClassTemplatePartialSpecializationDecl *D) { 632049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // FIXME: Visit the "outer" template parameter lists on the TagDecl 633049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // before visiting these template parameters. 634049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (VisitTemplateParameters(D->getTemplateParameters())) 635049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return true; 636049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 637049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Visit the partial specialization arguments. 638049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const TemplateArgumentLoc *TemplateArgs = D->getTemplateArgsAsWritten(); 639049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for (unsigned I = 0, N = D->getNumTemplateArgsAsWritten(); I != N; ++I) 640049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (VisitTemplateArgumentLoc(TemplateArgs[I])) 641049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return true; 642049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 643049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return VisitCXXRecordDecl(D); 644049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 645049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 646049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectbool CursorVisitor::VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D) { 647049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Visit the default argument. 648049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (D->hasDefaultArgument() && !D->defaultArgumentWasInherited()) 649a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang if (TypeSourceInfo *DefArg = D->getDefaultArgumentInfo()) 650049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (Visit(DefArg->getTypeLoc())) 651049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return true; 652049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 653049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return false; 654049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 655049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 656049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectbool CursorVisitor::VisitEnumConstantDecl(EnumConstantDecl *D) { 657049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (Expr *Init = D->getInitExpr()) 658049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return Visit(MakeCXCursor(Init, StmtParent, TU)); 659049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return false; 660049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 661049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 662049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectbool CursorVisitor::VisitDeclaratorDecl(DeclaratorDecl *DD) { 663049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (TypeSourceInfo *TSInfo = DD->getTypeSourceInfo()) 664049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (Visit(TSInfo->getTypeLoc())) 665049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return true; 666049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 667049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return false; 668049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 669049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 670049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/// \brief Compare two base or member initializers based on their source order. 671049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectstatic int CompareCXXBaseOrMemberInitializers(const void* Xp, const void *Yp) { 672049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXXBaseOrMemberInitializer const * const *X 673049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project = static_cast<CXXBaseOrMemberInitializer const * const *>(Xp); 674049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXXBaseOrMemberInitializer const * const *Y 675049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project = static_cast<CXXBaseOrMemberInitializer const * const *>(Yp); 676049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 677049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ((*X)->getSourceOrder() < (*Y)->getSourceOrder()) 678049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return -1; 679049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else if ((*X)->getSourceOrder() > (*Y)->getSourceOrder()) 680c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner return 1; 681c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner else 682c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner return 0; 683049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 684049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 685049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectbool CursorVisitor::VisitFunctionDecl(FunctionDecl *ND) { 686049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (TypeSourceInfo *TSInfo = ND->getTypeSourceInfo()) { 687049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Visit the function declaration's syntactic components in the order 688049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // written. This requires a bit of work. 689049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TypeLoc TL = TSInfo->getTypeLoc(); 690049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FunctionTypeLoc *FTL = dyn_cast<FunctionTypeLoc>(&TL); 691049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 692a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang // If we have a function declared directly (without the use of a typedef), 693049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // visit just the return type. Otherwise, just visit the function's type 694049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // now. 695049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ((FTL && !isa<CXXConversionDecl>(ND) && Visit(FTL->getResultLoc())) || 696049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project (!FTL && Visit(TL))) 697049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return true; 698049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 699049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Visit the nested-name-specifier, if present. 700049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (NestedNameSpecifier *Qualifier = ND->getQualifier()) 701049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (VisitNestedNameSpecifier(Qualifier, ND->getQualifierRange())) 702049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return true; 703049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 704049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Visit the declaration name. 705049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (VisitDeclarationNameInfo(ND->getNameInfo())) 706049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return true; 707049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 708049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // FIXME: Visit explicitly-specified template arguments! 709049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 710049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Visit the function parameters, if we have a function type. 711049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (FTL && VisitFunctionTypeLoc(*FTL, true)) 712049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return true; 713049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 714049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // FIXME: Attributes? 7150a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project } 716049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 717049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (ND->isThisDeclarationADefinition()) { 718049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (CXXConstructorDecl *Constructor = dyn_cast<CXXConstructorDecl>(ND)) { 719049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Find the initializers that were written in the source. 720049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project llvm::SmallVector<CXXBaseOrMemberInitializer *, 4> WrittenInits; 721049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for (CXXConstructorDecl::init_iterator I = Constructor->init_begin(), 722049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project IEnd = Constructor->init_end(); 723049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project I != IEnd; ++I) { 724049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (!(*I)->isWritten()) 725049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project continue; 726049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 727e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang WrittenInits.push_back(*I); 728a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang } 729049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 730049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Sort the initializers in source order 731049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project llvm::array_pod_sort(WrittenInits.begin(), WrittenInits.end(), 732049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project &CompareCXXBaseOrMemberInitializers); 733049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 734049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Visit the initializers in source order 735049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for (unsigned I = 0, N = WrittenInits.size(); I != N; ++I) { 736049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXXBaseOrMemberInitializer *Init = WrittenInits[I]; 737049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (Init->isMemberInitializer()) { 738049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (Visit(MakeCursorMemberRef(Init->getMember(), 739049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Init->getMemberLocation(), TU))) 740049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return true; 741049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } else if (TypeSourceInfo *BaseInfo = Init->getBaseClassInfo()) { 742049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (Visit(BaseInfo->getTypeLoc())) 743049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return true; 744049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 745049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 746049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Visit the initializer value. 747049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (Expr *Initializer = Init->getInit()) 748049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (Visit(MakeCXCursor(Initializer, ND, TU))) 749049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return true; 750049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 751049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 752049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 753049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (Visit(MakeCXCursor(ND->getBody(), StmtParent, TU))) 754049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return true; 755049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 756049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 757049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return false; 758049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 759049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 760049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectbool CursorVisitor::VisitFieldDecl(FieldDecl *D) { 761049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (VisitDeclaratorDecl(D)) 762049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return true; 763049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 764049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (Expr *BitWidth = D->getBitWidth()) 765a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang return Visit(MakeCXCursor(BitWidth, StmtParent, TU)); 766049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 767049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return false; 768049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 769049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7700a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Projectbool CursorVisitor::VisitVarDecl(VarDecl *D) { 7710a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project if (VisitDeclaratorDecl(D)) 7720a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project return true; 7730a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 7740a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project if (Expr *Init = D->getInit()) 7750a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project return Visit(MakeCXCursor(Init, StmtParent, TU)); 7760a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 777049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return false; 778049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 779049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 780049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectbool CursorVisitor::VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D) { 781049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (VisitDeclaratorDecl(D)) 782049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return true; 783049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 784049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (D->hasDefaultArgument() && !D->defaultArgumentWasInherited()) 785049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (Expr *DefArg = D->getDefaultArgument()) 786049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return Visit(MakeCXCursor(DefArg, StmtParent, TU)); 787049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 788049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return false; 789049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 7900a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 791049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectbool CursorVisitor::VisitFunctionTemplateDecl(FunctionTemplateDecl *D) { 792049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // FIXME: Visit the "outer" template parameter lists on the FunctionDecl 793049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // before visiting these template parameters. 794049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (VisitTemplateParameters(D->getTemplateParameters())) 795049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return true; 796049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 797049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return VisitFunctionDecl(D->getTemplatedDecl()); 798049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 799049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 800049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectbool CursorVisitor::VisitClassTemplateDecl(ClassTemplateDecl *D) { 801049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // FIXME: Visit the "outer" template parameter lists on the TagDecl 802049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // before visiting these template parameters. 803049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (VisitTemplateParameters(D->getTemplateParameters())) 804049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return true; 805049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 806049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return VisitCXXRecordDecl(D->getTemplatedDecl()); 807049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 808049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 809049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectbool CursorVisitor::VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D) { 810049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (VisitTemplateParameters(D->getTemplateParameters())) 811049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return true; 812049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 813295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner if (D->hasDefaultArgument() && !D->defaultArgumentWasInherited() && 814049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project VisitTemplateArgumentLoc(D->getDefaultArgument())) 815295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner return true; 816049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 817049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return false; 818049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 819049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 820049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectbool CursorVisitor::VisitObjCMethodDecl(ObjCMethodDecl *ND) { 821049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (TypeSourceInfo *TSInfo = ND->getResultTypeSourceInfo()) 822049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (Visit(TSInfo->getTypeLoc())) 823049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return true; 824049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 825049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for (ObjCMethodDecl::param_iterator P = ND->param_begin(), 826049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project PEnd = ND->param_end(); 827295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner P != PEnd; ++P) { 828049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (Visit(MakeCXCursor(*P, TU))) 829049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return true; 830049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 831049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 832049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (ND->isThisDeclarationADefinition() && 833049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Visit(MakeCXCursor(ND->getBody(), StmtParent, TU))) 834049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return true; 835049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 836049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return false; 837049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 838049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 839049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectnamespace { 840049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project struct ContainerDeclsSort { 841049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SourceManager &SM; 842049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ContainerDeclsSort(SourceManager &sm) : SM(sm) {} 843049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bool operator()(Decl *A, Decl *B) { 844049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SourceLocation L_A = A->getLocStart(); 845049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SourceLocation L_B = B->getLocStart(); 846049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project assert(L_A.isValid() && L_B.isValid()); 847049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return SM.isBeforeInTranslationUnit(L_A, L_B); 848049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 849049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project }; 850049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 851049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 852049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectbool CursorVisitor::VisitObjCContainerDecl(ObjCContainerDecl *D) { 853049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // FIXME: Eventually convert back to just 'VisitDeclContext()'. Essentially 854049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // an @implementation can lexically contain Decls that are not properly 855049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // nested in the AST. When we identify such cases, we need to retrofit 856049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // this nesting here. 857049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (!DI_current) 858049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return VisitDeclContext(D); 859049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 860049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Scan the Decls that immediately come after the container 861049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // in the current DeclContext. If any fall within the 862049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // container's lexical region, stash them into a vector 863049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // for later processing. 864049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project llvm::SmallVector<Decl *, 24> DeclsInContainer; 865049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SourceLocation EndLoc = D->getSourceRange().getEnd(); 866049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SourceManager &SM = AU->getSourceManager(); 867049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (EndLoc.isValid()) { 868049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DeclContext::decl_iterator next = *DI_current; 869049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project while (++next != DE_current) { 870049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Decl *D_next = *next; 871049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (!D_next) 872049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 873049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SourceLocation L = D_next->getLocStart(); 874049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (!L.isValid()) 875049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 876049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (SM.isBeforeInTranslationUnit(L, EndLoc)) { 877049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *DI_current = next; 878049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DeclsInContainer.push_back(D_next); 879049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project continue; 880049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 881049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 882049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 883049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 884049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 885049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // The common case. 886049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (DeclsInContainer.empty()) 887049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return VisitDeclContext(D); 888049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 889049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Get all the Decls in the DeclContext, and sort them with the 890049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // additional ones we've collected. Then visit them. 891049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for (DeclContext::decl_iterator I = D->decls_begin(), E = D->decls_end(); 892049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project I!=E; ++I) { 893049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Decl *subDecl = *I; 894049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (!subDecl || subDecl->getLexicalDeclContext() != D || 895049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project subDecl->getLocStart().isInvalid()) 896049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project continue; 897049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DeclsInContainer.push_back(subDecl); 898049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 899049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 900049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Now sort the Decls so that they appear in lexical order. 901049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project std::sort(DeclsInContainer.begin(), DeclsInContainer.end(), 902049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ContainerDeclsSort(SM)); 903049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 904049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Now visit the decls. 905049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for (llvm::SmallVectorImpl<Decl*>::iterator I = DeclsInContainer.begin(), 906049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project E = DeclsInContainer.end(); I != E; ++I) { 907049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXCursor Cursor = MakeCXCursor(*I, TU); 908049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const llvm::Optional<bool> &V = shouldVisitCursor(Cursor); 909049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (!V.hasValue()) 910049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project continue; 911049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (!V.getValue()) 912049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return false; 913049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (Visit(Cursor, true)) 914049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return true; 915049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 916049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return false; 917049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 918049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 919049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectbool CursorVisitor::VisitObjCCategoryDecl(ObjCCategoryDecl *ND) { 920049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (Visit(MakeCursorObjCClassRef(ND->getClassInterface(), ND->getLocation(), 921049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TU))) 922049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return true; 923049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 924049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ObjCCategoryDecl::protocol_loc_iterator PL = ND->protocol_loc_begin(); 925049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for (ObjCCategoryDecl::protocol_iterator I = ND->protocol_begin(), 926049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project E = ND->protocol_end(); I != E; ++I, ++PL) 927049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (Visit(MakeCursorObjCProtocolRef(*I, *PL, TU))) 928049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return true; 929049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 930049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return VisitObjCContainerDecl(ND); 931049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 932049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 933049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectbool CursorVisitor::VisitObjCProtocolDecl(ObjCProtocolDecl *PID) { 934049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ObjCProtocolDecl::protocol_loc_iterator PL = PID->protocol_loc_begin(); 935049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for (ObjCProtocolDecl::protocol_iterator I = PID->protocol_begin(), 936049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project E = PID->protocol_end(); I != E; ++I, ++PL) 937049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (Visit(MakeCursorObjCProtocolRef(*I, *PL, TU))) 938049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return true; 939049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 940049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return VisitObjCContainerDecl(PID); 941049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 942049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 943049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectbool CursorVisitor::VisitObjCPropertyDecl(ObjCPropertyDecl *PD) { 944049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (PD->getTypeSourceInfo() && Visit(PD->getTypeSourceInfo()->getTypeLoc())) 945049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return true; 946049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 947049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // FIXME: This implements a workaround with @property declarations also being 948049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // installed in the DeclContext for the @interface. Eventually this code 949049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // should be removed. 950049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ObjCCategoryDecl *CDecl = dyn_cast<ObjCCategoryDecl>(PD->getDeclContext()); 951049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (!CDecl || !CDecl->IsClassExtension()) 952049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return false; 953049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 954049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ObjCInterfaceDecl *ID = CDecl->getClassInterface(); 955049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (!ID) 956049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return false; 957049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 958049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project IdentifierInfo *PropertyId = PD->getIdentifier(); 959049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ObjCPropertyDecl *prevDecl = 960049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ObjCPropertyDecl::findPropertyDecl(cast<DeclContext>(ID), PropertyId); 961049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 962049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (!prevDecl) 963049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return false; 964049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 965049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Visit synthesized methods since they will be skipped when visiting 966049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // the @interface. 967049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (ObjCMethodDecl *MD = prevDecl->getGetterMethodDecl()) 968049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (MD->isSynthesized() && MD->getLexicalDeclContext() == CDecl) 969049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (Visit(MakeCXCursor(MD, TU))) 970049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return true; 971049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 972049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (ObjCMethodDecl *MD = prevDecl->getSetterMethodDecl()) 973049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (MD->isSynthesized() && MD->getLexicalDeclContext() == CDecl) 974049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (Visit(MakeCXCursor(MD, TU))) 975049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return true; 976049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 977049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return false; 978049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 979049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 980049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectbool CursorVisitor::VisitObjCInterfaceDecl(ObjCInterfaceDecl *D) { 981049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Issue callbacks for super class. 982049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (D->getSuperClass() && 983049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Visit(MakeCursorObjCSuperClassRef(D->getSuperClass(), 984049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project D->getSuperClassLoc(), 985049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TU))) 986049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return true; 987049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 988049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ObjCInterfaceDecl::protocol_loc_iterator PL = D->protocol_loc_begin(); 989049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for (ObjCInterfaceDecl::protocol_iterator I = D->protocol_begin(), 990049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project E = D->protocol_end(); I != E; ++I, ++PL) 991049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (Visit(MakeCursorObjCProtocolRef(*I, *PL, TU))) 992049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return true; 993049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 994049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return VisitObjCContainerDecl(D); 995049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 996049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 997049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectbool CursorVisitor::VisitObjCImplDecl(ObjCImplDecl *D) { 998049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return VisitObjCContainerDecl(D); 999049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 1000049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1001c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turnerbool CursorVisitor::VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D) { 1002c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner // 'ID' could be null when dealing with invalid code. 1003049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (ObjCInterfaceDecl *ID = D->getClassInterface()) 1004049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (Visit(MakeCursorObjCClassRef(ID, D->getLocation(), TU))) 1005049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return true; 1006049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1007049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return VisitObjCImplDecl(D); 1008049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 1009049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1010049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectbool CursorVisitor::VisitObjCImplementationDecl(ObjCImplementationDecl *D) { 1011049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#if 0 1012049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Issue callbacks for super class. 1013049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // FIXME: No source location information! 1014049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (D->getSuperClass() && 1015049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Visit(MakeCursorObjCSuperClassRef(D->getSuperClass(), 1016049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project D->getSuperClassLoc(), 1017049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TU))) 1018049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return true; 1019049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif 1020049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1021049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return VisitObjCImplDecl(D); 1022049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 1023049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1024049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectbool CursorVisitor::VisitObjCForwardProtocolDecl(ObjCForwardProtocolDecl *D) { 1025049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ObjCForwardProtocolDecl::protocol_loc_iterator PL = D->protocol_loc_begin(); 1026049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for (ObjCForwardProtocolDecl::protocol_iterator I = D->protocol_begin(), 1027049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project E = D->protocol_end(); 1028049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project I != E; ++I, ++PL) 1029049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (Visit(MakeCursorObjCProtocolRef(*I, *PL, TU))) 1030049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return true; 1031049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1032049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return false; 1033049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 1034049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1035049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectbool CursorVisitor::VisitObjCClassDecl(ObjCClassDecl *D) { 1036049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for (ObjCClassDecl::iterator C = D->begin(), CEnd = D->end(); C != CEnd; ++C) 1037049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (Visit(MakeCursorObjCClassRef(C->getInterface(), C->getLocation(), TU))) 1038049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return true; 1039049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1040049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return false; 1041049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 1042049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1043049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectbool CursorVisitor::VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *PD) { 1044049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (ObjCIvarDecl *Ivar = PD->getPropertyIvarDecl()) 1045049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return Visit(MakeCursorMemberRef(Ivar, PD->getPropertyIvarDeclLoc(), TU)); 1046049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1047049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return false; 1048049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 1049049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1050049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectbool CursorVisitor::VisitNamespaceDecl(NamespaceDecl *D) { 1051049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return VisitDeclContext(D); 1052049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 1053049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1054049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectbool CursorVisitor::VisitNamespaceAliasDecl(NamespaceAliasDecl *D) { 1055049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Visit nested-name-specifier. 1056049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (NestedNameSpecifier *Qualifier = D->getQualifier()) 1057049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (VisitNestedNameSpecifier(Qualifier, D->getQualifierRange())) 1058049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return true; 1059049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1060049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return Visit(MakeCursorNamespaceRef(D->getAliasedNamespace(), 1061049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project D->getTargetNameLoc(), TU)); 1062049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 1063049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1064049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectbool CursorVisitor::VisitUsingDecl(UsingDecl *D) { 1065049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Visit nested-name-specifier. 1066049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (NestedNameSpecifier *Qualifier = D->getTargetNestedNameDecl()) 1067049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (VisitNestedNameSpecifier(Qualifier, D->getNestedNameRange())) 1068049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return true; 1069049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1070049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (Visit(MakeCursorOverloadedDeclRef(D, D->getLocation(), TU))) 1071049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return true; 1072049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1073049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return VisitDeclarationNameInfo(D->getNameInfo()); 1074049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 1075049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1076049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectbool CursorVisitor::VisitUsingDirectiveDecl(UsingDirectiveDecl *D) { 1077049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Visit nested-name-specifier. 1078049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (NestedNameSpecifier *Qualifier = D->getQualifier()) 1079049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (VisitNestedNameSpecifier(Qualifier, D->getQualifierRange())) 1080049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return true; 1081049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1082049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return Visit(MakeCursorNamespaceRef(D->getNominatedNamespaceAsWritten(), 1083049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project D->getIdentLocation(), TU)); 1084049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 1085049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1086049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectbool CursorVisitor::VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D) { 1087049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Visit nested-name-specifier. 1088049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (NestedNameSpecifier *Qualifier = D->getTargetNestedNameSpecifier()) 1089049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (VisitNestedNameSpecifier(Qualifier, D->getTargetNestedNameRange())) 1090049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return true; 1091049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1092049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return VisitDeclarationNameInfo(D->getNameInfo()); 1093049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 1094049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1095049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectbool CursorVisitor::VisitUnresolvedUsingTypenameDecl( 1096049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project UnresolvedUsingTypenameDecl *D) { 1097049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Visit nested-name-specifier. 1098049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (NestedNameSpecifier *Qualifier = D->getTargetNestedNameSpecifier()) 1099049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (VisitNestedNameSpecifier(Qualifier, D->getTargetNestedNameRange())) 1100049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return true; 1101049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1102049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return false; 1103049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 1104049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1105049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectbool CursorVisitor::VisitDeclarationNameInfo(DeclarationNameInfo Name) { 1106049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project switch (Name.getName().getNameKind()) { 1107049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case clang::DeclarationName::Identifier: 1108049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case clang::DeclarationName::CXXLiteralOperatorName: 1109049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case clang::DeclarationName::CXXOperatorName: 1110049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case clang::DeclarationName::CXXUsingDirective: 1111049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return false; 1112049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1113049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case clang::DeclarationName::CXXConstructorName: 1114049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case clang::DeclarationName::CXXDestructorName: 1115049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case clang::DeclarationName::CXXConversionFunctionName: 1116049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (TypeSourceInfo *TSInfo = Name.getNamedTypeInfo()) 1117049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return Visit(TSInfo->getTypeLoc()); 1118049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return false; 1119049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1120049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case clang::DeclarationName::ObjCZeroArgSelector: 1121049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case clang::DeclarationName::ObjCOneArgSelector: 1122049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case clang::DeclarationName::ObjCMultiArgSelector: 1123049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // FIXME: Per-identifier location info? 1124049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return false; 1125049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1126049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1127049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return false; 1128049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 1129049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1130049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectbool CursorVisitor::VisitNestedNameSpecifier(NestedNameSpecifier *NNS, 1131049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SourceRange Range) { 1132049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // FIXME: This whole routine is a hack to work around the lack of proper 1133aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich // source information in nested-name-specifiers (PR5791). Since we do have 1134aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich // a beginning source location, we can visit the first component of the 1135aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich // nested-name-specifier, if it's a single-token component. 1136aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich if (!NNS) 1137aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich return false; 1138aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 1139aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich // Get the first component in the nested-name-specifier. 1140aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich while (NestedNameSpecifier *Prefix = NNS->getPrefix()) 1141aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich NNS = Prefix; 1142aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 1143aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich switch (NNS->getKind()) { 1144aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich case NestedNameSpecifier::Namespace: 1145aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich // FIXME: The token at this source location might actually have been a 1146aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich // namespace alias, but we don't model that. Lame! 1147aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich return Visit(MakeCursorNamespaceRef(NNS->getAsNamespace(), Range.getBegin(), 1148aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich TU)); 1149aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 1150aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich case NestedNameSpecifier::TypeSpec: { 1151aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich // If the type has a form where we know that the beginning of the source 1152aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich // range matches up with a reference cursor. Visit the appropriate reference 1153aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich // cursor. 1154aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich Type *T = NNS->getAsType(); 1155aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich if (const TypedefType *Typedef = dyn_cast<TypedefType>(T)) 1156aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich return Visit(MakeCursorTypeRef(Typedef->getDecl(), Range.getBegin(), TU)); 1157aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich if (const TagType *Tag = dyn_cast<TagType>(T)) 1158aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich return Visit(MakeCursorTypeRef(Tag->getDecl(), Range.getBegin(), TU)); 1159aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich if (const TemplateSpecializationType *TST 1160aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich = dyn_cast<TemplateSpecializationType>(T)) 1161aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich return VisitTemplateName(TST->getTemplateName(), Range.getBegin()); 1162aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich break; 1163aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich } 1164aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 1165aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich case NestedNameSpecifier::TypeSpecWithTemplate: 1166aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich case NestedNameSpecifier::Global: 1167aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich case NestedNameSpecifier::Identifier: 1168aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich break; 1169aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich } 1170aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 1171aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich return false; 1172aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich} 1173aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 1174aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevichbool CursorVisitor::VisitTemplateParameters( 1175aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich const TemplateParameterList *Params) { 1176aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich if (!Params) 1177aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich return false; 1178aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 1179aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich for (TemplateParameterList::const_iterator P = Params->begin(), 1180aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich PEnd = Params->end(); 1181aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich P != PEnd; ++P) { 1182aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich if (Visit(MakeCXCursor(*P, TU))) 1183aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich return true; 1184aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich } 1185aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 1186aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich return false; 1187aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich} 1188aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 1189aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevichbool CursorVisitor::VisitTemplateName(TemplateName Name, SourceLocation Loc) { 1190aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich switch (Name.getKind()) { 1191aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich case TemplateName::Template: 1192aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich return Visit(MakeCursorTemplateRef(Name.getAsTemplateDecl(), Loc, TU)); 1193aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 1194aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich case TemplateName::OverloadedTemplate: 1195aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich // Visit the overloaded template set. 1196aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich if (Visit(MakeCursorOverloadedDeclRef(Name, Loc, TU))) 1197aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich return true; 1198aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 1199aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich return false; 1200aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 1201aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich case TemplateName::DependentTemplate: 1202aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich // FIXME: Visit nested-name-specifier. 1203aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich return false; 1204aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 1205aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich case TemplateName::QualifiedTemplate: 1206aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich // FIXME: Visit nested-name-specifier. 1207aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich return Visit(MakeCursorTemplateRef( 1208aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich Name.getAsQualifiedTemplateName()->getDecl(), 1209aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich Loc, TU)); 1210aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich } 1211aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 1212aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich return false; 1213aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich} 1214aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 1215aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevichbool CursorVisitor::VisitTemplateArgumentLoc(const TemplateArgumentLoc &TAL) { 1216aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich switch (TAL.getArgument().getKind()) { 1217aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich case TemplateArgument::Null: 1218aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich case TemplateArgument::Integral: 1219aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich return false; 1220aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 1221aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich case TemplateArgument::Pack: 1222aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich // FIXME: Implement when variadic templates come along. 1223aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich return false; 1224aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 1225aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich case TemplateArgument::Type: 1226aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich if (TypeSourceInfo *TSInfo = TAL.getTypeSourceInfo()) 1227aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich return Visit(TSInfo->getTypeLoc()); 1228aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich return false; 1229aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 1230aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich case TemplateArgument::Declaration: 1231aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich if (Expr *E = TAL.getSourceDeclExpression()) 1232aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich return Visit(MakeCXCursor(E, StmtParent, TU)); 1233aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich return false; 1234aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 1235aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich case TemplateArgument::Expression: 1236aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich if (Expr *E = TAL.getSourceExpression()) 1237aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich return Visit(MakeCXCursor(E, StmtParent, TU)); 1238aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich return false; 1239aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 1240aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich case TemplateArgument::Template: 1241aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich return VisitTemplateName(TAL.getArgument().getAsTemplate(), 1242aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich TAL.getTemplateNameLoc()); 1243aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich } 1244aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 1245aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich return false; 1246aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich} 1247aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 1248aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevichbool CursorVisitor::VisitLinkageSpecDecl(LinkageSpecDecl *D) { 1249aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich return VisitDeclContext(D); 1250aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich} 1251aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 1252aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevichbool CursorVisitor::VisitQualifiedTypeLoc(QualifiedTypeLoc TL) { 1253aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich return Visit(TL.getUnqualifiedLoc()); 1254aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich} 1255aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 1256aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevichbool CursorVisitor::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) { 1257aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich ASTContext &Context = AU->getASTContext(); 1258aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 1259aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich // Some builtin types (such as Objective-C's "id", "sel", and 1260aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich // "Class") have associated declarations. Create cursors for those. 1261aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich QualType VisitType; 1262aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich switch (TL.getType()->getAs<BuiltinType>()->getKind()) { 1263aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich case BuiltinType::Void: 1264aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich case BuiltinType::Bool: 1265aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich case BuiltinType::Char_U: 1266aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich case BuiltinType::UChar: 1267aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich case BuiltinType::Char16: 1268aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich case BuiltinType::Char32: 1269aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich case BuiltinType::UShort: 1270aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich case BuiltinType::UInt: 1271aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich case BuiltinType::ULong: 1272aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich case BuiltinType::ULongLong: 1273aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich case BuiltinType::UInt128: 1274aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich case BuiltinType::Char_S: 1275aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich case BuiltinType::SChar: 1276aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich case BuiltinType::WChar: 1277aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich case BuiltinType::Short: 1278aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich case BuiltinType::Int: 1279aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich case BuiltinType::Long: 1280aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich case BuiltinType::LongLong: 1281aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich case BuiltinType::Int128: 1282aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich case BuiltinType::Float: 1283aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich case BuiltinType::Double: 1284aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich case BuiltinType::LongDouble: 1285aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich case BuiltinType::NullPtr: 1286aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich case BuiltinType::Overload: 1287aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich case BuiltinType::Dependent: 1288aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich break; 1289aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 1290aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich case BuiltinType::UndeducedAuto: // FIXME: Deserves a cursor? 1291aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich break; 1292aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 1293aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich case BuiltinType::ObjCId: 1294aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich VisitType = Context.getObjCIdType(); 1295aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich break; 1296aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 1297aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich case BuiltinType::ObjCClass: 1298aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich VisitType = Context.getObjCClassType(); 1299aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich break; 1300aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 1301aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich case BuiltinType::ObjCSel: 1302aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich VisitType = Context.getObjCSelType(); 1303aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich break; 1304aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich } 1305aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 1306aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich if (!VisitType.isNull()) { 1307aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich if (const TypedefType *Typedef = VisitType->getAs<TypedefType>()) 1308aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich return Visit(MakeCursorTypeRef(Typedef->getDecl(), TL.getBuiltinLoc(), 1309aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich TU)); 1310aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich } 1311aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 1312aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich return false; 1313aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich} 1314aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 1315aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevichbool CursorVisitor::VisitTypedefTypeLoc(TypedefTypeLoc TL) { 1316aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich return Visit(MakeCursorTypeRef(TL.getTypedefDecl(), TL.getNameLoc(), TU)); 1317aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich} 1318aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 1319aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevichbool CursorVisitor::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) { 1320aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich return Visit(MakeCursorTypeRef(TL.getDecl(), TL.getNameLoc(), TU)); 1321aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich} 1322aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 1323aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevichbool CursorVisitor::VisitTagTypeLoc(TagTypeLoc TL) { 1324aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich return Visit(MakeCursorTypeRef(TL.getDecl(), TL.getNameLoc(), TU)); 1325aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich} 1326aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 1327aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevichbool CursorVisitor::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) { 1328aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich // FIXME: We can't visit the template type parameter, because there's 1329aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich // no context information with which we can match up the depth/index in the 1330aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich // type to the appropriate 1331aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich return false; 1332aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich} 1333aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 1334aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevichbool CursorVisitor::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) { 1335aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich if (Visit(MakeCursorObjCClassRef(TL.getIFaceDecl(), TL.getNameLoc(), TU))) 1336aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich return true; 1337aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 1338aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich return false; 1339aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich} 1340aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 1341aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevichbool CursorVisitor::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) { 1342aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich if (TL.hasBaseTypeAsWritten() && Visit(TL.getBaseLoc())) 1343aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich return true; 1344aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 1345aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich for (unsigned I = 0, N = TL.getNumProtocols(); I != N; ++I) { 1346aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich if (Visit(MakeCursorObjCProtocolRef(TL.getProtocol(I), TL.getProtocolLoc(I), 1347aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich TU))) 1348aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich return true; 1349aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich } 1350aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 1351aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich return false; 1352aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich} 1353aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 1354aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevichbool CursorVisitor::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) { 1355aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich return Visit(TL.getPointeeLoc()); 1356aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich} 1357aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 1358aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevichbool CursorVisitor::VisitPointerTypeLoc(PointerTypeLoc TL) { 1359aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich return Visit(TL.getPointeeLoc()); 1360aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich} 1361aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 1362aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevichbool CursorVisitor::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) { 1363aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich return Visit(TL.getPointeeLoc()); 1364aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich} 1365aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 1366aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevichbool CursorVisitor::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) { 1367aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich return Visit(TL.getPointeeLoc()); 1368aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich} 1369aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 1370aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevichbool CursorVisitor::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) { 1371aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich return Visit(TL.getPointeeLoc()); 1372aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich} 1373aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 1374aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevichbool CursorVisitor::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) { 1375aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich return Visit(TL.getPointeeLoc()); 1376aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich} 1377aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 1378aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevichbool CursorVisitor::VisitFunctionTypeLoc(FunctionTypeLoc TL, 1379aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich bool SkipResultType) { 1380aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich if (!SkipResultType && Visit(TL.getResultLoc())) 1381aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich return true; 1382aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 1383aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich for (unsigned I = 0, N = TL.getNumArgs(); I != N; ++I) 1384aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich if (Decl *D = TL.getArg(I)) 1385aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich if (Visit(MakeCXCursor(D, TU))) 1386aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich return true; 1387aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 1388aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich return false; 1389aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich} 1390aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 1391aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevichbool CursorVisitor::VisitArrayTypeLoc(ArrayTypeLoc TL) { 1392aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich if (Visit(TL.getElementLoc())) 1393aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich return true; 1394aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 1395aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich if (Expr *Size = TL.getSizeExpr()) 1396aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich return Visit(MakeCXCursor(Size, StmtParent, TU)); 1397aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 1398aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich return false; 1399aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich} 1400aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 1401aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevichbool CursorVisitor::VisitTemplateSpecializationTypeLoc( 1402aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich TemplateSpecializationTypeLoc TL) { 1403aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich // Visit the template name. 1404aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich if (VisitTemplateName(TL.getTypePtr()->getTemplateName(), 1405aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich TL.getTemplateNameLoc())) 1406aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich return true; 1407aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 1408aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich // Visit the template arguments. 1409aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich for (unsigned I = 0, N = TL.getNumArgs(); I != N; ++I) 1410aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich if (VisitTemplateArgumentLoc(TL.getArgLoc(I))) 1411aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich return true; 1412aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 1413aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich return false; 1414049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 1415049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1416049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectbool CursorVisitor::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) { 1417049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return Visit(MakeCXCursor(TL.getUnderlyingExpr(), StmtParent, TU)); 1418049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 1419049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1420049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectbool CursorVisitor::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) { 1421049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (TypeSourceInfo *TSInfo = TL.getUnderlyingTInfo()) 1422049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return Visit(TSInfo->getTypeLoc()); 1423049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1424049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return false; 1425049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 1426049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1427049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectbool CursorVisitor::VisitCXXRecordDecl(CXXRecordDecl *D) { 1428049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (D->isDefinition()) { 1429049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for (CXXRecordDecl::base_class_iterator I = D->bases_begin(), 1430049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project E = D->bases_end(); I != E; ++I) { 1431049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (Visit(cxcursor::MakeCursorCXXBaseSpecifier(I, TU))) 1432049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return true; 1433049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1434049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1435049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1436049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return VisitTagDecl(D); 1437049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 1438049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1439049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectbool CursorVisitor::VisitAttributes(Decl *D) { 1440049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for (AttrVec::const_iterator i = D->attr_begin(), e = D->attr_end(); 1441049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project i != e; ++i) 1442049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (Visit(MakeCXCursor(*i, D, TU))) 1443049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return true; 1444049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1445049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return false; 1446049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 1447049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1448049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project//===----------------------------------------------------------------------===// 1449049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project// Data-recursive visitor methods. 1450049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project//===----------------------------------------------------------------------===// 1451049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1452049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectnamespace { 1453049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DEF_JOB(NAME, DATA, KIND)\ 1454049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectclass NAME : public VisitorJob {\ 1455049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectpublic:\ 1456049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project NAME(DATA *d, CXCursor parent) : VisitorJob(parent, VisitorJob::KIND, d) {} \ 1457049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static bool classof(const VisitorJob *VJ) { return VJ->getKind() == KIND; }\ 1458049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DATA *get() const { return static_cast<DATA*>(data[0]); }\ 1459049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project}; 1460049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1461049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source ProjectDEF_JOB(StmtVisit, Stmt, StmtVisitKind) 1462049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source ProjectDEF_JOB(MemberExprParts, MemberExpr, MemberExprPartsKind) 1463049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source ProjectDEF_JOB(DeclRefExprParts, DeclRefExpr, DeclRefExprPartsKind) 1464049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source ProjectDEF_JOB(OverloadExprParts, OverloadExpr, OverloadExprPartsKind) 1465049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source ProjectDEF_JOB(ExplicitTemplateArgsVisit, ExplicitTemplateArgumentList, 1466049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ExplicitTemplateArgsVisitKind) 1467049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#undef DEF_JOB 1468049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1469049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectclass DeclVisit : public VisitorJob { 1470049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectpublic: 1471049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DeclVisit(Decl *d, CXCursor parent, bool isFirst) : 1472049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project VisitorJob(parent, VisitorJob::DeclVisitKind, 1473049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project d, isFirst ? (void*) 1 : (void*) 0) {} 1474049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static bool classof(const VisitorJob *VJ) { 1475a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang return VJ->getKind() == DeclVisitKind; 1476049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1477049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Decl *get() const { return static_cast<Decl*>(data[0]); } 1478049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bool isFirst() const { return data[1] ? true : false; } 1479049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project}; 1480049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectclass TypeLocVisit : public VisitorJob { 1481049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectpublic: 1482049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TypeLocVisit(TypeLoc tl, CXCursor parent) : 1483049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project VisitorJob(parent, VisitorJob::TypeLocVisitKind, 1484049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project tl.getType().getAsOpaquePtr(), tl.getOpaqueData()) {} 1485049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1486049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static bool classof(const VisitorJob *VJ) { 1487049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return VJ->getKind() == TypeLocVisitKind; 1488a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang } 1489049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1490049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TypeLoc get() const { 1491049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project QualType T = QualType::getFromOpaquePtr(data[0]); 1492049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return TypeLoc(T, data[1]); 1493049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1494049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project}; 1495049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1496049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectclass LabelRefVisit : public VisitorJob { 1497049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectpublic: 1498049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project LabelRefVisit(LabelStmt *LS, SourceLocation labelLoc, CXCursor parent) 1499049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project : VisitorJob(parent, VisitorJob::LabelRefVisitKind, LS, 1500a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang (void*) labelLoc.getRawEncoding()) {} 1501049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1502049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static bool classof(const VisitorJob *VJ) { 1503049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return VJ->getKind() == VisitorJob::LabelRefVisitKind; 1504049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1505a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang LabelStmt *get() const { return static_cast<LabelStmt*>(data[0]); } 1506049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SourceLocation getLoc() const { 1507049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return SourceLocation::getFromRawEncoding((unsigned)(uintptr_t) data[1]); } 1508049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project}; 1509049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectclass NestedNameSpecifierVisit : public VisitorJob { 1510049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectpublic: 1511049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project NestedNameSpecifierVisit(NestedNameSpecifier *NS, SourceRange R, 1512049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXCursor parent) 1513049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project : VisitorJob(parent, VisitorJob::NestedNameSpecifierVisitKind, 1514049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project NS, (void*) R.getBegin().getRawEncoding(), 1515049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project (void*) R.getEnd().getRawEncoding()) {} 1516049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static bool classof(const VisitorJob *VJ) { 1517049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return VJ->getKind() == VisitorJob::NestedNameSpecifierVisitKind; 1518049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1519049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project NestedNameSpecifier *get() const { 1520a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang return static_cast<NestedNameSpecifier*>(data[0]); 1521049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1522049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SourceRange getSourceRange() const { 1523049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SourceLocation A = 1524049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SourceLocation::getFromRawEncoding((unsigned)(uintptr_t) data[1]); 1525049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SourceLocation B = 1526049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SourceLocation::getFromRawEncoding((unsigned)(uintptr_t) data[2]); 1527a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang return SourceRange(A, B); 1528049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1529049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project}; 1530049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectclass DeclarationNameInfoVisit : public VisitorJob { 1531049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectpublic: 1532049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DeclarationNameInfoVisit(Stmt *S, CXCursor parent) 1533049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project : VisitorJob(parent, VisitorJob::DeclarationNameInfoVisitKind, S) {} 1534049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static bool classof(const VisitorJob *VJ) { 1535049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return VJ->getKind() == VisitorJob::DeclarationNameInfoVisitKind; 1536049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1537049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DeclarationNameInfo get() const { 1538049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Stmt *S = static_cast<Stmt*>(data[0]); 1539049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project switch (S->getStmtClass()) { 1540049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project default: 1541049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project llvm_unreachable("Unhandled Stmt"); 1542049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Stmt::CXXDependentScopeMemberExprClass: 1543a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang return cast<CXXDependentScopeMemberExpr>(S)->getMemberNameInfo(); 1544049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Stmt::DependentScopeDeclRefExprClass: 1545049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return cast<DependentScopeDeclRefExpr>(S)->getNameInfo(); 1546049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1547049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1548049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project}; 1549049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectclass MemberRefVisit : public VisitorJob { 1550049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectpublic: 1551049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project MemberRefVisit(FieldDecl *D, SourceLocation L, CXCursor parent) 1552049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project : VisitorJob(parent, VisitorJob::MemberRefVisitKind, D, 1553049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project (void*) L.getRawEncoding()) {} 1554049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static bool classof(const VisitorJob *VJ) { 1555049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return VJ->getKind() == VisitorJob::MemberRefVisitKind; 1556049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1557049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FieldDecl *get() const { 1558049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return static_cast<FieldDecl*>(data[0]); 1559049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1560049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SourceLocation getLoc() const { 1561049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return SourceLocation::getFromRawEncoding((unsigned)(uintptr_t) data[1]); 1562049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1563049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project}; 1564049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectclass EnqueueVisitor : public StmtVisitor<EnqueueVisitor, void> { 1565049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project VisitorWorkList &WL; 1566049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXCursor Parent; 1567049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectpublic: 1568049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project EnqueueVisitor(VisitorWorkList &wl, CXCursor parent) 1569049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project : WL(wl), Parent(parent) {} 1570049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1571049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project void VisitAddrLabelExpr(AddrLabelExpr *E); 1572049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project void VisitBlockExpr(BlockExpr *B); 1573049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project void VisitCompoundLiteralExpr(CompoundLiteralExpr *E); 1574049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project void VisitCompoundStmt(CompoundStmt *S); 1575049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project void VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E) { /* Do nothing. */ } 1576049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project void VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr *E); 1577049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project void VisitCXXNewExpr(CXXNewExpr *E); 1578049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project void VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *E); 1579049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project void VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E); 1580049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project void VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E); 1581049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project void VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *E); 1582049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project void VisitCXXTypeidExpr(CXXTypeidExpr *E); 1583a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang void VisitCXXUnresolvedConstructExpr(CXXUnresolvedConstructExpr *E); 1584049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project void VisitCXXUuidofExpr(CXXUuidofExpr *E); 1585049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project void VisitDeclRefExpr(DeclRefExpr *D); 1586a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang void VisitDeclStmt(DeclStmt *S); 1587a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang void VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E); 1588a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang void VisitDesignatedInitExpr(DesignatedInitExpr *E); 1589a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang void VisitExplicitCastExpr(ExplicitCastExpr *E); 1590a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang void VisitForStmt(ForStmt *FS); 1591049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project void VisitGotoStmt(GotoStmt *GS); 1592049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project void VisitIfStmt(IfStmt *If); 1593049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project void VisitInitListExpr(InitListExpr *IE); 1594049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project void VisitMemberExpr(MemberExpr *M); 1595049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project void VisitOffsetOfExpr(OffsetOfExpr *E); 1596049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project void VisitObjCEncodeExpr(ObjCEncodeExpr *E); 1597049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project void VisitObjCMessageExpr(ObjCMessageExpr *M); 1598049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project void VisitOverloadExpr(OverloadExpr *E); 1599049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project void VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *E); 1600049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project void VisitStmt(Stmt *S); 1601a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang void VisitSwitchStmt(SwitchStmt *S); 1602049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project void VisitTypesCompatibleExpr(TypesCompatibleExpr *E); 1603049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project void VisitWhileStmt(WhileStmt *W); 1604049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project void VisitUnaryTypeTraitExpr(UnaryTypeTraitExpr *E); 1605049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project void VisitUnresolvedMemberExpr(UnresolvedMemberExpr *U); 1606049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project void VisitVAArgExpr(VAArgExpr *E); 1607049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1608049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectprivate: 1609049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project void AddDeclarationNameInfo(Stmt *S); 1610049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project void AddNestedNameSpecifier(NestedNameSpecifier *NS, SourceRange R); 1611049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project void AddExplicitTemplateArgs(const ExplicitTemplateArgumentList *A); 1612049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project void AddMemberRef(FieldDecl *D, SourceLocation L); 1613049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project void AddStmt(Stmt *S); 1614049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project void AddDecl(Decl *D, bool isFirst = true); 1615049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project void AddTypeLoc(TypeSourceInfo *TI); 1616049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project void EnqueueChildren(Stmt *S); 1617049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project}; 1618049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} // end anonyous namespace 1619049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1620049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectvoid EnqueueVisitor::AddDeclarationNameInfo(Stmt *S) { 1621049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // 'S' should always be non-null, since it comes from the 1622a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang // statement we are visiting. 1623049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project WL.push_back(DeclarationNameInfoVisit(S, Parent)); 1624049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 1625049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectvoid EnqueueVisitor::AddNestedNameSpecifier(NestedNameSpecifier *N, 1626049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SourceRange R) { 1627049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (N) 1628049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project WL.push_back(NestedNameSpecifierVisit(N, R, Parent)); 1629049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 1630049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectvoid EnqueueVisitor::AddStmt(Stmt *S) { 1631049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (S) 1632049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project WL.push_back(StmtVisit(S, Parent)); 1633049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 1634049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectvoid EnqueueVisitor::AddDecl(Decl *D, bool isFirst) { 1635049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (D) 1636049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project WL.push_back(DeclVisit(D, Parent, isFirst)); 1637049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 1638049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectvoid EnqueueVisitor:: 1639049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project AddExplicitTemplateArgs(const ExplicitTemplateArgumentList *A) { 1640049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (A) 1641049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project WL.push_back(ExplicitTemplateArgsVisit( 1642049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const_cast<ExplicitTemplateArgumentList*>(A), Parent)); 1643049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 1644049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectvoid EnqueueVisitor::AddMemberRef(FieldDecl *D, SourceLocation L) { 1645049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (D) 1646049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project WL.push_back(MemberRefVisit(D, L, Parent)); 1647049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 1648049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectvoid EnqueueVisitor::AddTypeLoc(TypeSourceInfo *TI) { 1649049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (TI) 1650049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project WL.push_back(TypeLocVisit(TI->getTypeLoc(), Parent)); 1651049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1652049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectvoid EnqueueVisitor::EnqueueChildren(Stmt *S) { 1653049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project unsigned size = WL.size(); 1654049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for (Stmt::child_iterator Child = S->child_begin(), ChildEnd = S->child_end(); 1655049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Child != ChildEnd; ++Child) { 1656049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project AddStmt(*Child); 1657049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1658049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (size == WL.size()) 1659049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 1660049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Now reverse the entries we just added. This will match the DFS 1661049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // ordering performed by the worklist. 1662049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project VisitorWorkList::iterator I = WL.begin() + size, E = WL.end(); 1663049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project std::reverse(I, E); 1664049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 1665049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectvoid EnqueueVisitor::VisitAddrLabelExpr(AddrLabelExpr *E) { 1666049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project WL.push_back(LabelRefVisit(E->getLabel(), E->getLabelLoc(), Parent)); 1667049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 1668049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectvoid EnqueueVisitor::VisitBlockExpr(BlockExpr *B) { 1669049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project AddDecl(B->getBlockDecl()); 1670049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 1671049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectvoid EnqueueVisitor::VisitCompoundLiteralExpr(CompoundLiteralExpr *E) { 1672049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project EnqueueChildren(E); 1673049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project AddTypeLoc(E->getTypeSourceInfo()); 1674049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 1675049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectvoid EnqueueVisitor::VisitCompoundStmt(CompoundStmt *S) { 1676049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for (CompoundStmt::reverse_body_iterator I = S->body_rbegin(), 1677049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project E = S->body_rend(); I != E; ++I) { 1678049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project AddStmt(*I); 1679049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1680049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 1681049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectvoid EnqueueVisitor:: 1682049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source ProjectVisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr *E) { 1683049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project AddExplicitTemplateArgs(E->getOptionalExplicitTemplateArgs()); 1684049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project AddDeclarationNameInfo(E); 1685049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (NestedNameSpecifier *Qualifier = E->getQualifier()) 1686049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project AddNestedNameSpecifier(Qualifier, E->getQualifierRange()); 1687049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (!E->isImplicitAccess()) 1688049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project AddStmt(E->getBase()); 1689049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 1690049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectvoid EnqueueVisitor::VisitCXXNewExpr(CXXNewExpr *E) { 1691049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Enqueue the initializer or constructor arguments. 1692049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for (unsigned I = E->getNumConstructorArgs(); I > 0; --I) 1693049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project AddStmt(E->getConstructorArg(I-1)); 1694049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Enqueue the array size, if any. 1695049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project AddStmt(E->getArraySize()); 1696049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Enqueue the allocated type. 1697049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project AddTypeLoc(E->getAllocatedTypeSourceInfo()); 1698049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Enqueue the placement arguments. 1699049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for (unsigned I = E->getNumPlacementArgs(); I > 0; --I) 1700049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project AddStmt(E->getPlacementArg(I-1)); 1701049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 1702049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectvoid EnqueueVisitor::VisitCXXOperatorCallExpr(CXXOperatorCallExpr *CE) { 1703049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for (unsigned I = CE->getNumArgs(); I > 1 /* Yes, this is 1 */; --I) 1704049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project AddStmt(CE->getArg(I-1)); 1705049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project AddStmt(CE->getCallee()); 1706049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project AddStmt(CE->getArg(0)); 1707049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 1708a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wangvoid EnqueueVisitor::VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E) { 1709049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Visit the name of the type being destroyed. 1710049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project AddTypeLoc(E->getDestroyedTypeInfo()); 1711049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Visit the scope type that looks disturbingly like the nested-name-specifier 1712049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // but isn't. 1713049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project AddTypeLoc(E->getScopeTypeInfo()); 1714049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Visit the nested-name-specifier. 1715049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (NestedNameSpecifier *Qualifier = E->getQualifier()) 1716a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang AddNestedNameSpecifier(Qualifier, E->getQualifierRange()); 1717049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Visit base expression. 1718049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project AddStmt(E->getBase()); 1719049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 1720049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectvoid EnqueueVisitor::VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *E) { 1721049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project AddTypeLoc(E->getTypeSourceInfo()); 1722e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang} 1723049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectvoid EnqueueVisitor::VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *E) { 1724049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project EnqueueChildren(E); 1725049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project AddTypeLoc(E->getTypeSourceInfo()); 1726a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang} 1727049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectvoid EnqueueVisitor::VisitCXXTypeidExpr(CXXTypeidExpr *E) { 1728049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project EnqueueChildren(E); 1729049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (E->isTypeOperand()) 1730049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project AddTypeLoc(E->getTypeOperandSourceInfo()); 1731049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 1732049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1733049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectvoid EnqueueVisitor::VisitCXXUnresolvedConstructExpr(CXXUnresolvedConstructExpr 1734049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *E) { 1735049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project EnqueueChildren(E); 1736049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project AddTypeLoc(E->getTypeSourceInfo()); 1737049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 1738049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectvoid EnqueueVisitor::VisitCXXUuidofExpr(CXXUuidofExpr *E) { 1739049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project EnqueueChildren(E); 1740049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (E->isTypeOperand()) 1741049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project AddTypeLoc(E->getTypeOperandSourceInfo()); 1742049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 1743049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectvoid EnqueueVisitor::VisitDeclRefExpr(DeclRefExpr *DR) { 1744049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (DR->hasExplicitTemplateArgs()) { 1745049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project AddExplicitTemplateArgs(&DR->getExplicitTemplateArgs()); 1746049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1747049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project WL.push_back(DeclRefExprParts(DR, Parent)); 1748049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 1749049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectvoid EnqueueVisitor::VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E) { 1750049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project AddExplicitTemplateArgs(E->getOptionalExplicitTemplateArgs()); 1751049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project AddDeclarationNameInfo(E); 1752049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (NestedNameSpecifier *Qualifier = E->getQualifier()) 1753049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project AddNestedNameSpecifier(Qualifier, E->getQualifierRange()); 1754049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 1755049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectvoid EnqueueVisitor::VisitDeclStmt(DeclStmt *S) { 1756049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project unsigned size = WL.size(); 1757049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bool isFirst = true; 1758049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for (DeclStmt::decl_iterator D = S->decl_begin(), DEnd = S->decl_end(); 1759049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project D != DEnd; ++D) { 1760049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project AddDecl(*D, isFirst); 1761049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project isFirst = false; 1762049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1763049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (size == WL.size()) 1764049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 1765049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Now reverse the entries we just added. This will match the DFS 1766049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // ordering performed by the worklist. 1767049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project VisitorWorkList::iterator I = WL.begin() + size, E = WL.end(); 1768049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project std::reverse(I, E); 1769049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 1770049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectvoid EnqueueVisitor::VisitDesignatedInitExpr(DesignatedInitExpr *E) { 1771049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project AddStmt(E->getInit()); 1772a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang typedef DesignatedInitExpr::Designator Designator; 1773a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang for (DesignatedInitExpr::reverse_designators_iterator 1774a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang D = E->designators_rbegin(), DEnd = E->designators_rend(); 1775a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang D != DEnd; ++D) { 1776a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang if (D->isFieldDesignator()) { 1777a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang if (FieldDecl *Field = D->getField()) 1778049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project AddMemberRef(Field, D->getFieldLoc()); 1779049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project continue; 1780049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1781049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (D->isArrayDesignator()) { 1782049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project AddStmt(E->getArrayIndex(*D)); 1783049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project continue; 1784049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1785049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project assert(D->isArrayRangeDesignator() && "Unknown designator kind"); 1786a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang AddStmt(E->getArrayRangeEnd(*D)); 1787049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project AddStmt(E->getArrayRangeStart(*D)); 1788049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1789049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 1790049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectvoid EnqueueVisitor::VisitExplicitCastExpr(ExplicitCastExpr *E) { 1791049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project EnqueueChildren(E); 1792049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project AddTypeLoc(E->getTypeInfoAsWritten()); 1793049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 1794049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectvoid EnqueueVisitor::VisitForStmt(ForStmt *FS) { 1795049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project AddStmt(FS->getBody()); 1796049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project AddStmt(FS->getInc()); 1797049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project AddStmt(FS->getCond()); 1798049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project AddDecl(FS->getConditionVariable()); 1799049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project AddStmt(FS->getInit()); 1800049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 1801049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectvoid EnqueueVisitor::VisitGotoStmt(GotoStmt *GS) { 1802049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project WL.push_back(LabelRefVisit(GS->getLabel(), GS->getLabelLoc(), Parent)); 1803049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 1804049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectvoid EnqueueVisitor::VisitIfStmt(IfStmt *If) { 1805049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project AddStmt(If->getElse()); 1806049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project AddStmt(If->getThen()); 1807049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project AddStmt(If->getCond()); 1808049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project AddDecl(If->getConditionVariable()); 1809049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 1810049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectvoid EnqueueVisitor::VisitInitListExpr(InitListExpr *IE) { 1811049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // We care about the syntactic form of the initializer list, only. 1812049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (InitListExpr *Syntactic = IE->getSyntacticForm()) 1813049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project IE = Syntactic; 1814049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project EnqueueChildren(IE); 1815049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 1816049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectvoid EnqueueVisitor::VisitMemberExpr(MemberExpr *M) { 1817049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project WL.push_back(MemberExprParts(M, Parent)); 1818049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1819049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // If the base of the member access expression is an implicit 'this', don't 1820049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // visit it. 1821049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // FIXME: If we ever want to show these implicit accesses, this will be 1822049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // unfortunate. However, clang_getCursor() relies on this behavior. 1823049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (CXXThisExpr *This 1824049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project = llvm::dyn_cast<CXXThisExpr>(M->getBase()->IgnoreParenImpCasts())) 1825a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang if (This->isImplicit()) 1826049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 1827049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1828049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project AddStmt(M->getBase()); 1829049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 1830a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wangvoid EnqueueVisitor::VisitObjCEncodeExpr(ObjCEncodeExpr *E) { 1831049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project AddTypeLoc(E->getEncodedTypeSourceInfo()); 1832049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 1833049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectvoid EnqueueVisitor::VisitObjCMessageExpr(ObjCMessageExpr *M) { 1834049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project EnqueueChildren(M); 1835049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project AddTypeLoc(M->getClassReceiverTypeInfo()); 1836049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 1837049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectvoid EnqueueVisitor::VisitOffsetOfExpr(OffsetOfExpr *E) { 1838049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Visit the components of the offsetof expression. 1839049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for (unsigned N = E->getNumComponents(), I = N; I > 0; --I) { 1840049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project typedef OffsetOfExpr::OffsetOfNode OffsetOfNode; 1841049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const OffsetOfNode &Node = E->getComponent(I-1); 1842049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project switch (Node.getKind()) { 1843049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case OffsetOfNode::Array: 1844049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project AddStmt(E->getIndexExpr(Node.getArrayExprIndex())); 1845049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 1846049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case OffsetOfNode::Field: 1847049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project AddMemberRef(Node.getField(), Node.getRange().getEnd()); 1848049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 1849049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case OffsetOfNode::Identifier: 1850049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case OffsetOfNode::Base: 1851a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang continue; 1852a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang } 1853a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang } 1854a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang // Visit the type into which we're computing the offset. 1855a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang AddTypeLoc(E->getTypeSourceInfo()); 1856a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang} 1857049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectvoid EnqueueVisitor::VisitOverloadExpr(OverloadExpr *E) { 1858049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project AddExplicitTemplateArgs(E->getOptionalExplicitTemplateArgs()); 1859049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project WL.push_back(OverloadExprParts(E, Parent)); 1860049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 1861049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectvoid EnqueueVisitor::VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *E) { 1862049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project EnqueueChildren(E); 1863049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (E->isArgumentType()) 1864049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project AddTypeLoc(E->getArgumentTypeInfo()); 1865049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 1866049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectvoid EnqueueVisitor::VisitStmt(Stmt *S) { 1867049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project EnqueueChildren(S); 1868049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 1869049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectvoid EnqueueVisitor::VisitSwitchStmt(SwitchStmt *S) { 1870049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project AddStmt(S->getBody()); 1871049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project AddStmt(S->getCond()); 1872049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project AddDecl(S->getConditionVariable()); 1873049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 1874049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectvoid EnqueueVisitor::VisitTypesCompatibleExpr(TypesCompatibleExpr *E) { 1875049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project AddTypeLoc(E->getArgTInfo2()); 1876049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project AddTypeLoc(E->getArgTInfo1()); 1877049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 1878049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1879049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectvoid EnqueueVisitor::VisitWhileStmt(WhileStmt *W) { 1880049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project AddStmt(W->getBody()); 1881049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project AddStmt(W->getCond()); 1882049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project AddDecl(W->getConditionVariable()); 1883049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 1884049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectvoid EnqueueVisitor::VisitUnaryTypeTraitExpr(UnaryTypeTraitExpr *E) { 1885049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project AddTypeLoc(E->getQueriedTypeSourceInfo()); 1886049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 1887049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectvoid EnqueueVisitor::VisitUnresolvedMemberExpr(UnresolvedMemberExpr *U) { 1888049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project VisitOverloadExpr(U); 1889049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (!U->isImplicitAccess()) 1890049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project AddStmt(U->getBase()); 1891049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 1892049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectvoid EnqueueVisitor::VisitVAArgExpr(VAArgExpr *E) { 1893049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project AddStmt(E->getSubExpr()); 1894049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project AddTypeLoc(E->getWrittenTypeInfo()); 1895049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 1896049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1897049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectvoid CursorVisitor::EnqueueWorkList(VisitorWorkList &WL, Stmt *S) { 1898049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project EnqueueVisitor(WL, MakeCXCursor(S, StmtParent, TU)).Visit(S); 1899049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 1900049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1901049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectbool CursorVisitor::IsInRegionOfInterest(CXCursor C) { 1902049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (RegionOfInterest.isValid()) { 1903049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SourceRange Range = getRawCursorExtent(C); 1904049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (Range.isInvalid() || CompareRegionOfInterest(Range)) 1905049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return false; 1906049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1907049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return true; 1908049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 1909049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1910049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectbool CursorVisitor::RunVisitorWorkList(VisitorWorkList &WL) { 1911049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project while (!WL.empty()) { 1912049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Dequeue the worklist item. 1913049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project VisitorJob LI = WL.back(); 1914049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project WL.pop_back(); 1915049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1916049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Set the Parent field, then back to its old value once we're done. 1917049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SetParentRAII SetParent(Parent, StmtParent, LI.getParent()); 1918049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1919049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project switch (LI.getKind()) { 1920049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case VisitorJob::DeclVisitKind: { 1921049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Decl *D = cast<DeclVisit>(&LI)->get(); 1922049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (!D) 1923049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project continue; 1924049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1925049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // For now, perform default visitation for Decls. 1926049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (Visit(MakeCXCursor(D, TU, cast<DeclVisit>(&LI)->isFirst()))) 1927049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return true; 1928049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1929049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project continue; 1930049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1931049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case VisitorJob::ExplicitTemplateArgsVisitKind: { 1932049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const ExplicitTemplateArgumentList *ArgList = 1933049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cast<ExplicitTemplateArgsVisit>(&LI)->get(); 1934049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for (const TemplateArgumentLoc *Arg = ArgList->getTemplateArgs(), 1935049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *ArgEnd = Arg + ArgList->NumTemplateArgs; 1936049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Arg != ArgEnd; ++Arg) { 1937049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (VisitTemplateArgumentLoc(*Arg)) 1938049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return true; 1939049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1940049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project continue; 1941049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1942aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich case VisitorJob::TypeLocVisitKind: { 1943aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich // Perform default visitation for TypeLocs. 1944049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (Visit(cast<TypeLocVisit>(&LI)->get())) 1945049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return true; 1946049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project continue; 1947049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1948049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case VisitorJob::LabelRefVisitKind: { 1949049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project LabelStmt *LS = cast<LabelRefVisit>(&LI)->get(); 1950049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (Visit(MakeCursorLabelRef(LS, 1951049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cast<LabelRefVisit>(&LI)->getLoc(), 1952049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TU))) 1953049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return true; 1954049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project continue; 1955049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1956049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case VisitorJob::NestedNameSpecifierVisitKind: { 1957049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project NestedNameSpecifierVisit *V = cast<NestedNameSpecifierVisit>(&LI); 1958049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (VisitNestedNameSpecifier(V->get(), V->getSourceRange())) 1959049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return true; 1960049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project continue; 1961049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1962049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case VisitorJob::DeclarationNameInfoVisitKind: { 1963049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (VisitDeclarationNameInfo(cast<DeclarationNameInfoVisit>(&LI) 1964049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ->get())) 1965049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return true; 1966049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project continue; 1967049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1968049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case VisitorJob::MemberRefVisitKind: { 1969049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project MemberRefVisit *V = cast<MemberRefVisit>(&LI); 1970049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (Visit(MakeCursorMemberRef(V->get(), V->getLoc(), TU))) 1971049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return true; 1972049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project continue; 1973049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1974049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case VisitorJob::StmtVisitKind: { 1975049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Stmt *S = cast<StmtVisit>(&LI)->get(); 1976049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (!S) 1977049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project continue; 1978049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1979049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Update the current cursor. 1980049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXCursor Cursor = MakeCXCursor(S, StmtParent, TU); 1981049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (!IsInRegionOfInterest(Cursor)) 1982049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project continue; 1983049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project switch (Visitor(Cursor, Parent, ClientData)) { 1984049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXChildVisit_Break: return true; 1985049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXChildVisit_Continue: break; 1986049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXChildVisit_Recurse: 1987049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project EnqueueWorkList(WL, S); 1988049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 1989049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1990049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project continue; 1991049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1992049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case VisitorJob::MemberExprPartsKind: { 1993049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Handle the other pieces in the MemberExpr besides the base. 1994049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project MemberExpr *M = cast<MemberExprParts>(&LI)->get(); 1995049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1996049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Visit the nested-name-specifier 1997049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (NestedNameSpecifier *Qualifier = M->getQualifier()) 1998049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (VisitNestedNameSpecifier(Qualifier, M->getQualifierRange())) 1999049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return true; 2000049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2001049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Visit the declaration name. 2002049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (VisitDeclarationNameInfo(M->getMemberNameInfo())) 2003049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return true; 2004049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2005049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Visit the explicitly-specified template arguments, if any. 2006049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (M->hasExplicitTemplateArgs()) { 2007049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for (const TemplateArgumentLoc *Arg = M->getTemplateArgs(), 2008049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *ArgEnd = Arg + M->getNumTemplateArgs(); 2009049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Arg != ArgEnd; ++Arg) { 2010049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (VisitTemplateArgumentLoc(*Arg)) 2011049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return true; 2012049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2013049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2014049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project continue; 2015049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2016049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case VisitorJob::DeclRefExprPartsKind: { 2017049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DeclRefExpr *DR = cast<DeclRefExprParts>(&LI)->get(); 2018049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Visit nested-name-specifier, if present. 2019049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (NestedNameSpecifier *Qualifier = DR->getQualifier()) 2020049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (VisitNestedNameSpecifier(Qualifier, DR->getQualifierRange())) 2021049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return true; 2022049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Visit declaration name. 2023049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (VisitDeclarationNameInfo(DR->getNameInfo())) 2024049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return true; 2025049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project continue; 2026049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2027049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case VisitorJob::OverloadExprPartsKind: { 2028049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project OverloadExpr *O = cast<OverloadExprParts>(&LI)->get(); 2029049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Visit the nested-name-specifier. 2030049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (NestedNameSpecifier *Qualifier = O->getQualifier()) 2031049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (VisitNestedNameSpecifier(Qualifier, O->getQualifierRange())) 2032049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return true; 2033049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Visit the declaration name. 2034049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (VisitDeclarationNameInfo(O->getNameInfo())) 2035049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return true; 2036049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Visit the overloaded declaration reference. 2037049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (Visit(MakeCursorOverloadedDeclRef(O, TU))) 2038049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return true; 2039049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project continue; 2040049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2041049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2042049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2043049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return false; 2044049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 2045049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2046049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectbool CursorVisitor::Visit(Stmt *S) { 2047049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project VisitorWorkList *WL = 0; 2048049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (!WorkListFreeList.empty()) { 2049049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project WL = WorkListFreeList.back(); 2050049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project WL->clear(); 2051049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project WorkListFreeList.pop_back(); 2052049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2053049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else { 2054049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project WL = new VisitorWorkList(); 2055049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project WorkListCache.push_back(WL); 2056049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2057049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project EnqueueWorkList(*WL, S); 2058049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bool result = RunVisitorWorkList(*WL); 2059049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project WorkListFreeList.push_back(WL); 2060049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return result; 2061049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 2062049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2063049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project//===----------------------------------------------------------------------===// 2064049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project// Misc. API hooks. 2065049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project//===----------------------------------------------------------------------===// 2066049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2067049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectstatic llvm::sys::Mutex EnableMultithreadingMutex; 2068049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectstatic bool EnabledMultithreading; 2069049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2070049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectextern "C" { 2071049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source ProjectCXIndex clang_createIndex(int excludeDeclarationsFromPCH, 2072049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project int displayDiagnostics) { 2073049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Disable pretty stack trace functionality, which will otherwise be a very 2074049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // poor citizen of the world and set up all sorts of signal handlers. 2075049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project llvm::DisablePrettyStackTrace = true; 2076049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2077049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // We use crash recovery to make some of our APIs more reliable, implicitly 2078049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // enable it. 2079049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project llvm::CrashRecoveryContext::Enable(); 2080049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2081049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Enable support for multithreading in LLVM. 2082049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 2083049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project llvm::sys::ScopedLock L(EnableMultithreadingMutex); 2084049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (!EnabledMultithreading) { 2085049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project llvm::llvm_start_multithreaded(); 2086049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project EnabledMultithreading = true; 2087049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2088049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2089049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2090049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CIndexer *CIdxr = new CIndexer(); 2091049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (excludeDeclarationsFromPCH) 2092049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CIdxr->setOnlyLocalDecls(); 2093049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (displayDiagnostics) 2094049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CIdxr->setDisplayDiagnostics(); 2095049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return CIdxr; 2096049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 2097049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2098049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectvoid clang_disposeIndex(CXIndex CIdx) { 2099049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (CIdx) 2100049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project delete static_cast<CIndexer *>(CIdx); 2101049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 2102049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2103049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source ProjectCXTranslationUnit clang_createTranslationUnit(CXIndex CIdx, 2104049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const char *ast_filename) { 2105049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (!CIdx) 2106049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return 0; 2107049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2108049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CIndexer *CXXIdx = static_cast<CIndexer *>(CIdx); 2109049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FileSystemOptions FileSystemOpts; 2110049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FileSystemOpts.WorkingDir = CXXIdx->getWorkingDirectory(); 2111049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2112049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project llvm::IntrusiveRefCntPtr<Diagnostic> Diags; 2113049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ASTUnit *TU = ASTUnit::LoadFromASTFile(ast_filename, Diags, FileSystemOpts, 2114049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXXIdx->getOnlyLocalDecls(), 2115049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 0, 0, true); 2116049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return MakeCXTranslationUnit(TU); 2117a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang} 2118049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2119049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectunsigned clang_defaultEditingTranslationUnitOptions() { 2120049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return CXTranslationUnit_PrecompiledPreamble | 2121049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXTranslationUnit_CacheCompletionResults | 2122049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXTranslationUnit_CXXPrecompiledPreamble; 2123049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 2124049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2125049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source ProjectCXTranslationUnit 2126049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectclang_createTranslationUnitFromSourceFile(CXIndex CIdx, 2127049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const char *source_filename, 2128049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project int num_command_line_args, 2129049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const char * const *command_line_args, 2130049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project unsigned num_unsaved_files, 2131049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project struct CXUnsavedFile *unsaved_files) { 2132049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return clang_parseTranslationUnit(CIdx, source_filename, 2133049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project command_line_args, num_command_line_args, 2134049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project unsaved_files, num_unsaved_files, 2135049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXTranslationUnit_DetailedPreprocessingRecord); 2136049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 2137049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2138049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectstruct ParseTranslationUnitInfo { 2139049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXIndex CIdx; 2140049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const char *source_filename; 2141049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const char *const *command_line_args; 2142049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project int num_command_line_args; 2143049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project struct CXUnsavedFile *unsaved_files; 2144049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project unsigned num_unsaved_files; 2145049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project unsigned options; 2146049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXTranslationUnit result; 2147049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project}; 2148049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectstatic void clang_parseTranslationUnit_Impl(void *UserData) { 2149049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ParseTranslationUnitInfo *PTUI = 2150049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static_cast<ParseTranslationUnitInfo*>(UserData); 2151049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXIndex CIdx = PTUI->CIdx; 2152049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const char *source_filename = PTUI->source_filename; 2153049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const char * const *command_line_args = PTUI->command_line_args; 2154049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project int num_command_line_args = PTUI->num_command_line_args; 2155049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project struct CXUnsavedFile *unsaved_files = PTUI->unsaved_files; 2156049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project unsigned num_unsaved_files = PTUI->num_unsaved_files; 2157049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project unsigned options = PTUI->options; 2158049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project PTUI->result = 0; 2159049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2160049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (!CIdx) 2161049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 2162049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2163049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CIndexer *CXXIdx = static_cast<CIndexer *>(CIdx); 2164049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2165049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bool PrecompilePreamble = options & CXTranslationUnit_PrecompiledPreamble; 2166049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bool CompleteTranslationUnit 2167049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project = ((options & CXTranslationUnit_Incomplete) == 0); 2168049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bool CacheCodeCompetionResults 2169049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project = options & CXTranslationUnit_CacheCompletionResults; 2170049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bool CXXPrecompilePreamble 2171049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project = options & CXTranslationUnit_CXXPrecompiledPreamble; 2172049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bool CXXChainedPCH 2173049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project = options & CXTranslationUnit_CXXChainedPCH; 2174049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2175049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Configure the diagnostics. 2176049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DiagnosticOptions DiagOpts; 2177049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project llvm::IntrusiveRefCntPtr<Diagnostic> Diags; 2178049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Diags = CompilerInstance::createDiagnostics(DiagOpts, 0, 0); 2179049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2180049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project llvm::SmallVector<ASTUnit::RemappedFile, 4> RemappedFiles; 2181049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for (unsigned I = 0; I != num_unsaved_files; ++I) { 2182049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project llvm::StringRef Data(unsaved_files[I].Contents, unsaved_files[I].Length); 2183049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const llvm::MemoryBuffer *Buffer 2184049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project = llvm::MemoryBuffer::getMemBufferCopy(Data, unsaved_files[I].Filename); 2185049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project RemappedFiles.push_back(std::make_pair(unsaved_files[I].Filename, 2186049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Buffer)); 2187049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2188049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2189049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project llvm::SmallVector<const char *, 16> Args; 2190049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2191049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // The 'source_filename' argument is optional. If the caller does not 2192049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // specify it then it is assumed that the source file is specified 2193049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // in the actual argument list. 2194049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (source_filename) 2195049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Args.push_back(source_filename); 2196049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2197049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Since the Clang C library is primarily used by batch tools dealing with 2198049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // (often very broken) source code, where spell-checking can have a 2199049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // significant negative impact on performance (particularly when 2200049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // precompiled headers are involved), we disable it by default. 2201049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Only do this if we haven't found a spell-checking-related argument. 2202049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bool FoundSpellCheckingArgument = false; 2203049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for (int I = 0; I != num_command_line_args; ++I) { 2204049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (strcmp(command_line_args[I], "-fno-spell-checking") == 0 || 2205049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project strcmp(command_line_args[I], "-fspell-checking") == 0) { 2206049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FoundSpellCheckingArgument = true; 2207049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 2208049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2209049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2210049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (!FoundSpellCheckingArgument) 2211049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Args.push_back("-fno-spell-checking"); 2212049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2213049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Args.insert(Args.end(), command_line_args, 2214049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project command_line_args + num_command_line_args); 2215049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2216049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Do we need the detailed preprocessing record? 2217049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (options & CXTranslationUnit_DetailedPreprocessingRecord) { 2218049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Args.push_back("-Xclang"); 2219049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Args.push_back("-detailed-preprocessing-record"); 2220049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2221049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2222049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project unsigned NumErrors = Diags->getClient()->getNumErrors(); 2223049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project llvm::OwningPtr<ASTUnit> Unit( 2224049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ASTUnit::LoadFromCommandLine(Args.data(), Args.data() + Args.size(), 2225049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Diags, 2226049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXXIdx->getClangResourcesPath(), 2227049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXXIdx->getOnlyLocalDecls(), 2228049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*CaptureDiagnostics=*/true, 2229049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project RemappedFiles.data(), 2230049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project RemappedFiles.size(), 2231049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project PrecompilePreamble, 2232049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CompleteTranslationUnit, 2233049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CacheCodeCompetionResults, 2234049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXXPrecompilePreamble, 2235049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXXChainedPCH)); 2236049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2237049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (NumErrors != Diags->getClient()->getNumErrors()) { 2238049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Make sure to check that 'Unit' is non-NULL. 2239049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (CXXIdx->getDisplayDiagnostics() && Unit.get()) { 2240049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for (ASTUnit::stored_diag_iterator D = Unit->stored_diag_begin(), 2241049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DEnd = Unit->stored_diag_end(); 2242049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project D != DEnd; ++D) { 2243049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXStoredDiagnostic Diag(*D, Unit->getASTContext().getLangOptions()); 2244049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXString Msg = clang_formatDiagnostic(&Diag, 2245049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project clang_defaultDiagnosticDisplayOptions()); 2246049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project fprintf(stderr, "%s\n", clang_getCString(Msg)); 2247049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project clang_disposeString(Msg); 2248049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2249049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef LLVM_ON_WIN32 2250049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // On Windows, force a flush, since there may be multiple copies of 2251049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // stderr and stdout in the file system, all with different buffers 2252049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // but writing to the same device. 2253049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project fflush(stderr); 2254049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif 2255049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2256049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2257049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2258049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project PTUI->result = MakeCXTranslationUnit(Unit.take()); 2259049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 2260049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source ProjectCXTranslationUnit clang_parseTranslationUnit(CXIndex CIdx, 2261049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const char *source_filename, 2262049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const char * const *command_line_args, 2263049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project int num_command_line_args, 2264049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project struct CXUnsavedFile *unsaved_files, 2265049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project unsigned num_unsaved_files, 2266049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project unsigned options) { 2267049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ParseTranslationUnitInfo PTUI = { CIdx, source_filename, command_line_args, 2268049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project num_command_line_args, unsaved_files, 2269049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project num_unsaved_files, options, 0 }; 2270049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project llvm::CrashRecoveryContext CRC; 2271049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2272049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (!RunSafely(CRC, clang_parseTranslationUnit_Impl, &PTUI)) { 2273049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project fprintf(stderr, "libclang: crash detected during parsing: {\n"); 2274049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project fprintf(stderr, " 'source_filename' : '%s'\n", source_filename); 2275049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project fprintf(stderr, " 'command_line_args' : ["); 2276049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for (int i = 0; i != num_command_line_args; ++i) { 2277049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (i) 2278049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project fprintf(stderr, ", "); 2279049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project fprintf(stderr, "'%s'", command_line_args[i]); 2280049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2281049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project fprintf(stderr, "],\n"); 2282049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project fprintf(stderr, " 'unsaved_files' : ["); 2283049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for (unsigned i = 0; i != num_unsaved_files; ++i) { 2284049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (i) 2285049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project fprintf(stderr, ", "); 2286049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project fprintf(stderr, "('%s', '...', %ld)", unsaved_files[i].Filename, 2287049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project unsaved_files[i].Length); 2288049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2289049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project fprintf(stderr, "],\n"); 2290049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project fprintf(stderr, " 'options' : %d,\n", options); 2291049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project fprintf(stderr, "}\n"); 2292049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2293049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return 0; 2294049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2295049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2296049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return PTUI.result; 2297049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 2298049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2299049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectunsigned clang_defaultSaveOptions(CXTranslationUnit TU) { 2300049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return CXSaveTranslationUnit_None; 2301049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 2302049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2303049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectint clang_saveTranslationUnit(CXTranslationUnit TU, const char *FileName, 2304049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project unsigned options) { 2305049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (!TU) 2306049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return 1; 2307049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2308049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return static_cast<ASTUnit *>(TU->TUData)->Save(FileName); 2309049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 2310049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2311049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectvoid clang_disposeTranslationUnit(CXTranslationUnit CTUnit) { 2312049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (CTUnit) { 2313049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // If the translation unit has been marked as unsafe to free, just discard 2314049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // it. 2315049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (static_cast<ASTUnit *>(CTUnit->TUData)->isUnsafeToFree()) 2316049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 2317049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2318049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project delete static_cast<ASTUnit *>(CTUnit->TUData); 2319049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project disposeCXStringPool(CTUnit->StringPool); 2320049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project delete CTUnit; 2321049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2322049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 2323049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2324049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectunsigned clang_defaultReparseOptions(CXTranslationUnit TU) { 2325049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return CXReparse_None; 2326049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 2327049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2328a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wangstruct ReparseTranslationUnitInfo { 2329a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang CXTranslationUnit TU; 2330a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang unsigned num_unsaved_files; 2331049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project struct CXUnsavedFile *unsaved_files; 2332049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project unsigned options; 2333049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project int result; 2334049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project}; 2335049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2336049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectstatic void clang_reparseTranslationUnit_Impl(void *UserData) { 2337049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ReparseTranslationUnitInfo *RTUI = 2338049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static_cast<ReparseTranslationUnitInfo*>(UserData); 2339049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXTranslationUnit TU = RTUI->TU; 2340049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project unsigned num_unsaved_files = RTUI->num_unsaved_files; 2341049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project struct CXUnsavedFile *unsaved_files = RTUI->unsaved_files; 2342049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project unsigned options = RTUI->options; 2343049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project (void) options; 2344049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project RTUI->result = 1; 2345049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2346049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (!TU) 2347049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 2348049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2349049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ASTUnit *CXXUnit = static_cast<ASTUnit *>(TU->TUData); 2350049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ASTUnit::ConcurrencyCheck Check(*CXXUnit); 2351049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2352049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project llvm::SmallVector<ASTUnit::RemappedFile, 4> RemappedFiles; 2353049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for (unsigned I = 0; I != num_unsaved_files; ++I) { 2354049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project llvm::StringRef Data(unsaved_files[I].Contents, unsaved_files[I].Length); 2355049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const llvm::MemoryBuffer *Buffer 2356049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project = llvm::MemoryBuffer::getMemBufferCopy(Data, unsaved_files[I].Filename); 2357049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project RemappedFiles.push_back(std::make_pair(unsaved_files[I].Filename, 2358049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Buffer)); 2359049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2360049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2361049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (!CXXUnit->Reparse(RemappedFiles.data(), RemappedFiles.size())) 2362049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project RTUI->result = 0; 2363049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 2364049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2365049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectint clang_reparseTranslationUnit(CXTranslationUnit TU, 2366049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project unsigned num_unsaved_files, 2367049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project struct CXUnsavedFile *unsaved_files, 2368049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project unsigned options) { 2369049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ReparseTranslationUnitInfo RTUI = { TU, num_unsaved_files, unsaved_files, 2370049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project options, 0 }; 2371049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project llvm::CrashRecoveryContext CRC; 2372049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2373049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (!RunSafely(CRC, clang_reparseTranslationUnit_Impl, &RTUI)) { 2374049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project fprintf(stderr, "libclang: crash detected during reparsing\n"); 2375049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static_cast<ASTUnit *>(TU->TUData)->setUnsafeToFree(true); 2376049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return 1; 2377049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2378049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2379049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2380049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return RTUI.result; 2381049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 2382049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2383049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2384049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source ProjectCXString clang_getTranslationUnitSpelling(CXTranslationUnit CTUnit) { 2385049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (!CTUnit) 2386049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString(""); 2387049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2388049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ASTUnit *CXXUnit = static_cast<ASTUnit *>(CTUnit->TUData); 2389049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString(CXXUnit->getOriginalSourceFileName(), true); 2390049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 2391049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2392049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source ProjectCXCursor clang_getTranslationUnitCursor(CXTranslationUnit TU) { 2393049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXCursor Result = { CXCursor_TranslationUnit, { 0, 0, TU } }; 2394049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return Result; 2395049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 2396049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2397049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} // end: extern "C" 2398049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2399049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project//===----------------------------------------------------------------------===// 2400049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project// CXSourceLocation and CXSourceRange Operations. 2401049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project//===----------------------------------------------------------------------===// 2402049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2403049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectextern "C" { 2404049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source ProjectCXSourceLocation clang_getNullLocation() { 2405049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXSourceLocation Result = { { 0, 0 }, 0 }; 2406049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return Result; 2407049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 2408049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2409049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectunsigned clang_equalLocations(CXSourceLocation loc1, CXSourceLocation loc2) { 2410049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return (loc1.ptr_data[0] == loc2.ptr_data[0] && 2411295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner loc1.ptr_data[1] == loc2.ptr_data[1] && 2412049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project loc1.int_data == loc2.int_data); 2413049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 2414049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2415049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source ProjectCXSourceLocation clang_getLocation(CXTranslationUnit tu, 2416049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXFile file, 2417049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project unsigned line, 2418049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project unsigned column) { 2419049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (!tu || !file) 2420049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return clang_getNullLocation(); 2421049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2422049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ASTUnit *CXXUnit = static_cast<ASTUnit *>(tu->TUData); 2423049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SourceLocation SLoc 2424049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project = CXXUnit->getSourceManager().getLocation( 2425049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static_cast<const FileEntry *>(file), 2426049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project line, column); 2427049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (SLoc.isInvalid()) return clang_getNullLocation(); 2428049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2429049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return cxloc::translateSourceLocation(CXXUnit->getASTContext(), SLoc); 2430049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 2431049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2432049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source ProjectCXSourceLocation clang_getLocationForOffset(CXTranslationUnit tu, 2433049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXFile file, 2434049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project unsigned offset) { 2435049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (!tu || !file) 2436049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return clang_getNullLocation(); 2437295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner 2438049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ASTUnit *CXXUnit = static_cast<ASTUnit *>(tu->TUData); 2439049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SourceLocation Start 2440049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project = CXXUnit->getSourceManager().getLocation( 2441049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static_cast<const FileEntry *>(file), 2442049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1, 1); 2443049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (Start.isInvalid()) return clang_getNullLocation(); 2444049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2445049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SourceLocation SLoc = Start.getFileLocWithOffset(offset); 2446049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2447049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (SLoc.isInvalid()) return clang_getNullLocation(); 2448049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2449049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return cxloc::translateSourceLocation(CXXUnit->getASTContext(), SLoc); 2450049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 2451049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2452049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source ProjectCXSourceRange clang_getNullRange() { 2453049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXSourceRange Result = { { 0, 0 }, 0, 0 }; 2454049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return Result; 2455049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 2456049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2457049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source ProjectCXSourceRange clang_getRange(CXSourceLocation begin, CXSourceLocation end) { 2458049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (begin.ptr_data[0] != end.ptr_data[0] || 2459049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project begin.ptr_data[1] != end.ptr_data[1]) 2460049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return clang_getNullRange(); 2461049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2462049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXSourceRange Result = { { begin.ptr_data[0], begin.ptr_data[1] }, 2463049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project begin.int_data, end.int_data }; 2464049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return Result; 2465049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 2466049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2467049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectvoid clang_getInstantiationLocation(CXSourceLocation location, 2468049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXFile *file, 2469049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project unsigned *line, 2470049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project unsigned *column, 2471049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project unsigned *offset) { 2472049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SourceLocation Loc = SourceLocation::getFromRawEncoding(location.int_data); 2473049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2474049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (!location.ptr_data[0] || Loc.isInvalid()) { 2475049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (file) 2476049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *file = 0; 2477049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (line) 2478049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *line = 0; 2479049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (column) 2480049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *column = 0; 2481049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (offset) 2482049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *offset = 0; 2483049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 2484049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2485049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2486049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const SourceManager &SM = 2487049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *static_cast<const SourceManager*>(location.ptr_data[0]); 2488049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SourceLocation InstLoc = SM.getInstantiationLoc(Loc); 2489049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2490049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (file) 2491049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *file = (void *)SM.getFileEntryForID(SM.getFileID(InstLoc)); 2492049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (line) 2493049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *line = SM.getInstantiationLineNumber(InstLoc); 2494049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (column) 2495049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *column = SM.getInstantiationColumnNumber(InstLoc); 2496049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (offset) 2497049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *offset = SM.getDecomposedLoc(InstLoc).second; 2498049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 2499049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2500049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectvoid clang_getSpellingLocation(CXSourceLocation location, 2501049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXFile *file, 2502049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project unsigned *line, 2503049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project unsigned *column, 2504049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project unsigned *offset) { 2505049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SourceLocation Loc = SourceLocation::getFromRawEncoding(location.int_data); 2506049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2507049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (!location.ptr_data[0] || Loc.isInvalid()) { 2508049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (file) 2509049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *file = 0; 2510049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (line) 2511049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *line = 0; 2512049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (column) 2513049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *column = 0; 2514049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (offset) 2515049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *offset = 0; 2516049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 2517049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2518049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2519049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const SourceManager &SM = 2520049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *static_cast<const SourceManager*>(location.ptr_data[0]); 2521049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SourceLocation SpellLoc = Loc; 2522049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (SpellLoc.isMacroID()) { 2523049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SourceLocation SimpleSpellingLoc = SM.getImmediateSpellingLoc(SpellLoc); 2524049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (SimpleSpellingLoc.isFileID() && 2525049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SM.getFileEntryForID(SM.getDecomposedLoc(SimpleSpellingLoc).first)) 2526049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SpellLoc = SimpleSpellingLoc; 2527049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 2528049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SpellLoc = SM.getInstantiationLoc(SpellLoc); 2529049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2530049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2531049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project std::pair<FileID, unsigned> LocInfo = SM.getDecomposedLoc(SpellLoc); 2532049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FileID FID = LocInfo.first; 2533049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project unsigned FileOffset = LocInfo.second; 2534049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2535049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (file) 2536049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *file = (void *)SM.getFileEntryForID(FID); 2537049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (line) 2538049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *line = SM.getLineNumber(FID, FileOffset); 2539049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (column) 2540049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *column = SM.getColumnNumber(FID, FileOffset); 2541049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (offset) 2542a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang *offset = FileOffset; 2543a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang} 2544049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2545a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu WangCXSourceLocation clang_getRangeStart(CXSourceRange range) { 2546049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXSourceLocation Result = { { range.ptr_data[0], range.ptr_data[1] }, 2547049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project range.begin_int_data }; 2548049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return Result; 2549049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 2550049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2551049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source ProjectCXSourceLocation clang_getRangeEnd(CXSourceRange range) { 2552049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXSourceLocation Result = { { range.ptr_data[0], range.ptr_data[1] }, 2553049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project range.end_int_data }; 2554049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return Result; 2555a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang} 2556a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 2557a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang} // end: extern "C" 2558049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2559a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang//===----------------------------------------------------------------------===// 2560a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang// CXFile Operations. 2561a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang//===----------------------------------------------------------------------===// 2562049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2563049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectextern "C" { 2564049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source ProjectCXString clang_getFileName(CXFile SFile) { 2565a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang if (!SFile) 2566a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang return createCXString((const char*)NULL); 2567049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2568a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang FileEntry *FEnt = static_cast<FileEntry *>(SFile); 2569049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString(FEnt->getName()); 2570049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 2571049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2572a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wangtime_t clang_getFileTime(CXFile SFile) { 2573a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang if (!SFile) 2574049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return 0; 2575a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 2576049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FileEntry *FEnt = static_cast<FileEntry *>(SFile); 2577049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return FEnt->getModificationTime(); 2578049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 2579049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2580a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu WangCXFile clang_getFile(CXTranslationUnit tu, const char *file_name) { 2581049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (!tu) 2582049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return 0; 2583049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2584049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ASTUnit *CXXUnit = static_cast<ASTUnit *>(tu->TUData); 2585049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2586049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FileManager &FMgr = CXXUnit->getFileManager(); 2587a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang const FileEntry *File = FMgr.getFile(file_name, CXXUnit->getFileSystemOpts()); 2588049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return const_cast<FileEntry *>(File); 2589a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang} 2590a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 2591049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} // end: extern "C" 2592049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2593049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project//===----------------------------------------------------------------------===// 2594049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project// CXCursor Operations. 2595049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project//===----------------------------------------------------------------------===// 2596049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2597a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wangstatic Decl *getDeclFromExpr(Stmt *E) { 2598a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang if (CastExpr *CE = dyn_cast<CastExpr>(E)) 2599049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return getDeclFromExpr(CE->getSubExpr()); 2600049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2601049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (DeclRefExpr *RefExpr = dyn_cast<DeclRefExpr>(E)) 2602049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return RefExpr->getDecl(); 2603049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (BlockDeclRefExpr *RefExpr = dyn_cast<BlockDeclRefExpr>(E)) 2604049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return RefExpr->getDecl(); 2605049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (MemberExpr *ME = dyn_cast<MemberExpr>(E)) 2606049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return ME->getMemberDecl(); 2607049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (ObjCIvarRefExpr *RE = dyn_cast<ObjCIvarRefExpr>(E)) 2608049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return RE->getDecl(); 2609049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (ObjCPropertyRefExpr *PRE = dyn_cast<ObjCPropertyRefExpr>(E)) 2610049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return PRE->getProperty(); 2611049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2612049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (CallExpr *CE = dyn_cast<CallExpr>(E)) 2613049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return getDeclFromExpr(CE->getCallee()); 2614049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (CXXConstructExpr *CE = llvm::dyn_cast<CXXConstructExpr>(E)) 2615049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (!CE->isElidable()) 2616049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return CE->getConstructor(); 2617049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (ObjCMessageExpr *OME = dyn_cast<ObjCMessageExpr>(E)) 2618049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return OME->getMethodDecl(); 2619049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2620049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (ObjCProtocolExpr *PE = dyn_cast<ObjCProtocolExpr>(E)) 2621049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return PE->getProtocol(); 2622049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2623049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return 0; 2624049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 2625049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2626049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectstatic SourceLocation getLocationFromExpr(Expr *E) { 2627049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (ObjCMessageExpr *Msg = dyn_cast<ObjCMessageExpr>(E)) 2628049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return /*FIXME:*/Msg->getLeftLoc(); 2629049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E)) 2630049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return DRE->getLocation(); 2631049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (BlockDeclRefExpr *RefExpr = dyn_cast<BlockDeclRefExpr>(E)) 2632049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return RefExpr->getLocation(); 2633049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (MemberExpr *Member = dyn_cast<MemberExpr>(E)) 2634049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return Member->getMemberLoc(); 2635049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (ObjCIvarRefExpr *Ivar = dyn_cast<ObjCIvarRefExpr>(E)) 2636049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return Ivar->getLocation(); 2637a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang return E->getLocStart(); 2638049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 2639a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 2640049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectextern "C" { 2641049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2642049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectunsigned clang_visitChildren(CXCursor parent, 2643049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXCursorVisitor visitor, 2644049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXClientData client_data) { 2645049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CursorVisitor CursorVis(getCursorTU(parent), visitor, client_data, 2646a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang getCursorASTUnit(parent)->getMaxPCHLevel()); 2647a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang return CursorVis.VisitChildren(parent); 2648049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 2649049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2650a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang#ifndef __has_feature 2651049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define __has_feature(x) 0 2652a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang#endif 2653a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang#if __has_feature(blocks) 2654049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projecttypedef enum CXChildVisitResult 2655049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project (^CXCursorVisitorBlock)(CXCursor cursor, CXCursor parent); 2656049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2657049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectstatic enum CXChildVisitResult visitWithBlock(CXCursor cursor, CXCursor parent, 2658049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXClientData client_data) { 2659049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXCursorVisitorBlock block = (CXCursorVisitorBlock)client_data; 2660049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return block(cursor, parent); 2661049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 2662049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#else 2663049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project// If we are compiled with a compiler that doesn't have native blocks support, 2664049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project// define and call the block manually, so the 2665049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projecttypedef struct _CXChildVisitResult 2666049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project{ 2667049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project void *isa; 2668049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project int flags; 2669049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project int reserved; 2670049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project enum CXChildVisitResult(*invoke)(struct _CXChildVisitResult*, CXCursor, 2671049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXCursor); 2672049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} *CXCursorVisitorBlock; 2673049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2674049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectstatic enum CXChildVisitResult visitWithBlock(CXCursor cursor, CXCursor parent, 2675049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXClientData client_data) { 2676049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXCursorVisitorBlock block = (CXCursorVisitorBlock)client_data; 2677049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return block->invoke(block, cursor, parent); 2678049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 2679049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif 2680049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2681a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 2682049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectunsigned clang_visitChildrenWithBlock(CXCursor parent, 2683049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXCursorVisitorBlock block) { 2684049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return clang_visitChildren(parent, visitWithBlock, block); 2685049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 2686049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2687049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectstatic CXString getDeclSpelling(Decl *D) { 2688049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project NamedDecl *ND = dyn_cast_or_null<NamedDecl>(D); 2689049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (!ND) { 2690049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (ObjCPropertyImplDecl *PropImpl =llvm::dyn_cast<ObjCPropertyImplDecl>(D)) 2691c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner if (ObjCPropertyDecl *Property = PropImpl->getPropertyDecl()) 2692c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner return createCXString(Property->getIdentifier()->getName()); 2693c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner 2694c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner return createCXString(""); 2695c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner } 2696c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner 2697c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner if (ObjCMethodDecl *OMD = dyn_cast<ObjCMethodDecl>(ND)) 2698c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner return createCXString(OMD->getSelector().getAsString()); 2699c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner 2700c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner if (ObjCCategoryImplDecl *CIMP = dyn_cast<ObjCCategoryImplDecl>(ND)) 2701c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner // No, this isn't the same as the code below. getIdentifier() is non-virtual 2702049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // and returns different names. NamedDecl returns the class name and 2703049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // ObjCCategoryImplDecl returns the category name. 2704049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString(CIMP->getIdentifier()->getNameStart()); 2705049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2706049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (isa<UsingDirectiveDecl>(D)) 2707049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString(""); 2708049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2709049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project llvm::SmallString<1024> S; 2710049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project llvm::raw_svector_ostream os(S); 2711049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ND->printName(os); 2712049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2713049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString(os.str()); 2714049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 2715049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2716049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source ProjectCXString clang_getCursorSpelling(CXCursor C) { 2717049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (clang_isTranslationUnit(C.kind)) 2718049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return clang_getTranslationUnitSpelling( 2719049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static_cast<CXTranslationUnit>(C.data[2])); 2720049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2721049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (clang_isReference(C.kind)) { 2722049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project switch (C.kind) { 2723049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXCursor_ObjCSuperClassRef: { 2724049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ObjCInterfaceDecl *Super = getCursorObjCSuperClassRef(C).first; 2725049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString(Super->getIdentifier()->getNameStart()); 2726049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2727049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXCursor_ObjCClassRef: { 2728049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ObjCInterfaceDecl *Class = getCursorObjCClassRef(C).first; 2729049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString(Class->getIdentifier()->getNameStart()); 2730049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2731049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXCursor_ObjCProtocolRef: { 2732049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ObjCProtocolDecl *OID = getCursorObjCProtocolRef(C).first; 2733049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project assert(OID && "getCursorSpelling(): Missing protocol decl"); 2734049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString(OID->getIdentifier()->getNameStart()); 2735049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2736049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXCursor_CXXBaseSpecifier: { 2737049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXXBaseSpecifier *B = getCursorCXXBaseSpecifier(C); 2738049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString(B->getType().getAsString()); 2739049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2740049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXCursor_TypeRef: { 2741049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TypeDecl *Type = getCursorTypeRef(C).first; 2742049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project assert(Type && "Missing type decl"); 2743049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2744049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString(getCursorContext(C).getTypeDeclType(Type). 2745049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project getAsString()); 2746049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2747049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXCursor_TemplateRef: { 2748049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TemplateDecl *Template = getCursorTemplateRef(C).first; 2749049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project assert(Template && "Missing template decl"); 2750049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2751049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString(Template->getNameAsString()); 2752049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2753049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2754049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXCursor_NamespaceRef: { 2755049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project NamedDecl *NS = getCursorNamespaceRef(C).first; 2756049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project assert(NS && "Missing namespace decl"); 2757049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2758049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString(NS->getNameAsString()); 2759049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2760049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2761049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXCursor_MemberRef: { 2762049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FieldDecl *Field = getCursorMemberRef(C).first; 2763049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project assert(Field && "Missing member decl"); 2764049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2765049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString(Field->getNameAsString()); 2766049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2767049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2768049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXCursor_LabelRef: { 2769049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project LabelStmt *Label = getCursorLabelRef(C).first; 2770049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project assert(Label && "Missing label"); 2771049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2772049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString(Label->getID()->getName()); 2773049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2774049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2775049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXCursor_OverloadedDeclRef: { 2776049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project OverloadedDeclRefStorage Storage = getCursorOverloadedDeclRef(C).first; 2777049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (Decl *D = Storage.dyn_cast<Decl *>()) { 2778049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (NamedDecl *ND = dyn_cast<NamedDecl>(D)) 2779049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString(ND->getNameAsString()); 2780049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString(""); 2781049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2782049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (OverloadExpr *E = Storage.dyn_cast<OverloadExpr *>()) 2783049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString(E->getName().getAsString()); 2784049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project OverloadedTemplateStorage *Ovl 2785049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project = Storage.get<OverloadedTemplateStorage*>(); 2786049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (Ovl->size() == 0) 2787049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString(""); 2788049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString((*Ovl->begin())->getNameAsString()); 2789049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2790049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2791049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project default: 2792049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString("<not implemented>"); 2793049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2794049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2795049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2796049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (clang_isExpression(C.kind)) { 2797049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Decl *D = getDeclFromExpr(getCursorExpr(C)); 2798049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (D) 2799049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return getDeclSpelling(D); 2800049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString(""); 2801049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2802049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2803049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (clang_isStatement(C.kind)) { 2804049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Stmt *S = getCursorStmt(C); 2805049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (LabelStmt *Label = dyn_cast_or_null<LabelStmt>(S)) 2806049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString(Label->getID()->getName()); 2807049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2808049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString(""); 2809049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2810049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2811049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (C.kind == CXCursor_MacroInstantiation) 2812049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString(getCursorMacroInstantiation(C)->getName() 2813049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ->getNameStart()); 2814049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2815049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (C.kind == CXCursor_MacroDefinition) 2816049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString(getCursorMacroDefinition(C)->getName() 2817049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ->getNameStart()); 2818049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2819049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (C.kind == CXCursor_InclusionDirective) 2820049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString(getCursorInclusionDirective(C)->getFileName()); 2821049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2822049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (clang_isDeclaration(C.kind)) 2823049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return getDeclSpelling(getCursorDecl(C)); 2824049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2825049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString(""); 2826049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 2827049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2828049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source ProjectCXString clang_getCursorDisplayName(CXCursor C) { 2829049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (!clang_isDeclaration(C.kind)) 2830049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return clang_getCursorSpelling(C); 2831049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2832049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Decl *D = getCursorDecl(C); 2833049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (!D) 2834049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString(""); 2835049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2836049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project PrintingPolicy &Policy = getCursorContext(C).PrintingPolicy; 2837049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (FunctionTemplateDecl *FunTmpl = dyn_cast<FunctionTemplateDecl>(D)) 2838049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project D = FunTmpl->getTemplatedDecl(); 2839049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2840049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (FunctionDecl *Function = dyn_cast<FunctionDecl>(D)) { 2841049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project llvm::SmallString<64> Str; 2842049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project llvm::raw_svector_ostream OS(Str); 2843049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project OS << Function->getNameAsString(); 2844049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (Function->getPrimaryTemplate()) 2845049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project OS << "<>"; 2846049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project OS << "("; 2847049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for (unsigned I = 0, N = Function->getNumParams(); I != N; ++I) { 2848049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (I) 2849049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project OS << ", "; 2850049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project OS << Function->getParamDecl(I)->getType().getAsString(Policy); 2851049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2852049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2853049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (Function->isVariadic()) { 2854049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (Function->getNumParams()) 2855049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project OS << ", "; 2856049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project OS << "..."; 2857049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2858049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project OS << ")"; 2859049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString(OS.str()); 2860049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2861049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2862049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (ClassTemplateDecl *ClassTemplate = dyn_cast<ClassTemplateDecl>(D)) { 2863049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project llvm::SmallString<64> Str; 2864049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project llvm::raw_svector_ostream OS(Str); 2865049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project OS << ClassTemplate->getNameAsString(); 2866049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project OS << "<"; 2867049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TemplateParameterList *Params = ClassTemplate->getTemplateParameters(); 2868049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for (unsigned I = 0, N = Params->size(); I != N; ++I) { 2869049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (I) 2870049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project OS << ", "; 2871049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2872049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project NamedDecl *Param = Params->getParam(I); 2873049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (Param->getIdentifier()) { 2874049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project OS << Param->getIdentifier()->getName(); 2875049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project continue; 2876049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2877049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2878049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // There is no parameter name, which makes this tricky. Try to come up 2879049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // with something useful that isn't too long. 2880049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(Param)) 2881049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project OS << (TTP->wasDeclaredWithTypename()? "typename" : "class"); 2882049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else if (NonTypeTemplateParmDecl *NTTP 2883049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project = dyn_cast<NonTypeTemplateParmDecl>(Param)) 2884049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project OS << NTTP->getType().getAsString(Policy); 2885049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 2886049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project OS << "template<...> class"; 2887049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2888049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2889049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project OS << ">"; 2890049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString(OS.str()); 2891049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2892049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2893049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (ClassTemplateSpecializationDecl *ClassSpec 2894049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project = dyn_cast<ClassTemplateSpecializationDecl>(D)) { 2895049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // If the type was explicitly written, use that. 2896049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (TypeSourceInfo *TSInfo = ClassSpec->getTypeAsWritten()) 2897049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString(TSInfo->getType().getAsString(Policy)); 2898049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2899049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project llvm::SmallString<64> Str; 2900049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project llvm::raw_svector_ostream OS(Str); 2901049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project OS << ClassSpec->getNameAsString(); 2902049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project OS << TemplateSpecializationType::PrintTemplateArgumentList( 2903049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ClassSpec->getTemplateArgs().data(), 2904049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ClassSpec->getTemplateArgs().size(), 2905049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Policy); 2906049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString(OS.str()); 2907049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2908049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2909049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return clang_getCursorSpelling(C); 2910049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 2911049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2912049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source ProjectCXString clang_getCursorKindSpelling(enum CXCursorKind Kind) { 2913049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project switch (Kind) { 2914049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXCursor_FunctionDecl: 2915049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString("FunctionDecl"); 2916049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXCursor_TypedefDecl: 2917049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString("TypedefDecl"); 2918049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXCursor_EnumDecl: 2919049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString("EnumDecl"); 2920049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXCursor_EnumConstantDecl: 2921049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString("EnumConstantDecl"); 2922049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXCursor_StructDecl: 2923049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString("StructDecl"); 2924049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXCursor_UnionDecl: 2925049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString("UnionDecl"); 2926049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXCursor_ClassDecl: 2927049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString("ClassDecl"); 2928049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXCursor_FieldDecl: 2929049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString("FieldDecl"); 2930049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXCursor_VarDecl: 2931049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString("VarDecl"); 2932049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXCursor_ParmDecl: 2933049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString("ParmDecl"); 2934049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXCursor_ObjCInterfaceDecl: 2935049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString("ObjCInterfaceDecl"); 2936049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXCursor_ObjCCategoryDecl: 2937a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang return createCXString("ObjCCategoryDecl"); 2938a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang case CXCursor_ObjCProtocolDecl: 2939a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang return createCXString("ObjCProtocolDecl"); 2940a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang case CXCursor_ObjCPropertyDecl: 2941049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString("ObjCPropertyDecl"); 2942049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXCursor_ObjCIvarDecl: 2943049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString("ObjCIvarDecl"); 2944049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXCursor_ObjCInstanceMethodDecl: 2945049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString("ObjCInstanceMethodDecl"); 2946049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXCursor_ObjCClassMethodDecl: 2947049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString("ObjCClassMethodDecl"); 2948049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXCursor_ObjCImplementationDecl: 2949049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString("ObjCImplementationDecl"); 2950049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXCursor_ObjCCategoryImplDecl: 2951049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString("ObjCCategoryImplDecl"); 2952049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXCursor_CXXMethod: 2953049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString("CXXMethod"); 2954049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXCursor_UnexposedDecl: 2955049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString("UnexposedDecl"); 2956a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang case CXCursor_ObjCSuperClassRef: 2957a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang return createCXString("ObjCSuperClassRef"); 2958a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang case CXCursor_ObjCProtocolRef: 2959049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString("ObjCProtocolRef"); 2960049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXCursor_ObjCClassRef: 2961049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString("ObjCClassRef"); 2962049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXCursor_TypeRef: 2963049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString("TypeRef"); 2964049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXCursor_TemplateRef: 2965049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString("TemplateRef"); 2966049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXCursor_NamespaceRef: 2967049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString("NamespaceRef"); 2968049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXCursor_MemberRef: 2969049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString("MemberRef"); 2970049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXCursor_LabelRef: 2971049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString("LabelRef"); 2972049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXCursor_OverloadedDeclRef: 2973049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString("OverloadedDeclRef"); 2974049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXCursor_UnexposedExpr: 2975049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString("UnexposedExpr"); 2976049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXCursor_BlockExpr: 2977049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString("BlockExpr"); 2978049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXCursor_DeclRefExpr: 2979049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString("DeclRefExpr"); 2980049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXCursor_MemberRefExpr: 2981049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString("MemberRefExpr"); 2982049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXCursor_CallExpr: 2983049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString("CallExpr"); 2984049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXCursor_ObjCMessageExpr: 2985049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString("ObjCMessageExpr"); 2986049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXCursor_UnexposedStmt: 2987049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString("UnexposedStmt"); 2988049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXCursor_LabelStmt: 2989049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString("LabelStmt"); 2990049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXCursor_InvalidFile: 2991049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString("InvalidFile"); 2992049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXCursor_InvalidCode: 2993049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString("InvalidCode"); 2994049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXCursor_NoDeclFound: 2995049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString("NoDeclFound"); 2996049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXCursor_NotImplemented: 2997049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString("NotImplemented"); 2998049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXCursor_TranslationUnit: 2999049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString("TranslationUnit"); 3000049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXCursor_UnexposedAttr: 3001049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString("UnexposedAttr"); 3002049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXCursor_IBActionAttr: 3003049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString("attribute(ibaction)"); 3004049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXCursor_IBOutletAttr: 3005049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString("attribute(iboutlet)"); 3006049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXCursor_IBOutletCollectionAttr: 3007049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString("attribute(iboutletcollection)"); 3008049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXCursor_PreprocessingDirective: 3009049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString("preprocessing directive"); 3010049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXCursor_MacroDefinition: 3011049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString("macro definition"); 3012049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXCursor_MacroInstantiation: 3013049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString("macro instantiation"); 3014049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXCursor_InclusionDirective: 3015049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString("inclusion directive"); 3016049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXCursor_Namespace: 3017049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString("Namespace"); 3018049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXCursor_LinkageSpec: 3019049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString("LinkageSpec"); 3020049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXCursor_CXXBaseSpecifier: 3021049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString("C++ base class specifier"); 3022a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang case CXCursor_Constructor: 3023a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang return createCXString("CXXConstructor"); 3024a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang case CXCursor_Destructor: 3025a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang return createCXString("CXXDestructor"); 3026a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang case CXCursor_ConversionFunction: 3027a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang return createCXString("CXXConversion"); 3028a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang case CXCursor_TemplateTypeParameter: 3029a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang return createCXString("TemplateTypeParameter"); 3030a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang case CXCursor_NonTypeTemplateParameter: 3031a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang return createCXString("NonTypeTemplateParameter"); 3032a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang case CXCursor_TemplateTemplateParameter: 3033a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang return createCXString("TemplateTemplateParameter"); 3034a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang case CXCursor_FunctionTemplate: 3035a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang return createCXString("FunctionTemplate"); 3036a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang case CXCursor_ClassTemplate: 3037c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner return createCXString("ClassTemplate"); 3038c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner case CXCursor_ClassTemplatePartialSpecialization: 3039c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner return createCXString("ClassTemplatePartialSpecialization"); 3040e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang case CXCursor_NamespaceAlias: 3041e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang return createCXString("NamespaceAlias"); 3042e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang case CXCursor_UsingDirective: 3043e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang return createCXString("UsingDirective"); 3044a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang case CXCursor_UsingDeclaration: 3045e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang return createCXString("UsingDeclaration"); 3046e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang } 3047e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang 3048e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang llvm_unreachable("Unhandled CXCursorKind"); 3049a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang return createCXString((const char*) 0); 3050e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang} 3051c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner 3052c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turnerenum CXChildVisitResult GetCursorVisitor(CXCursor cursor, 3053c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner CXCursor parent, 3054e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang CXClientData client_data) { 3055e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang CXCursor *BestCursor = static_cast<CXCursor *>(client_data); 3056a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 3057e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang // If our current best cursor is the construction of a temporary object, 3058e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang // don't replace that cursor with a type reference, because we want 3059e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang // clang_getCursor() to point at the constructor. 3060e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang if (clang_isExpression(BestCursor->kind) && 3061a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang isa<CXXTemporaryObjectExpr>(getCursorExpr(*BestCursor)) && 3062049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cursor.kind == CXCursor_TypeRef) 3063049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return CXChildVisit_Recurse; 3064049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3065e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang *BestCursor = cursor; 3066e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang return CXChildVisit_Recurse; 3067e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang} 3068e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang 3069a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu WangCXCursor clang_getCursor(CXTranslationUnit TU, CXSourceLocation Loc) { 3070e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang if (!TU) 3071e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang return clang_getNullCursor(); 3072e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang 3073e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang ASTUnit *CXXUnit = static_cast<ASTUnit *>(TU->TUData); 3074a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang ASTUnit::ConcurrencyCheck Check(*CXXUnit); 3075e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang 3076049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Translate the given source location to make it point at the beginning of 3077049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // the token under the cursor. 3078049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SourceLocation SLoc = cxloc::translateSourceLocation(Loc); 3079049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3080049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Guard against an invalid SourceLocation, or we may assert in one 3081049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // of the following calls. 3082049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (SLoc.isInvalid()) 3083049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return clang_getNullCursor(); 3084049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3085049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bool Logging = getenv("LIBCLANG_LOGGING"); 3086049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SLoc = Lexer::GetBeginningOfToken(SLoc, CXXUnit->getSourceManager(), 3087049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXXUnit->getASTContext().getLangOptions()); 3088049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3089049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXCursor Result = MakeCXCursorInvalid(CXCursor_NoDeclFound); 3090049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (SLoc.isValid()) { 3091049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // FIXME: Would be great to have a "hint" cursor, then walk from that 3092049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // hint cursor upward until we find a cursor whose source range encloses 3093049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // the region of interest, rather than starting from the translation unit. 3094049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXCursor Parent = clang_getTranslationUnitCursor(TU); 3095049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CursorVisitor CursorVis(TU, GetCursorVisitor, &Result, 3096049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Decl::MaxPCHLevel, SourceLocation(SLoc)); 3097049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CursorVis.VisitChildren(Parent); 3098049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3099049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3100049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (Logging) { 3101049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXFile SearchFile; 3102049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project unsigned SearchLine, SearchColumn; 3103049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXFile ResultFile; 3104049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project unsigned ResultLine, ResultColumn; 3105049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXString SearchFileName, ResultFileName, KindSpelling, USR; 3106049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const char *IsDef = clang_isCursorDefinition(Result)? " (Definition)" : ""; 3107049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXSourceLocation ResultLoc = clang_getCursorLocation(Result); 3108049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3109049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project clang_getInstantiationLocation(Loc, &SearchFile, &SearchLine, &SearchColumn, 3110049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 0); 3111049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project clang_getInstantiationLocation(ResultLoc, &ResultFile, &ResultLine, 3112049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project &ResultColumn, 0); 3113049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SearchFileName = clang_getFileName(SearchFile); 3114049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ResultFileName = clang_getFileName(ResultFile); 3115049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project KindSpelling = clang_getCursorKindSpelling(Result.kind); 3116049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project USR = clang_getCursorUSR(Result); 3117049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project fprintf(stderr, "clang_getCursor(%s:%d:%d) = %s(%s:%d:%d):%s%s\n", 3118049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project clang_getCString(SearchFileName), SearchLine, SearchColumn, 3119049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project clang_getCString(KindSpelling), 3120049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project clang_getCString(ResultFileName), ResultLine, ResultColumn, 3121049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project clang_getCString(USR), IsDef); 3122049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project clang_disposeString(SearchFileName); 3123049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project clang_disposeString(ResultFileName); 3124049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project clang_disposeString(KindSpelling); 3125049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project clang_disposeString(USR); 3126049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3127049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3128049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return Result; 3129049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 3130049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3131049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source ProjectCXCursor clang_getNullCursor(void) { 3132049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return MakeCXCursorInvalid(CXCursor_InvalidFile); 3133a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang} 3134049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3135a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wangunsigned clang_equalCursors(CXCursor X, CXCursor Y) { 3136049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return X == Y; 3137049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 3138049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3139a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wangunsigned clang_hashCursor(CXCursor C) { 3140049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project unsigned Index = 0; 3141049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (clang_isExpression(C.kind) || clang_isStatement(C.kind)) 3142049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Index = 1; 3143049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3144049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return llvm::DenseMapInfo<std::pair<unsigned, void*> >::getHashValue( 3145049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project std::make_pair(C.kind, C.data[Index])); 3146049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 3147049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3148049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectunsigned clang_isInvalid(enum CXCursorKind K) { 3149049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return K >= CXCursor_FirstInvalid && K <= CXCursor_LastInvalid; 3150049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 3151049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3152049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectunsigned clang_isDeclaration(enum CXCursorKind K) { 3153049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return K >= CXCursor_FirstDecl && K <= CXCursor_LastDecl; 3154049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 3155049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3156049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectunsigned clang_isReference(enum CXCursorKind K) { 3157a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang return K >= CXCursor_FirstRef && K <= CXCursor_LastRef; 3158a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang} 3159a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 3160a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wangunsigned clang_isExpression(enum CXCursorKind K) { 3161a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang return K >= CXCursor_FirstExpr && K <= CXCursor_LastExpr; 3162a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang} 3163a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 3164a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wangunsigned clang_isStatement(enum CXCursorKind K) { 3165a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang return K >= CXCursor_FirstStmt && K <= CXCursor_LastStmt; 3166a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang} 3167a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 3168a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wangunsigned clang_isTranslationUnit(enum CXCursorKind K) { 3169a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang return K == CXCursor_TranslationUnit; 3170a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang} 3171a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 3172a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wangunsigned clang_isPreprocessing(enum CXCursorKind K) { 3173a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang return K >= CXCursor_FirstPreprocessing && K <= CXCursor_LastPreprocessing; 3174a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang} 3175a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 3176a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wangunsigned clang_isUnexposed(enum CXCursorKind K) { 3177a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang switch (K) { 3178a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang case CXCursor_UnexposedDecl: 3179a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang case CXCursor_UnexposedExpr: 3180a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang case CXCursor_UnexposedStmt: 3181a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang case CXCursor_UnexposedAttr: 3182a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang return true; 3183a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang default: 3184a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang return false; 3185a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang } 3186a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang} 3187a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 3188a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu WangCXCursorKind clang_getCursorKind(CXCursor C) { 3189a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang return C.kind; 3190a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang} 3191a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 3192a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu WangCXSourceLocation clang_getCursorLocation(CXCursor C) { 3193a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang if (clang_isReference(C.kind)) { 3194a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang switch (C.kind) { 3195a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang case CXCursor_ObjCSuperClassRef: { 3196049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project std::pair<ObjCInterfaceDecl *, SourceLocation> P 3197aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich = getCursorObjCSuperClassRef(C); 3198aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich return cxloc::translateSourceLocation(P.first->getASTContext(), P.second); 3199aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich } 3200aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 3201aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich case CXCursor_ObjCProtocolRef: { 3202aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich std::pair<ObjCProtocolDecl *, SourceLocation> P 3203aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich = getCursorObjCProtocolRef(C); 3204aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich return cxloc::translateSourceLocation(P.first->getASTContext(), P.second); 3205aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich } 3206aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 3207aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich case CXCursor_ObjCClassRef: { 3208aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich std::pair<ObjCInterfaceDecl *, SourceLocation> P 3209aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich = getCursorObjCClassRef(C); 3210aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich return cxloc::translateSourceLocation(P.first->getASTContext(), P.second); 3211aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich } 3212aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 3213049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXCursor_TypeRef: { 3214049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project std::pair<TypeDecl *, SourceLocation> P = getCursorTypeRef(C); 3215a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang return cxloc::translateSourceLocation(P.first->getASTContext(), P.second); 3216a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang } 3217049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3218aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich case CXCursor_TemplateRef: { 3219aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich std::pair<TemplateDecl *, SourceLocation> P = getCursorTemplateRef(C); 3220aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich return cxloc::translateSourceLocation(P.first->getASTContext(), P.second); 3221aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich } 3222aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 3223aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich case CXCursor_NamespaceRef: { 3224aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich std::pair<NamedDecl *, SourceLocation> P = getCursorNamespaceRef(C); 3225aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich return cxloc::translateSourceLocation(P.first->getASTContext(), P.second); 3226aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich } 3227aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 3228aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich case CXCursor_MemberRef: { 3229aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich std::pair<FieldDecl *, SourceLocation> P = getCursorMemberRef(C); 3230aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich return cxloc::translateSourceLocation(P.first->getASTContext(), P.second); 3231aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich } 3232049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3233049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXCursor_CXXBaseSpecifier: { 3234049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXXBaseSpecifier *BaseSpec = getCursorCXXBaseSpecifier(C); 3235049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (!BaseSpec) 3236049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return clang_getNullLocation(); 3237049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3238049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (TypeSourceInfo *TSInfo = BaseSpec->getTypeSourceInfo()) 3239049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return cxloc::translateSourceLocation(getCursorContext(C), 3240aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich TSInfo->getTypeLoc().getBeginLoc()); 3241049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3242049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return cxloc::translateSourceLocation(getCursorContext(C), 3243049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project BaseSpec->getSourceRange().getBegin()); 3244049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3245049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3246049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXCursor_LabelRef: { 3247049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project std::pair<LabelStmt *, SourceLocation> P = getCursorLabelRef(C); 3248049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return cxloc::translateSourceLocation(getCursorContext(C), P.second); 3249049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3250049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3251049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXCursor_OverloadedDeclRef: 3252049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return cxloc::translateSourceLocation(getCursorContext(C), 3253049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project getCursorOverloadedDeclRef(C).second); 3254049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3255049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project default: 3256049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // FIXME: Need a way to enumerate all non-reference cases. 3257049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project llvm_unreachable("Missed a reference kind"); 3258049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3259aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich } 3260049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3261049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (clang_isExpression(C.kind)) 3262049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return cxloc::translateSourceLocation(getCursorContext(C), 3263049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project getLocationFromExpr(getCursorExpr(C))); 3264049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3265049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (clang_isStatement(C.kind)) 3266049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return cxloc::translateSourceLocation(getCursorContext(C), 3267049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project getCursorStmt(C)->getLocStart()); 3268049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3269049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (C.kind == CXCursor_PreprocessingDirective) { 3270049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SourceLocation L = cxcursor::getCursorPreprocessingDirective(C).getBegin(); 3271049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return cxloc::translateSourceLocation(getCursorContext(C), L); 3272049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3273049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3274049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (C.kind == CXCursor_MacroInstantiation) { 3275049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SourceLocation L 3276aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich = cxcursor::getCursorMacroInstantiation(C)->getSourceRange().getBegin(); 3277049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return cxloc::translateSourceLocation(getCursorContext(C), L); 3278049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3279049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3280049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (C.kind == CXCursor_MacroDefinition) { 3281049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SourceLocation L = cxcursor::getCursorMacroDefinition(C)->getLocation(); 3282049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return cxloc::translateSourceLocation(getCursorContext(C), L); 3283049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3284a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 3285049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (C.kind == CXCursor_InclusionDirective) { 3286049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SourceLocation L 3287049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project = cxcursor::getCursorInclusionDirective(C)->getSourceRange().getBegin(); 3288a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang return cxloc::translateSourceLocation(getCursorContext(C), L); 3289a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang } 3290049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3291049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (C.kind < CXCursor_FirstDecl || C.kind > CXCursor_LastDecl) 3292049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return clang_getNullLocation(); 3293049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3294049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Decl *D = getCursorDecl(C); 3295049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SourceLocation Loc = D->getLocation(); 3296049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (ObjCInterfaceDecl *Class = dyn_cast<ObjCInterfaceDecl>(D)) 3297049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Loc = Class->getClassLoc(); 3298049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // FIXME: Multiple variables declared in a single declaration 3299049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // currently lack the information needed to correctly determine their 3300049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // ranges when accounting for the type-specifier. We use context 3301049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // stored in the CXCursor to determine if the VarDecl is in a DeclGroup, 3302049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // and if so, whether it is the first decl. 3303049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (VarDecl *VD = dyn_cast<VarDecl>(D)) { 3304049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (!cxcursor::isFirstInDeclGroup(C)) 3305049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Loc = VD->getLocation(); 3306049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3307049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3308049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return cxloc::translateSourceLocation(getCursorContext(C), Loc); 3309049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 3310049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3311049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} // end extern "C" 3312049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3313049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectstatic SourceRange getRawCursorExtent(CXCursor C) { 3314049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (clang_isReference(C.kind)) { 3315049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project switch (C.kind) { 3316049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXCursor_ObjCSuperClassRef: 3317a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang return getCursorObjCSuperClassRef(C).second; 3318a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 3319a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang case CXCursor_ObjCProtocolRef: 3320a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang return getCursorObjCProtocolRef(C).second; 3321049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3322049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXCursor_ObjCClassRef: 3323049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return getCursorObjCClassRef(C).second; 3324049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3325049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXCursor_TypeRef: 3326049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return getCursorTypeRef(C).second; 3327049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3328049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXCursor_TemplateRef: 3329049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return getCursorTemplateRef(C).second; 3330049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3331049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXCursor_NamespaceRef: 3332049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return getCursorNamespaceRef(C).second; 3333049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3334049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXCursor_MemberRef: 3335049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return getCursorMemberRef(C).second; 3336049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3337049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXCursor_CXXBaseSpecifier: 3338049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return getCursorCXXBaseSpecifier(C)->getSourceRange(); 3339049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3340049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXCursor_LabelRef: 3341049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return getCursorLabelRef(C).second; 3342049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3343049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXCursor_OverloadedDeclRef: 3344049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return getCursorOverloadedDeclRef(C).second; 3345049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3346049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project default: 3347049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // FIXME: Need a way to enumerate all non-reference cases. 3348049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project llvm_unreachable("Missed a reference kind"); 3349049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3350049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3351049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3352049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (clang_isExpression(C.kind)) 3353049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return getCursorExpr(C)->getSourceRange(); 3354049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3355049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (clang_isStatement(C.kind)) 3356049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return getCursorStmt(C)->getSourceRange(); 3357049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3358049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (C.kind == CXCursor_PreprocessingDirective) 3359049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return cxcursor::getCursorPreprocessingDirective(C); 3360049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3361049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (C.kind == CXCursor_MacroInstantiation) 3362049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return cxcursor::getCursorMacroInstantiation(C)->getSourceRange(); 3363049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3364049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (C.kind == CXCursor_MacroDefinition) 3365049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return cxcursor::getCursorMacroDefinition(C)->getSourceRange(); 3366049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3367049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (C.kind == CXCursor_InclusionDirective) 3368049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return cxcursor::getCursorInclusionDirective(C)->getSourceRange(); 3369049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3370049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (C.kind >= CXCursor_FirstDecl && C.kind <= CXCursor_LastDecl) { 3371049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Decl *D = cxcursor::getCursorDecl(C); 3372049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SourceRange R = D->getSourceRange(); 3373049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // FIXME: Multiple variables declared in a single declaration 3374049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // currently lack the information needed to correctly determine their 3375049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // ranges when accounting for the type-specifier. We use context 3376049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // stored in the CXCursor to determine if the VarDecl is in a DeclGroup, 3377049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // and if so, whether it is the first decl. 3378049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (VarDecl *VD = dyn_cast<VarDecl>(D)) { 3379049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (!cxcursor::isFirstInDeclGroup(C)) 3380049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project R.setBegin(VD->getLocation()); 3381049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3382049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return R; 3383049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3384049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return SourceRange(); 3385049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 3386049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3387049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/// \brief Retrieves the "raw" cursor extent, which is then extended to include 3388049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/// the decl-specifier-seq for declarations. 3389049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectstatic SourceRange getFullCursorExtent(CXCursor C, SourceManager &SrcMgr) { 3390049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (C.kind >= CXCursor_FirstDecl && C.kind <= CXCursor_LastDecl) { 3391049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Decl *D = cxcursor::getCursorDecl(C); 3392049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SourceRange R = D->getSourceRange(); 3393049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3394049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (const DeclaratorDecl *DD = dyn_cast<DeclaratorDecl>(D)) { 3395049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (TypeSourceInfo *TI = DD->getTypeSourceInfo()) { 3396049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TypeLoc TL = TI->getTypeLoc(); 3397049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SourceLocation TLoc = TL.getSourceRange().getBegin(); 3398049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (TLoc.isValid() && R.getBegin().isValid() && 3399049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SrcMgr.isBeforeInTranslationUnit(TLoc, R.getBegin())) 3400049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project R.setBegin(TLoc); 3401049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3402049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3403049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // FIXME: Multiple variables declared in a single declaration 3404049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // currently lack the information needed to correctly determine their 3405049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // ranges when accounting for the type-specifier. We use context 3406049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // stored in the CXCursor to determine if the VarDecl is in a DeclGroup, 3407049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // and if so, whether it is the first decl. 3408049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (VarDecl *VD = dyn_cast<VarDecl>(D)) { 3409049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (!cxcursor::isFirstInDeclGroup(C)) 3410049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project R.setBegin(VD->getLocation()); 3411049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3412049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3413049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3414049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return R; 3415049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3416049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3417049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return getRawCursorExtent(C); 3418049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 3419049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3420049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectextern "C" { 3421049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3422049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source ProjectCXSourceRange clang_getCursorExtent(CXCursor C) { 3423049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SourceRange R = getRawCursorExtent(C); 3424049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (R.isInvalid()) 3425049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return clang_getNullRange(); 3426049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3427049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return cxloc::translateSourceRange(getCursorContext(C), R); 3428049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 3429049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3430049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source ProjectCXCursor clang_getCursorReferenced(CXCursor C) { 3431049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (clang_isInvalid(C.kind)) 3432049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return clang_getNullCursor(); 3433049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3434049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXTranslationUnit tu = getCursorTU(C); 3435049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (clang_isDeclaration(C.kind)) { 3436049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Decl *D = getCursorDecl(C); 3437049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (UsingDecl *Using = dyn_cast<UsingDecl>(D)) 3438049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return MakeCursorOverloadedDeclRef(Using, D->getLocation(), tu); 3439049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (ObjCClassDecl *Classes = dyn_cast<ObjCClassDecl>(D)) 3440049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return MakeCursorOverloadedDeclRef(Classes, D->getLocation(), tu); 3441049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (ObjCForwardProtocolDecl *Protocols 3442049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project = dyn_cast<ObjCForwardProtocolDecl>(D)) 3443049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return MakeCursorOverloadedDeclRef(Protocols, D->getLocation(), tu); 3444049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (ObjCPropertyImplDecl *PropImpl =llvm::dyn_cast<ObjCPropertyImplDecl>(D)) 3445049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (ObjCPropertyDecl *Property = PropImpl->getPropertyDecl()) 3446049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return MakeCXCursor(Property, tu); 3447049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3448049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return C; 3449049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3450049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3451049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (clang_isExpression(C.kind)) { 3452049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Expr *E = getCursorExpr(C); 3453049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Decl *D = getDeclFromExpr(E); 3454049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (D) 3455049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return MakeCXCursor(D, tu); 3456049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3457049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (OverloadExpr *Ovl = dyn_cast_or_null<OverloadExpr>(E)) 3458049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return MakeCursorOverloadedDeclRef(Ovl, tu); 3459049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3460049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return clang_getNullCursor(); 3461049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3462049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3463049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (clang_isStatement(C.kind)) { 3464049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Stmt *S = getCursorStmt(C); 3465049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (GotoStmt *Goto = dyn_cast_or_null<GotoStmt>(S)) 3466049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return MakeCXCursor(Goto->getLabel(), getCursorDecl(C), tu); 3467049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3468049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return clang_getNullCursor(); 3469049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3470049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3471049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (C.kind == CXCursor_MacroInstantiation) { 3472049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (MacroDefinition *Def = getCursorMacroInstantiation(C)->getDefinition()) 3473049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return MakeMacroDefinitionCursor(Def, tu); 3474049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3475049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3476049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (!clang_isReference(C.kind)) 3477049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return clang_getNullCursor(); 3478049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3479049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project switch (C.kind) { 3480049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXCursor_ObjCSuperClassRef: 3481049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return MakeCXCursor(getCursorObjCSuperClassRef(C).first, tu); 3482049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3483049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXCursor_ObjCProtocolRef: { 3484049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return MakeCXCursor(getCursorObjCProtocolRef(C).first, tu); 3485049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3486049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXCursor_ObjCClassRef: 3487049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return MakeCXCursor(getCursorObjCClassRef(C).first, tu ); 3488049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3489049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXCursor_TypeRef: 3490049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return MakeCXCursor(getCursorTypeRef(C).first, tu ); 3491049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3492049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXCursor_TemplateRef: 3493049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return MakeCXCursor(getCursorTemplateRef(C).first, tu ); 3494049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3495049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXCursor_NamespaceRef: 3496049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return MakeCXCursor(getCursorNamespaceRef(C).first, tu ); 3497049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3498049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXCursor_MemberRef: 3499049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return MakeCXCursor(getCursorMemberRef(C).first, tu ); 3500049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3501049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXCursor_CXXBaseSpecifier: { 3502049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXXBaseSpecifier *B = cxcursor::getCursorCXXBaseSpecifier(C); 3503049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return clang_getTypeDeclaration(cxtype::MakeCXType(B->getType(), 3504049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project tu )); 3505049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3506049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3507049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXCursor_LabelRef: 3508049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // FIXME: We end up faking the "parent" declaration here because we 3509049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // don't want to make CXCursor larger. 3510049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return MakeCXCursor(getCursorLabelRef(C).first, 3511049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static_cast<ASTUnit*>(tu->TUData)->getASTContext() 3512049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project .getTranslationUnitDecl(), 3513049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project tu); 3514049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3515049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXCursor_OverloadedDeclRef: 3516049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return C; 3517049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3518049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project default: 3519049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // We would prefer to enumerate all non-reference cursor kinds here. 3520049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project llvm_unreachable("Unhandled reference cursor kind"); 3521049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 3522049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3523049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3524049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3525049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return clang_getNullCursor(); 3526049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 3527049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3528049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source ProjectCXCursor clang_getCursorDefinition(CXCursor C) { 3529049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (clang_isInvalid(C.kind)) 3530049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return clang_getNullCursor(); 3531049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3532049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXTranslationUnit TU = getCursorTU(C); 3533049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3534049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bool WasReference = false; 3535049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (clang_isReference(C.kind) || clang_isExpression(C.kind)) { 3536049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project C = clang_getCursorReferenced(C); 3537049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project WasReference = true; 3538049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3539049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3540049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (C.kind == CXCursor_MacroInstantiation) 3541049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return clang_getCursorReferenced(C); 3542049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3543049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (!clang_isDeclaration(C.kind)) 3544049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return clang_getNullCursor(); 3545049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3546049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Decl *D = getCursorDecl(C); 3547049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (!D) 3548049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return clang_getNullCursor(); 3549049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3550049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project switch (D->getKind()) { 3551049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Declaration kinds that don't really separate the notions of 3552049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // declaration and definition. 3553049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::Namespace: 3554049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::Typedef: 3555049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::TemplateTypeParm: 3556049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::EnumConstant: 3557049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::Field: 3558049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::ObjCIvar: 3559049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::ObjCAtDefsField: 3560049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::ImplicitParam: 3561049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::ParmVar: 3562049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::NonTypeTemplateParm: 3563049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::TemplateTemplateParm: 3564049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::ObjCCategoryImpl: 3565049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::ObjCImplementation: 3566049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::AccessSpec: 3567049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::LinkageSpec: 3568049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::ObjCPropertyImpl: 3569049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::FileScopeAsm: 3570049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::StaticAssert: 3571049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::Block: 3572049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return C; 3573049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3574049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Declaration kinds that don't make any sense here, but are 3575049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // nonetheless harmless. 3576049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::TranslationUnit: 3577049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 3578049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3579049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Declaration kinds for which the definition is not resolvable. 3580049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::UnresolvedUsingTypename: 3581049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::UnresolvedUsingValue: 3582049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 3583049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3584049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::UsingDirective: 3585049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return MakeCXCursor(cast<UsingDirectiveDecl>(D)->getNominatedNamespace(), 3586049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TU); 3587049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3588049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::NamespaceAlias: 3589049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return MakeCXCursor(cast<NamespaceAliasDecl>(D)->getNamespace(), TU); 3590049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3591049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::Enum: 3592049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::Record: 3593049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::CXXRecord: 3594049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::ClassTemplateSpecialization: 3595049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::ClassTemplatePartialSpecialization: 3596049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (TagDecl *Def = cast<TagDecl>(D)->getDefinition()) 3597049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return MakeCXCursor(Def, TU); 3598049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return clang_getNullCursor(); 3599049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3600049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::Function: 3601049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::CXXMethod: 3602049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::CXXConstructor: 3603049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::CXXDestructor: 3604049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::CXXConversion: { 3605049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const FunctionDecl *Def = 0; 3606049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (cast<FunctionDecl>(D)->getBody(Def)) 3607049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return MakeCXCursor(const_cast<FunctionDecl *>(Def), TU); 3608049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return clang_getNullCursor(); 3609049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3610049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3611049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::Var: { 3612049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Ask the variable if it has a definition. 3613049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (VarDecl *Def = cast<VarDecl>(D)->getDefinition()) 3614049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return MakeCXCursor(Def, TU); 3615049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return clang_getNullCursor(); 3616049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3617049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3618049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::FunctionTemplate: { 3619049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const FunctionDecl *Def = 0; 3620049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (cast<FunctionTemplateDecl>(D)->getTemplatedDecl()->getBody(Def)) 3621049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return MakeCXCursor(Def->getDescribedFunctionTemplate(), TU); 3622049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return clang_getNullCursor(); 3623049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3624049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3625049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::ClassTemplate: { 3626049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (RecordDecl *Def = cast<ClassTemplateDecl>(D)->getTemplatedDecl() 3627049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ->getDefinition()) 3628049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return MakeCXCursor(cast<CXXRecordDecl>(Def)->getDescribedClassTemplate(), 3629049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TU); 3630049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return clang_getNullCursor(); 3631049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3632049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3633049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::Using: 3634049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return MakeCursorOverloadedDeclRef(cast<UsingDecl>(D), 3635049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project D->getLocation(), TU); 3636049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3637049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::UsingShadow: 3638049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return clang_getCursorDefinition( 3639049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project MakeCXCursor(cast<UsingShadowDecl>(D)->getTargetDecl(), 3640049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TU)); 3641049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3642049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::ObjCMethod: { 3643049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ObjCMethodDecl *Method = cast<ObjCMethodDecl>(D); 3644049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (Method->isThisDeclarationADefinition()) 3645049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return C; 3646049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3647049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Dig out the method definition in the associated 3648049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // @implementation, if we have it. 3649049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // FIXME: The ASTs should make finding the definition easier. 3650049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (ObjCInterfaceDecl *Class 3651049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project = dyn_cast<ObjCInterfaceDecl>(Method->getDeclContext())) 3652049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (ObjCImplementationDecl *ClassImpl = Class->getImplementation()) 3653049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (ObjCMethodDecl *Def = ClassImpl->getMethod(Method->getSelector(), 3654049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Method->isInstanceMethod())) 3655049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (Def->isThisDeclarationADefinition()) 3656049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return MakeCXCursor(Def, TU); 3657049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3658049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return clang_getNullCursor(); 3659049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3660049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3661049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::ObjCCategory: 3662049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (ObjCCategoryImplDecl *Impl 3663049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project = cast<ObjCCategoryDecl>(D)->getImplementation()) 3664049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return MakeCXCursor(Impl, TU); 3665049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return clang_getNullCursor(); 3666049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3667049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::ObjCProtocol: 3668049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (!cast<ObjCProtocolDecl>(D)->isForwardDecl()) 3669049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return C; 3670049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return clang_getNullCursor(); 3671049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3672049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::ObjCInterface: 3673049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // There are two notions of a "definition" for an Objective-C 3674049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // class: the interface and its implementation. When we resolved a 3675049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // reference to an Objective-C class, produce the @interface as 3676049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // the definition; when we were provided with the interface, 3677049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // produce the @implementation as the definition. 3678049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (WasReference) { 3679049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (!cast<ObjCInterfaceDecl>(D)->isForwardDecl()) 3680049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return C; 3681049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } else if (ObjCImplementationDecl *Impl 3682049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project = cast<ObjCInterfaceDecl>(D)->getImplementation()) 3683049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return MakeCXCursor(Impl, TU); 3684049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return clang_getNullCursor(); 3685049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3686049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::ObjCProperty: 3687049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // FIXME: We don't really know where to find the 3688049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // ObjCPropertyImplDecls that implement this property. 3689049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return clang_getNullCursor(); 3690049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3691049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::ObjCCompatibleAlias: 3692049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (ObjCInterfaceDecl *Class 3693049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project = cast<ObjCCompatibleAliasDecl>(D)->getClassInterface()) 3694049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (!Class->isForwardDecl()) 3695049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return MakeCXCursor(Class, TU); 3696049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3697049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return clang_getNullCursor(); 3698049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3699049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::ObjCForwardProtocol: 3700049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return MakeCursorOverloadedDeclRef(cast<ObjCForwardProtocolDecl>(D), 3701049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project D->getLocation(), TU); 3702049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3703049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::ObjCClass: 3704049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return MakeCursorOverloadedDeclRef(cast<ObjCClassDecl>(D), D->getLocation(), 3705049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TU); 3706049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3707049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::Friend: 3708049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (NamedDecl *Friend = cast<FriendDecl>(D)->getFriendDecl()) 3709049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return clang_getCursorDefinition(MakeCXCursor(Friend, TU)); 3710049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return clang_getNullCursor(); 3711049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3712049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::FriendTemplate: 3713049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (NamedDecl *Friend = cast<FriendTemplateDecl>(D)->getFriendDecl()) 3714049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return clang_getCursorDefinition(MakeCXCursor(Friend, TU)); 3715049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return clang_getNullCursor(); 3716049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3717049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3718049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return clang_getNullCursor(); 3719049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 3720049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3721049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectunsigned clang_isCursorDefinition(CXCursor C) { 3722049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (!clang_isDeclaration(C.kind)) 3723049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return 0; 3724049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3725049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return clang_getCursorDefinition(C) == C; 3726049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 3727049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3728049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source ProjectCXCursor clang_getCanonicalCursor(CXCursor C) { 3729049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (!clang_isDeclaration(C.kind)) 3730049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return C; 3731049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3732049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (Decl *D = getCursorDecl(C)) 3733049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return MakeCXCursor(D->getCanonicalDecl(), getCursorTU(C)); 3734049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3735049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return C; 3736049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 3737049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3738049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectunsigned clang_getNumOverloadedDecls(CXCursor C) { 3739049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (C.kind != CXCursor_OverloadedDeclRef) 3740049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return 0; 3741049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3742049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project OverloadedDeclRefStorage Storage = getCursorOverloadedDeclRef(C).first; 3743049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (OverloadExpr *E = Storage.dyn_cast<OverloadExpr *>()) 3744049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return E->getNumDecls(); 3745049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3746049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (OverloadedTemplateStorage *S 3747049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project = Storage.dyn_cast<OverloadedTemplateStorage*>()) 3748049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return S->size(); 3749049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3750049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Decl *D = Storage.get<Decl*>(); 3751049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (UsingDecl *Using = dyn_cast<UsingDecl>(D)) 3752049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return Using->shadow_size(); 3753049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (ObjCClassDecl *Classes = dyn_cast<ObjCClassDecl>(D)) 3754049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return Classes->size(); 3755049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (ObjCForwardProtocolDecl *Protocols =dyn_cast<ObjCForwardProtocolDecl>(D)) 3756049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return Protocols->protocol_size(); 3757049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3758049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return 0; 3759049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 3760049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3761049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source ProjectCXCursor clang_getOverloadedDecl(CXCursor cursor, unsigned index) { 3762049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (cursor.kind != CXCursor_OverloadedDeclRef) 3763049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return clang_getNullCursor(); 3764049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3765049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (index >= clang_getNumOverloadedDecls(cursor)) 3766049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return clang_getNullCursor(); 3767049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3768049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXTranslationUnit TU = getCursorTU(cursor); 3769049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project OverloadedDeclRefStorage Storage = getCursorOverloadedDeclRef(cursor).first; 3770049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (OverloadExpr *E = Storage.dyn_cast<OverloadExpr *>()) 3771049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return MakeCXCursor(E->decls_begin()[index], TU); 3772049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3773049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (OverloadedTemplateStorage *S 3774049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project = Storage.dyn_cast<OverloadedTemplateStorage*>()) 3775049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return MakeCXCursor(S->begin()[index], TU); 3776049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3777049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Decl *D = Storage.get<Decl*>(); 3778049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (UsingDecl *Using = dyn_cast<UsingDecl>(D)) { 3779049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // FIXME: This is, unfortunately, linear time. 3780049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project UsingDecl::shadow_iterator Pos = Using->shadow_begin(); 3781049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project std::advance(Pos, index); 3782049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return MakeCXCursor(cast<UsingShadowDecl>(*Pos)->getTargetDecl(), TU); 3783049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3784049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3785049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (ObjCClassDecl *Classes = dyn_cast<ObjCClassDecl>(D)) 3786049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return MakeCXCursor(Classes->begin()[index].getInterface(), TU); 3787049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3788049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (ObjCForwardProtocolDecl *Protocols = dyn_cast<ObjCForwardProtocolDecl>(D)) 3789049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return MakeCXCursor(Protocols->protocol_begin()[index], TU); 3790049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3791049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return clang_getNullCursor(); 3792049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 3793049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3794049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectvoid clang_getDefinitionSpellingAndExtent(CXCursor C, 3795049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const char **startBuf, 3796049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const char **endBuf, 3797049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project unsigned *startLine, 3798049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project unsigned *startColumn, 3799049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project unsigned *endLine, 3800049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project unsigned *endColumn) { 3801049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project assert(getCursorDecl(C) && "CXCursor has null decl"); 3802049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project NamedDecl *ND = static_cast<NamedDecl *>(getCursorDecl(C)); 3803049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FunctionDecl *FD = dyn_cast<FunctionDecl>(ND); 3804049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CompoundStmt *Body = dyn_cast<CompoundStmt>(FD->getBody()); 3805049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3806049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SourceManager &SM = FD->getASTContext().getSourceManager(); 3807049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *startBuf = SM.getCharacterData(Body->getLBracLoc()); 3808049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *endBuf = SM.getCharacterData(Body->getRBracLoc()); 3809049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *startLine = SM.getSpellingLineNumber(Body->getLBracLoc()); 3810049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *startColumn = SM.getSpellingColumnNumber(Body->getLBracLoc()); 3811049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *endLine = SM.getSpellingLineNumber(Body->getRBracLoc()); 3812049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *endColumn = SM.getSpellingColumnNumber(Body->getRBracLoc()); 3813049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 3814049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3815049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectvoid clang_enableStackTraces(void) { 3816049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project llvm::sys::PrintStackTraceOnErrorSignal(); 3817049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 3818049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3819049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectvoid clang_executeOnThread(void (*fn)(void*), void *user_data, 3820049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project unsigned stack_size) { 3821049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project llvm::llvm_execute_on_thread(fn, user_data, stack_size); 3822049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 3823049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3824049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} // end: extern "C" 3825049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3826049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project//===----------------------------------------------------------------------===// 3827049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project// Token-based Operations. 3828049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project//===----------------------------------------------------------------------===// 3829049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3830049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* CXToken layout: 3831049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project * int_data[0]: a CXTokenKind 3832049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project * int_data[1]: starting token location 3833049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project * int_data[2]: token length 3834049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project * int_data[3]: reserved 3835049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project * ptr_data: for identifiers and keywords, an IdentifierInfo*. 3836049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project * otherwise unused. 3837049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project */ 3838049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectextern "C" { 3839049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3840049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source ProjectCXTokenKind clang_getTokenKind(CXToken CXTok) { 3841049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return static_cast<CXTokenKind>(CXTok.int_data[0]); 3842049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 3843049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3844049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source ProjectCXString clang_getTokenSpelling(CXTranslationUnit TU, CXToken CXTok) { 3845049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project switch (clang_getTokenKind(CXTok)) { 3846049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXToken_Identifier: 3847049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXToken_Keyword: 3848049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // We know we have an IdentifierInfo*, so use that. 3849049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString(static_cast<IdentifierInfo *>(CXTok.ptr_data) 3850049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ->getNameStart()); 3851049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3852049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXToken_Literal: { 3853049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // We have stashed the starting pointer in the ptr_data field. Use it. 3854049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const char *Text = static_cast<const char *>(CXTok.ptr_data); 3855049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString(llvm::StringRef(Text, CXTok.int_data[2])); 3856049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3857049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3858049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXToken_Punctuation: 3859049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case CXToken_Comment: 3860049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 3861049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3862049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3863049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // We have to find the starting buffer pointer the hard way, by 3864049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // deconstructing the source location. 3865049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ASTUnit *CXXUnit = static_cast<ASTUnit *>(TU->TUData); 3866049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (!CXXUnit) 3867049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString(""); 3868049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3869049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SourceLocation Loc = SourceLocation::getFromRawEncoding(CXTok.int_data[1]); 3870049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project std::pair<FileID, unsigned> LocInfo 3871049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project = CXXUnit->getSourceManager().getDecomposedLoc(Loc); 3872049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bool Invalid = false; 3873049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project llvm::StringRef Buffer 3874049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project = CXXUnit->getSourceManager().getBufferData(LocInfo.first, &Invalid); 3875049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (Invalid) 3876049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString(""); 3877049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3878049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return createCXString(Buffer.substr(LocInfo.second, CXTok.int_data[2])); 3879049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 3880049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3881049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source ProjectCXSourceLocation clang_getTokenLocation(CXTranslationUnit TU, CXToken CXTok) { 3882049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ASTUnit *CXXUnit = static_cast<ASTUnit *>(TU->TUData); 3883049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (!CXXUnit) 3884049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return clang_getNullLocation(); 3885049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3886049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return cxloc::translateSourceLocation(CXXUnit->getASTContext(), 3887049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SourceLocation::getFromRawEncoding(CXTok.int_data[1])); 3888049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 3889049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3890049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source ProjectCXSourceRange clang_getTokenExtent(CXTranslationUnit TU, CXToken CXTok) { 3891049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ASTUnit *CXXUnit = static_cast<ASTUnit *>(TU->TUData); 3892049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (!CXXUnit) 3893049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return clang_getNullRange(); 3894049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3895049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return cxloc::translateSourceRange(CXXUnit->getASTContext(), 3896049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SourceLocation::getFromRawEncoding(CXTok.int_data[1])); 3897049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 3898049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3899049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectvoid clang_tokenize(CXTranslationUnit TU, CXSourceRange Range, 3900049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXToken **Tokens, unsigned *NumTokens) { 3901049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (Tokens) 3902049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *Tokens = 0; 3903049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (NumTokens) 3904049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *NumTokens = 0; 3905049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3906049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ASTUnit *CXXUnit = static_cast<ASTUnit *>(TU->TUData); 3907049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (!CXXUnit || !Tokens || !NumTokens) 3908049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 3909049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3910049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ASTUnit::ConcurrencyCheck Check(*CXXUnit); 3911049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3912049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SourceRange R = cxloc::translateCXSourceRange(Range); 3913049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (R.isInvalid()) 3914049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 3915049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3916049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SourceManager &SourceMgr = CXXUnit->getSourceManager(); 3917049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project std::pair<FileID, unsigned> BeginLocInfo 3918049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project = SourceMgr.getDecomposedLoc(R.getBegin()); 3919049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project std::pair<FileID, unsigned> EndLocInfo 3920049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project = SourceMgr.getDecomposedLoc(R.getEnd()); 3921049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3922049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Cannot tokenize across files. 3923049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (BeginLocInfo.first != EndLocInfo.first) 3924049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 3925049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3926049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Create a lexer 3927049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bool Invalid = false; 3928049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project llvm::StringRef Buffer 3929049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project = SourceMgr.getBufferData(BeginLocInfo.first, &Invalid); 3930049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (Invalid) 3931049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 3932049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3933049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Lexer Lex(SourceMgr.getLocForStartOfFile(BeginLocInfo.first), 3934049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXXUnit->getASTContext().getLangOptions(), 3935049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Buffer.begin(), Buffer.data() + BeginLocInfo.second, Buffer.end()); 3936049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Lex.SetCommentRetentionState(true); 3937049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3938049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Lex tokens until we hit the end of the range. 3939049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const char *EffectiveBufferEnd = Buffer.data() + EndLocInfo.second; 3940049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project llvm::SmallVector<CXToken, 32> CXTokens; 3941049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Token Tok; 3942049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bool previousWasAt = false; 3943049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project do { 3944049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Lex the next token 3945049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Lex.LexFromRawLexer(Tok); 3946049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (Tok.is(tok::eof)) 3947049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 3948049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3949049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Initialize the CXToken. 3950049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXToken CXTok; 3951049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3952049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // - Common fields 3953049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXTok.int_data[1] = Tok.getLocation().getRawEncoding(); 3954049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXTok.int_data[2] = Tok.getLength(); 3955049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXTok.int_data[3] = 0; 3956049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3957049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // - Kind-specific fields 3958049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (Tok.isLiteral()) { 3959049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXTok.int_data[0] = CXToken_Literal; 3960049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXTok.ptr_data = (void *)Tok.getLiteralData(); 3961049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } else if (Tok.is(tok::identifier)) { 3962049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Lookup the identifier to determine whether we have a keyword. 3963049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project std::pair<FileID, unsigned> LocInfo 3964049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project = SourceMgr.getDecomposedLoc(Tok.getLocation()); 3965049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bool Invalid = false; 3966049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project llvm::StringRef Buf 3967049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project = CXXUnit->getSourceManager().getBufferData(LocInfo.first, &Invalid); 3968049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (Invalid) 3969049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 3970049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3971049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const char *StartPos = Buf.data() + LocInfo.second; 3972049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project IdentifierInfo *II 3973049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project = CXXUnit->getPreprocessor().LookUpIdentifierInfo(Tok, StartPos); 3974049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3975049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ((II->getObjCKeywordID() != tok::objc_not_keyword) && previousWasAt) { 3976049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXTok.int_data[0] = CXToken_Keyword; 3977049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3978049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else { 3979049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXTok.int_data[0] = II->getTokenID() == tok::identifier? 3980049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXToken_Identifier 3981049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project : CXToken_Keyword; 3982049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3983049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXTok.ptr_data = II; 3984049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } else if (Tok.is(tok::comment)) { 3985049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXTok.int_data[0] = CXToken_Comment; 3986049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXTok.ptr_data = 0; 3987049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } else { 3988049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXTok.int_data[0] = CXToken_Punctuation; 3989049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXTok.ptr_data = 0; 3990049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3991049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXTokens.push_back(CXTok); 3992049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project previousWasAt = Tok.is(tok::at); 3993049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } while (Lex.getBufferLocation() <= EffectiveBufferEnd); 3994049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3995049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (CXTokens.empty()) 3996049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 3997049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3998049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *Tokens = (CXToken *)malloc(sizeof(CXToken) * CXTokens.size()); 3999049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project memmove(*Tokens, CXTokens.data(), sizeof(CXToken) * CXTokens.size()); 4000049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *NumTokens = CXTokens.size(); 4001049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 4002049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4003049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectvoid clang_disposeTokens(CXTranslationUnit TU, 4004049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXToken *Tokens, unsigned NumTokens) { 4005049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project free(Tokens); 4006049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 4007049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4008049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} // end: extern "C" 4009049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4010049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project//===----------------------------------------------------------------------===// 4011049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project// Token annotation APIs. 4012049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project//===----------------------------------------------------------------------===// 4013049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4014049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projecttypedef llvm::DenseMap<unsigned, CXCursor> AnnotateTokensData; 4015049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectstatic enum CXChildVisitResult AnnotateTokensVisitor(CXCursor cursor, 4016049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXCursor parent, 4017049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXClientData client_data); 4018049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectnamespace { 4019049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectclass AnnotateTokensWorker { 4020049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project AnnotateTokensData &Annotated; 4021049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXToken *Tokens; 4022049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXCursor *Cursors; 4023049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project unsigned NumTokens; 4024049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project unsigned TokIdx; 4025049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project unsigned PreprocessingTokIdx; 4026049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CursorVisitor AnnotateVis; 4027049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SourceManager &SrcMgr; 4028049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4029049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bool MoreTokens() const { return TokIdx < NumTokens; } 4030049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project unsigned NextToken() const { return TokIdx; } 4031049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project void AdvanceToken() { ++TokIdx; } 4032049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SourceLocation GetTokenLoc(unsigned tokI) { 4033049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return SourceLocation::getFromRawEncoding(Tokens[tokI].int_data[1]); 4034049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 4035049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4036049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectpublic: 4037049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project AnnotateTokensWorker(AnnotateTokensData &annotated, 4038049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXToken *tokens, CXCursor *cursors, unsigned numTokens, 4039049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXTranslationUnit tu, SourceRange RegionOfInterest) 4040049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project : Annotated(annotated), Tokens(tokens), Cursors(cursors), 4041049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project NumTokens(numTokens), TokIdx(0), PreprocessingTokIdx(0), 4042049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project AnnotateVis(tu, 4043049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project AnnotateTokensVisitor, this, 4044049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Decl::MaxPCHLevel, RegionOfInterest), 4045049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SrcMgr(static_cast<ASTUnit*>(tu->TUData)->getSourceManager()) {} 4046049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4047049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project void VisitChildren(CXCursor C) { AnnotateVis.VisitChildren(C); } 4048049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project enum CXChildVisitResult Visit(CXCursor cursor, CXCursor parent); 4049049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project void AnnotateTokens(CXCursor parent); 4050049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project void AnnotateTokens() { 4051049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project AnnotateTokens(clang_getTranslationUnitCursor(AnnotateVis.getTU())); 4052049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 4053049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project}; 4054049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 4055049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4056049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectvoid AnnotateTokensWorker::AnnotateTokens(CXCursor parent) { 4057049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Walk the AST within the region of interest, annotating tokens 4058049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // along the way. 4059049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project VisitChildren(parent); 4060049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4061049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for (unsigned I = 0 ; I < TokIdx ; ++I) { 4062049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project AnnotateTokensData::iterator Pos = Annotated.find(Tokens[I].int_data[1]); 4063049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (Pos != Annotated.end() && 4064049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project (clang_isInvalid(Cursors[I].kind) || 4065049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Pos->second.kind != CXCursor_PreprocessingDirective)) 4066049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Cursors[I] = Pos->second; 4067049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 4068049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4069049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Finish up annotating any tokens left. 4070049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (!MoreTokens()) 4071049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 4072049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4073049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const CXCursor &C = clang_getNullCursor(); 4074049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for (unsigned I = TokIdx ; I < NumTokens ; ++I) { 4075049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project AnnotateTokensData::iterator Pos = Annotated.find(Tokens[I].int_data[1]); 4076049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Cursors[I] = (Pos == Annotated.end()) ? C : Pos->second; 4077049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 4078049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 4079049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4080049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectenum CXChildVisitResult 4081049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source ProjectAnnotateTokensWorker::Visit(CXCursor cursor, CXCursor parent) { 4082049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXSourceLocation Loc = clang_getCursorLocation(cursor); 4083049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SourceRange cursorRange = getRawCursorExtent(cursor); 4084049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (cursorRange.isInvalid()) 4085049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return CXChildVisit_Recurse; 4086049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4087049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (clang_isPreprocessing(cursor.kind)) { 4088049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // For macro instantiations, just note where the beginning of the macro 4089049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // instantiation occurs. 4090049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (cursor.kind == CXCursor_MacroInstantiation) { 4091049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Annotated[Loc.int_data] = cursor; 4092049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return CXChildVisit_Recurse; 4093049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 4094049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4095049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Items in the preprocessing record are kept separate from items in 4096049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // declarations, so we keep a separate token index. 4097049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project unsigned SavedTokIdx = TokIdx; 4098049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TokIdx = PreprocessingTokIdx; 4099049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4100049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Skip tokens up until we catch up to the beginning of the preprocessing 4101049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // entry. 4102049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project while (MoreTokens()) { 4103049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const unsigned I = NextToken(); 4104049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SourceLocation TokLoc = GetTokenLoc(I); 4105049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project switch (LocationCompare(SrcMgr, TokLoc, cursorRange)) { 4106049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case RangeBefore: 4107049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project AdvanceToken(); 4108049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project continue; 4109049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case RangeAfter: 4110049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case RangeOverlap: 4111049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 4112049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 4113049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 4114049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 4115049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4116049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Look at all of the tokens within this range. 4117049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project while (MoreTokens()) { 4118049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const unsigned I = NextToken(); 4119049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SourceLocation TokLoc = GetTokenLoc(I); 4120049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project switch (LocationCompare(SrcMgr, TokLoc, cursorRange)) { 4121049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case RangeBefore: 4122049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project assert(0 && "Infeasible"); 4123049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case RangeAfter: 4124049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 4125049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case RangeOverlap: 4126049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Cursors[I] = cursor; 4127049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project AdvanceToken(); 4128049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project continue; 4129049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 4130049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 4131049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 4132049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4133049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Save the preprocessing token index; restore the non-preprocessing 4134049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // token index. 4135049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project PreprocessingTokIdx = TokIdx; 4136049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TokIdx = SavedTokIdx; 4137049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return CXChildVisit_Recurse; 4138049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 4139049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4140049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (cursorRange.isInvalid()) 4141049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return CXChildVisit_Continue; 4142049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4143049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SourceLocation L = SourceLocation::getFromRawEncoding(Loc.int_data); 4144049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4145049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Adjust the annotated range based specific declarations. 4146049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const enum CXCursorKind cursorK = clang_getCursorKind(cursor); 4147049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (cursorK >= CXCursor_FirstDecl && cursorK <= CXCursor_LastDecl) { 4148049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Decl *D = cxcursor::getCursorDecl(cursor); 4149049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Don't visit synthesized ObjC methods, since they have no syntatic 4150049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // representation in the source. 4151049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(D)) { 4152049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (MD->isSynthesized()) 4153049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return CXChildVisit_Continue; 4154049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 4155049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (const DeclaratorDecl *DD = dyn_cast<DeclaratorDecl>(D)) { 4156049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (TypeSourceInfo *TI = DD->getTypeSourceInfo()) { 4157049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TypeLoc TL = TI->getTypeLoc(); 4158049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SourceLocation TLoc = TL.getSourceRange().getBegin(); 4159049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (TLoc.isValid() && L.isValid() && 4160049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SrcMgr.isBeforeInTranslationUnit(TLoc, L)) 4161049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cursorRange.setBegin(TLoc); 4162049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 4163049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 4164049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 4165049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4166049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // If the location of the cursor occurs within a macro instantiation, record 4167049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // the spelling location of the cursor in our annotation map. We can then 4168049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // paper over the token labelings during a post-processing step to try and 4169049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // get cursor mappings for tokens that are the *arguments* of a macro 4170049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // instantiation. 4171049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (L.isMacroID()) { 4172049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project unsigned rawEncoding = SrcMgr.getSpellingLoc(L).getRawEncoding(); 4173049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Only invalidate the old annotation if it isn't part of a preprocessing 4174049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // directive. Here we assume that the default construction of CXCursor 4175049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // results in CXCursor.kind being an initialized value (i.e., 0). If 4176049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // this isn't the case, we can fix by doing lookup + insertion. 4177049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4178049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXCursor &oldC = Annotated[rawEncoding]; 4179049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (!clang_isPreprocessing(oldC.kind)) 4180049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project oldC = cursor; 4181049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 4182049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4183049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const enum CXCursorKind K = clang_getCursorKind(parent); 4184049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const CXCursor updateC = 4185049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project (clang_isInvalid(K) || K == CXCursor_TranslationUnit) 4186049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ? clang_getNullCursor() : parent; 4187049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4188049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project while (MoreTokens()) { 4189049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const unsigned I = NextToken(); 4190049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SourceLocation TokLoc = GetTokenLoc(I); 4191049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project switch (LocationCompare(SrcMgr, TokLoc, cursorRange)) { 4192049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case RangeBefore: 4193049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Cursors[I] = updateC; 4194049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project AdvanceToken(); 4195049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project continue; 4196049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case RangeAfter: 4197049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case RangeOverlap: 4198049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 4199049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 4200049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 4201049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 4202049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4203049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Visit children to get their cursor information. 4204049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const unsigned BeforeChildren = NextToken(); 4205049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project VisitChildren(cursor); 4206049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const unsigned AfterChildren = NextToken(); 4207049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4208049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Adjust 'Last' to the last token within the extent of the cursor. 4209049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project while (MoreTokens()) { 4210049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const unsigned I = NextToken(); 4211049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SourceLocation TokLoc = GetTokenLoc(I); 4212049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project switch (LocationCompare(SrcMgr, TokLoc, cursorRange)) { 4213049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case RangeBefore: 4214049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project assert(0 && "Infeasible"); 4215049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case RangeAfter: 4216049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 4217049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case RangeOverlap: 4218049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Cursors[I] = updateC; 4219049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project AdvanceToken(); 4220049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project continue; 4221049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 4222049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 4223049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 4224049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const unsigned Last = NextToken(); 4225049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4226049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Scan the tokens that are at the beginning of the cursor, but are not 4227049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // capture by the child cursors. 4228049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4229049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // For AST elements within macros, rely on a post-annotate pass to 4230049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // to correctly annotate the tokens with cursors. Otherwise we can 4231049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // get confusing results of having tokens that map to cursors that really 4232049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // are expanded by an instantiation. 4233049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (L.isMacroID()) 4234049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cursor = clang_getNullCursor(); 4235049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4236049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for (unsigned I = BeforeChildren; I != AfterChildren; ++I) { 4237049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (!clang_isInvalid(clang_getCursorKind(Cursors[I]))) 4238049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 4239049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4240049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Cursors[I] = cursor; 4241049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 4242049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Scan the tokens that are at the end of the cursor, but are not captured 4243049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // but the child cursors. 4244049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for (unsigned I = AfterChildren; I != Last; ++I) 4245049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Cursors[I] = cursor; 4246049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4247049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TokIdx = Last; 4248049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return CXChildVisit_Continue; 4249049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 4250049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4251049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectstatic enum CXChildVisitResult AnnotateTokensVisitor(CXCursor cursor, 4252049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXCursor parent, 4253049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXClientData client_data) { 4254049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return static_cast<AnnotateTokensWorker*>(client_data)->Visit(cursor, parent); 4255049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 4256049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4257049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project// This gets run a separate thread to avoid stack blowout. 4258049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectstatic void runAnnotateTokensWorker(void *UserData) { 4259049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ((AnnotateTokensWorker*)UserData)->AnnotateTokens(); 4260049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 4261049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4262049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectextern "C" { 4263049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4264049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectvoid clang_annotateTokens(CXTranslationUnit TU, 4265049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXToken *Tokens, unsigned NumTokens, 4266049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXCursor *Cursors) { 4267049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4268049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (NumTokens == 0 || !Tokens || !Cursors) 4269049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 4270049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4271049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Any token we don't specifically annotate will have a NULL cursor. 4272049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXCursor C = clang_getNullCursor(); 4273049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for (unsigned I = 0; I != NumTokens; ++I) 4274049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Cursors[I] = C; 4275049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4276049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ASTUnit *CXXUnit = static_cast<ASTUnit *>(TU->TUData); 4277049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (!CXXUnit) 4278049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 4279049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4280049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ASTUnit::ConcurrencyCheck Check(*CXXUnit); 4281049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4282049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Determine the region of interest, which contains all of the tokens. 4283049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SourceRange RegionOfInterest; 4284049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project RegionOfInterest.setBegin(cxloc::translateSourceLocation( 4285049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project clang_getTokenLocation(TU, Tokens[0]))); 4286049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project RegionOfInterest.setEnd(cxloc::translateSourceLocation( 4287049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project clang_getTokenLocation(TU, 4288049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Tokens[NumTokens - 1]))); 4289049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4290049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // A mapping from the source locations found when re-lexing or traversing the 4291049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // region of interest to the corresponding cursors. 4292049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project AnnotateTokensData Annotated; 4293049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4294049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Relex the tokens within the source range to look for preprocessing 4295049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // directives. 4296049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SourceManager &SourceMgr = CXXUnit->getSourceManager(); 4297049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project std::pair<FileID, unsigned> BeginLocInfo 4298c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner = SourceMgr.getDecomposedLoc(RegionOfInterest.getBegin()); 4299a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang std::pair<FileID, unsigned> EndLocInfo 4300049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project = SourceMgr.getDecomposedLoc(RegionOfInterest.getEnd()); 4301c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner 4302c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner llvm::StringRef Buffer; 4303c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner bool Invalid = false; 4304049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (BeginLocInfo.first == EndLocInfo.first && 4305c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner ((Buffer = SourceMgr.getBufferData(BeginLocInfo.first, &Invalid)),true) && 4306c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner !Invalid) { 4307c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner Lexer Lex(SourceMgr.getLocForStartOfFile(BeginLocInfo.first), 4308049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXXUnit->getASTContext().getLangOptions(), 4309c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner Buffer.begin(), Buffer.data() + BeginLocInfo.second, 4310c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner Buffer.end()); 4311049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Lex.SetCommentRetentionState(true); 4312049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4313049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Lex tokens in raw mode until we hit the end of the range, to avoid 4314049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // entering #includes or expanding macros. 4315049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project while (true) { 4316049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Token Tok; 4317049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Lex.LexFromRawLexer(Tok); 4318049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4319049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project reprocess: 4320049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (Tok.is(tok::hash) && Tok.isAtStartOfLine()) { 4321049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // We have found a preprocessing directive. Gobble it up so that we 4322049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // don't see it while preprocessing these tokens later, but keep track 4323049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // of all of the token locations inside this preprocessing directive so 4324049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // that we can annotate them appropriately. 4325049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // 4326049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // FIXME: Some simple tests here could identify macro definitions and 4327049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // #undefs, to provide specific cursor kinds for those. 4328049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project std::vector<SourceLocation> Locations; 4329049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project do { 4330049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Locations.push_back(Tok.getLocation()); 4331049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Lex.LexFromRawLexer(Tok); 4332049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } while (!Tok.isAtStartOfLine() && !Tok.is(tok::eof)); 4333049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4334049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project using namespace cxcursor; 4335049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CXCursor Cursor 4336049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project = MakePreprocessingDirectiveCursor(SourceRange(Locations.front(), 4337049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Locations.back()), 4338049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TU); 4339049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for (unsigned I = 0, N = Locations.size(); I != N; ++I) { 4340049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Annotated[Locations[I].getRawEncoding()] = Cursor; 4341049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 4342049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4343049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (Tok.isAtStartOfLine()) 4344049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto reprocess; 4345049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4346049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project continue; 4347049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 4348049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4349049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (Tok.is(tok::eof)) 4350049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 4351049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 4352049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 4353049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4354049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // Annotate all of the source locations in the region of interest that map to 4355049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // a specific cursor. 4356049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project AnnotateTokensWorker W(Annotated, Tokens, Cursors, NumTokens, 4357049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TU, RegionOfInterest); 4358049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4359e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang // Run the worker within a CrashRecoveryContext. 4360049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // FIXME: We use a ridiculous stack size here because the data-recursion 4361049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // algorithm uses a large stack frame than the non-data recursive version, 4362049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // and AnnotationTokensWorker currently transforms the data-recursion 4363049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // algorithm back into a traditional recursion by explicitly calling 4364049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // VisitChildren(). We will need to remove this explicit recursive call. 4365049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project llvm::CrashRecoveryContext CRC; 4366049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (!RunSafely(CRC, runAnnotateTokensWorker, &W, 4367049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project GetSafetyThreadStackSize() * 2)) { 4368049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project fprintf(stderr, "libclang: crash detected while annotating tokens\n"); 4369a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang } 4370049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 4371049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} // end: extern "C" 4372049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4373049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project//===----------------------------------------------------------------------===// 4374049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project// Operations for querying linkage of a cursor. 4375049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project//===----------------------------------------------------------------------===// 4376049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4377049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectextern "C" { 4378049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source ProjectCXLinkageKind clang_getCursorLinkage(CXCursor cursor) { 4379049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (!clang_isDeclaration(cursor.kind)) 4380049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return CXLinkage_Invalid; 4381049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4382049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Decl *D = cxcursor::getCursorDecl(cursor); 4383049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (NamedDecl *ND = dyn_cast_or_null<NamedDecl>(D)) 4384049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project switch (ND->getLinkage()) { 4385049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case NoLinkage: return CXLinkage_NoLinkage; 4386049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case InternalLinkage: return CXLinkage_Internal; 4387049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case UniqueExternalLinkage: return CXLinkage_UniqueExternal; 4388049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case ExternalLinkage: return CXLinkage_External; 4389049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project }; 4390049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4391049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return CXLinkage_Invalid; 4392049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 4393049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} // end: extern "C" 4394049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4395049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project//===----------------------------------------------------------------------===// 4396049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project// Operations for querying language of a cursor. 4397049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project//===----------------------------------------------------------------------===// 4398049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4399049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectstatic CXLanguageKind getDeclLanguage(const Decl *D) { 4400049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project switch (D->getKind()) { 4401049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project default: 4402049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 4403049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::ImplicitParam: 4404049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::ObjCAtDefsField: 4405049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::ObjCCategory: 4406049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::ObjCCategoryImpl: 4407049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::ObjCClass: 4408049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::ObjCCompatibleAlias: 4409049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::ObjCForwardProtocol: 4410049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::ObjCImplementation: 4411049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::ObjCInterface: 4412049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::ObjCIvar: 4413049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::ObjCMethod: 4414049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::ObjCProperty: 4415049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::ObjCPropertyImpl: 4416049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::ObjCProtocol: 4417049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return CXLanguage_ObjC; 4418049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::CXXConstructor: 4419049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::CXXConversion: 4420049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::CXXDestructor: 4421049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::CXXMethod: 4422049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::CXXRecord: 4423049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::ClassTemplate: 4424049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::ClassTemplatePartialSpecialization: 4425049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::ClassTemplateSpecialization: 4426049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::Friend: 4427049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::FriendTemplate: 4428049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::FunctionTemplate: 4429049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::LinkageSpec: 4430049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::Namespace: 4431049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::NamespaceAlias: 4432049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::NonTypeTemplateParm: 4433049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::StaticAssert: 4434049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::TemplateTemplateParm: 4435049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::TemplateTypeParm: 4436049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::UnresolvedUsingTypename: 4437049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::UnresolvedUsingValue: 4438049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::Using: 4439049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::UsingDirective: 4440049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case Decl::UsingShadow: 4441049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return CXLanguage_CPlusPlus; 4442049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 4443049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4444049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return CXLanguage_C; 4445049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 4446049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4447049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectextern "C" { 4448049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4449049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectenum CXAvailabilityKind clang_getCursorAvailability(CXCursor cursor) { 4450049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (clang_isDeclaration(cursor.kind)) 4451049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (Decl *D = cxcursor::getCursorDecl(cursor)) { 4452049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (D->hasAttr<UnavailableAttr>() || 4453049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project (isa<FunctionDecl>(D) && cast<FunctionDecl>(D)->isDeleted())) 4454049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return CXAvailability_Available; 4455049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4456049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (D->hasAttr<DeprecatedAttr>()) 4457049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return CXAvailability_Deprecated; 4458049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 4459049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4460049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return CXAvailability_Available; 4461049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 4462049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4463049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source ProjectCXLanguageKind clang_getCursorLanguage(CXCursor cursor) { 4464049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (clang_isDeclaration(cursor.kind)) 4465049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return getDeclLanguage(cxcursor::getCursorDecl(cursor)); 4466049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4467049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return CXLanguage_Invalid; 4468049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 4469049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4470049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source ProjectCXCursor clang_getCursorSemanticParent(CXCursor cursor) { 4471049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (clang_isDeclaration(cursor.kind)) { 4472049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (Decl *D = getCursorDecl(cursor)) { 4473049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DeclContext *DC = D->getDeclContext(); 4474a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang return MakeCXCursor(cast<Decl>(DC), getCursorTU(cursor)); 4475a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang } 4476a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang } 4477a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 4478a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang if (clang_isStatement(cursor.kind) || clang_isExpression(cursor.kind)) { 4479a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang if (Decl *D = getCursorDecl(cursor)) 4480a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang return MakeCXCursor(D, getCursorTU(cursor)); 4481a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang } 4482a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 4483a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang return clang_getNullCursor(); 4484a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang} 4485a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 4486a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu WangCXCursor clang_getCursorLexicalParent(CXCursor cursor) { 4487a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang if (clang_isDeclaration(cursor.kind)) { 4488a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang if (Decl *D = getCursorDecl(cursor)) { 4489a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang DeclContext *DC = D->getLexicalDeclContext(); 4490a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang return MakeCXCursor(cast<Decl>(DC), getCursorTU(cursor)); 4491a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang } 4492a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang } 4493a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 4494a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang // FIXME: Note that we can't easily compute the lexical context of a 4495a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang // statement or expression, so we return nothing. 4496a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang return clang_getNullCursor(); 4497a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang} 4498a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 4499a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wangstatic void CollectOverriddenMethods(DeclContext *Ctx, 4500a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang ObjCMethodDecl *Method, 4501a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang llvm::SmallVectorImpl<ObjCMethodDecl *> &Methods) { 4502a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang if (!Ctx) 4503a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang return; 4504a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 4505a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang // If we have a class or category implementation, jump straight to the 4506a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang // interface. 4507a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang if (ObjCImplDecl *Impl = dyn_cast<ObjCImplDecl>(Ctx)) 4508a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang return CollectOverriddenMethods(Impl->getClassInterface(), Method, Methods); 4509a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 4510a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang ObjCContainerDecl *Container = dyn_cast<ObjCContainerDecl>(Ctx); 4511a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang if (!Container) 4512a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang return; 4513a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 4514a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang // Check whether we have a matching method at this level. 4515a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang if (ObjCMethodDecl *Overridden = Container->getMethod(Method->getSelector(), 4516a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang Method->isInstanceMethod())) 4517a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang if (Method != Overridden) { 4518a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang // We found an override at this level; there is no need to look 4519a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang // into other protocols or categories. 4520a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang Methods.push_back(Overridden); 4521a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang return; 4522a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang } 4523a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 4524a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang if (ObjCProtocolDecl *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) { 4525a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang for (ObjCProtocolDecl::protocol_iterator P = Protocol->protocol_begin(), 4526a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang PEnd = Protocol->protocol_end(); 4527a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang P != PEnd; ++P) 4528a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang CollectOverriddenMethods(*P, Method, Methods); 4529a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang } 4530a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 4531a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang if (ObjCCategoryDecl *Category = dyn_cast<ObjCCategoryDecl>(Container)) { 4532a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang for (ObjCCategoryDecl::protocol_iterator P = Category->protocol_begin(), 4533a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang PEnd = Category->protocol_end(); 4534a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang P != PEnd; ++P) 4535a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang CollectOverriddenMethods(*P, Method, Methods); 4536a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang } 4537a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 4538a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang if (ObjCInterfaceDecl *Interface = dyn_cast<ObjCInterfaceDecl>(Container)) { 4539a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang for (ObjCInterfaceDecl::protocol_iterator P = Interface->protocol_begin(), 4540a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang PEnd = Interface->protocol_end(); 4541a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang P != PEnd; ++P) 4542a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang CollectOverriddenMethods(*P, Method, Methods); 4543a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 4544a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang for (ObjCCategoryDecl *Category = Interface->getCategoryList(); 4545a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang Category; Category = Category->getNextClassCategory()) 4546a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang CollectOverriddenMethods(Category, Method, Methods); 4547a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 4548a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang // We only look into the superclass if we haven't found anything yet. 4549a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang if (Methods.empty()) 4550a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang if (ObjCInterfaceDecl *Super = Interface->getSuperClass()) 4551a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang return CollectOverriddenMethods(Super, Method, Methods); 4552a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang } 4553a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang} 4554a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 4555a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wangvoid clang_getOverriddenCursors(CXCursor cursor, 4556a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang CXCursor **overridden, 4557a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang unsigned *num_overridden) { 4558a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang if (overridden) 4559a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang *overridden = 0; 4560a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang if (num_overridden) 4561a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang *num_overridden = 0; 4562a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang if (!overridden || !num_overridden) 4563a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang return; 4564a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 4565a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang if (!clang_isDeclaration(cursor.kind)) 4566a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang return; 4567a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 4568a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang Decl *D = getCursorDecl(cursor); 4569a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang if (!D) 4570a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang return; 4571a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 4572a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang // Handle C++ member functions. 4573a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang CXTranslationUnit TU = getCursorTU(cursor); 4574049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (CXXMethodDecl *CXXMethod = dyn_cast<CXXMethodDecl>(D)) { 4575049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *num_overridden = CXXMethod->size_overridden_methods(); 4576049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (!*num_overridden) 4577049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 4578049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4579049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *overridden = new CXCursor [*num_overridden]; 4580049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project unsigned I = 0; 4581049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for (CXXMethodDecl::method_iterator 4582049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project M = CXXMethod->begin_overridden_methods(), 4583049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project MEnd = CXXMethod->end_overridden_methods(); 4584049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project M != MEnd; (void)++M, ++I) 4585049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project (*overridden)[I] = MakeCXCursor(const_cast<CXXMethodDecl*>(*M), TU); 4586049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 4587049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 4588049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4589049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(D); 4590049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (!Method) 4591049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 4592049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4593a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang // Handle Objective-C methods. 4594049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project llvm::SmallVector<ObjCMethodDecl *, 4> Methods; 4595049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CollectOverriddenMethods(Method->getDeclContext(), Method, Methods); 4596049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4597049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (Methods.empty()) 4598049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 4599295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner 4600295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner *num_overridden = Methods.size(); 4601295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner *overridden = new CXCursor [Methods.size()]; 4602295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner for (unsigned I = 0, N = Methods.size(); I != N; ++I) 4603a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang (*overridden)[I] = MakeCXCursor(Methods[I], TU); 4604295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner} 4605295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner 4606295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turnervoid clang_disposeOverriddenCursors(CXCursor *overridden) { 4607a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang delete [] overridden; 4608a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang} 4609a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 4610a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu WangCXFile clang_getIncludedFile(CXCursor cursor) { 4611a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang if (cursor.kind != CXCursor_InclusionDirective) 4612a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang return 0; 4613049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4614049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project InclusionDirective *ID = getCursorInclusionDirective(cursor); 4615295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner return (void *)ID->getFile(); 4616049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 4617a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 4618a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang} // end: extern "C" 4619a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 4620a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 4621a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang//===----------------------------------------------------------------------===// 4622a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang// C++ AST instrospection. 4623a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang//===----------------------------------------------------------------------===// 4624049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4625049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectextern "C" { 4626049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectunsigned clang_CXXMethod_isStatic(CXCursor C) { 4627049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (!clang_isDeclaration(C.kind)) 4628049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return 0; 4629a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 4630a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang CXXMethodDecl *Method = 0; 4631a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang Decl *D = cxcursor::getCursorDecl(C); 4632a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang if (FunctionTemplateDecl *FunTmpl = dyn_cast_or_null<FunctionTemplateDecl>(D)) 4633a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang Method = dyn_cast<CXXMethodDecl>(FunTmpl->getTemplatedDecl()); 4634a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang else 4635a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang Method = dyn_cast_or_null<CXXMethodDecl>(D); 4636a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang return (Method && Method->isStatic()) ? 1 : 0; 4637a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang} 4638a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 4639a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang} // end: extern "C" 4640a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 4641a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang//===----------------------------------------------------------------------===// 4642a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang// Attribute introspection. 4643a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang//===----------------------------------------------------------------------===// 4644a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 4645a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wangextern "C" { 4646a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu WangCXType clang_getIBOutletCollectionType(CXCursor C) { 4647a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang if (C.kind != CXCursor_IBOutletCollectionAttr) 4648a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang return cxtype::MakeCXType(QualType(), cxcursor::getCursorTU(C)); 4649a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 4650a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang IBOutletCollectionAttr *A = 4651a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang cast<IBOutletCollectionAttr>(cxcursor::getCursorAttr(C)); 4652a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 4653a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang return cxtype::MakeCXType(A->getInterface(), cxcursor::getCursorTU(C)); 4654a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang} 4655a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang} // end: extern "C" 4656a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 4657a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang//===----------------------------------------------------------------------===// 4658a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang// Misc. utility functions. 4659a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang//===----------------------------------------------------------------------===// 4660a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 4661a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang/// Default to using an 8 MB stack size on "safety" threads. 4662a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wangstatic unsigned SafetyStackThreadSize = 8 << 20; 4663a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 4664a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wangnamespace clang { 4665a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 4666a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wangbool RunSafely(llvm::CrashRecoveryContext &CRC, 4667a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang void (*Fn)(void*), void *UserData, 4668a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang unsigned Size) { 4669a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang if (!Size) 4670a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang Size = GetSafetyThreadStackSize(); 4671a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang if (Size) 4672a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang return CRC.RunSafelyOnThread(Fn, UserData, Size); 4673a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang return CRC.RunSafely(Fn, UserData); 4674a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang} 4675a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 4676a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wangunsigned GetSafetyThreadStackSize() { 4677a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang return SafetyStackThreadSize; 4678a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang} 4679a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 4680a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wangvoid SetSafetyThreadStackSize(unsigned Value) { 4681a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang SafetyStackThreadSize = Value; 4682a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang} 4683a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 4684a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang} 4685a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 4686a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wangextern "C" { 4687a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 4688a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu WangCXString clang_getClangVersion() { 4689a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang return createCXString(getClangFullVersion()); 4690a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang} 4691a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 4692a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang} // end: extern "C" 4693a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang