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