CIndex.cpp revision a6b70435ae49f2c7da1ad2b200c1aeb9f8761fdd
1dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu//===- CIndex.cpp - Clang-C Source Indexing Library -----------------------===//
2dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu//
3dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu//                     The LLVM Compiler Infrastructure
4dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu//
5dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu// This file is distributed under the University of Illinois Open Source
6dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu// License. See LICENSE.TXT for details.
7dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu//
8dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu//===----------------------------------------------------------------------===//
9dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu//
10dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu// This file implements the main API hooks in the Clang-C Source Indexing
11dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu// library.
12dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu//
13dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu//===----------------------------------------------------------------------===//
14dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
15dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu#include "CIndexer.h"
16dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu#include "CXCursor.h"
17dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu#include "CXType.h"
18dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu#include "CXSourceLocation.h"
19dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu#include "CIndexDiagnostic.h"
20dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
21dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu#include "clang/Basic/Version.h"
22dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
23dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu#include "clang/AST/DeclVisitor.h"
24dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu#include "clang/AST/StmtVisitor.h"
25dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu#include "clang/AST/TypeLocVisitor.h"
26dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu#include "clang/Basic/Diagnostic.h"
27dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu#include "clang/Frontend/ASTUnit.h"
28dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu#include "clang/Frontend/CompilerInstance.h"
29dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu#include "clang/Frontend/FrontendDiagnostic.h"
30dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu#include "clang/Lex/Lexer.h"
31dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu#include "clang/Lex/PreprocessingRecord.h"
32dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu#include "clang/Lex/Preprocessor.h"
33dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu#include "llvm/ADT/STLExtras.h"
34dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu#include "llvm/ADT/Optional.h"
35dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu#include "clang/Analysis/Support/SaveAndRestore.h"
36dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu#include "llvm/Support/CrashRecoveryContext.h"
37dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu#include "llvm/Support/PrettyStackTrace.h"
38dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu#include "llvm/Support/MemoryBuffer.h"
39dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu#include "llvm/Support/raw_ostream.h"
40dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu#include "llvm/Support/Timer.h"
41dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu#include "llvm/System/Mutex.h"
42dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu#include "llvm/System/Program.h"
43dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu#include "llvm/System/Signals.h"
44dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu#include "llvm/System/Threading.h"
45dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
46dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu// Needed to define L_TMPNAM on some systems.
47dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu#include <cstdio>
48dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
49dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuusing namespace clang;
50dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuusing namespace clang::cxcursor;
51dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuusing namespace clang::cxstring;
52dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
53dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu/// \brief The result of comparing two source ranges.
54dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuenum RangeComparisonResult {
55dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  /// \brief Either the ranges overlap or one of the ranges is invalid.
56dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  RangeOverlap,
57dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
58dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  /// \brief The first range ends before the second range starts.
59dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  RangeBefore,
60dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
61dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  /// \brief The first range starts after the second range ends.
62dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  RangeAfter
63dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu};
64dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
65dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu/// \brief Compare two source ranges to determine their relative position in
66dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu/// the translation unit.
67dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhustatic RangeComparisonResult RangeCompare(SourceManager &SM,
68dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                                          SourceRange R1,
69dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                                          SourceRange R2) {
70dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  assert(R1.isValid() && "First range is invalid?");
71dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  assert(R2.isValid() && "Second range is invalid?");
72dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  if (R1.getEnd() != R2.getBegin() &&
73dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu      SM.isBeforeInTranslationUnit(R1.getEnd(), R2.getBegin()))
74dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    return RangeBefore;
75dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  if (R2.getEnd() != R1.getBegin() &&
76dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu      SM.isBeforeInTranslationUnit(R2.getEnd(), R1.getBegin()))
77dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    return RangeAfter;
78dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  return RangeOverlap;
79dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu}
80dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
81dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu/// \brief Determine if a source location falls within, before, or after a
82dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu///   a given source range.
83dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhustatic RangeComparisonResult LocationCompare(SourceManager &SM,
84dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                                             SourceLocation L, SourceRange R) {
85dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  assert(R.isValid() && "First range is invalid?");
86dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  assert(L.isValid() && "Second range is invalid?");
87dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  if (L == R.getBegin() || L == R.getEnd())
88dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    return RangeOverlap;
89dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  if (SM.isBeforeInTranslationUnit(L, R.getBegin()))
90dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    return RangeBefore;
91dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  if (SM.isBeforeInTranslationUnit(R.getEnd(), L))
92dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    return RangeAfter;
93dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  return RangeOverlap;
94dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu}
95dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
96dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu/// \brief Translate a Clang source range into a CIndex source range.
97dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu///
98dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu/// Clang internally represents ranges where the end location points to the
99dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu/// start of the token at the end. However, for external clients it is more
100dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu/// useful to have a CXSourceRange be a proper half-open interval. This routine
101dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu/// does the appropriate translation.
102dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui ZhuCXSourceRange cxloc::translateSourceRange(const SourceManager &SM,
103dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                                          const LangOptions &LangOpts,
104dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                                          const CharSourceRange &R) {
105dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  // We want the last character in this location, so we will adjust the
106dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  // location accordingly.
107dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  SourceLocation EndLoc = R.getEnd();
108dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  if (EndLoc.isValid() && EndLoc.isMacroID())
109dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    EndLoc = SM.getSpellingLoc(EndLoc);
110dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  if (R.isTokenRange() && !EndLoc.isInvalid() && EndLoc.isFileID()) {
111dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    unsigned Length = Lexer::MeasureTokenLength(EndLoc, SM, LangOpts);
112dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    EndLoc = EndLoc.getFileLocWithOffset(Length);
113dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  }
114dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
115dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  CXSourceRange Result = { { (void *)&SM, (void *)&LangOpts },
116dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                           R.getBegin().getRawEncoding(),
117dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                           EndLoc.getRawEncoding() };
118dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  return Result;
119dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu}
120dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
121dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu//===----------------------------------------------------------------------===//
122dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu// Cursor visitor.
123dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu//===----------------------------------------------------------------------===//
124dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
125dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhunamespace {
126dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
127dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuclass VisitorJob {
128dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhupublic:
129dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  enum Kind { DeclVisitKind, StmtVisitKind, MemberExprPartsKind };
130dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuprotected:
131dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  void *data;
132dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  CXCursor parent;
133dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  Kind K;
134dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  VisitorJob(void *d, CXCursor C, Kind k) : data(d), parent(C), K(k) {}
135dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhupublic:
136dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  Kind getKind() const { return K; }
137dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  const CXCursor &getParent() const { return parent; }
138dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  static bool classof(VisitorJob *VJ) { return true; }
139dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu};
140dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
141dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhutypedef llvm::SmallVector<VisitorJob, 10> VisitorWorkList;
142dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
143dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu#define DEF_JOB(NAME, DATA, KIND)\
144dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuclass NAME : public VisitorJob {\
145dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhupublic:\
146dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  NAME(DATA *d, CXCursor parent) : VisitorJob(d, parent, VisitorJob::KIND) {}\
147dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  static bool classof(const VisitorJob *VJ) { return VJ->getKind() == KIND; }\
148dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  DATA *get() const { return static_cast<DATA*>(data); }\
149dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu};
150dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
151dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui ZhuDEF_JOB(DeclVisit, Decl, DeclVisitKind)
152dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui ZhuDEF_JOB(StmtVisit, Stmt, StmtVisitKind)
153dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui ZhuDEF_JOB(MemberExprParts, MemberExpr, MemberExprPartsKind)
154dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu#undef DEF_JOB
155dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
156dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhustatic inline void WLAddStmt(VisitorWorkList &WL, CXCursor Parent, Stmt *S) {
157dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  if (S)
158dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    WL.push_back(StmtVisit(S, Parent));
159dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu}
160dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhustatic inline void WLAddDecl(VisitorWorkList &WL, CXCursor Parent, Decl *D) {
161dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  if (D)
162dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    WL.push_back(DeclVisit(D, Parent));
163dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu}
164dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
165dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu// Cursor visitor.
166dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuclass CursorVisitor : public DeclVisitor<CursorVisitor, bool>,
167dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                      public TypeLocVisitor<CursorVisitor, bool>,
168dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                      public StmtVisitor<CursorVisitor, bool>
169dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu{
170dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  /// \brief The translation unit we are traversing.
171dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  ASTUnit *TU;
172dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
173dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  /// \brief The parent cursor whose children we are traversing.
174dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  CXCursor Parent;
175dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
176dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  /// \brief The declaration that serves at the parent of any statement or
177dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  /// expression nodes.
178dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  Decl *StmtParent;
179dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
180dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  /// \brief The visitor function.
181dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  CXCursorVisitor Visitor;
182dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
183dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  /// \brief The opaque client data, to be passed along to the visitor.
184dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  CXClientData ClientData;
185dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
186dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  // MaxPCHLevel - the maximum PCH level of declarations that we will pass on
187dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  // to the visitor. Declarations with a PCH level greater than this value will
188dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  // be suppressed.
189dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  unsigned MaxPCHLevel;
190dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
191dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  /// \brief When valid, a source range to which the cursor should restrict
192dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  /// its search.
193dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  SourceRange RegionOfInterest;
194dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
195dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  // FIXME: Eventually remove.  This part of a hack to support proper
196dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  // iteration over all Decls contained lexically within an ObjC container.
197dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  DeclContext::decl_iterator *DI_current;
198dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  DeclContext::decl_iterator DE_current;
199dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
200dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  using DeclVisitor<CursorVisitor, bool>::Visit;
201dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  using TypeLocVisitor<CursorVisitor, bool>::Visit;
202dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  using StmtVisitor<CursorVisitor, bool>::Visit;
203dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
204dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  /// \brief Determine whether this particular source range comes before, comes
205dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  /// after, or overlaps the region of interest.
206dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  ///
207dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  /// \param R a half-open source range retrieved from the abstract syntax tree.
208dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  RangeComparisonResult CompareRegionOfInterest(SourceRange R);
209dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
210dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  class SetParentRAII {
211dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    CXCursor &Parent;
212dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    Decl *&StmtParent;
213dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    CXCursor OldParent;
214dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
215dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  public:
216dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    SetParentRAII(CXCursor &Parent, Decl *&StmtParent, CXCursor NewParent)
217dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu      : Parent(Parent), StmtParent(StmtParent), OldParent(Parent)
218dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    {
219dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu      Parent = NewParent;
220dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu      if (clang_isDeclaration(Parent.kind))
221dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        StmtParent = getCursorDecl(Parent);
222dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
223dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
224dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    ~SetParentRAII() {
225dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu      Parent = OldParent;
226dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu      if (clang_isDeclaration(Parent.kind))
227dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        StmtParent = getCursorDecl(Parent);
228dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
229dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  };
230dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
231dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhupublic:
232dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  CursorVisitor(ASTUnit *TU, CXCursorVisitor Visitor, CXClientData ClientData,
233dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                unsigned MaxPCHLevel,
234dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                SourceRange RegionOfInterest = SourceRange())
235dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    : TU(TU), Visitor(Visitor), ClientData(ClientData),
236dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu      MaxPCHLevel(MaxPCHLevel), RegionOfInterest(RegionOfInterest),
237dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu      DI_current(0)
238dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  {
239dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    Parent.kind = CXCursor_NoDeclFound;
240dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    Parent.data[0] = 0;
241dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    Parent.data[1] = 0;
242dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    Parent.data[2] = 0;
243dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    StmtParent = 0;
244dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  }
245dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
246dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  ASTUnit *getASTUnit() const { return TU; }
247dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
248dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool Visit(CXCursor Cursor, bool CheckedRegionOfInterest = false);
249dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
250dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  std::pair<PreprocessingRecord::iterator, PreprocessingRecord::iterator>
251dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    getPreprocessedEntities();
252dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
253dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitChildren(CXCursor Parent);
254dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
255dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  // Declaration visitors
256dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitAttributes(Decl *D);
257dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitBlockDecl(BlockDecl *B);
258dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitCXXRecordDecl(CXXRecordDecl *D);
259dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  llvm::Optional<bool> shouldVisitCursor(CXCursor C);
260dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitDeclContext(DeclContext *DC);
261dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitTranslationUnitDecl(TranslationUnitDecl *D);
262dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitTypedefDecl(TypedefDecl *D);
263dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitTagDecl(TagDecl *D);
264dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitClassTemplateSpecializationDecl(ClassTemplateSpecializationDecl *D);
265dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitClassTemplatePartialSpecializationDecl(
266dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                                     ClassTemplatePartialSpecializationDecl *D);
267dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D);
268dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitEnumConstantDecl(EnumConstantDecl *D);
269dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitDeclaratorDecl(DeclaratorDecl *DD);
270dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitFunctionDecl(FunctionDecl *ND);
271dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitFieldDecl(FieldDecl *D);
272dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitVarDecl(VarDecl *);
273dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D);
274dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitFunctionTemplateDecl(FunctionTemplateDecl *D);
275dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitClassTemplateDecl(ClassTemplateDecl *D);
276dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D);
277dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitObjCMethodDecl(ObjCMethodDecl *ND);
278dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitObjCContainerDecl(ObjCContainerDecl *D);
279dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitObjCCategoryDecl(ObjCCategoryDecl *ND);
280dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitObjCProtocolDecl(ObjCProtocolDecl *PID);
281dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitObjCPropertyDecl(ObjCPropertyDecl *PD);
282dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitObjCInterfaceDecl(ObjCInterfaceDecl *D);
283dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitObjCImplDecl(ObjCImplDecl *D);
284dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D);
285dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitObjCImplementationDecl(ObjCImplementationDecl *D);
286dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  // FIXME: ObjCCompatibleAliasDecl requires aliased-class locations.
287dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitObjCForwardProtocolDecl(ObjCForwardProtocolDecl *D);
288dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitObjCClassDecl(ObjCClassDecl *D);
289dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitLinkageSpecDecl(LinkageSpecDecl *D);
290dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitNamespaceDecl(NamespaceDecl *D);
291dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitNamespaceAliasDecl(NamespaceAliasDecl *D);
292dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitUsingDirectiveDecl(UsingDirectiveDecl *D);
293dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitUsingDecl(UsingDecl *D);
294dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D);
295dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitUnresolvedUsingTypenameDecl(UnresolvedUsingTypenameDecl *D);
296dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
297dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  // Name visitor
298dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitDeclarationNameInfo(DeclarationNameInfo Name);
299dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitNestedNameSpecifier(NestedNameSpecifier *NNS, SourceRange Range);
300dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
301dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  // Template visitors
302dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitTemplateParameters(const TemplateParameterList *Params);
303dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitTemplateName(TemplateName Name, SourceLocation Loc);
304dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitTemplateArgumentLoc(const TemplateArgumentLoc &TAL);
305dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
306dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  // Type visitors
307dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitQualifiedTypeLoc(QualifiedTypeLoc TL);
308dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitBuiltinTypeLoc(BuiltinTypeLoc TL);
309dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitTypedefTypeLoc(TypedefTypeLoc TL);
310dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL);
311dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitTagTypeLoc(TagTypeLoc TL);
312dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL);
313dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL);
314dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL);
315dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL);
316dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitPointerTypeLoc(PointerTypeLoc TL);
317dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL);
318dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL);
319dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL);
320dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL);
321dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitFunctionTypeLoc(FunctionTypeLoc TL, bool SkipResultType = false);
322dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitArrayTypeLoc(ArrayTypeLoc TL);
323dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitTemplateSpecializationTypeLoc(TemplateSpecializationTypeLoc TL);
324dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  // FIXME: Implement visitors here when the unimplemented TypeLocs get
325dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  // implemented
326dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL);
327dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitTypeOfTypeLoc(TypeOfTypeLoc TL);
328dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
329dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  // Statement visitors
330dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitStmt(Stmt *S);
331dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitDeclStmt(DeclStmt *S);
332dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitGotoStmt(GotoStmt *S);
333dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
334dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  // Expression visitors
335dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitDeclRefExpr(DeclRefExpr *E);
336dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitBlockExpr(BlockExpr *B);
337dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitCompoundLiteralExpr(CompoundLiteralExpr *E);
338dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitExplicitCastExpr(ExplicitCastExpr *E);
339dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitObjCMessageExpr(ObjCMessageExpr *E);
340dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitObjCEncodeExpr(ObjCEncodeExpr *E);
341dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitOffsetOfExpr(OffsetOfExpr *E);
342dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *E);
343dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitAddrLabelExpr(AddrLabelExpr *E);
344dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitTypesCompatibleExpr(TypesCompatibleExpr *E);
345dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitVAArgExpr(VAArgExpr *E);
346dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitDesignatedInitExpr(DesignatedInitExpr *E);
347dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitCXXTypeidExpr(CXXTypeidExpr *E);
348dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitCXXUuidofExpr(CXXUuidofExpr *E);
349dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E) { return false; }
350dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *E);
351dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *E);
352dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitCXXNewExpr(CXXNewExpr *E);
353dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E);
354dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitUnaryTypeTraitExpr(UnaryTypeTraitExpr *E);
355dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitOverloadExpr(OverloadExpr *E);
356dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E);
357dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitCXXUnresolvedConstructExpr(CXXUnresolvedConstructExpr *E);
358dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr *E);
359dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitUnresolvedMemberExpr(UnresolvedMemberExpr *E);
360dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
361dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu#define DATA_RECURSIVE_VISIT(NAME)\
362dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhubool Visit##NAME(NAME *S) { return VisitDataRecursive(S); }
363dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  DATA_RECURSIVE_VISIT(BinaryOperator)
364dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  DATA_RECURSIVE_VISIT(CXXMemberCallExpr)
365dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  DATA_RECURSIVE_VISIT(CXXOperatorCallExpr)
366dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  DATA_RECURSIVE_VISIT(DoStmt)
367dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  DATA_RECURSIVE_VISIT(IfStmt)
368dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  DATA_RECURSIVE_VISIT(InitListExpr)
369dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  DATA_RECURSIVE_VISIT(ForStmt)
370dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  DATA_RECURSIVE_VISIT(MemberExpr)
371dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  DATA_RECURSIVE_VISIT(SwitchStmt)
372dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  DATA_RECURSIVE_VISIT(WhileStmt)
373dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
374dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  // Data-recursive visitor functions.
375dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool IsInRegionOfInterest(CXCursor C);
376dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool RunVisitorWorkList(VisitorWorkList &WL);
377dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  void EnqueueWorkList(VisitorWorkList &WL, Stmt *S);
378dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool VisitDataRecursive(Stmt *S);
379dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu};
380dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
381dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu} // end anonymous namespace
382dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
383dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhustatic SourceRange getRawCursorExtent(CXCursor C);
384dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
385dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui ZhuRangeComparisonResult CursorVisitor::CompareRegionOfInterest(SourceRange R) {
386dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  return RangeCompare(TU->getSourceManager(), R, RegionOfInterest);
387dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu}
388dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
389dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu/// \brief Visit the given cursor and, if requested by the visitor,
390dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu/// its children.
391dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu///
392dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu/// \param Cursor the cursor to visit.
393dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu///
394dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu/// \param CheckRegionOfInterest if true, then the caller already checked that
395dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu/// this cursor is within the region of interest.
396dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu///
397dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu/// \returns true if the visitation should be aborted, false if it
398dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu/// should continue.
399dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhubool CursorVisitor::Visit(CXCursor Cursor, bool CheckedRegionOfInterest) {
400dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  if (clang_isInvalid(Cursor.kind))
401dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    return false;
402dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
403dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  if (clang_isDeclaration(Cursor.kind)) {
404dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    Decl *D = getCursorDecl(Cursor);
405dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    assert(D && "Invalid declaration cursor");
406dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    if (D->getPCHLevel() > MaxPCHLevel)
407dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu      return false;
408dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
409dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    if (D->isImplicit())
410dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu      return false;
411dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  }
412dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
413dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  // If we have a range of interest, and this cursor doesn't intersect with it,
414dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  // we're done.
415dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  if (RegionOfInterest.isValid() && !CheckedRegionOfInterest) {
416dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    SourceRange Range = getRawCursorExtent(Cursor);
417dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    if (Range.isInvalid() || CompareRegionOfInterest(Range))
418dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu      return false;
419dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  }
420dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
421dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  switch (Visitor(Cursor, Parent, ClientData)) {
422dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  case CXChildVisit_Break:
423dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    return true;
424dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
425dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  case CXChildVisit_Continue:
426dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    return false;
427dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
428dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  case CXChildVisit_Recurse:
429dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    return VisitChildren(Cursor);
430dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  }
431dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
432dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  return false;
433dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu}
434dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
435dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhustd::pair<PreprocessingRecord::iterator, PreprocessingRecord::iterator>
436dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui ZhuCursorVisitor::getPreprocessedEntities() {
437dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  PreprocessingRecord &PPRec
438dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    = *TU->getPreprocessor().getPreprocessingRecord();
439dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
440dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool OnlyLocalDecls
441dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    = !TU->isMainFileAST() && TU->getOnlyLocalDecls();
442dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
443dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  // There is no region of interest; we have to walk everything.
444dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  if (RegionOfInterest.isInvalid())
445dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    return std::make_pair(PPRec.begin(OnlyLocalDecls),
446dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                          PPRec.end(OnlyLocalDecls));
447dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
448dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  // Find the file in which the region of interest lands.
449dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  SourceManager &SM = TU->getSourceManager();
450dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  std::pair<FileID, unsigned> Begin
451dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    = SM.getDecomposedInstantiationLoc(RegionOfInterest.getBegin());
452dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  std::pair<FileID, unsigned> End
453dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    = SM.getDecomposedInstantiationLoc(RegionOfInterest.getEnd());
454dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
455dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  // The region of interest spans files; we have to walk everything.
456dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  if (Begin.first != End.first)
457dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    return std::make_pair(PPRec.begin(OnlyLocalDecls),
458dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                          PPRec.end(OnlyLocalDecls));
459dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
460dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  ASTUnit::PreprocessedEntitiesByFileMap &ByFileMap
461dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    = TU->getPreprocessedEntitiesByFile();
462dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  if (ByFileMap.empty()) {
463dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    // Build the mapping from files to sets of preprocessed entities.
464dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    for (PreprocessingRecord::iterator E = PPRec.begin(OnlyLocalDecls),
465dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                                    EEnd = PPRec.end(OnlyLocalDecls);
466dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu         E != EEnd; ++E) {
467dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu      std::pair<FileID, unsigned> P
468dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        = SM.getDecomposedInstantiationLoc((*E)->getSourceRange().getBegin());
469dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu      ByFileMap[P.first].push_back(*E);
470dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
471dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  }
472dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
473dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  return std::make_pair(ByFileMap[Begin.first].begin(),
474dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                        ByFileMap[Begin.first].end());
475dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu}
476dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
477dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu/// \brief Visit the children of the given cursor.
478dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu///
479dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu/// \returns true if the visitation should be aborted, false if it
480dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu/// should continue.
481dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhubool CursorVisitor::VisitChildren(CXCursor Cursor) {
482dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  if (clang_isReference(Cursor.kind)) {
483dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    // By definition, references have no children.
484dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    return false;
485dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  }
486dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
487dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  // Set the Parent field to Cursor, then back to its old value once we're
488dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  // done.
489dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  SetParentRAII SetParent(Parent, StmtParent, Cursor);
490dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
491dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  if (clang_isDeclaration(Cursor.kind)) {
492dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    Decl *D = getCursorDecl(Cursor);
493dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    assert(D && "Invalid declaration cursor");
494dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    return VisitAttributes(D) || Visit(D);
495dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  }
496dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
497dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  if (clang_isStatement(Cursor.kind))
498dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    return Visit(getCursorStmt(Cursor));
499dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  if (clang_isExpression(Cursor.kind))
500dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    return Visit(getCursorExpr(Cursor));
501dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
502dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  if (clang_isTranslationUnit(Cursor.kind)) {
503dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    ASTUnit *CXXUnit = getCursorASTUnit(Cursor);
504dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    if (!CXXUnit->isMainFileAST() && CXXUnit->getOnlyLocalDecls() &&
505dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        RegionOfInterest.isInvalid()) {
506dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu      for (ASTUnit::top_level_iterator TL = CXXUnit->top_level_begin(),
507dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                                    TLEnd = CXXUnit->top_level_end();
508dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu           TL != TLEnd; ++TL) {
509dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        if (Visit(MakeCXCursor(*TL, CXXUnit), true))
510dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu          return true;
511dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu      }
512dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    } else if (VisitDeclContext(
513dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                            CXXUnit->getASTContext().getTranslationUnitDecl()))
514dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu      return true;
515dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
516dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    // Walk the preprocessing record.
517dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    if (CXXUnit->getPreprocessor().getPreprocessingRecord()) {
518dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu      // FIXME: Once we have the ability to deserialize a preprocessing record,
519dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu      // do so.
520dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu      PreprocessingRecord::iterator E, EEnd;
521dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu      for (llvm::tie(E, EEnd) = getPreprocessedEntities(); E != EEnd; ++E) {
522dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        if (MacroInstantiation *MI = dyn_cast<MacroInstantiation>(*E)) {
523dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu          if (Visit(MakeMacroInstantiationCursor(MI, CXXUnit)))
524dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            return true;
525dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
526dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu          continue;
527dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        }
528dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
529dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        if (MacroDefinition *MD = dyn_cast<MacroDefinition>(*E)) {
530dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu          if (Visit(MakeMacroDefinitionCursor(MD, CXXUnit)))
531dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            return true;
532dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
533dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu          continue;
534dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        }
535dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
536dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        if (InclusionDirective *ID = dyn_cast<InclusionDirective>(*E)) {
537dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu          if (Visit(MakeInclusionDirectiveCursor(ID, CXXUnit)))
538dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            return true;
539dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
540dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu          continue;
541dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        }
542dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu      }
543dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
544dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    return false;
545dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  }
546dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
547dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  // Nothing to visit at the moment.
548dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  return false;
549dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu}
550dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
551dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhubool CursorVisitor::VisitBlockDecl(BlockDecl *B) {
552dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  if (Visit(B->getSignatureAsWritten()->getTypeLoc()))
553dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    return true;
554dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
555dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  if (Stmt *Body = B->getBody())
556dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    return Visit(MakeCXCursor(Body, StmtParent, TU));
557dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
558dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  return false;
559dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu}
560dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
561dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhullvm::Optional<bool> CursorVisitor::shouldVisitCursor(CXCursor Cursor) {
562dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  if (RegionOfInterest.isValid()) {
563dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    SourceRange Range = getRawCursorExtent(Cursor);
564dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    if (Range.isInvalid())
565dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu      return llvm::Optional<bool>();
566dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
567dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    switch (CompareRegionOfInterest(Range)) {
568dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    case RangeBefore:
569dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu      // This declaration comes before the region of interest; skip it.
570dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu      return llvm::Optional<bool>();
571dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
572dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    case RangeAfter:
573dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu      // This declaration comes after the region of interest; we're done.
574dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu      return false;
575dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
576dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    case RangeOverlap:
577dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu      // This declaration overlaps the region of interest; visit it.
578dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu      break;
579dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
580dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  }
581dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  return true;
582dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu}
583dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
584dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhubool CursorVisitor::VisitDeclContext(DeclContext *DC) {
585dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  DeclContext::decl_iterator I = DC->decls_begin(), E = DC->decls_end();
586dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
587dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  // FIXME: Eventually remove.  This part of a hack to support proper
588dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  // iteration over all Decls contained lexically within an ObjC container.
589dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  SaveAndRestore<DeclContext::decl_iterator*> DI_saved(DI_current, &I);
590dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  SaveAndRestore<DeclContext::decl_iterator> DE_saved(DE_current, E);
591dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
592dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  for ( ; I != E; ++I) {
593dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    Decl *D = *I;
594dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    if (D->getLexicalDeclContext() != DC)
595dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu      continue;
596dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    CXCursor Cursor = MakeCXCursor(D, TU);
597dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    const llvm::Optional<bool> &V = shouldVisitCursor(Cursor);
598dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    if (!V.hasValue())
599dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu      continue;
600dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    if (!V.getValue())
601dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu      return false;
602dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    if (Visit(Cursor, true))
603dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu      return true;
604dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  }
605dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  return false;
606dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu}
607dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
608dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhubool CursorVisitor::VisitTranslationUnitDecl(TranslationUnitDecl *D) {
609dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  llvm_unreachable("Translation units are visited directly by Visit()");
610dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  return false;
611dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu}
612dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
613dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhubool CursorVisitor::VisitTypedefDecl(TypedefDecl *D) {
614dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  if (TypeSourceInfo *TSInfo = D->getTypeSourceInfo())
615dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    return Visit(TSInfo->getTypeLoc());
616dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
617dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  return false;
618dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu}
619dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
620dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhubool CursorVisitor::VisitTagDecl(TagDecl *D) {
621dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  return VisitDeclContext(D);
622dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu}
623dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
624dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhubool CursorVisitor::VisitClassTemplateSpecializationDecl(
625dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                                          ClassTemplateSpecializationDecl *D) {
626dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  bool ShouldVisitBody = false;
627dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  switch (D->getSpecializationKind()) {
628dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  case TSK_Undeclared:
629dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  case TSK_ImplicitInstantiation:
630dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    // Nothing to visit
631dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    return false;
632dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
633dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  case TSK_ExplicitInstantiationDeclaration:
634dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  case TSK_ExplicitInstantiationDefinition:
635dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    break;
636dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
637dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  case TSK_ExplicitSpecialization:
638dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    ShouldVisitBody = true;
639dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    break;
640dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  }
641dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
642dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  // Visit the template arguments used in the specialization.
643dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  if (TypeSourceInfo *SpecType = D->getTypeAsWritten()) {
644dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    TypeLoc TL = SpecType->getTypeLoc();
645dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    if (TemplateSpecializationTypeLoc *TSTLoc
646dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu          = dyn_cast<TemplateSpecializationTypeLoc>(&TL)) {
647dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu      for (unsigned I = 0, N = TSTLoc->getNumArgs(); I != N; ++I)
648dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        if (VisitTemplateArgumentLoc(TSTLoc->getArgLoc(I)))
649dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu          return true;
650dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
651dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  }
652dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
653dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  if (ShouldVisitBody && VisitCXXRecordDecl(D))
654dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    return true;
655dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
656dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  return false;
657dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu}
658dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
659dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhubool CursorVisitor::VisitClassTemplatePartialSpecializationDecl(
660dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                                   ClassTemplatePartialSpecializationDecl *D) {
661dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  // FIXME: Visit the "outer" template parameter lists on the TagDecl
662dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  // before visiting these template parameters.
663dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  if (VisitTemplateParameters(D->getTemplateParameters()))
664dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    return true;
665dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
666dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  // Visit the partial specialization arguments.
667dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  const TemplateArgumentLoc *TemplateArgs = D->getTemplateArgsAsWritten();
668dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  for (unsigned I = 0, N = D->getNumTemplateArgsAsWritten(); I != N; ++I)
669dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    if (VisitTemplateArgumentLoc(TemplateArgs[I]))
670dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu      return true;
671dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
672dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  return VisitCXXRecordDecl(D);
673dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu}
674dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
675dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhubool CursorVisitor::VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D) {
676dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  // Visit the default argument.
677dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  if (D->hasDefaultArgument() && !D->defaultArgumentWasInherited())
678dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    if (TypeSourceInfo *DefArg = D->getDefaultArgumentInfo())
679dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu      if (Visit(DefArg->getTypeLoc()))
680dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        return true;
681dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
682dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  return false;
683dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu}
684dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
685dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhubool CursorVisitor::VisitEnumConstantDecl(EnumConstantDecl *D) {
686dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  if (Expr *Init = D->getInitExpr())
687dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    return Visit(MakeCXCursor(Init, StmtParent, TU));
688dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  return false;
689dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu}
690dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
691dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhubool CursorVisitor::VisitDeclaratorDecl(DeclaratorDecl *DD) {
692dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  if (TypeSourceInfo *TSInfo = DD->getTypeSourceInfo())
693dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    if (Visit(TSInfo->getTypeLoc()))
694dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu      return true;
695dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
696dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  return false;
697dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu}
698dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
699dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu/// \brief Compare two base or member initializers based on their source order.
700dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhustatic int CompareCXXBaseOrMemberInitializers(const void* Xp, const void *Yp) {
701dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  CXXBaseOrMemberInitializer const * const *X
702dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    = static_cast<CXXBaseOrMemberInitializer const * const *>(Xp);
703dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  CXXBaseOrMemberInitializer const * const *Y
704dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    = static_cast<CXXBaseOrMemberInitializer const * const *>(Yp);
705dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
706dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  if ((*X)->getSourceOrder() < (*Y)->getSourceOrder())
707dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    return -1;
708dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  else if ((*X)->getSourceOrder() > (*Y)->getSourceOrder())
709dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    return 1;
710dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  else
711dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    return 0;
712dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu}
713dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
714dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhubool CursorVisitor::VisitFunctionDecl(FunctionDecl *ND) {
715dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu  if (TypeSourceInfo *TSInfo = ND->getTypeSourceInfo()) {
716dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    // Visit the function declaration's syntactic components in the order
717dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    // written. This requires a bit of work.
718dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    TypeLoc TL = TSInfo->getTypeLoc();
719dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    FunctionTypeLoc *FTL = dyn_cast<FunctionTypeLoc>(&TL);
720dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
721dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    // If we have a function declared directly (without the use of a typedef),
722dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    // visit just the return type. Otherwise, just visit the function's type
723dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    // now.
724dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    if ((FTL && !isa<CXXConversionDecl>(ND) && Visit(FTL->getResultLoc())) ||
725dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        (!FTL && Visit(TL)))
726dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu      return true;
727dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
728dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    // Visit the nested-name-specifier, if present.
729dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    if (NestedNameSpecifier *Qualifier = ND->getQualifier())
730dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu      if (VisitNestedNameSpecifier(Qualifier, ND->getQualifierRange()))
731dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        return true;
732dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
733dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    // Visit the declaration name.
734dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    if (VisitDeclarationNameInfo(ND->getNameInfo()))
735dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu      return true;
736dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
737dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    // FIXME: Visit explicitly-specified template arguments!
738dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
739dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    // Visit the function parameters, if we have a function type.
740dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    if (FTL && VisitFunctionTypeLoc(*FTL, true))
741dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu      return true;
742dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
743    // FIXME: Attributes?
744  }
745
746  if (ND->isThisDeclarationADefinition()) {
747    if (CXXConstructorDecl *Constructor = dyn_cast<CXXConstructorDecl>(ND)) {
748      // Find the initializers that were written in the source.
749      llvm::SmallVector<CXXBaseOrMemberInitializer *, 4> WrittenInits;
750      for (CXXConstructorDecl::init_iterator I = Constructor->init_begin(),
751                                          IEnd = Constructor->init_end();
752           I != IEnd; ++I) {
753        if (!(*I)->isWritten())
754          continue;
755
756        WrittenInits.push_back(*I);
757      }
758
759      // Sort the initializers in source order
760      llvm::array_pod_sort(WrittenInits.begin(), WrittenInits.end(),
761                           &CompareCXXBaseOrMemberInitializers);
762
763      // Visit the initializers in source order
764      for (unsigned I = 0, N = WrittenInits.size(); I != N; ++I) {
765        CXXBaseOrMemberInitializer *Init = WrittenInits[I];
766        if (Init->isMemberInitializer()) {
767          if (Visit(MakeCursorMemberRef(Init->getMember(),
768                                        Init->getMemberLocation(), TU)))
769            return true;
770        } else if (TypeSourceInfo *BaseInfo = Init->getBaseClassInfo()) {
771          if (Visit(BaseInfo->getTypeLoc()))
772            return true;
773        }
774
775        // Visit the initializer value.
776        if (Expr *Initializer = Init->getInit())
777          if (Visit(MakeCXCursor(Initializer, ND, TU)))
778            return true;
779      }
780    }
781
782    if (Visit(MakeCXCursor(ND->getBody(), StmtParent, TU)))
783      return true;
784  }
785
786  return false;
787}
788
789bool CursorVisitor::VisitFieldDecl(FieldDecl *D) {
790  if (VisitDeclaratorDecl(D))
791    return true;
792
793  if (Expr *BitWidth = D->getBitWidth())
794    return Visit(MakeCXCursor(BitWidth, StmtParent, TU));
795
796  return false;
797}
798
799bool CursorVisitor::VisitVarDecl(VarDecl *D) {
800  if (VisitDeclaratorDecl(D))
801    return true;
802
803  if (Expr *Init = D->getInit())
804    return Visit(MakeCXCursor(Init, StmtParent, TU));
805
806  return false;
807}
808
809bool CursorVisitor::VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D) {
810  if (VisitDeclaratorDecl(D))
811    return true;
812
813  if (D->hasDefaultArgument() && !D->defaultArgumentWasInherited())
814    if (Expr *DefArg = D->getDefaultArgument())
815      return Visit(MakeCXCursor(DefArg, StmtParent, TU));
816
817  return false;
818}
819
820bool CursorVisitor::VisitFunctionTemplateDecl(FunctionTemplateDecl *D) {
821  // FIXME: Visit the "outer" template parameter lists on the FunctionDecl
822  // before visiting these template parameters.
823  if (VisitTemplateParameters(D->getTemplateParameters()))
824    return true;
825
826  return VisitFunctionDecl(D->getTemplatedDecl());
827}
828
829bool CursorVisitor::VisitClassTemplateDecl(ClassTemplateDecl *D) {
830  // FIXME: Visit the "outer" template parameter lists on the TagDecl
831  // before visiting these template parameters.
832  if (VisitTemplateParameters(D->getTemplateParameters()))
833    return true;
834
835  return VisitCXXRecordDecl(D->getTemplatedDecl());
836}
837
838bool CursorVisitor::VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D) {
839  if (VisitTemplateParameters(D->getTemplateParameters()))
840    return true;
841
842  if (D->hasDefaultArgument() && !D->defaultArgumentWasInherited() &&
843      VisitTemplateArgumentLoc(D->getDefaultArgument()))
844    return true;
845
846  return false;
847}
848
849bool CursorVisitor::VisitObjCMethodDecl(ObjCMethodDecl *ND) {
850  if (TypeSourceInfo *TSInfo = ND->getResultTypeSourceInfo())
851    if (Visit(TSInfo->getTypeLoc()))
852      return true;
853
854  for (ObjCMethodDecl::param_iterator P = ND->param_begin(),
855       PEnd = ND->param_end();
856       P != PEnd; ++P) {
857    if (Visit(MakeCXCursor(*P, TU)))
858      return true;
859  }
860
861  if (ND->isThisDeclarationADefinition() &&
862      Visit(MakeCXCursor(ND->getBody(), StmtParent, TU)))
863    return true;
864
865  return false;
866}
867
868namespace {
869  struct ContainerDeclsSort {
870    SourceManager &SM;
871    ContainerDeclsSort(SourceManager &sm) : SM(sm) {}
872    bool operator()(Decl *A, Decl *B) {
873      SourceLocation L_A = A->getLocStart();
874      SourceLocation L_B = B->getLocStart();
875      assert(L_A.isValid() && L_B.isValid());
876      return SM.isBeforeInTranslationUnit(L_A, L_B);
877    }
878  };
879}
880
881bool CursorVisitor::VisitObjCContainerDecl(ObjCContainerDecl *D) {
882  // FIXME: Eventually convert back to just 'VisitDeclContext()'.  Essentially
883  // an @implementation can lexically contain Decls that are not properly
884  // nested in the AST.  When we identify such cases, we need to retrofit
885  // this nesting here.
886  if (!DI_current)
887    return VisitDeclContext(D);
888
889  // Scan the Decls that immediately come after the container
890  // in the current DeclContext.  If any fall within the
891  // container's lexical region, stash them into a vector
892  // for later processing.
893  llvm::SmallVector<Decl *, 24> DeclsInContainer;
894  SourceLocation EndLoc = D->getSourceRange().getEnd();
895  SourceManager &SM = TU->getSourceManager();
896  if (EndLoc.isValid()) {
897    DeclContext::decl_iterator next = *DI_current;
898    while (++next != DE_current) {
899      Decl *D_next = *next;
900      if (!D_next)
901        break;
902      SourceLocation L = D_next->getLocStart();
903      if (!L.isValid())
904        break;
905      if (SM.isBeforeInTranslationUnit(L, EndLoc)) {
906        *DI_current = next;
907        DeclsInContainer.push_back(D_next);
908        continue;
909      }
910      break;
911    }
912  }
913
914  // The common case.
915  if (DeclsInContainer.empty())
916    return VisitDeclContext(D);
917
918  // Get all the Decls in the DeclContext, and sort them with the
919  // additional ones we've collected.  Then visit them.
920  for (DeclContext::decl_iterator I = D->decls_begin(), E = D->decls_end();
921       I!=E; ++I) {
922    Decl *subDecl = *I;
923    if (!subDecl || subDecl->getLexicalDeclContext() != D ||
924        subDecl->getLocStart().isInvalid())
925      continue;
926    DeclsInContainer.push_back(subDecl);
927  }
928
929  // Now sort the Decls so that they appear in lexical order.
930  std::sort(DeclsInContainer.begin(), DeclsInContainer.end(),
931            ContainerDeclsSort(SM));
932
933  // Now visit the decls.
934  for (llvm::SmallVectorImpl<Decl*>::iterator I = DeclsInContainer.begin(),
935         E = DeclsInContainer.end(); I != E; ++I) {
936    CXCursor Cursor = MakeCXCursor(*I, TU);
937    const llvm::Optional<bool> &V = shouldVisitCursor(Cursor);
938    if (!V.hasValue())
939      continue;
940    if (!V.getValue())
941      return false;
942    if (Visit(Cursor, true))
943      return true;
944  }
945  return false;
946}
947
948bool CursorVisitor::VisitObjCCategoryDecl(ObjCCategoryDecl *ND) {
949  if (Visit(MakeCursorObjCClassRef(ND->getClassInterface(), ND->getLocation(),
950                                   TU)))
951    return true;
952
953  ObjCCategoryDecl::protocol_loc_iterator PL = ND->protocol_loc_begin();
954  for (ObjCCategoryDecl::protocol_iterator I = ND->protocol_begin(),
955         E = ND->protocol_end(); I != E; ++I, ++PL)
956    if (Visit(MakeCursorObjCProtocolRef(*I, *PL, TU)))
957      return true;
958
959  return VisitObjCContainerDecl(ND);
960}
961
962bool CursorVisitor::VisitObjCProtocolDecl(ObjCProtocolDecl *PID) {
963  ObjCProtocolDecl::protocol_loc_iterator PL = PID->protocol_loc_begin();
964  for (ObjCProtocolDecl::protocol_iterator I = PID->protocol_begin(),
965       E = PID->protocol_end(); I != E; ++I, ++PL)
966    if (Visit(MakeCursorObjCProtocolRef(*I, *PL, TU)))
967      return true;
968
969  return VisitObjCContainerDecl(PID);
970}
971
972bool CursorVisitor::VisitObjCPropertyDecl(ObjCPropertyDecl *PD) {
973  if (PD->getTypeSourceInfo() && Visit(PD->getTypeSourceInfo()->getTypeLoc()))
974    return true;
975
976  // FIXME: This implements a workaround with @property declarations also being
977  // installed in the DeclContext for the @interface.  Eventually this code
978  // should be removed.
979  ObjCCategoryDecl *CDecl = dyn_cast<ObjCCategoryDecl>(PD->getDeclContext());
980  if (!CDecl || !CDecl->IsClassExtension())
981    return false;
982
983  ObjCInterfaceDecl *ID = CDecl->getClassInterface();
984  if (!ID)
985    return false;
986
987  IdentifierInfo *PropertyId = PD->getIdentifier();
988  ObjCPropertyDecl *prevDecl =
989    ObjCPropertyDecl::findPropertyDecl(cast<DeclContext>(ID), PropertyId);
990
991  if (!prevDecl)
992    return false;
993
994  // Visit synthesized methods since they will be skipped when visiting
995  // the @interface.
996  if (ObjCMethodDecl *MD = prevDecl->getGetterMethodDecl())
997    if (MD->isSynthesized() && MD->getLexicalDeclContext() == CDecl)
998      if (Visit(MakeCXCursor(MD, TU)))
999        return true;
1000
1001  if (ObjCMethodDecl *MD = prevDecl->getSetterMethodDecl())
1002    if (MD->isSynthesized() && MD->getLexicalDeclContext() == CDecl)
1003      if (Visit(MakeCXCursor(MD, TU)))
1004        return true;
1005
1006  return false;
1007}
1008
1009bool CursorVisitor::VisitObjCInterfaceDecl(ObjCInterfaceDecl *D) {
1010  // Issue callbacks for super class.
1011  if (D->getSuperClass() &&
1012      Visit(MakeCursorObjCSuperClassRef(D->getSuperClass(),
1013                                        D->getSuperClassLoc(),
1014                                        TU)))
1015    return true;
1016
1017  ObjCInterfaceDecl::protocol_loc_iterator PL = D->protocol_loc_begin();
1018  for (ObjCInterfaceDecl::protocol_iterator I = D->protocol_begin(),
1019         E = D->protocol_end(); I != E; ++I, ++PL)
1020    if (Visit(MakeCursorObjCProtocolRef(*I, *PL, TU)))
1021      return true;
1022
1023  return VisitObjCContainerDecl(D);
1024}
1025
1026bool CursorVisitor::VisitObjCImplDecl(ObjCImplDecl *D) {
1027  return VisitObjCContainerDecl(D);
1028}
1029
1030bool CursorVisitor::VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D) {
1031  // 'ID' could be null when dealing with invalid code.
1032  if (ObjCInterfaceDecl *ID = D->getClassInterface())
1033    if (Visit(MakeCursorObjCClassRef(ID, D->getLocation(), TU)))
1034      return true;
1035
1036  return VisitObjCImplDecl(D);
1037}
1038
1039bool CursorVisitor::VisitObjCImplementationDecl(ObjCImplementationDecl *D) {
1040#if 0
1041  // Issue callbacks for super class.
1042  // FIXME: No source location information!
1043  if (D->getSuperClass() &&
1044      Visit(MakeCursorObjCSuperClassRef(D->getSuperClass(),
1045                                        D->getSuperClassLoc(),
1046                                        TU)))
1047    return true;
1048#endif
1049
1050  return VisitObjCImplDecl(D);
1051}
1052
1053bool CursorVisitor::VisitObjCForwardProtocolDecl(ObjCForwardProtocolDecl *D) {
1054  ObjCForwardProtocolDecl::protocol_loc_iterator PL = D->protocol_loc_begin();
1055  for (ObjCForwardProtocolDecl::protocol_iterator I = D->protocol_begin(),
1056                                                  E = D->protocol_end();
1057       I != E; ++I, ++PL)
1058    if (Visit(MakeCursorObjCProtocolRef(*I, *PL, TU)))
1059      return true;
1060
1061  return false;
1062}
1063
1064bool CursorVisitor::VisitObjCClassDecl(ObjCClassDecl *D) {
1065  for (ObjCClassDecl::iterator C = D->begin(), CEnd = D->end(); C != CEnd; ++C)
1066    if (Visit(MakeCursorObjCClassRef(C->getInterface(), C->getLocation(), TU)))
1067      return true;
1068
1069  return false;
1070}
1071
1072bool CursorVisitor::VisitNamespaceDecl(NamespaceDecl *D) {
1073  return VisitDeclContext(D);
1074}
1075
1076bool CursorVisitor::VisitNamespaceAliasDecl(NamespaceAliasDecl *D) {
1077  // Visit nested-name-specifier.
1078  if (NestedNameSpecifier *Qualifier = D->getQualifier())
1079    if (VisitNestedNameSpecifier(Qualifier, D->getQualifierRange()))
1080      return true;
1081
1082  return Visit(MakeCursorNamespaceRef(D->getAliasedNamespace(),
1083                                      D->getTargetNameLoc(), TU));
1084}
1085
1086bool CursorVisitor::VisitUsingDecl(UsingDecl *D) {
1087  // Visit nested-name-specifier.
1088  if (NestedNameSpecifier *Qualifier = D->getTargetNestedNameDecl())
1089    if (VisitNestedNameSpecifier(Qualifier, D->getNestedNameRange()))
1090      return true;
1091
1092  if (Visit(MakeCursorOverloadedDeclRef(D, D->getLocation(), TU)))
1093    return true;
1094
1095  return VisitDeclarationNameInfo(D->getNameInfo());
1096}
1097
1098bool CursorVisitor::VisitUsingDirectiveDecl(UsingDirectiveDecl *D) {
1099  // Visit nested-name-specifier.
1100  if (NestedNameSpecifier *Qualifier = D->getQualifier())
1101    if (VisitNestedNameSpecifier(Qualifier, D->getQualifierRange()))
1102      return true;
1103
1104  return Visit(MakeCursorNamespaceRef(D->getNominatedNamespaceAsWritten(),
1105                                      D->getIdentLocation(), TU));
1106}
1107
1108bool CursorVisitor::VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D) {
1109  // Visit nested-name-specifier.
1110  if (NestedNameSpecifier *Qualifier = D->getTargetNestedNameSpecifier())
1111    if (VisitNestedNameSpecifier(Qualifier, D->getTargetNestedNameRange()))
1112      return true;
1113
1114  return VisitDeclarationNameInfo(D->getNameInfo());
1115}
1116
1117bool CursorVisitor::VisitUnresolvedUsingTypenameDecl(
1118                                               UnresolvedUsingTypenameDecl *D) {
1119  // Visit nested-name-specifier.
1120  if (NestedNameSpecifier *Qualifier = D->getTargetNestedNameSpecifier())
1121    if (VisitNestedNameSpecifier(Qualifier, D->getTargetNestedNameRange()))
1122      return true;
1123
1124  return false;
1125}
1126
1127bool CursorVisitor::VisitDeclarationNameInfo(DeclarationNameInfo Name) {
1128  switch (Name.getName().getNameKind()) {
1129  case clang::DeclarationName::Identifier:
1130  case clang::DeclarationName::CXXLiteralOperatorName:
1131  case clang::DeclarationName::CXXOperatorName:
1132  case clang::DeclarationName::CXXUsingDirective:
1133    return false;
1134
1135  case clang::DeclarationName::CXXConstructorName:
1136  case clang::DeclarationName::CXXDestructorName:
1137  case clang::DeclarationName::CXXConversionFunctionName:
1138    if (TypeSourceInfo *TSInfo = Name.getNamedTypeInfo())
1139      return Visit(TSInfo->getTypeLoc());
1140    return false;
1141
1142  case clang::DeclarationName::ObjCZeroArgSelector:
1143  case clang::DeclarationName::ObjCOneArgSelector:
1144  case clang::DeclarationName::ObjCMultiArgSelector:
1145    // FIXME: Per-identifier location info?
1146    return false;
1147  }
1148
1149  return false;
1150}
1151
1152bool CursorVisitor::VisitNestedNameSpecifier(NestedNameSpecifier *NNS,
1153                                             SourceRange Range) {
1154  // FIXME: This whole routine is a hack to work around the lack of proper
1155  // source information in nested-name-specifiers (PR5791). Since we do have
1156  // a beginning source location, we can visit the first component of the
1157  // nested-name-specifier, if it's a single-token component.
1158  if (!NNS)
1159    return false;
1160
1161  // Get the first component in the nested-name-specifier.
1162  while (NestedNameSpecifier *Prefix = NNS->getPrefix())
1163    NNS = Prefix;
1164
1165  switch (NNS->getKind()) {
1166  case NestedNameSpecifier::Namespace:
1167    // FIXME: The token at this source location might actually have been a
1168    // namespace alias, but we don't model that. Lame!
1169    return Visit(MakeCursorNamespaceRef(NNS->getAsNamespace(), Range.getBegin(),
1170                                        TU));
1171
1172  case NestedNameSpecifier::TypeSpec: {
1173    // If the type has a form where we know that the beginning of the source
1174    // range matches up with a reference cursor. Visit the appropriate reference
1175    // cursor.
1176    Type *T = NNS->getAsType();
1177    if (const TypedefType *Typedef = dyn_cast<TypedefType>(T))
1178      return Visit(MakeCursorTypeRef(Typedef->getDecl(), Range.getBegin(), TU));
1179    if (const TagType *Tag = dyn_cast<TagType>(T))
1180      return Visit(MakeCursorTypeRef(Tag->getDecl(), Range.getBegin(), TU));
1181    if (const TemplateSpecializationType *TST
1182                                      = dyn_cast<TemplateSpecializationType>(T))
1183      return VisitTemplateName(TST->getTemplateName(), Range.getBegin());
1184    break;
1185  }
1186
1187  case NestedNameSpecifier::TypeSpecWithTemplate:
1188  case NestedNameSpecifier::Global:
1189  case NestedNameSpecifier::Identifier:
1190    break;
1191  }
1192
1193  return false;
1194}
1195
1196bool CursorVisitor::VisitTemplateParameters(
1197                                          const TemplateParameterList *Params) {
1198  if (!Params)
1199    return false;
1200
1201  for (TemplateParameterList::const_iterator P = Params->begin(),
1202                                          PEnd = Params->end();
1203       P != PEnd; ++P) {
1204    if (Visit(MakeCXCursor(*P, TU)))
1205      return true;
1206  }
1207
1208  return false;
1209}
1210
1211bool CursorVisitor::VisitTemplateName(TemplateName Name, SourceLocation Loc) {
1212  switch (Name.getKind()) {
1213  case TemplateName::Template:
1214    return Visit(MakeCursorTemplateRef(Name.getAsTemplateDecl(), Loc, TU));
1215
1216  case TemplateName::OverloadedTemplate:
1217    // Visit the overloaded template set.
1218    if (Visit(MakeCursorOverloadedDeclRef(Name, Loc, TU)))
1219      return true;
1220
1221    return false;
1222
1223  case TemplateName::DependentTemplate:
1224    // FIXME: Visit nested-name-specifier.
1225    return false;
1226
1227  case TemplateName::QualifiedTemplate:
1228    // FIXME: Visit nested-name-specifier.
1229    return Visit(MakeCursorTemplateRef(
1230                                  Name.getAsQualifiedTemplateName()->getDecl(),
1231                                       Loc, TU));
1232  }
1233
1234  return false;
1235}
1236
1237bool CursorVisitor::VisitTemplateArgumentLoc(const TemplateArgumentLoc &TAL) {
1238  switch (TAL.getArgument().getKind()) {
1239  case TemplateArgument::Null:
1240  case TemplateArgument::Integral:
1241    return false;
1242
1243  case TemplateArgument::Pack:
1244    // FIXME: Implement when variadic templates come along.
1245    return false;
1246
1247  case TemplateArgument::Type:
1248    if (TypeSourceInfo *TSInfo = TAL.getTypeSourceInfo())
1249      return Visit(TSInfo->getTypeLoc());
1250    return false;
1251
1252  case TemplateArgument::Declaration:
1253    if (Expr *E = TAL.getSourceDeclExpression())
1254      return Visit(MakeCXCursor(E, StmtParent, TU));
1255    return false;
1256
1257  case TemplateArgument::Expression:
1258    if (Expr *E = TAL.getSourceExpression())
1259      return Visit(MakeCXCursor(E, StmtParent, TU));
1260    return false;
1261
1262  case TemplateArgument::Template:
1263    return VisitTemplateName(TAL.getArgument().getAsTemplate(),
1264                             TAL.getTemplateNameLoc());
1265  }
1266
1267  return false;
1268}
1269
1270bool CursorVisitor::VisitLinkageSpecDecl(LinkageSpecDecl *D) {
1271  return VisitDeclContext(D);
1272}
1273
1274bool CursorVisitor::VisitQualifiedTypeLoc(QualifiedTypeLoc TL) {
1275  return Visit(TL.getUnqualifiedLoc());
1276}
1277
1278bool CursorVisitor::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) {
1279  ASTContext &Context = TU->getASTContext();
1280
1281  // Some builtin types (such as Objective-C's "id", "sel", and
1282  // "Class") have associated declarations. Create cursors for those.
1283  QualType VisitType;
1284  switch (TL.getType()->getAs<BuiltinType>()->getKind()) {
1285  case BuiltinType::Void:
1286  case BuiltinType::Bool:
1287  case BuiltinType::Char_U:
1288  case BuiltinType::UChar:
1289  case BuiltinType::Char16:
1290  case BuiltinType::Char32:
1291  case BuiltinType::UShort:
1292  case BuiltinType::UInt:
1293  case BuiltinType::ULong:
1294  case BuiltinType::ULongLong:
1295  case BuiltinType::UInt128:
1296  case BuiltinType::Char_S:
1297  case BuiltinType::SChar:
1298  case BuiltinType::WChar:
1299  case BuiltinType::Short:
1300  case BuiltinType::Int:
1301  case BuiltinType::Long:
1302  case BuiltinType::LongLong:
1303  case BuiltinType::Int128:
1304  case BuiltinType::Float:
1305  case BuiltinType::Double:
1306  case BuiltinType::LongDouble:
1307  case BuiltinType::NullPtr:
1308  case BuiltinType::Overload:
1309  case BuiltinType::Dependent:
1310    break;
1311
1312  case BuiltinType::UndeducedAuto: // FIXME: Deserves a cursor?
1313    break;
1314
1315  case BuiltinType::ObjCId:
1316    VisitType = Context.getObjCIdType();
1317    break;
1318
1319  case BuiltinType::ObjCClass:
1320    VisitType = Context.getObjCClassType();
1321    break;
1322
1323  case BuiltinType::ObjCSel:
1324    VisitType = Context.getObjCSelType();
1325    break;
1326  }
1327
1328  if (!VisitType.isNull()) {
1329    if (const TypedefType *Typedef = VisitType->getAs<TypedefType>())
1330      return Visit(MakeCursorTypeRef(Typedef->getDecl(), TL.getBuiltinLoc(),
1331                                     TU));
1332  }
1333
1334  return false;
1335}
1336
1337bool CursorVisitor::VisitTypedefTypeLoc(TypedefTypeLoc TL) {
1338  return Visit(MakeCursorTypeRef(TL.getTypedefDecl(), TL.getNameLoc(), TU));
1339}
1340
1341bool CursorVisitor::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) {
1342  return Visit(MakeCursorTypeRef(TL.getDecl(), TL.getNameLoc(), TU));
1343}
1344
1345bool CursorVisitor::VisitTagTypeLoc(TagTypeLoc TL) {
1346  return Visit(MakeCursorTypeRef(TL.getDecl(), TL.getNameLoc(), TU));
1347}
1348
1349bool CursorVisitor::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) {
1350  // FIXME: We can't visit the template type parameter, because there's
1351  // no context information with which we can match up the depth/index in the
1352  // type to the appropriate
1353  return false;
1354}
1355
1356bool CursorVisitor::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) {
1357  if (Visit(MakeCursorObjCClassRef(TL.getIFaceDecl(), TL.getNameLoc(), TU)))
1358    return true;
1359
1360  return false;
1361}
1362
1363bool CursorVisitor::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) {
1364  if (TL.hasBaseTypeAsWritten() && Visit(TL.getBaseLoc()))
1365    return true;
1366
1367  for (unsigned I = 0, N = TL.getNumProtocols(); I != N; ++I) {
1368    if (Visit(MakeCursorObjCProtocolRef(TL.getProtocol(I), TL.getProtocolLoc(I),
1369                                        TU)))
1370      return true;
1371  }
1372
1373  return false;
1374}
1375
1376bool CursorVisitor::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) {
1377  return Visit(TL.getPointeeLoc());
1378}
1379
1380bool CursorVisitor::VisitPointerTypeLoc(PointerTypeLoc TL) {
1381  return Visit(TL.getPointeeLoc());
1382}
1383
1384bool CursorVisitor::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) {
1385  return Visit(TL.getPointeeLoc());
1386}
1387
1388bool CursorVisitor::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) {
1389  return Visit(TL.getPointeeLoc());
1390}
1391
1392bool CursorVisitor::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) {
1393  return Visit(TL.getPointeeLoc());
1394}
1395
1396bool CursorVisitor::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) {
1397  return Visit(TL.getPointeeLoc());
1398}
1399
1400bool CursorVisitor::VisitFunctionTypeLoc(FunctionTypeLoc TL,
1401                                         bool SkipResultType) {
1402  if (!SkipResultType && Visit(TL.getResultLoc()))
1403    return true;
1404
1405  for (unsigned I = 0, N = TL.getNumArgs(); I != N; ++I)
1406    if (Decl *D = TL.getArg(I))
1407      if (Visit(MakeCXCursor(D, TU)))
1408        return true;
1409
1410  return false;
1411}
1412
1413bool CursorVisitor::VisitArrayTypeLoc(ArrayTypeLoc TL) {
1414  if (Visit(TL.getElementLoc()))
1415    return true;
1416
1417  if (Expr *Size = TL.getSizeExpr())
1418    return Visit(MakeCXCursor(Size, StmtParent, TU));
1419
1420  return false;
1421}
1422
1423bool CursorVisitor::VisitTemplateSpecializationTypeLoc(
1424                                             TemplateSpecializationTypeLoc TL) {
1425  // Visit the template name.
1426  if (VisitTemplateName(TL.getTypePtr()->getTemplateName(),
1427                        TL.getTemplateNameLoc()))
1428    return true;
1429
1430  // Visit the template arguments.
1431  for (unsigned I = 0, N = TL.getNumArgs(); I != N; ++I)
1432    if (VisitTemplateArgumentLoc(TL.getArgLoc(I)))
1433      return true;
1434
1435  return false;
1436}
1437
1438bool CursorVisitor::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) {
1439  return Visit(MakeCXCursor(TL.getUnderlyingExpr(), StmtParent, TU));
1440}
1441
1442bool CursorVisitor::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) {
1443  if (TypeSourceInfo *TSInfo = TL.getUnderlyingTInfo())
1444    return Visit(TSInfo->getTypeLoc());
1445
1446  return false;
1447}
1448
1449bool CursorVisitor::VisitStmt(Stmt *S) {
1450  for (Stmt::child_iterator Child = S->child_begin(), ChildEnd = S->child_end();
1451       Child != ChildEnd; ++Child) {
1452    if (Stmt *C = *Child)
1453      if (Visit(MakeCXCursor(C, StmtParent, TU)))
1454        return true;
1455  }
1456
1457  return false;
1458}
1459
1460bool CursorVisitor::VisitDeclStmt(DeclStmt *S) {
1461  bool isFirst = true;
1462  for (DeclStmt::decl_iterator D = S->decl_begin(), DEnd = S->decl_end();
1463       D != DEnd; ++D) {
1464    if (*D && Visit(MakeCXCursor(*D, TU, isFirst)))
1465      return true;
1466    isFirst = false;
1467  }
1468
1469  return false;
1470}
1471
1472bool CursorVisitor::VisitGotoStmt(GotoStmt *S) {
1473  return Visit(MakeCursorLabelRef(S->getLabel(), S->getLabelLoc(), TU));
1474}
1475
1476bool CursorVisitor::VisitDeclRefExpr(DeclRefExpr *E) {
1477  // Visit nested-name-specifier, if present.
1478  if (NestedNameSpecifier *Qualifier = E->getQualifier())
1479    if (VisitNestedNameSpecifier(Qualifier, E->getQualifierRange()))
1480      return true;
1481
1482  // Visit declaration name.
1483  if (VisitDeclarationNameInfo(E->getNameInfo()))
1484    return true;
1485
1486  // Visit explicitly-specified template arguments.
1487  if (E->hasExplicitTemplateArgs()) {
1488    ExplicitTemplateArgumentList &Args = E->getExplicitTemplateArgs();
1489    for (TemplateArgumentLoc *Arg = Args.getTemplateArgs(),
1490                          *ArgEnd = Arg + Args.NumTemplateArgs;
1491         Arg != ArgEnd; ++Arg)
1492      if (VisitTemplateArgumentLoc(*Arg))
1493        return true;
1494  }
1495
1496  return false;
1497}
1498
1499bool CursorVisitor::VisitCXXRecordDecl(CXXRecordDecl *D) {
1500  if (D->isDefinition()) {
1501    for (CXXRecordDecl::base_class_iterator I = D->bases_begin(),
1502         E = D->bases_end(); I != E; ++I) {
1503      if (Visit(cxcursor::MakeCursorCXXBaseSpecifier(I, TU)))
1504        return true;
1505    }
1506  }
1507
1508  return VisitTagDecl(D);
1509}
1510
1511
1512bool CursorVisitor::VisitBlockExpr(BlockExpr *B) {
1513  return Visit(B->getBlockDecl());
1514}
1515
1516bool CursorVisitor::VisitOffsetOfExpr(OffsetOfExpr *E) {
1517  // Visit the type into which we're computing an offset.
1518  if (Visit(E->getTypeSourceInfo()->getTypeLoc()))
1519    return true;
1520
1521  // Visit the components of the offsetof expression.
1522  for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) {
1523    typedef OffsetOfExpr::OffsetOfNode OffsetOfNode;
1524    const OffsetOfNode &Node = E->getComponent(I);
1525    switch (Node.getKind()) {
1526    case OffsetOfNode::Array:
1527      if (Visit(MakeCXCursor(E->getIndexExpr(Node.getArrayExprIndex()),
1528                             StmtParent, TU)))
1529        return true;
1530      break;
1531
1532    case OffsetOfNode::Field:
1533      if (Visit(MakeCursorMemberRef(Node.getField(), Node.getRange().getEnd(),
1534                                    TU)))
1535        return true;
1536      break;
1537
1538    case OffsetOfNode::Identifier:
1539    case OffsetOfNode::Base:
1540      continue;
1541    }
1542  }
1543
1544  return false;
1545}
1546
1547bool CursorVisitor::VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *E) {
1548  if (E->isArgumentType()) {
1549    if (TypeSourceInfo *TSInfo = E->getArgumentTypeInfo())
1550      return Visit(TSInfo->getTypeLoc());
1551
1552    return false;
1553  }
1554
1555  return VisitExpr(E);
1556}
1557
1558bool CursorVisitor::VisitExplicitCastExpr(ExplicitCastExpr *E) {
1559  if (TypeSourceInfo *TSInfo = E->getTypeInfoAsWritten())
1560    if (Visit(TSInfo->getTypeLoc()))
1561      return true;
1562
1563  return VisitCastExpr(E);
1564}
1565
1566bool CursorVisitor::VisitCompoundLiteralExpr(CompoundLiteralExpr *E) {
1567  if (TypeSourceInfo *TSInfo = E->getTypeSourceInfo())
1568    if (Visit(TSInfo->getTypeLoc()))
1569      return true;
1570
1571  return VisitExpr(E);
1572}
1573
1574bool CursorVisitor::VisitAddrLabelExpr(AddrLabelExpr *E) {
1575  return Visit(MakeCursorLabelRef(E->getLabel(), E->getLabelLoc(), TU));
1576}
1577
1578bool CursorVisitor::VisitTypesCompatibleExpr(TypesCompatibleExpr *E) {
1579  return Visit(E->getArgTInfo1()->getTypeLoc()) ||
1580         Visit(E->getArgTInfo2()->getTypeLoc());
1581}
1582
1583bool CursorVisitor::VisitVAArgExpr(VAArgExpr *E) {
1584  if (Visit(E->getWrittenTypeInfo()->getTypeLoc()))
1585    return true;
1586
1587  return Visit(MakeCXCursor(E->getSubExpr(), StmtParent, TU));
1588}
1589
1590bool CursorVisitor::VisitDesignatedInitExpr(DesignatedInitExpr *E) {
1591  // Visit the designators.
1592  typedef DesignatedInitExpr::Designator Designator;
1593  for (DesignatedInitExpr::designators_iterator D = E->designators_begin(),
1594                                             DEnd = E->designators_end();
1595       D != DEnd; ++D) {
1596    if (D->isFieldDesignator()) {
1597      if (FieldDecl *Field = D->getField())
1598        if (Visit(MakeCursorMemberRef(Field, D->getFieldLoc(), TU)))
1599          return true;
1600
1601      continue;
1602    }
1603
1604    if (D->isArrayDesignator()) {
1605      if (Visit(MakeCXCursor(E->getArrayIndex(*D), StmtParent, TU)))
1606        return true;
1607
1608      continue;
1609    }
1610
1611    assert(D->isArrayRangeDesignator() && "Unknown designator kind");
1612    if (Visit(MakeCXCursor(E->getArrayRangeStart(*D), StmtParent, TU)) ||
1613        Visit(MakeCXCursor(E->getArrayRangeEnd(*D), StmtParent, TU)))
1614      return true;
1615  }
1616
1617  // Visit the initializer value itself.
1618  return Visit(MakeCXCursor(E->getInit(), StmtParent, TU));
1619}
1620
1621bool CursorVisitor::VisitCXXTypeidExpr(CXXTypeidExpr *E) {
1622  if (E->isTypeOperand()) {
1623    if (TypeSourceInfo *TSInfo = E->getTypeOperandSourceInfo())
1624      return Visit(TSInfo->getTypeLoc());
1625
1626    return false;
1627  }
1628
1629  return VisitExpr(E);
1630}
1631
1632bool CursorVisitor::VisitCXXUuidofExpr(CXXUuidofExpr *E) {
1633  if (E->isTypeOperand()) {
1634    if (TypeSourceInfo *TSInfo = E->getTypeOperandSourceInfo())
1635      return Visit(TSInfo->getTypeLoc());
1636
1637    return false;
1638  }
1639
1640  return VisitExpr(E);
1641}
1642
1643bool CursorVisitor::VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *E) {
1644  if (TypeSourceInfo *TSInfo = E->getTypeSourceInfo())
1645    if (Visit(TSInfo->getTypeLoc()))
1646      return true;
1647
1648  return VisitExpr(E);
1649}
1650
1651bool CursorVisitor::VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *E) {
1652  if (TypeSourceInfo *TSInfo = E->getTypeSourceInfo())
1653    return Visit(TSInfo->getTypeLoc());
1654
1655  return false;
1656}
1657
1658bool CursorVisitor::VisitCXXNewExpr(CXXNewExpr *E) {
1659  // Visit placement arguments.
1660  for (unsigned I = 0, N = E->getNumPlacementArgs(); I != N; ++I)
1661    if (Visit(MakeCXCursor(E->getPlacementArg(I), StmtParent, TU)))
1662      return true;
1663
1664  // Visit the allocated type.
1665  if (TypeSourceInfo *TSInfo = E->getAllocatedTypeSourceInfo())
1666    if (Visit(TSInfo->getTypeLoc()))
1667      return true;
1668
1669  // Visit the array size, if any.
1670  if (E->isArray() && Visit(MakeCXCursor(E->getArraySize(), StmtParent, TU)))
1671    return true;
1672
1673  // Visit the initializer or constructor arguments.
1674  for (unsigned I = 0, N = E->getNumConstructorArgs(); I != N; ++I)
1675    if (Visit(MakeCXCursor(E->getConstructorArg(I), StmtParent, TU)))
1676      return true;
1677
1678  return false;
1679}
1680
1681bool CursorVisitor::VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E) {
1682  // Visit base expression.
1683  if (Visit(MakeCXCursor(E->getBase(), StmtParent, TU)))
1684    return true;
1685
1686  // Visit the nested-name-specifier.
1687  if (NestedNameSpecifier *Qualifier = E->getQualifier())
1688    if (VisitNestedNameSpecifier(Qualifier, E->getQualifierRange()))
1689      return true;
1690
1691  // Visit the scope type that looks disturbingly like the nested-name-specifier
1692  // but isn't.
1693  if (TypeSourceInfo *TSInfo = E->getScopeTypeInfo())
1694    if (Visit(TSInfo->getTypeLoc()))
1695      return true;
1696
1697  // Visit the name of the type being destroyed.
1698  if (TypeSourceInfo *TSInfo = E->getDestroyedTypeInfo())
1699    if (Visit(TSInfo->getTypeLoc()))
1700      return true;
1701
1702  return false;
1703}
1704
1705bool CursorVisitor::VisitUnaryTypeTraitExpr(UnaryTypeTraitExpr *E) {
1706  return Visit(E->getQueriedTypeSourceInfo()->getTypeLoc());
1707}
1708
1709bool CursorVisitor::VisitOverloadExpr(OverloadExpr *E) {
1710  // Visit the nested-name-specifier.
1711  if (NestedNameSpecifier *Qualifier = E->getQualifier())
1712    if (VisitNestedNameSpecifier(Qualifier, E->getQualifierRange()))
1713      return true;
1714
1715  // Visit the declaration name.
1716  if (VisitDeclarationNameInfo(E->getNameInfo()))
1717    return true;
1718
1719  // Visit the overloaded declaration reference.
1720  if (Visit(MakeCursorOverloadedDeclRef(E, TU)))
1721    return true;
1722
1723  // Visit the explicitly-specified template arguments.
1724  if (const ExplicitTemplateArgumentList *ArgList
1725                                      = E->getOptionalExplicitTemplateArgs()) {
1726    for (const TemplateArgumentLoc *Arg = ArgList->getTemplateArgs(),
1727                                *ArgEnd = Arg + ArgList->NumTemplateArgs;
1728         Arg != ArgEnd; ++Arg) {
1729      if (VisitTemplateArgumentLoc(*Arg))
1730        return true;
1731    }
1732  }
1733
1734  return false;
1735}
1736
1737bool CursorVisitor::VisitDependentScopeDeclRefExpr(
1738                                                DependentScopeDeclRefExpr *E) {
1739  // Visit the nested-name-specifier.
1740  if (NestedNameSpecifier *Qualifier = E->getQualifier())
1741    if (VisitNestedNameSpecifier(Qualifier, E->getQualifierRange()))
1742      return true;
1743
1744  // Visit the declaration name.
1745  if (VisitDeclarationNameInfo(E->getNameInfo()))
1746    return true;
1747
1748  // Visit the explicitly-specified template arguments.
1749  if (const ExplicitTemplateArgumentList *ArgList
1750      = E->getOptionalExplicitTemplateArgs()) {
1751    for (const TemplateArgumentLoc *Arg = ArgList->getTemplateArgs(),
1752         *ArgEnd = Arg + ArgList->NumTemplateArgs;
1753         Arg != ArgEnd; ++Arg) {
1754      if (VisitTemplateArgumentLoc(*Arg))
1755        return true;
1756    }
1757  }
1758
1759  return false;
1760}
1761
1762bool CursorVisitor::VisitCXXUnresolvedConstructExpr(
1763                                                CXXUnresolvedConstructExpr *E) {
1764  if (TypeSourceInfo *TSInfo = E->getTypeSourceInfo())
1765    if (Visit(TSInfo->getTypeLoc()))
1766      return true;
1767
1768  return VisitExpr(E);
1769}
1770
1771bool CursorVisitor::VisitCXXDependentScopeMemberExpr(
1772                                              CXXDependentScopeMemberExpr *E) {
1773  // Visit the base expression, if there is one.
1774  if (!E->isImplicitAccess() &&
1775      Visit(MakeCXCursor(E->getBase(), StmtParent, TU)))
1776    return true;
1777
1778  // Visit the nested-name-specifier.
1779  if (NestedNameSpecifier *Qualifier = E->getQualifier())
1780    if (VisitNestedNameSpecifier(Qualifier, E->getQualifierRange()))
1781      return true;
1782
1783  // Visit the declaration name.
1784  if (VisitDeclarationNameInfo(E->getMemberNameInfo()))
1785    return true;
1786
1787  // Visit the explicitly-specified template arguments.
1788  if (const ExplicitTemplateArgumentList *ArgList
1789      = E->getOptionalExplicitTemplateArgs()) {
1790    for (const TemplateArgumentLoc *Arg = ArgList->getTemplateArgs(),
1791         *ArgEnd = Arg + ArgList->NumTemplateArgs;
1792         Arg != ArgEnd; ++Arg) {
1793      if (VisitTemplateArgumentLoc(*Arg))
1794        return true;
1795    }
1796  }
1797
1798  return false;
1799}
1800
1801bool CursorVisitor::VisitUnresolvedMemberExpr(UnresolvedMemberExpr *E) {
1802  // Visit the base expression, if there is one.
1803  if (!E->isImplicitAccess() &&
1804      Visit(MakeCXCursor(E->getBase(), StmtParent, TU)))
1805    return true;
1806
1807  return VisitOverloadExpr(E);
1808}
1809
1810bool CursorVisitor::VisitObjCMessageExpr(ObjCMessageExpr *E) {
1811  if (TypeSourceInfo *TSInfo = E->getClassReceiverTypeInfo())
1812    if (Visit(TSInfo->getTypeLoc()))
1813      return true;
1814
1815  return VisitExpr(E);
1816}
1817
1818bool CursorVisitor::VisitObjCEncodeExpr(ObjCEncodeExpr *E) {
1819  return Visit(E->getEncodedTypeSourceInfo()->getTypeLoc());
1820}
1821
1822
1823bool CursorVisitor::VisitAttributes(Decl *D) {
1824  for (AttrVec::const_iterator i = D->attr_begin(), e = D->attr_end();
1825       i != e; ++i)
1826    if (Visit(MakeCXCursor(*i, D, TU)))
1827        return true;
1828
1829  return false;
1830}
1831
1832//===----------------------------------------------------------------------===//
1833// Data-recursive visitor methods.
1834//===----------------------------------------------------------------------===//
1835
1836static void EnqueueChildren(VisitorWorkList &WL, CXCursor Parent, Stmt *S) {
1837  unsigned size = WL.size();
1838  for (Stmt::child_iterator Child = S->child_begin(), ChildEnd = S->child_end();
1839       Child != ChildEnd; ++Child) {
1840    WLAddStmt(WL, Parent, *Child);
1841  }
1842  if (size == WL.size())
1843    return;
1844  // Now reverse the entries we just added.  This will match the DFS
1845  // ordering performed by the worklist.
1846  VisitorWorkList::iterator I = WL.begin() + size, E = WL.end();
1847  std::reverse(I, E);
1848}
1849
1850void CursorVisitor::EnqueueWorkList(VisitorWorkList &WL, Stmt *S) {
1851  CXCursor C = MakeCXCursor(S, StmtParent, TU);
1852  switch (S->getStmtClass()) {
1853    default:
1854      EnqueueChildren(WL, C, S);
1855      break;
1856    case Stmt::CXXOperatorCallExprClass: {
1857      CXXOperatorCallExpr *CE = cast<CXXOperatorCallExpr>(S);
1858      // Note that we enqueue things in reverse order so that
1859      // they are visited correctly by the DFS.
1860      for (unsigned I = 1, N = CE->getNumArgs(); I != N; ++I)
1861        WLAddStmt(WL, C, CE->getArg(N-I));
1862
1863      WLAddStmt(WL, C, CE->getCallee());
1864      WLAddStmt(WL, C, CE->getArg(0));
1865      break;
1866    }
1867    case Stmt::BinaryOperatorClass: {
1868      BinaryOperator *B = cast<BinaryOperator>(S);
1869      WLAddStmt(WL, C, B->getRHS());
1870      WLAddStmt(WL, C, B->getLHS());
1871      break;
1872    }
1873    case Stmt::ForStmtClass: {
1874      ForStmt *FS = cast<ForStmt>(S);
1875      WLAddStmt(WL, C, FS->getBody());
1876      WLAddStmt(WL, C, FS->getInc());
1877      WLAddStmt(WL, C, FS->getCond());
1878      WLAddDecl(WL, C, FS->getConditionVariable());
1879      WLAddStmt(WL, C, FS->getInit());
1880      break;
1881    }
1882    case Stmt::IfStmtClass: {
1883      IfStmt *If = cast<IfStmt>(S);
1884      WLAddStmt(WL, C, If->getElse());
1885      WLAddStmt(WL, C, If->getThen());
1886      WLAddStmt(WL, C, If->getCond());
1887      WLAddDecl(WL, C, If->getConditionVariable());
1888      break;
1889    }
1890    case Stmt::InitListExprClass: {
1891      InitListExpr *IE = cast<InitListExpr>(S);
1892      // We care about the syntactic form of the initializer list, only.
1893      if (InitListExpr *Syntactic = IE->getSyntacticForm())
1894        IE = Syntactic;
1895      EnqueueChildren(WL, C, IE);
1896      break;
1897    }
1898    case Stmt::MemberExprClass: {
1899      MemberExpr *M = cast<MemberExpr>(S);
1900      WL.push_back(MemberExprParts(M, C));
1901      WLAddStmt(WL, C, M->getBase());
1902      break;
1903    }
1904    case Stmt::ParenExprClass: {
1905      WLAddStmt(WL, C, cast<ParenExpr>(S)->getSubExpr());
1906      break;
1907    }
1908    case Stmt::SwitchStmtClass: {
1909      SwitchStmt *SS = cast<SwitchStmt>(S);
1910      WLAddStmt(WL, C, SS->getBody());
1911      WLAddStmt(WL, C, SS->getCond());
1912      WLAddDecl(WL, C, SS->getConditionVariable());
1913      break;
1914    }
1915    case Stmt::WhileStmtClass: {
1916      WhileStmt *W = cast<WhileStmt>(S);
1917      WLAddStmt(WL, C, W->getBody());
1918      WLAddStmt(WL, C, W->getCond());
1919      WLAddDecl(WL, C, W->getConditionVariable());
1920      break;
1921    }
1922  }
1923}
1924
1925bool CursorVisitor::IsInRegionOfInterest(CXCursor C) {
1926  if (RegionOfInterest.isValid()) {
1927    SourceRange Range = getRawCursorExtent(C);
1928    if (Range.isInvalid() || CompareRegionOfInterest(Range))
1929      return false;
1930  }
1931  return true;
1932}
1933
1934bool CursorVisitor::RunVisitorWorkList(VisitorWorkList &WL) {
1935  while (!WL.empty()) {
1936    // Dequeue the worklist item.
1937    VisitorJob LI = WL.back(); WL.pop_back();
1938
1939    // Set the Parent field, then back to its old value once we're done.
1940    SetParentRAII SetParent(Parent, StmtParent, LI.getParent());
1941
1942    switch (LI.getKind()) {
1943      case VisitorJob::DeclVisitKind: {
1944        Decl *D = cast<DeclVisit>(LI).get();
1945        if (!D)
1946          continue;
1947
1948        // For now, perform default visitation for Decls.
1949        if (Visit(MakeCXCursor(D, TU)))
1950            return true;
1951
1952        continue;
1953      }
1954      case VisitorJob::StmtVisitKind: {
1955        Stmt *S = cast<StmtVisit>(LI).get();
1956        if (!S)
1957          continue;
1958
1959        // Update the current cursor.
1960        CXCursor Cursor = MakeCXCursor(S, StmtParent, TU);
1961
1962        switch (S->getStmtClass()) {
1963          default: {
1964            // Perform default visitation for other cases.
1965            if (Visit(Cursor))
1966              return true;
1967            continue;
1968          }
1969          case Stmt::BinaryOperatorClass:
1970          case Stmt::CallExprClass:
1971          case Stmt::CaseStmtClass:
1972          case Stmt::CompoundStmtClass:
1973          case Stmt::CXXMemberCallExprClass:
1974          case Stmt::CXXOperatorCallExprClass:
1975          case Stmt::DefaultStmtClass:
1976          case Stmt::DoStmtClass:
1977          case Stmt::ForStmtClass:
1978          case Stmt::IfStmtClass:
1979          case Stmt::InitListExprClass:
1980          case Stmt::MemberExprClass:
1981          case Stmt::ParenExprClass:
1982          case Stmt::SwitchStmtClass:
1983          case Stmt::UnaryOperatorClass:
1984          case Stmt::WhileStmtClass:
1985          {
1986            if (!IsInRegionOfInterest(Cursor))
1987              continue;
1988            switch (Visitor(Cursor, Parent, ClientData)) {
1989              case CXChildVisit_Break:
1990                return true;
1991              case CXChildVisit_Continue:
1992                break;
1993              case CXChildVisit_Recurse:
1994                EnqueueWorkList(WL, S);
1995                break;
1996            }
1997          }
1998        }
1999        continue;
2000      }
2001      case VisitorJob::MemberExprPartsKind: {
2002        // Handle the other pieces in the MemberExpr besides the base.
2003        MemberExpr *M = cast<MemberExprParts>(LI).get();
2004
2005        // Visit the nested-name-specifier
2006        if (NestedNameSpecifier *Qualifier = M->getQualifier())
2007          if (VisitNestedNameSpecifier(Qualifier, M->getQualifierRange()))
2008            return true;
2009
2010        // Visit the declaration name.
2011        if (VisitDeclarationNameInfo(M->getMemberNameInfo()))
2012          return true;
2013
2014        // Visit the explicitly-specified template arguments, if any.
2015        if (M->hasExplicitTemplateArgs()) {
2016          for (const TemplateArgumentLoc *Arg = M->getTemplateArgs(),
2017               *ArgEnd = Arg + M->getNumTemplateArgs();
2018               Arg != ArgEnd; ++Arg) {
2019            if (VisitTemplateArgumentLoc(*Arg))
2020              return true;
2021          }
2022        }
2023        continue;
2024      }
2025    }
2026  }
2027  return false;
2028}
2029
2030bool CursorVisitor::VisitDataRecursive(Stmt *S) {
2031  VisitorWorkList WL;
2032  EnqueueWorkList(WL, S);
2033  return RunVisitorWorkList(WL);
2034}
2035
2036//===----------------------------------------------------------------------===//
2037// Misc. API hooks.
2038//===----------------------------------------------------------------------===//
2039
2040static llvm::sys::Mutex EnableMultithreadingMutex;
2041static bool EnabledMultithreading;
2042
2043extern "C" {
2044CXIndex clang_createIndex(int excludeDeclarationsFromPCH,
2045                          int displayDiagnostics) {
2046  // Disable pretty stack trace functionality, which will otherwise be a very
2047  // poor citizen of the world and set up all sorts of signal handlers.
2048  llvm::DisablePrettyStackTrace = true;
2049
2050  // We use crash recovery to make some of our APIs more reliable, implicitly
2051  // enable it.
2052  llvm::CrashRecoveryContext::Enable();
2053
2054  // Enable support for multithreading in LLVM.
2055  {
2056    llvm::sys::ScopedLock L(EnableMultithreadingMutex);
2057    if (!EnabledMultithreading) {
2058      llvm::llvm_start_multithreaded();
2059      EnabledMultithreading = true;
2060    }
2061  }
2062
2063  CIndexer *CIdxr = new CIndexer();
2064  if (excludeDeclarationsFromPCH)
2065    CIdxr->setOnlyLocalDecls();
2066  if (displayDiagnostics)
2067    CIdxr->setDisplayDiagnostics();
2068  return CIdxr;
2069}
2070
2071void clang_disposeIndex(CXIndex CIdx) {
2072  if (CIdx)
2073    delete static_cast<CIndexer *>(CIdx);
2074}
2075
2076CXTranslationUnit clang_createTranslationUnit(CXIndex CIdx,
2077                                              const char *ast_filename) {
2078  if (!CIdx)
2079    return 0;
2080
2081  CIndexer *CXXIdx = static_cast<CIndexer *>(CIdx);
2082  FileSystemOptions FileSystemOpts;
2083  FileSystemOpts.WorkingDir = CXXIdx->getWorkingDirectory();
2084
2085  llvm::IntrusiveRefCntPtr<Diagnostic> Diags;
2086  return ASTUnit::LoadFromASTFile(ast_filename, Diags, FileSystemOpts,
2087                                  CXXIdx->getOnlyLocalDecls(),
2088                                  0, 0, true);
2089}
2090
2091unsigned clang_defaultEditingTranslationUnitOptions() {
2092  return CXTranslationUnit_PrecompiledPreamble |
2093         CXTranslationUnit_CacheCompletionResults |
2094         CXTranslationUnit_CXXPrecompiledPreamble;
2095}
2096
2097CXTranslationUnit
2098clang_createTranslationUnitFromSourceFile(CXIndex CIdx,
2099                                          const char *source_filename,
2100                                          int num_command_line_args,
2101                                          const char * const *command_line_args,
2102                                          unsigned num_unsaved_files,
2103                                          struct CXUnsavedFile *unsaved_files) {
2104  return clang_parseTranslationUnit(CIdx, source_filename,
2105                                    command_line_args, num_command_line_args,
2106                                    unsaved_files, num_unsaved_files,
2107                                 CXTranslationUnit_DetailedPreprocessingRecord);
2108}
2109
2110struct ParseTranslationUnitInfo {
2111  CXIndex CIdx;
2112  const char *source_filename;
2113  const char *const *command_line_args;
2114  int num_command_line_args;
2115  struct CXUnsavedFile *unsaved_files;
2116  unsigned num_unsaved_files;
2117  unsigned options;
2118  CXTranslationUnit result;
2119};
2120static void clang_parseTranslationUnit_Impl(void *UserData) {
2121  ParseTranslationUnitInfo *PTUI =
2122    static_cast<ParseTranslationUnitInfo*>(UserData);
2123  CXIndex CIdx = PTUI->CIdx;
2124  const char *source_filename = PTUI->source_filename;
2125  const char * const *command_line_args = PTUI->command_line_args;
2126  int num_command_line_args = PTUI->num_command_line_args;
2127  struct CXUnsavedFile *unsaved_files = PTUI->unsaved_files;
2128  unsigned num_unsaved_files = PTUI->num_unsaved_files;
2129  unsigned options = PTUI->options;
2130  PTUI->result = 0;
2131
2132  if (!CIdx)
2133    return;
2134
2135  CIndexer *CXXIdx = static_cast<CIndexer *>(CIdx);
2136
2137  bool PrecompilePreamble = options & CXTranslationUnit_PrecompiledPreamble;
2138  bool CompleteTranslationUnit
2139    = ((options & CXTranslationUnit_Incomplete) == 0);
2140  bool CacheCodeCompetionResults
2141    = options & CXTranslationUnit_CacheCompletionResults;
2142  bool CXXPrecompilePreamble
2143    = options & CXTranslationUnit_CXXPrecompiledPreamble;
2144  bool CXXChainedPCH
2145    = options & CXTranslationUnit_CXXChainedPCH;
2146
2147  // Configure the diagnostics.
2148  DiagnosticOptions DiagOpts;
2149  llvm::IntrusiveRefCntPtr<Diagnostic> Diags;
2150  Diags = CompilerInstance::createDiagnostics(DiagOpts, 0, 0);
2151
2152  llvm::SmallVector<ASTUnit::RemappedFile, 4> RemappedFiles;
2153  for (unsigned I = 0; I != num_unsaved_files; ++I) {
2154    llvm::StringRef Data(unsaved_files[I].Contents, unsaved_files[I].Length);
2155    const llvm::MemoryBuffer *Buffer
2156      = llvm::MemoryBuffer::getMemBufferCopy(Data, unsaved_files[I].Filename);
2157    RemappedFiles.push_back(std::make_pair(unsaved_files[I].Filename,
2158                                           Buffer));
2159  }
2160
2161  llvm::SmallVector<const char *, 16> Args;
2162
2163  // The 'source_filename' argument is optional.  If the caller does not
2164  // specify it then it is assumed that the source file is specified
2165  // in the actual argument list.
2166  if (source_filename)
2167    Args.push_back(source_filename);
2168
2169  // Since the Clang C library is primarily used by batch tools dealing with
2170  // (often very broken) source code, where spell-checking can have a
2171  // significant negative impact on performance (particularly when
2172  // precompiled headers are involved), we disable it by default.
2173  // Only do this if we haven't found a spell-checking-related argument.
2174  bool FoundSpellCheckingArgument = false;
2175  for (int I = 0; I != num_command_line_args; ++I) {
2176    if (strcmp(command_line_args[I], "-fno-spell-checking") == 0 ||
2177        strcmp(command_line_args[I], "-fspell-checking") == 0) {
2178      FoundSpellCheckingArgument = true;
2179      break;
2180    }
2181  }
2182  if (!FoundSpellCheckingArgument)
2183    Args.push_back("-fno-spell-checking");
2184
2185  Args.insert(Args.end(), command_line_args,
2186              command_line_args + num_command_line_args);
2187
2188  // Do we need the detailed preprocessing record?
2189  if (options & CXTranslationUnit_DetailedPreprocessingRecord) {
2190    Args.push_back("-Xclang");
2191    Args.push_back("-detailed-preprocessing-record");
2192  }
2193
2194  unsigned NumErrors = Diags->getNumErrors();
2195  llvm::OwningPtr<ASTUnit> Unit(
2196    ASTUnit::LoadFromCommandLine(Args.data(), Args.data() + Args.size(),
2197                                 Diags,
2198                                 CXXIdx->getClangResourcesPath(),
2199                                 CXXIdx->getOnlyLocalDecls(),
2200                                 /*CaptureDiagnostics=*/true,
2201                                 RemappedFiles.data(),
2202                                 RemappedFiles.size(),
2203                                 PrecompilePreamble,
2204                                 CompleteTranslationUnit,
2205                                 CacheCodeCompetionResults,
2206                                 CXXPrecompilePreamble,
2207                                 CXXChainedPCH));
2208
2209  if (NumErrors != Diags->getNumErrors()) {
2210    // Make sure to check that 'Unit' is non-NULL.
2211    if (CXXIdx->getDisplayDiagnostics() && Unit.get()) {
2212      for (ASTUnit::stored_diag_iterator D = Unit->stored_diag_begin(),
2213                                      DEnd = Unit->stored_diag_end();
2214           D != DEnd; ++D) {
2215        CXStoredDiagnostic Diag(*D, Unit->getASTContext().getLangOptions());
2216        CXString Msg = clang_formatDiagnostic(&Diag,
2217                                    clang_defaultDiagnosticDisplayOptions());
2218        fprintf(stderr, "%s\n", clang_getCString(Msg));
2219        clang_disposeString(Msg);
2220      }
2221#ifdef LLVM_ON_WIN32
2222      // On Windows, force a flush, since there may be multiple copies of
2223      // stderr and stdout in the file system, all with different buffers
2224      // but writing to the same device.
2225      fflush(stderr);
2226#endif
2227    }
2228  }
2229
2230  PTUI->result = Unit.take();
2231}
2232CXTranslationUnit clang_parseTranslationUnit(CXIndex CIdx,
2233                                             const char *source_filename,
2234                                         const char * const *command_line_args,
2235                                             int num_command_line_args,
2236                                            struct CXUnsavedFile *unsaved_files,
2237                                             unsigned num_unsaved_files,
2238                                             unsigned options) {
2239  ParseTranslationUnitInfo PTUI = { CIdx, source_filename, command_line_args,
2240                                    num_command_line_args, unsaved_files,
2241                                    num_unsaved_files, options, 0 };
2242  llvm::CrashRecoveryContext CRC;
2243
2244  if (!RunSafely(CRC, clang_parseTranslationUnit_Impl, &PTUI)) {
2245    fprintf(stderr, "libclang: crash detected during parsing: {\n");
2246    fprintf(stderr, "  'source_filename' : '%s'\n", source_filename);
2247    fprintf(stderr, "  'command_line_args' : [");
2248    for (int i = 0; i != num_command_line_args; ++i) {
2249      if (i)
2250        fprintf(stderr, ", ");
2251      fprintf(stderr, "'%s'", command_line_args[i]);
2252    }
2253    fprintf(stderr, "],\n");
2254    fprintf(stderr, "  'unsaved_files' : [");
2255    for (unsigned i = 0; i != num_unsaved_files; ++i) {
2256      if (i)
2257        fprintf(stderr, ", ");
2258      fprintf(stderr, "('%s', '...', %ld)", unsaved_files[i].Filename,
2259              unsaved_files[i].Length);
2260    }
2261    fprintf(stderr, "],\n");
2262    fprintf(stderr, "  'options' : %d,\n", options);
2263    fprintf(stderr, "}\n");
2264
2265    return 0;
2266  }
2267
2268  return PTUI.result;
2269}
2270
2271unsigned clang_defaultSaveOptions(CXTranslationUnit TU) {
2272  return CXSaveTranslationUnit_None;
2273}
2274
2275int clang_saveTranslationUnit(CXTranslationUnit TU, const char *FileName,
2276                              unsigned options) {
2277  if (!TU)
2278    return 1;
2279
2280  return static_cast<ASTUnit *>(TU)->Save(FileName);
2281}
2282
2283void clang_disposeTranslationUnit(CXTranslationUnit CTUnit) {
2284  if (CTUnit) {
2285    // If the translation unit has been marked as unsafe to free, just discard
2286    // it.
2287    if (static_cast<ASTUnit *>(CTUnit)->isUnsafeToFree())
2288      return;
2289
2290    delete static_cast<ASTUnit *>(CTUnit);
2291  }
2292}
2293
2294unsigned clang_defaultReparseOptions(CXTranslationUnit TU) {
2295  return CXReparse_None;
2296}
2297
2298struct ReparseTranslationUnitInfo {
2299  CXTranslationUnit TU;
2300  unsigned num_unsaved_files;
2301  struct CXUnsavedFile *unsaved_files;
2302  unsigned options;
2303  int result;
2304};
2305
2306static void clang_reparseTranslationUnit_Impl(void *UserData) {
2307  ReparseTranslationUnitInfo *RTUI =
2308    static_cast<ReparseTranslationUnitInfo*>(UserData);
2309  CXTranslationUnit TU = RTUI->TU;
2310  unsigned num_unsaved_files = RTUI->num_unsaved_files;
2311  struct CXUnsavedFile *unsaved_files = RTUI->unsaved_files;
2312  unsigned options = RTUI->options;
2313  (void) options;
2314  RTUI->result = 1;
2315
2316  if (!TU)
2317    return;
2318
2319  ASTUnit *CXXUnit = static_cast<ASTUnit *>(TU);
2320  ASTUnit::ConcurrencyCheck Check(*CXXUnit);
2321
2322  llvm::SmallVector<ASTUnit::RemappedFile, 4> RemappedFiles;
2323  for (unsigned I = 0; I != num_unsaved_files; ++I) {
2324    llvm::StringRef Data(unsaved_files[I].Contents, unsaved_files[I].Length);
2325    const llvm::MemoryBuffer *Buffer
2326      = llvm::MemoryBuffer::getMemBufferCopy(Data, unsaved_files[I].Filename);
2327    RemappedFiles.push_back(std::make_pair(unsaved_files[I].Filename,
2328                                           Buffer));
2329  }
2330
2331  if (!CXXUnit->Reparse(RemappedFiles.data(), RemappedFiles.size()))
2332    RTUI->result = 0;
2333}
2334
2335int clang_reparseTranslationUnit(CXTranslationUnit TU,
2336                                 unsigned num_unsaved_files,
2337                                 struct CXUnsavedFile *unsaved_files,
2338                                 unsigned options) {
2339  ReparseTranslationUnitInfo RTUI = { TU, num_unsaved_files, unsaved_files,
2340                                      options, 0 };
2341  llvm::CrashRecoveryContext CRC;
2342
2343  if (!RunSafely(CRC, clang_reparseTranslationUnit_Impl, &RTUI)) {
2344    fprintf(stderr, "libclang: crash detected during reparsing\n");
2345    static_cast<ASTUnit *>(TU)->setUnsafeToFree(true);
2346    return 1;
2347  }
2348
2349
2350  return RTUI.result;
2351}
2352
2353
2354CXString clang_getTranslationUnitSpelling(CXTranslationUnit CTUnit) {
2355  if (!CTUnit)
2356    return createCXString("");
2357
2358  ASTUnit *CXXUnit = static_cast<ASTUnit *>(CTUnit);
2359  return createCXString(CXXUnit->getOriginalSourceFileName(), true);
2360}
2361
2362CXCursor clang_getTranslationUnitCursor(CXTranslationUnit TU) {
2363  CXCursor Result = { CXCursor_TranslationUnit, { 0, 0, TU } };
2364  return Result;
2365}
2366
2367} // end: extern "C"
2368
2369//===----------------------------------------------------------------------===//
2370// CXSourceLocation and CXSourceRange Operations.
2371//===----------------------------------------------------------------------===//
2372
2373extern "C" {
2374CXSourceLocation clang_getNullLocation() {
2375  CXSourceLocation Result = { { 0, 0 }, 0 };
2376  return Result;
2377}
2378
2379unsigned clang_equalLocations(CXSourceLocation loc1, CXSourceLocation loc2) {
2380  return (loc1.ptr_data[0] == loc2.ptr_data[0] &&
2381          loc1.ptr_data[1] == loc2.ptr_data[1] &&
2382          loc1.int_data == loc2.int_data);
2383}
2384
2385CXSourceLocation clang_getLocation(CXTranslationUnit tu,
2386                                   CXFile file,
2387                                   unsigned line,
2388                                   unsigned column) {
2389  if (!tu || !file)
2390    return clang_getNullLocation();
2391
2392  ASTUnit *CXXUnit = static_cast<ASTUnit *>(tu);
2393  SourceLocation SLoc
2394    = CXXUnit->getSourceManager().getLocation(
2395                                        static_cast<const FileEntry *>(file),
2396                                              line, column);
2397  if (SLoc.isInvalid()) return clang_getNullLocation();
2398
2399  return cxloc::translateSourceLocation(CXXUnit->getASTContext(), SLoc);
2400}
2401
2402CXSourceLocation clang_getLocationForOffset(CXTranslationUnit tu,
2403                                            CXFile file,
2404                                            unsigned offset) {
2405  if (!tu || !file)
2406    return clang_getNullLocation();
2407
2408  ASTUnit *CXXUnit = static_cast<ASTUnit *>(tu);
2409  SourceLocation Start
2410    = CXXUnit->getSourceManager().getLocation(
2411                                        static_cast<const FileEntry *>(file),
2412                                              1, 1);
2413  if (Start.isInvalid()) return clang_getNullLocation();
2414
2415  SourceLocation SLoc = Start.getFileLocWithOffset(offset);
2416
2417  if (SLoc.isInvalid()) return clang_getNullLocation();
2418
2419  return cxloc::translateSourceLocation(CXXUnit->getASTContext(), SLoc);
2420}
2421
2422CXSourceRange clang_getNullRange() {
2423  CXSourceRange Result = { { 0, 0 }, 0, 0 };
2424  return Result;
2425}
2426
2427CXSourceRange clang_getRange(CXSourceLocation begin, CXSourceLocation end) {
2428  if (begin.ptr_data[0] != end.ptr_data[0] ||
2429      begin.ptr_data[1] != end.ptr_data[1])
2430    return clang_getNullRange();
2431
2432  CXSourceRange Result = { { begin.ptr_data[0], begin.ptr_data[1] },
2433                           begin.int_data, end.int_data };
2434  return Result;
2435}
2436
2437void clang_getInstantiationLocation(CXSourceLocation location,
2438                                    CXFile *file,
2439                                    unsigned *line,
2440                                    unsigned *column,
2441                                    unsigned *offset) {
2442  SourceLocation Loc = SourceLocation::getFromRawEncoding(location.int_data);
2443
2444  if (!location.ptr_data[0] || Loc.isInvalid()) {
2445    if (file)
2446      *file = 0;
2447    if (line)
2448      *line = 0;
2449    if (column)
2450      *column = 0;
2451    if (offset)
2452      *offset = 0;
2453    return;
2454  }
2455
2456  const SourceManager &SM =
2457    *static_cast<const SourceManager*>(location.ptr_data[0]);
2458  SourceLocation InstLoc = SM.getInstantiationLoc(Loc);
2459
2460  if (file)
2461    *file = (void *)SM.getFileEntryForID(SM.getFileID(InstLoc));
2462  if (line)
2463    *line = SM.getInstantiationLineNumber(InstLoc);
2464  if (column)
2465    *column = SM.getInstantiationColumnNumber(InstLoc);
2466  if (offset)
2467    *offset = SM.getDecomposedLoc(InstLoc).second;
2468}
2469
2470void clang_getSpellingLocation(CXSourceLocation location,
2471                               CXFile *file,
2472                               unsigned *line,
2473                               unsigned *column,
2474                               unsigned *offset) {
2475  SourceLocation Loc = SourceLocation::getFromRawEncoding(location.int_data);
2476
2477  if (!location.ptr_data[0] || Loc.isInvalid()) {
2478    if (file)
2479      *file = 0;
2480    if (line)
2481      *line = 0;
2482    if (column)
2483      *column = 0;
2484    if (offset)
2485      *offset = 0;
2486    return;
2487  }
2488
2489  const SourceManager &SM =
2490    *static_cast<const SourceManager*>(location.ptr_data[0]);
2491  SourceLocation SpellLoc = Loc;
2492  if (SpellLoc.isMacroID()) {
2493    SourceLocation SimpleSpellingLoc = SM.getImmediateSpellingLoc(SpellLoc);
2494    if (SimpleSpellingLoc.isFileID() &&
2495        SM.getFileEntryForID(SM.getDecomposedLoc(SimpleSpellingLoc).first))
2496      SpellLoc = SimpleSpellingLoc;
2497    else
2498      SpellLoc = SM.getInstantiationLoc(SpellLoc);
2499  }
2500
2501  std::pair<FileID, unsigned> LocInfo = SM.getDecomposedLoc(SpellLoc);
2502  FileID FID = LocInfo.first;
2503  unsigned FileOffset = LocInfo.second;
2504
2505  if (file)
2506    *file = (void *)SM.getFileEntryForID(FID);
2507  if (line)
2508    *line = SM.getLineNumber(FID, FileOffset);
2509  if (column)
2510    *column = SM.getColumnNumber(FID, FileOffset);
2511  if (offset)
2512    *offset = FileOffset;
2513}
2514
2515CXSourceLocation clang_getRangeStart(CXSourceRange range) {
2516  CXSourceLocation Result = { { range.ptr_data[0], range.ptr_data[1] },
2517                              range.begin_int_data };
2518  return Result;
2519}
2520
2521CXSourceLocation clang_getRangeEnd(CXSourceRange range) {
2522  CXSourceLocation Result = { { range.ptr_data[0], range.ptr_data[1] },
2523                              range.end_int_data };
2524  return Result;
2525}
2526
2527} // end: extern "C"
2528
2529//===----------------------------------------------------------------------===//
2530// CXFile Operations.
2531//===----------------------------------------------------------------------===//
2532
2533extern "C" {
2534CXString clang_getFileName(CXFile SFile) {
2535  if (!SFile)
2536    return createCXString(NULL);
2537
2538  FileEntry *FEnt = static_cast<FileEntry *>(SFile);
2539  return createCXString(FEnt->getName());
2540}
2541
2542time_t clang_getFileTime(CXFile SFile) {
2543  if (!SFile)
2544    return 0;
2545
2546  FileEntry *FEnt = static_cast<FileEntry *>(SFile);
2547  return FEnt->getModificationTime();
2548}
2549
2550CXFile clang_getFile(CXTranslationUnit tu, const char *file_name) {
2551  if (!tu)
2552    return 0;
2553
2554  ASTUnit *CXXUnit = static_cast<ASTUnit *>(tu);
2555
2556  FileManager &FMgr = CXXUnit->getFileManager();
2557  const FileEntry *File = FMgr.getFile(file_name, file_name+strlen(file_name),
2558                                       CXXUnit->getFileSystemOpts());
2559  return const_cast<FileEntry *>(File);
2560}
2561
2562} // end: extern "C"
2563
2564//===----------------------------------------------------------------------===//
2565// CXCursor Operations.
2566//===----------------------------------------------------------------------===//
2567
2568static Decl *getDeclFromExpr(Stmt *E) {
2569  if (CastExpr *CE = dyn_cast<CastExpr>(E))
2570    return getDeclFromExpr(CE->getSubExpr());
2571
2572  if (DeclRefExpr *RefExpr = dyn_cast<DeclRefExpr>(E))
2573    return RefExpr->getDecl();
2574  if (BlockDeclRefExpr *RefExpr = dyn_cast<BlockDeclRefExpr>(E))
2575    return RefExpr->getDecl();
2576  if (MemberExpr *ME = dyn_cast<MemberExpr>(E))
2577    return ME->getMemberDecl();
2578  if (ObjCIvarRefExpr *RE = dyn_cast<ObjCIvarRefExpr>(E))
2579    return RE->getDecl();
2580  if (ObjCPropertyRefExpr *PRE = dyn_cast<ObjCPropertyRefExpr>(E))
2581    return PRE->getProperty();
2582
2583  if (CallExpr *CE = dyn_cast<CallExpr>(E))
2584    return getDeclFromExpr(CE->getCallee());
2585  if (CXXConstructExpr *CE = llvm::dyn_cast<CXXConstructExpr>(E))
2586    if (!CE->isElidable())
2587    return CE->getConstructor();
2588  if (ObjCMessageExpr *OME = dyn_cast<ObjCMessageExpr>(E))
2589    return OME->getMethodDecl();
2590
2591  if (ObjCProtocolExpr *PE = dyn_cast<ObjCProtocolExpr>(E))
2592    return PE->getProtocol();
2593
2594  return 0;
2595}
2596
2597static SourceLocation getLocationFromExpr(Expr *E) {
2598  if (ObjCMessageExpr *Msg = dyn_cast<ObjCMessageExpr>(E))
2599    return /*FIXME:*/Msg->getLeftLoc();
2600  if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E))
2601    return DRE->getLocation();
2602  if (BlockDeclRefExpr *RefExpr = dyn_cast<BlockDeclRefExpr>(E))
2603    return RefExpr->getLocation();
2604  if (MemberExpr *Member = dyn_cast<MemberExpr>(E))
2605    return Member->getMemberLoc();
2606  if (ObjCIvarRefExpr *Ivar = dyn_cast<ObjCIvarRefExpr>(E))
2607    return Ivar->getLocation();
2608  return E->getLocStart();
2609}
2610
2611extern "C" {
2612
2613unsigned clang_visitChildren(CXCursor parent,
2614                             CXCursorVisitor visitor,
2615                             CXClientData client_data) {
2616  ASTUnit *CXXUnit = getCursorASTUnit(parent);
2617
2618  CursorVisitor CursorVis(CXXUnit, visitor, client_data,
2619                          CXXUnit->getMaxPCHLevel());
2620  return CursorVis.VisitChildren(parent);
2621}
2622
2623#ifndef __has_feature
2624#define __has_feature(x) 0
2625#endif
2626#if __has_feature(blocks)
2627typedef enum CXChildVisitResult
2628     (^CXCursorVisitorBlock)(CXCursor cursor, CXCursor parent);
2629
2630static enum CXChildVisitResult visitWithBlock(CXCursor cursor, CXCursor parent,
2631    CXClientData client_data) {
2632  CXCursorVisitorBlock block = (CXCursorVisitorBlock)client_data;
2633  return block(cursor, parent);
2634}
2635#else
2636// If we are compiled with a compiler that doesn't have native blocks support,
2637// define and call the block manually, so the
2638typedef struct _CXChildVisitResult
2639{
2640	void *isa;
2641	int flags;
2642	int reserved;
2643	enum CXChildVisitResult(*invoke)(struct _CXChildVisitResult*, CXCursor,
2644                                         CXCursor);
2645} *CXCursorVisitorBlock;
2646
2647static enum CXChildVisitResult visitWithBlock(CXCursor cursor, CXCursor parent,
2648    CXClientData client_data) {
2649  CXCursorVisitorBlock block = (CXCursorVisitorBlock)client_data;
2650  return block->invoke(block, cursor, parent);
2651}
2652#endif
2653
2654
2655unsigned clang_visitChildrenWithBlock(CXCursor parent,
2656                                      CXCursorVisitorBlock block) {
2657  return clang_visitChildren(parent, visitWithBlock, block);
2658}
2659
2660static CXString getDeclSpelling(Decl *D) {
2661  NamedDecl *ND = dyn_cast_or_null<NamedDecl>(D);
2662  if (!ND)
2663    return createCXString("");
2664
2665  if (ObjCMethodDecl *OMD = dyn_cast<ObjCMethodDecl>(ND))
2666    return createCXString(OMD->getSelector().getAsString());
2667
2668  if (ObjCCategoryImplDecl *CIMP = dyn_cast<ObjCCategoryImplDecl>(ND))
2669    // No, this isn't the same as the code below. getIdentifier() is non-virtual
2670    // and returns different names. NamedDecl returns the class name and
2671    // ObjCCategoryImplDecl returns the category name.
2672    return createCXString(CIMP->getIdentifier()->getNameStart());
2673
2674  if (isa<UsingDirectiveDecl>(D))
2675    return createCXString("");
2676
2677  llvm::SmallString<1024> S;
2678  llvm::raw_svector_ostream os(S);
2679  ND->printName(os);
2680
2681  return createCXString(os.str());
2682}
2683
2684CXString clang_getCursorSpelling(CXCursor C) {
2685  if (clang_isTranslationUnit(C.kind))
2686    return clang_getTranslationUnitSpelling(C.data[2]);
2687
2688  if (clang_isReference(C.kind)) {
2689    switch (C.kind) {
2690    case CXCursor_ObjCSuperClassRef: {
2691      ObjCInterfaceDecl *Super = getCursorObjCSuperClassRef(C).first;
2692      return createCXString(Super->getIdentifier()->getNameStart());
2693    }
2694    case CXCursor_ObjCClassRef: {
2695      ObjCInterfaceDecl *Class = getCursorObjCClassRef(C).first;
2696      return createCXString(Class->getIdentifier()->getNameStart());
2697    }
2698    case CXCursor_ObjCProtocolRef: {
2699      ObjCProtocolDecl *OID = getCursorObjCProtocolRef(C).first;
2700      assert(OID && "getCursorSpelling(): Missing protocol decl");
2701      return createCXString(OID->getIdentifier()->getNameStart());
2702    }
2703    case CXCursor_CXXBaseSpecifier: {
2704      CXXBaseSpecifier *B = getCursorCXXBaseSpecifier(C);
2705      return createCXString(B->getType().getAsString());
2706    }
2707    case CXCursor_TypeRef: {
2708      TypeDecl *Type = getCursorTypeRef(C).first;
2709      assert(Type && "Missing type decl");
2710
2711      return createCXString(getCursorContext(C).getTypeDeclType(Type).
2712                              getAsString());
2713    }
2714    case CXCursor_TemplateRef: {
2715      TemplateDecl *Template = getCursorTemplateRef(C).first;
2716      assert(Template && "Missing template decl");
2717
2718      return createCXString(Template->getNameAsString());
2719    }
2720
2721    case CXCursor_NamespaceRef: {
2722      NamedDecl *NS = getCursorNamespaceRef(C).first;
2723      assert(NS && "Missing namespace decl");
2724
2725      return createCXString(NS->getNameAsString());
2726    }
2727
2728    case CXCursor_MemberRef: {
2729      FieldDecl *Field = getCursorMemberRef(C).first;
2730      assert(Field && "Missing member decl");
2731
2732      return createCXString(Field->getNameAsString());
2733    }
2734
2735    case CXCursor_LabelRef: {
2736      LabelStmt *Label = getCursorLabelRef(C).first;
2737      assert(Label && "Missing label");
2738
2739      return createCXString(Label->getID()->getName());
2740    }
2741
2742    case CXCursor_OverloadedDeclRef: {
2743      OverloadedDeclRefStorage Storage = getCursorOverloadedDeclRef(C).first;
2744      if (Decl *D = Storage.dyn_cast<Decl *>()) {
2745        if (NamedDecl *ND = dyn_cast<NamedDecl>(D))
2746          return createCXString(ND->getNameAsString());
2747        return createCXString("");
2748      }
2749      if (OverloadExpr *E = Storage.dyn_cast<OverloadExpr *>())
2750        return createCXString(E->getName().getAsString());
2751      OverloadedTemplateStorage *Ovl
2752        = Storage.get<OverloadedTemplateStorage*>();
2753      if (Ovl->size() == 0)
2754        return createCXString("");
2755      return createCXString((*Ovl->begin())->getNameAsString());
2756    }
2757
2758    default:
2759      return createCXString("<not implemented>");
2760    }
2761  }
2762
2763  if (clang_isExpression(C.kind)) {
2764    Decl *D = getDeclFromExpr(getCursorExpr(C));
2765    if (D)
2766      return getDeclSpelling(D);
2767    return createCXString("");
2768  }
2769
2770  if (clang_isStatement(C.kind)) {
2771    Stmt *S = getCursorStmt(C);
2772    if (LabelStmt *Label = dyn_cast_or_null<LabelStmt>(S))
2773      return createCXString(Label->getID()->getName());
2774
2775    return createCXString("");
2776  }
2777
2778  if (C.kind == CXCursor_MacroInstantiation)
2779    return createCXString(getCursorMacroInstantiation(C)->getName()
2780                                                           ->getNameStart());
2781
2782  if (C.kind == CXCursor_MacroDefinition)
2783    return createCXString(getCursorMacroDefinition(C)->getName()
2784                                                           ->getNameStart());
2785
2786  if (C.kind == CXCursor_InclusionDirective)
2787    return createCXString(getCursorInclusionDirective(C)->getFileName());
2788
2789  if (clang_isDeclaration(C.kind))
2790    return getDeclSpelling(getCursorDecl(C));
2791
2792  return createCXString("");
2793}
2794
2795CXString clang_getCursorDisplayName(CXCursor C) {
2796  if (!clang_isDeclaration(C.kind))
2797    return clang_getCursorSpelling(C);
2798
2799  Decl *D = getCursorDecl(C);
2800  if (!D)
2801    return createCXString("");
2802
2803  PrintingPolicy &Policy = getCursorContext(C).PrintingPolicy;
2804  if (FunctionTemplateDecl *FunTmpl = dyn_cast<FunctionTemplateDecl>(D))
2805    D = FunTmpl->getTemplatedDecl();
2806
2807  if (FunctionDecl *Function = dyn_cast<FunctionDecl>(D)) {
2808    llvm::SmallString<64> Str;
2809    llvm::raw_svector_ostream OS(Str);
2810    OS << Function->getNameAsString();
2811    if (Function->getPrimaryTemplate())
2812      OS << "<>";
2813    OS << "(";
2814    for (unsigned I = 0, N = Function->getNumParams(); I != N; ++I) {
2815      if (I)
2816        OS << ", ";
2817      OS << Function->getParamDecl(I)->getType().getAsString(Policy);
2818    }
2819
2820    if (Function->isVariadic()) {
2821      if (Function->getNumParams())
2822        OS << ", ";
2823      OS << "...";
2824    }
2825    OS << ")";
2826    return createCXString(OS.str());
2827  }
2828
2829  if (ClassTemplateDecl *ClassTemplate = dyn_cast<ClassTemplateDecl>(D)) {
2830    llvm::SmallString<64> Str;
2831    llvm::raw_svector_ostream OS(Str);
2832    OS << ClassTemplate->getNameAsString();
2833    OS << "<";
2834    TemplateParameterList *Params = ClassTemplate->getTemplateParameters();
2835    for (unsigned I = 0, N = Params->size(); I != N; ++I) {
2836      if (I)
2837        OS << ", ";
2838
2839      NamedDecl *Param = Params->getParam(I);
2840      if (Param->getIdentifier()) {
2841        OS << Param->getIdentifier()->getName();
2842        continue;
2843      }
2844
2845      // There is no parameter name, which makes this tricky. Try to come up
2846      // with something useful that isn't too long.
2847      if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(Param))
2848        OS << (TTP->wasDeclaredWithTypename()? "typename" : "class");
2849      else if (NonTypeTemplateParmDecl *NTTP
2850                                    = dyn_cast<NonTypeTemplateParmDecl>(Param))
2851        OS << NTTP->getType().getAsString(Policy);
2852      else
2853        OS << "template<...> class";
2854    }
2855
2856    OS << ">";
2857    return createCXString(OS.str());
2858  }
2859
2860  if (ClassTemplateSpecializationDecl *ClassSpec
2861                              = dyn_cast<ClassTemplateSpecializationDecl>(D)) {
2862    // If the type was explicitly written, use that.
2863    if (TypeSourceInfo *TSInfo = ClassSpec->getTypeAsWritten())
2864      return createCXString(TSInfo->getType().getAsString(Policy));
2865
2866    llvm::SmallString<64> Str;
2867    llvm::raw_svector_ostream OS(Str);
2868    OS << ClassSpec->getNameAsString();
2869    OS << TemplateSpecializationType::PrintTemplateArgumentList(
2870                                      ClassSpec->getTemplateArgs().data(),
2871                                      ClassSpec->getTemplateArgs().size(),
2872                                                                Policy);
2873    return createCXString(OS.str());
2874  }
2875
2876  return clang_getCursorSpelling(C);
2877}
2878
2879CXString clang_getCursorKindSpelling(enum CXCursorKind Kind) {
2880  switch (Kind) {
2881  case CXCursor_FunctionDecl:
2882      return createCXString("FunctionDecl");
2883  case CXCursor_TypedefDecl:
2884      return createCXString("TypedefDecl");
2885  case CXCursor_EnumDecl:
2886      return createCXString("EnumDecl");
2887  case CXCursor_EnumConstantDecl:
2888      return createCXString("EnumConstantDecl");
2889  case CXCursor_StructDecl:
2890      return createCXString("StructDecl");
2891  case CXCursor_UnionDecl:
2892      return createCXString("UnionDecl");
2893  case CXCursor_ClassDecl:
2894      return createCXString("ClassDecl");
2895  case CXCursor_FieldDecl:
2896      return createCXString("FieldDecl");
2897  case CXCursor_VarDecl:
2898      return createCXString("VarDecl");
2899  case CXCursor_ParmDecl:
2900      return createCXString("ParmDecl");
2901  case CXCursor_ObjCInterfaceDecl:
2902      return createCXString("ObjCInterfaceDecl");
2903  case CXCursor_ObjCCategoryDecl:
2904      return createCXString("ObjCCategoryDecl");
2905  case CXCursor_ObjCProtocolDecl:
2906      return createCXString("ObjCProtocolDecl");
2907  case CXCursor_ObjCPropertyDecl:
2908      return createCXString("ObjCPropertyDecl");
2909  case CXCursor_ObjCIvarDecl:
2910      return createCXString("ObjCIvarDecl");
2911  case CXCursor_ObjCInstanceMethodDecl:
2912      return createCXString("ObjCInstanceMethodDecl");
2913  case CXCursor_ObjCClassMethodDecl:
2914      return createCXString("ObjCClassMethodDecl");
2915  case CXCursor_ObjCImplementationDecl:
2916      return createCXString("ObjCImplementationDecl");
2917  case CXCursor_ObjCCategoryImplDecl:
2918      return createCXString("ObjCCategoryImplDecl");
2919  case CXCursor_CXXMethod:
2920      return createCXString("CXXMethod");
2921  case CXCursor_UnexposedDecl:
2922      return createCXString("UnexposedDecl");
2923  case CXCursor_ObjCSuperClassRef:
2924      return createCXString("ObjCSuperClassRef");
2925  case CXCursor_ObjCProtocolRef:
2926      return createCXString("ObjCProtocolRef");
2927  case CXCursor_ObjCClassRef:
2928      return createCXString("ObjCClassRef");
2929  case CXCursor_TypeRef:
2930      return createCXString("TypeRef");
2931  case CXCursor_TemplateRef:
2932      return createCXString("TemplateRef");
2933  case CXCursor_NamespaceRef:
2934    return createCXString("NamespaceRef");
2935  case CXCursor_MemberRef:
2936    return createCXString("MemberRef");
2937  case CXCursor_LabelRef:
2938    return createCXString("LabelRef");
2939  case CXCursor_OverloadedDeclRef:
2940    return createCXString("OverloadedDeclRef");
2941  case CXCursor_UnexposedExpr:
2942      return createCXString("UnexposedExpr");
2943  case CXCursor_BlockExpr:
2944      return createCXString("BlockExpr");
2945  case CXCursor_DeclRefExpr:
2946      return createCXString("DeclRefExpr");
2947  case CXCursor_MemberRefExpr:
2948      return createCXString("MemberRefExpr");
2949  case CXCursor_CallExpr:
2950      return createCXString("CallExpr");
2951  case CXCursor_ObjCMessageExpr:
2952      return createCXString("ObjCMessageExpr");
2953  case CXCursor_UnexposedStmt:
2954      return createCXString("UnexposedStmt");
2955  case CXCursor_LabelStmt:
2956      return createCXString("LabelStmt");
2957  case CXCursor_InvalidFile:
2958      return createCXString("InvalidFile");
2959  case CXCursor_InvalidCode:
2960    return createCXString("InvalidCode");
2961  case CXCursor_NoDeclFound:
2962      return createCXString("NoDeclFound");
2963  case CXCursor_NotImplemented:
2964      return createCXString("NotImplemented");
2965  case CXCursor_TranslationUnit:
2966      return createCXString("TranslationUnit");
2967  case CXCursor_UnexposedAttr:
2968      return createCXString("UnexposedAttr");
2969  case CXCursor_IBActionAttr:
2970      return createCXString("attribute(ibaction)");
2971  case CXCursor_IBOutletAttr:
2972     return createCXString("attribute(iboutlet)");
2973  case CXCursor_IBOutletCollectionAttr:
2974      return createCXString("attribute(iboutletcollection)");
2975  case CXCursor_PreprocessingDirective:
2976    return createCXString("preprocessing directive");
2977  case CXCursor_MacroDefinition:
2978    return createCXString("macro definition");
2979  case CXCursor_MacroInstantiation:
2980    return createCXString("macro instantiation");
2981  case CXCursor_InclusionDirective:
2982    return createCXString("inclusion directive");
2983  case CXCursor_Namespace:
2984    return createCXString("Namespace");
2985  case CXCursor_LinkageSpec:
2986    return createCXString("LinkageSpec");
2987  case CXCursor_CXXBaseSpecifier:
2988    return createCXString("C++ base class specifier");
2989  case CXCursor_Constructor:
2990    return createCXString("CXXConstructor");
2991  case CXCursor_Destructor:
2992    return createCXString("CXXDestructor");
2993  case CXCursor_ConversionFunction:
2994    return createCXString("CXXConversion");
2995  case CXCursor_TemplateTypeParameter:
2996    return createCXString("TemplateTypeParameter");
2997  case CXCursor_NonTypeTemplateParameter:
2998    return createCXString("NonTypeTemplateParameter");
2999  case CXCursor_TemplateTemplateParameter:
3000    return createCXString("TemplateTemplateParameter");
3001  case CXCursor_FunctionTemplate:
3002    return createCXString("FunctionTemplate");
3003  case CXCursor_ClassTemplate:
3004    return createCXString("ClassTemplate");
3005  case CXCursor_ClassTemplatePartialSpecialization:
3006    return createCXString("ClassTemplatePartialSpecialization");
3007  case CXCursor_NamespaceAlias:
3008    return createCXString("NamespaceAlias");
3009  case CXCursor_UsingDirective:
3010    return createCXString("UsingDirective");
3011  case CXCursor_UsingDeclaration:
3012    return createCXString("UsingDeclaration");
3013  }
3014
3015  llvm_unreachable("Unhandled CXCursorKind");
3016  return createCXString(NULL);
3017}
3018
3019enum CXChildVisitResult GetCursorVisitor(CXCursor cursor,
3020                                         CXCursor parent,
3021                                         CXClientData client_data) {
3022  CXCursor *BestCursor = static_cast<CXCursor *>(client_data);
3023
3024  // If our current best cursor is the construction of a temporary object,
3025  // don't replace that cursor with a type reference, because we want
3026  // clang_getCursor() to point at the constructor.
3027  if (clang_isExpression(BestCursor->kind) &&
3028      isa<CXXTemporaryObjectExpr>(getCursorExpr(*BestCursor)) &&
3029      cursor.kind == CXCursor_TypeRef)
3030    return CXChildVisit_Recurse;
3031
3032  *BestCursor = cursor;
3033  return CXChildVisit_Recurse;
3034}
3035
3036CXCursor clang_getCursor(CXTranslationUnit TU, CXSourceLocation Loc) {
3037  if (!TU)
3038    return clang_getNullCursor();
3039
3040  ASTUnit *CXXUnit = static_cast<ASTUnit *>(TU);
3041  ASTUnit::ConcurrencyCheck Check(*CXXUnit);
3042
3043  // Translate the given source location to make it point at the beginning of
3044  // the token under the cursor.
3045  SourceLocation SLoc = cxloc::translateSourceLocation(Loc);
3046
3047  // Guard against an invalid SourceLocation, or we may assert in one
3048  // of the following calls.
3049  if (SLoc.isInvalid())
3050    return clang_getNullCursor();
3051
3052  bool Logging = getenv("LIBCLANG_LOGGING");
3053  SLoc = Lexer::GetBeginningOfToken(SLoc, CXXUnit->getSourceManager(),
3054                                    CXXUnit->getASTContext().getLangOptions());
3055
3056  CXCursor Result = MakeCXCursorInvalid(CXCursor_NoDeclFound);
3057  if (SLoc.isValid()) {
3058    // FIXME: Would be great to have a "hint" cursor, then walk from that
3059    // hint cursor upward until we find a cursor whose source range encloses
3060    // the region of interest, rather than starting from the translation unit.
3061    CXCursor Parent = clang_getTranslationUnitCursor(CXXUnit);
3062    CursorVisitor CursorVis(CXXUnit, GetCursorVisitor, &Result,
3063                            Decl::MaxPCHLevel, SourceLocation(SLoc));
3064    CursorVis.VisitChildren(Parent);
3065  }
3066
3067  if (Logging) {
3068    CXFile SearchFile;
3069    unsigned SearchLine, SearchColumn;
3070    CXFile ResultFile;
3071    unsigned ResultLine, ResultColumn;
3072    CXString SearchFileName, ResultFileName, KindSpelling;
3073    CXSourceLocation ResultLoc = clang_getCursorLocation(Result);
3074
3075    clang_getInstantiationLocation(Loc, &SearchFile, &SearchLine, &SearchColumn,
3076                                   0);
3077    clang_getInstantiationLocation(ResultLoc, &ResultFile, &ResultLine,
3078                                   &ResultColumn, 0);
3079    SearchFileName = clang_getFileName(SearchFile);
3080    ResultFileName = clang_getFileName(ResultFile);
3081    KindSpelling = clang_getCursorKindSpelling(Result.kind);
3082    fprintf(stderr, "clang_getCursor(%s:%d:%d) = %s(%s:%d:%d)\n",
3083            clang_getCString(SearchFileName), SearchLine, SearchColumn,
3084            clang_getCString(KindSpelling),
3085            clang_getCString(ResultFileName), ResultLine, ResultColumn);
3086    clang_disposeString(SearchFileName);
3087    clang_disposeString(ResultFileName);
3088    clang_disposeString(KindSpelling);
3089  }
3090
3091  return Result;
3092}
3093
3094CXCursor clang_getNullCursor(void) {
3095  return MakeCXCursorInvalid(CXCursor_InvalidFile);
3096}
3097
3098unsigned clang_equalCursors(CXCursor X, CXCursor Y) {
3099  return X == Y;
3100}
3101
3102unsigned clang_isInvalid(enum CXCursorKind K) {
3103  return K >= CXCursor_FirstInvalid && K <= CXCursor_LastInvalid;
3104}
3105
3106unsigned clang_isDeclaration(enum CXCursorKind K) {
3107  return K >= CXCursor_FirstDecl && K <= CXCursor_LastDecl;
3108}
3109
3110unsigned clang_isReference(enum CXCursorKind K) {
3111  return K >= CXCursor_FirstRef && K <= CXCursor_LastRef;
3112}
3113
3114unsigned clang_isExpression(enum CXCursorKind K) {
3115  return K >= CXCursor_FirstExpr && K <= CXCursor_LastExpr;
3116}
3117
3118unsigned clang_isStatement(enum CXCursorKind K) {
3119  return K >= CXCursor_FirstStmt && K <= CXCursor_LastStmt;
3120}
3121
3122unsigned clang_isTranslationUnit(enum CXCursorKind K) {
3123  return K == CXCursor_TranslationUnit;
3124}
3125
3126unsigned clang_isPreprocessing(enum CXCursorKind K) {
3127  return K >= CXCursor_FirstPreprocessing && K <= CXCursor_LastPreprocessing;
3128}
3129
3130unsigned clang_isUnexposed(enum CXCursorKind K) {
3131  switch (K) {
3132    case CXCursor_UnexposedDecl:
3133    case CXCursor_UnexposedExpr:
3134    case CXCursor_UnexposedStmt:
3135    case CXCursor_UnexposedAttr:
3136      return true;
3137    default:
3138      return false;
3139  }
3140}
3141
3142CXCursorKind clang_getCursorKind(CXCursor C) {
3143  return C.kind;
3144}
3145
3146CXSourceLocation clang_getCursorLocation(CXCursor C) {
3147  if (clang_isReference(C.kind)) {
3148    switch (C.kind) {
3149    case CXCursor_ObjCSuperClassRef: {
3150      std::pair<ObjCInterfaceDecl *, SourceLocation> P
3151        = getCursorObjCSuperClassRef(C);
3152      return cxloc::translateSourceLocation(P.first->getASTContext(), P.second);
3153    }
3154
3155    case CXCursor_ObjCProtocolRef: {
3156      std::pair<ObjCProtocolDecl *, SourceLocation> P
3157        = getCursorObjCProtocolRef(C);
3158      return cxloc::translateSourceLocation(P.first->getASTContext(), P.second);
3159    }
3160
3161    case CXCursor_ObjCClassRef: {
3162      std::pair<ObjCInterfaceDecl *, SourceLocation> P
3163        = getCursorObjCClassRef(C);
3164      return cxloc::translateSourceLocation(P.first->getASTContext(), P.second);
3165    }
3166
3167    case CXCursor_TypeRef: {
3168      std::pair<TypeDecl *, SourceLocation> P = getCursorTypeRef(C);
3169      return cxloc::translateSourceLocation(P.first->getASTContext(), P.second);
3170    }
3171
3172    case CXCursor_TemplateRef: {
3173      std::pair<TemplateDecl *, SourceLocation> P = getCursorTemplateRef(C);
3174      return cxloc::translateSourceLocation(P.first->getASTContext(), P.second);
3175    }
3176
3177    case CXCursor_NamespaceRef: {
3178      std::pair<NamedDecl *, SourceLocation> P = getCursorNamespaceRef(C);
3179      return cxloc::translateSourceLocation(P.first->getASTContext(), P.second);
3180    }
3181
3182    case CXCursor_MemberRef: {
3183      std::pair<FieldDecl *, SourceLocation> P = getCursorMemberRef(C);
3184      return cxloc::translateSourceLocation(P.first->getASTContext(), P.second);
3185    }
3186
3187    case CXCursor_CXXBaseSpecifier: {
3188      CXXBaseSpecifier *BaseSpec = getCursorCXXBaseSpecifier(C);
3189      if (!BaseSpec)
3190        return clang_getNullLocation();
3191
3192      if (TypeSourceInfo *TSInfo = BaseSpec->getTypeSourceInfo())
3193        return cxloc::translateSourceLocation(getCursorContext(C),
3194                                            TSInfo->getTypeLoc().getBeginLoc());
3195
3196      return cxloc::translateSourceLocation(getCursorContext(C),
3197                                        BaseSpec->getSourceRange().getBegin());
3198    }
3199
3200    case CXCursor_LabelRef: {
3201      std::pair<LabelStmt *, SourceLocation> P = getCursorLabelRef(C);
3202      return cxloc::translateSourceLocation(getCursorContext(C), P.second);
3203    }
3204
3205    case CXCursor_OverloadedDeclRef:
3206      return cxloc::translateSourceLocation(getCursorContext(C),
3207                                          getCursorOverloadedDeclRef(C).second);
3208
3209    default:
3210      // FIXME: Need a way to enumerate all non-reference cases.
3211      llvm_unreachable("Missed a reference kind");
3212    }
3213  }
3214
3215  if (clang_isExpression(C.kind))
3216    return cxloc::translateSourceLocation(getCursorContext(C),
3217                                   getLocationFromExpr(getCursorExpr(C)));
3218
3219  if (clang_isStatement(C.kind))
3220    return cxloc::translateSourceLocation(getCursorContext(C),
3221                                          getCursorStmt(C)->getLocStart());
3222
3223  if (C.kind == CXCursor_PreprocessingDirective) {
3224    SourceLocation L = cxcursor::getCursorPreprocessingDirective(C).getBegin();
3225    return cxloc::translateSourceLocation(getCursorContext(C), L);
3226  }
3227
3228  if (C.kind == CXCursor_MacroInstantiation) {
3229    SourceLocation L
3230      = cxcursor::getCursorMacroInstantiation(C)->getSourceRange().getBegin();
3231    return cxloc::translateSourceLocation(getCursorContext(C), L);
3232  }
3233
3234  if (C.kind == CXCursor_MacroDefinition) {
3235    SourceLocation L = cxcursor::getCursorMacroDefinition(C)->getLocation();
3236    return cxloc::translateSourceLocation(getCursorContext(C), L);
3237  }
3238
3239  if (C.kind == CXCursor_InclusionDirective) {
3240    SourceLocation L
3241      = cxcursor::getCursorInclusionDirective(C)->getSourceRange().getBegin();
3242    return cxloc::translateSourceLocation(getCursorContext(C), L);
3243  }
3244
3245  if (C.kind < CXCursor_FirstDecl || C.kind > CXCursor_LastDecl)
3246    return clang_getNullLocation();
3247
3248  Decl *D = getCursorDecl(C);
3249  SourceLocation Loc = D->getLocation();
3250  if (ObjCInterfaceDecl *Class = dyn_cast<ObjCInterfaceDecl>(D))
3251    Loc = Class->getClassLoc();
3252  // FIXME: Multiple variables declared in a single declaration
3253  // currently lack the information needed to correctly determine their
3254  // ranges when accounting for the type-specifier.  We use context
3255  // stored in the CXCursor to determine if the VarDecl is in a DeclGroup,
3256  // and if so, whether it is the first decl.
3257  if (VarDecl *VD = dyn_cast<VarDecl>(D)) {
3258    if (!cxcursor::isFirstInDeclGroup(C))
3259      Loc = VD->getLocation();
3260  }
3261
3262  return cxloc::translateSourceLocation(getCursorContext(C), Loc);
3263}
3264
3265} // end extern "C"
3266
3267static SourceRange getRawCursorExtent(CXCursor C) {
3268  if (clang_isReference(C.kind)) {
3269    switch (C.kind) {
3270    case CXCursor_ObjCSuperClassRef:
3271      return  getCursorObjCSuperClassRef(C).second;
3272
3273    case CXCursor_ObjCProtocolRef:
3274      return getCursorObjCProtocolRef(C).second;
3275
3276    case CXCursor_ObjCClassRef:
3277      return getCursorObjCClassRef(C).second;
3278
3279    case CXCursor_TypeRef:
3280      return getCursorTypeRef(C).second;
3281
3282    case CXCursor_TemplateRef:
3283      return getCursorTemplateRef(C).second;
3284
3285    case CXCursor_NamespaceRef:
3286      return getCursorNamespaceRef(C).second;
3287
3288    case CXCursor_MemberRef:
3289      return getCursorMemberRef(C).second;
3290
3291    case CXCursor_CXXBaseSpecifier:
3292      return getCursorCXXBaseSpecifier(C)->getSourceRange();
3293
3294    case CXCursor_LabelRef:
3295      return getCursorLabelRef(C).second;
3296
3297    case CXCursor_OverloadedDeclRef:
3298      return getCursorOverloadedDeclRef(C).second;
3299
3300    default:
3301      // FIXME: Need a way to enumerate all non-reference cases.
3302      llvm_unreachable("Missed a reference kind");
3303    }
3304  }
3305
3306  if (clang_isExpression(C.kind))
3307    return getCursorExpr(C)->getSourceRange();
3308
3309  if (clang_isStatement(C.kind))
3310    return getCursorStmt(C)->getSourceRange();
3311
3312  if (C.kind == CXCursor_PreprocessingDirective)
3313    return cxcursor::getCursorPreprocessingDirective(C);
3314
3315  if (C.kind == CXCursor_MacroInstantiation)
3316    return cxcursor::getCursorMacroInstantiation(C)->getSourceRange();
3317
3318  if (C.kind == CXCursor_MacroDefinition)
3319    return cxcursor::getCursorMacroDefinition(C)->getSourceRange();
3320
3321  if (C.kind == CXCursor_InclusionDirective)
3322    return cxcursor::getCursorInclusionDirective(C)->getSourceRange();
3323
3324  if (C.kind >= CXCursor_FirstDecl && C.kind <= CXCursor_LastDecl) {
3325    Decl *D = cxcursor::getCursorDecl(C);
3326    SourceRange R = D->getSourceRange();
3327    // FIXME: Multiple variables declared in a single declaration
3328    // currently lack the information needed to correctly determine their
3329    // ranges when accounting for the type-specifier.  We use context
3330    // stored in the CXCursor to determine if the VarDecl is in a DeclGroup,
3331    // and if so, whether it is the first decl.
3332    if (VarDecl *VD = dyn_cast<VarDecl>(D)) {
3333      if (!cxcursor::isFirstInDeclGroup(C))
3334        R.setBegin(VD->getLocation());
3335    }
3336    return R;
3337  }
3338  return SourceRange();}
3339
3340extern "C" {
3341
3342CXSourceRange clang_getCursorExtent(CXCursor C) {
3343  SourceRange R = getRawCursorExtent(C);
3344  if (R.isInvalid())
3345    return clang_getNullRange();
3346
3347  return cxloc::translateSourceRange(getCursorContext(C), R);
3348}
3349
3350CXCursor clang_getCursorReferenced(CXCursor C) {
3351  if (clang_isInvalid(C.kind))
3352    return clang_getNullCursor();
3353
3354  ASTUnit *CXXUnit = getCursorASTUnit(C);
3355  if (clang_isDeclaration(C.kind)) {
3356    Decl *D = getCursorDecl(C);
3357    if (UsingDecl *Using = dyn_cast<UsingDecl>(D))
3358      return MakeCursorOverloadedDeclRef(Using, D->getLocation(), CXXUnit);
3359    if (ObjCClassDecl *Classes = dyn_cast<ObjCClassDecl>(D))
3360      return MakeCursorOverloadedDeclRef(Classes, D->getLocation(), CXXUnit);
3361    if (ObjCForwardProtocolDecl *Protocols
3362                                        = dyn_cast<ObjCForwardProtocolDecl>(D))
3363      return MakeCursorOverloadedDeclRef(Protocols, D->getLocation(), CXXUnit);
3364
3365    return C;
3366  }
3367
3368  if (clang_isExpression(C.kind)) {
3369    Expr *E = getCursorExpr(C);
3370    Decl *D = getDeclFromExpr(E);
3371    if (D)
3372      return MakeCXCursor(D, CXXUnit);
3373
3374    if (OverloadExpr *Ovl = dyn_cast_or_null<OverloadExpr>(E))
3375      return MakeCursorOverloadedDeclRef(Ovl, CXXUnit);
3376
3377    return clang_getNullCursor();
3378  }
3379
3380  if (clang_isStatement(C.kind)) {
3381    Stmt *S = getCursorStmt(C);
3382    if (GotoStmt *Goto = dyn_cast_or_null<GotoStmt>(S))
3383      return MakeCXCursor(Goto->getLabel(), getCursorDecl(C),
3384                          getCursorASTUnit(C));
3385
3386    return clang_getNullCursor();
3387  }
3388
3389  if (C.kind == CXCursor_MacroInstantiation) {
3390    if (MacroDefinition *Def = getCursorMacroInstantiation(C)->getDefinition())
3391      return MakeMacroDefinitionCursor(Def, CXXUnit);
3392  }
3393
3394  if (!clang_isReference(C.kind))
3395    return clang_getNullCursor();
3396
3397  switch (C.kind) {
3398    case CXCursor_ObjCSuperClassRef:
3399      return MakeCXCursor(getCursorObjCSuperClassRef(C).first, CXXUnit);
3400
3401    case CXCursor_ObjCProtocolRef: {
3402      return MakeCXCursor(getCursorObjCProtocolRef(C).first, CXXUnit);
3403
3404    case CXCursor_ObjCClassRef:
3405      return MakeCXCursor(getCursorObjCClassRef(C).first, CXXUnit);
3406
3407    case CXCursor_TypeRef:
3408      return MakeCXCursor(getCursorTypeRef(C).first, CXXUnit);
3409
3410    case CXCursor_TemplateRef:
3411      return MakeCXCursor(getCursorTemplateRef(C).first, CXXUnit);
3412
3413    case CXCursor_NamespaceRef:
3414      return MakeCXCursor(getCursorNamespaceRef(C).first, CXXUnit);
3415
3416    case CXCursor_MemberRef:
3417      return MakeCXCursor(getCursorMemberRef(C).first, CXXUnit);
3418
3419    case CXCursor_CXXBaseSpecifier: {
3420      CXXBaseSpecifier *B = cxcursor::getCursorCXXBaseSpecifier(C);
3421      return clang_getTypeDeclaration(cxtype::MakeCXType(B->getType(),
3422                                                         CXXUnit));
3423    }
3424
3425    case CXCursor_LabelRef:
3426      // FIXME: We end up faking the "parent" declaration here because we
3427      // don't want to make CXCursor larger.
3428      return MakeCXCursor(getCursorLabelRef(C).first,
3429                          CXXUnit->getASTContext().getTranslationUnitDecl(),
3430                          CXXUnit);
3431
3432    case CXCursor_OverloadedDeclRef:
3433      return C;
3434
3435    default:
3436      // We would prefer to enumerate all non-reference cursor kinds here.
3437      llvm_unreachable("Unhandled reference cursor kind");
3438      break;
3439    }
3440  }
3441
3442  return clang_getNullCursor();
3443}
3444
3445CXCursor clang_getCursorDefinition(CXCursor C) {
3446  if (clang_isInvalid(C.kind))
3447    return clang_getNullCursor();
3448
3449  ASTUnit *CXXUnit = getCursorASTUnit(C);
3450
3451  bool WasReference = false;
3452  if (clang_isReference(C.kind) || clang_isExpression(C.kind)) {
3453    C = clang_getCursorReferenced(C);
3454    WasReference = true;
3455  }
3456
3457  if (C.kind == CXCursor_MacroInstantiation)
3458    return clang_getCursorReferenced(C);
3459
3460  if (!clang_isDeclaration(C.kind))
3461    return clang_getNullCursor();
3462
3463  Decl *D = getCursorDecl(C);
3464  if (!D)
3465    return clang_getNullCursor();
3466
3467  switch (D->getKind()) {
3468  // Declaration kinds that don't really separate the notions of
3469  // declaration and definition.
3470  case Decl::Namespace:
3471  case Decl::Typedef:
3472  case Decl::TemplateTypeParm:
3473  case Decl::EnumConstant:
3474  case Decl::Field:
3475  case Decl::ObjCIvar:
3476  case Decl::ObjCAtDefsField:
3477  case Decl::ImplicitParam:
3478  case Decl::ParmVar:
3479  case Decl::NonTypeTemplateParm:
3480  case Decl::TemplateTemplateParm:
3481  case Decl::ObjCCategoryImpl:
3482  case Decl::ObjCImplementation:
3483  case Decl::AccessSpec:
3484  case Decl::LinkageSpec:
3485  case Decl::ObjCPropertyImpl:
3486  case Decl::FileScopeAsm:
3487  case Decl::StaticAssert:
3488  case Decl::Block:
3489    return C;
3490
3491  // Declaration kinds that don't make any sense here, but are
3492  // nonetheless harmless.
3493  case Decl::TranslationUnit:
3494    break;
3495
3496  // Declaration kinds for which the definition is not resolvable.
3497  case Decl::UnresolvedUsingTypename:
3498  case Decl::UnresolvedUsingValue:
3499    break;
3500
3501  case Decl::UsingDirective:
3502    return MakeCXCursor(cast<UsingDirectiveDecl>(D)->getNominatedNamespace(),
3503                        CXXUnit);
3504
3505  case Decl::NamespaceAlias:
3506    return MakeCXCursor(cast<NamespaceAliasDecl>(D)->getNamespace(), CXXUnit);
3507
3508  case Decl::Enum:
3509  case Decl::Record:
3510  case Decl::CXXRecord:
3511  case Decl::ClassTemplateSpecialization:
3512  case Decl::ClassTemplatePartialSpecialization:
3513    if (TagDecl *Def = cast<TagDecl>(D)->getDefinition())
3514      return MakeCXCursor(Def, CXXUnit);
3515    return clang_getNullCursor();
3516
3517  case Decl::Function:
3518  case Decl::CXXMethod:
3519  case Decl::CXXConstructor:
3520  case Decl::CXXDestructor:
3521  case Decl::CXXConversion: {
3522    const FunctionDecl *Def = 0;
3523    if (cast<FunctionDecl>(D)->getBody(Def))
3524      return MakeCXCursor(const_cast<FunctionDecl *>(Def), CXXUnit);
3525    return clang_getNullCursor();
3526  }
3527
3528  case Decl::Var: {
3529    // Ask the variable if it has a definition.
3530    if (VarDecl *Def = cast<VarDecl>(D)->getDefinition())
3531      return MakeCXCursor(Def, CXXUnit);
3532    return clang_getNullCursor();
3533  }
3534
3535  case Decl::FunctionTemplate: {
3536    const FunctionDecl *Def = 0;
3537    if (cast<FunctionTemplateDecl>(D)->getTemplatedDecl()->getBody(Def))
3538      return MakeCXCursor(Def->getDescribedFunctionTemplate(), CXXUnit);
3539    return clang_getNullCursor();
3540  }
3541
3542  case Decl::ClassTemplate: {
3543    if (RecordDecl *Def = cast<ClassTemplateDecl>(D)->getTemplatedDecl()
3544                                                            ->getDefinition())
3545      return MakeCXCursor(cast<CXXRecordDecl>(Def)->getDescribedClassTemplate(),
3546                          CXXUnit);
3547    return clang_getNullCursor();
3548  }
3549
3550  case Decl::Using:
3551    return MakeCursorOverloadedDeclRef(cast<UsingDecl>(D),
3552                                       D->getLocation(), CXXUnit);
3553
3554  case Decl::UsingShadow:
3555    return clang_getCursorDefinition(
3556                       MakeCXCursor(cast<UsingShadowDecl>(D)->getTargetDecl(),
3557                                    CXXUnit));
3558
3559  case Decl::ObjCMethod: {
3560    ObjCMethodDecl *Method = cast<ObjCMethodDecl>(D);
3561    if (Method->isThisDeclarationADefinition())
3562      return C;
3563
3564    // Dig out the method definition in the associated
3565    // @implementation, if we have it.
3566    // FIXME: The ASTs should make finding the definition easier.
3567    if (ObjCInterfaceDecl *Class
3568                       = dyn_cast<ObjCInterfaceDecl>(Method->getDeclContext()))
3569      if (ObjCImplementationDecl *ClassImpl = Class->getImplementation())
3570        if (ObjCMethodDecl *Def = ClassImpl->getMethod(Method->getSelector(),
3571                                                  Method->isInstanceMethod()))
3572          if (Def->isThisDeclarationADefinition())
3573            return MakeCXCursor(Def, CXXUnit);
3574
3575    return clang_getNullCursor();
3576  }
3577
3578  case Decl::ObjCCategory:
3579    if (ObjCCategoryImplDecl *Impl
3580                               = cast<ObjCCategoryDecl>(D)->getImplementation())
3581      return MakeCXCursor(Impl, CXXUnit);
3582    return clang_getNullCursor();
3583
3584  case Decl::ObjCProtocol:
3585    if (!cast<ObjCProtocolDecl>(D)->isForwardDecl())
3586      return C;
3587    return clang_getNullCursor();
3588
3589  case Decl::ObjCInterface:
3590    // There are two notions of a "definition" for an Objective-C
3591    // class: the interface and its implementation. When we resolved a
3592    // reference to an Objective-C class, produce the @interface as
3593    // the definition; when we were provided with the interface,
3594    // produce the @implementation as the definition.
3595    if (WasReference) {
3596      if (!cast<ObjCInterfaceDecl>(D)->isForwardDecl())
3597        return C;
3598    } else if (ObjCImplementationDecl *Impl
3599                              = cast<ObjCInterfaceDecl>(D)->getImplementation())
3600      return MakeCXCursor(Impl, CXXUnit);
3601    return clang_getNullCursor();
3602
3603  case Decl::ObjCProperty:
3604    // FIXME: We don't really know where to find the
3605    // ObjCPropertyImplDecls that implement this property.
3606    return clang_getNullCursor();
3607
3608  case Decl::ObjCCompatibleAlias:
3609    if (ObjCInterfaceDecl *Class
3610          = cast<ObjCCompatibleAliasDecl>(D)->getClassInterface())
3611      if (!Class->isForwardDecl())
3612        return MakeCXCursor(Class, CXXUnit);
3613
3614    return clang_getNullCursor();
3615
3616  case Decl::ObjCForwardProtocol:
3617    return MakeCursorOverloadedDeclRef(cast<ObjCForwardProtocolDecl>(D),
3618                                       D->getLocation(), CXXUnit);
3619
3620  case Decl::ObjCClass:
3621    return MakeCursorOverloadedDeclRef(cast<ObjCClassDecl>(D), D->getLocation(),
3622                                       CXXUnit);
3623
3624  case Decl::Friend:
3625    if (NamedDecl *Friend = cast<FriendDecl>(D)->getFriendDecl())
3626      return clang_getCursorDefinition(MakeCXCursor(Friend, CXXUnit));
3627    return clang_getNullCursor();
3628
3629  case Decl::FriendTemplate:
3630    if (NamedDecl *Friend = cast<FriendTemplateDecl>(D)->getFriendDecl())
3631      return clang_getCursorDefinition(MakeCXCursor(Friend, CXXUnit));
3632    return clang_getNullCursor();
3633  }
3634
3635  return clang_getNullCursor();
3636}
3637
3638unsigned clang_isCursorDefinition(CXCursor C) {
3639  if (!clang_isDeclaration(C.kind))
3640    return 0;
3641
3642  return clang_getCursorDefinition(C) == C;
3643}
3644
3645unsigned clang_getNumOverloadedDecls(CXCursor C) {
3646  if (C.kind != CXCursor_OverloadedDeclRef)
3647    return 0;
3648
3649  OverloadedDeclRefStorage Storage = getCursorOverloadedDeclRef(C).first;
3650  if (OverloadExpr *E = Storage.dyn_cast<OverloadExpr *>())
3651    return E->getNumDecls();
3652
3653  if (OverloadedTemplateStorage *S
3654                              = Storage.dyn_cast<OverloadedTemplateStorage*>())
3655    return S->size();
3656
3657  Decl *D = Storage.get<Decl*>();
3658  if (UsingDecl *Using = dyn_cast<UsingDecl>(D))
3659    return Using->shadow_size();
3660  if (ObjCClassDecl *Classes = dyn_cast<ObjCClassDecl>(D))
3661    return Classes->size();
3662  if (ObjCForwardProtocolDecl *Protocols =dyn_cast<ObjCForwardProtocolDecl>(D))
3663    return Protocols->protocol_size();
3664
3665  return 0;
3666}
3667
3668CXCursor clang_getOverloadedDecl(CXCursor cursor, unsigned index) {
3669  if (cursor.kind != CXCursor_OverloadedDeclRef)
3670    return clang_getNullCursor();
3671
3672  if (index >= clang_getNumOverloadedDecls(cursor))
3673    return clang_getNullCursor();
3674
3675  ASTUnit *Unit = getCursorASTUnit(cursor);
3676  OverloadedDeclRefStorage Storage = getCursorOverloadedDeclRef(cursor).first;
3677  if (OverloadExpr *E = Storage.dyn_cast<OverloadExpr *>())
3678    return MakeCXCursor(E->decls_begin()[index], Unit);
3679
3680  if (OverloadedTemplateStorage *S
3681                              = Storage.dyn_cast<OverloadedTemplateStorage*>())
3682    return MakeCXCursor(S->begin()[index], Unit);
3683
3684  Decl *D = Storage.get<Decl*>();
3685  if (UsingDecl *Using = dyn_cast<UsingDecl>(D)) {
3686    // FIXME: This is, unfortunately, linear time.
3687    UsingDecl::shadow_iterator Pos = Using->shadow_begin();
3688    std::advance(Pos, index);
3689    return MakeCXCursor(cast<UsingShadowDecl>(*Pos)->getTargetDecl(), Unit);
3690  }
3691
3692  if (ObjCClassDecl *Classes = dyn_cast<ObjCClassDecl>(D))
3693    return MakeCXCursor(Classes->begin()[index].getInterface(), Unit);
3694
3695  if (ObjCForwardProtocolDecl *Protocols = dyn_cast<ObjCForwardProtocolDecl>(D))
3696    return MakeCXCursor(Protocols->protocol_begin()[index], Unit);
3697
3698  return clang_getNullCursor();
3699}
3700
3701void clang_getDefinitionSpellingAndExtent(CXCursor C,
3702                                          const char **startBuf,
3703                                          const char **endBuf,
3704                                          unsigned *startLine,
3705                                          unsigned *startColumn,
3706                                          unsigned *endLine,
3707                                          unsigned *endColumn) {
3708  assert(getCursorDecl(C) && "CXCursor has null decl");
3709  NamedDecl *ND = static_cast<NamedDecl *>(getCursorDecl(C));
3710  FunctionDecl *FD = dyn_cast<FunctionDecl>(ND);
3711  CompoundStmt *Body = dyn_cast<CompoundStmt>(FD->getBody());
3712
3713  SourceManager &SM = FD->getASTContext().getSourceManager();
3714  *startBuf = SM.getCharacterData(Body->getLBracLoc());
3715  *endBuf = SM.getCharacterData(Body->getRBracLoc());
3716  *startLine = SM.getSpellingLineNumber(Body->getLBracLoc());
3717  *startColumn = SM.getSpellingColumnNumber(Body->getLBracLoc());
3718  *endLine = SM.getSpellingLineNumber(Body->getRBracLoc());
3719  *endColumn = SM.getSpellingColumnNumber(Body->getRBracLoc());
3720}
3721
3722void clang_enableStackTraces(void) {
3723  llvm::sys::PrintStackTraceOnErrorSignal();
3724}
3725
3726void clang_executeOnThread(void (*fn)(void*), void *user_data,
3727                           unsigned stack_size) {
3728  llvm::llvm_execute_on_thread(fn, user_data, stack_size);
3729}
3730
3731} // end: extern "C"
3732
3733//===----------------------------------------------------------------------===//
3734// Token-based Operations.
3735//===----------------------------------------------------------------------===//
3736
3737/* CXToken layout:
3738 *   int_data[0]: a CXTokenKind
3739 *   int_data[1]: starting token location
3740 *   int_data[2]: token length
3741 *   int_data[3]: reserved
3742 *   ptr_data: for identifiers and keywords, an IdentifierInfo*.
3743 *   otherwise unused.
3744 */
3745extern "C" {
3746
3747CXTokenKind clang_getTokenKind(CXToken CXTok) {
3748  return static_cast<CXTokenKind>(CXTok.int_data[0]);
3749}
3750
3751CXString clang_getTokenSpelling(CXTranslationUnit TU, CXToken CXTok) {
3752  switch (clang_getTokenKind(CXTok)) {
3753  case CXToken_Identifier:
3754  case CXToken_Keyword:
3755    // We know we have an IdentifierInfo*, so use that.
3756    return createCXString(static_cast<IdentifierInfo *>(CXTok.ptr_data)
3757                            ->getNameStart());
3758
3759  case CXToken_Literal: {
3760    // We have stashed the starting pointer in the ptr_data field. Use it.
3761    const char *Text = static_cast<const char *>(CXTok.ptr_data);
3762    return createCXString(llvm::StringRef(Text, CXTok.int_data[2]));
3763  }
3764
3765  case CXToken_Punctuation:
3766  case CXToken_Comment:
3767    break;
3768  }
3769
3770  // We have to find the starting buffer pointer the hard way, by
3771  // deconstructing the source location.
3772  ASTUnit *CXXUnit = static_cast<ASTUnit *>(TU);
3773  if (!CXXUnit)
3774    return createCXString("");
3775
3776  SourceLocation Loc = SourceLocation::getFromRawEncoding(CXTok.int_data[1]);
3777  std::pair<FileID, unsigned> LocInfo
3778    = CXXUnit->getSourceManager().getDecomposedLoc(Loc);
3779  bool Invalid = false;
3780  llvm::StringRef Buffer
3781    = CXXUnit->getSourceManager().getBufferData(LocInfo.first, &Invalid);
3782  if (Invalid)
3783    return createCXString("");
3784
3785  return createCXString(Buffer.substr(LocInfo.second, CXTok.int_data[2]));
3786}
3787
3788CXSourceLocation clang_getTokenLocation(CXTranslationUnit TU, CXToken CXTok) {
3789  ASTUnit *CXXUnit = static_cast<ASTUnit *>(TU);
3790  if (!CXXUnit)
3791    return clang_getNullLocation();
3792
3793  return cxloc::translateSourceLocation(CXXUnit->getASTContext(),
3794                        SourceLocation::getFromRawEncoding(CXTok.int_data[1]));
3795}
3796
3797CXSourceRange clang_getTokenExtent(CXTranslationUnit TU, CXToken CXTok) {
3798  ASTUnit *CXXUnit = static_cast<ASTUnit *>(TU);
3799  if (!CXXUnit)
3800    return clang_getNullRange();
3801
3802  return cxloc::translateSourceRange(CXXUnit->getASTContext(),
3803                        SourceLocation::getFromRawEncoding(CXTok.int_data[1]));
3804}
3805
3806void clang_tokenize(CXTranslationUnit TU, CXSourceRange Range,
3807                    CXToken **Tokens, unsigned *NumTokens) {
3808  if (Tokens)
3809    *Tokens = 0;
3810  if (NumTokens)
3811    *NumTokens = 0;
3812
3813  ASTUnit *CXXUnit = static_cast<ASTUnit *>(TU);
3814  if (!CXXUnit || !Tokens || !NumTokens)
3815    return;
3816
3817  ASTUnit::ConcurrencyCheck Check(*CXXUnit);
3818
3819  SourceRange R = cxloc::translateCXSourceRange(Range);
3820  if (R.isInvalid())
3821    return;
3822
3823  SourceManager &SourceMgr = CXXUnit->getSourceManager();
3824  std::pair<FileID, unsigned> BeginLocInfo
3825    = SourceMgr.getDecomposedLoc(R.getBegin());
3826  std::pair<FileID, unsigned> EndLocInfo
3827    = SourceMgr.getDecomposedLoc(R.getEnd());
3828
3829  // Cannot tokenize across files.
3830  if (BeginLocInfo.first != EndLocInfo.first)
3831    return;
3832
3833  // Create a lexer
3834  bool Invalid = false;
3835  llvm::StringRef Buffer
3836    = SourceMgr.getBufferData(BeginLocInfo.first, &Invalid);
3837  if (Invalid)
3838    return;
3839
3840  Lexer Lex(SourceMgr.getLocForStartOfFile(BeginLocInfo.first),
3841            CXXUnit->getASTContext().getLangOptions(),
3842            Buffer.begin(), Buffer.data() + BeginLocInfo.second, Buffer.end());
3843  Lex.SetCommentRetentionState(true);
3844
3845  // Lex tokens until we hit the end of the range.
3846  const char *EffectiveBufferEnd = Buffer.data() + EndLocInfo.second;
3847  llvm::SmallVector<CXToken, 32> CXTokens;
3848  Token Tok;
3849  bool previousWasAt = false;
3850  do {
3851    // Lex the next token
3852    Lex.LexFromRawLexer(Tok);
3853    if (Tok.is(tok::eof))
3854      break;
3855
3856    // Initialize the CXToken.
3857    CXToken CXTok;
3858
3859    //   - Common fields
3860    CXTok.int_data[1] = Tok.getLocation().getRawEncoding();
3861    CXTok.int_data[2] = Tok.getLength();
3862    CXTok.int_data[3] = 0;
3863
3864    //   - Kind-specific fields
3865    if (Tok.isLiteral()) {
3866      CXTok.int_data[0] = CXToken_Literal;
3867      CXTok.ptr_data = (void *)Tok.getLiteralData();
3868    } else if (Tok.is(tok::identifier)) {
3869      // Lookup the identifier to determine whether we have a keyword.
3870      std::pair<FileID, unsigned> LocInfo
3871        = SourceMgr.getDecomposedLoc(Tok.getLocation());
3872      bool Invalid = false;
3873      llvm::StringRef Buf
3874        = CXXUnit->getSourceManager().getBufferData(LocInfo.first, &Invalid);
3875      if (Invalid)
3876        return;
3877
3878      const char *StartPos = Buf.data() + LocInfo.second;
3879      IdentifierInfo *II
3880        = CXXUnit->getPreprocessor().LookUpIdentifierInfo(Tok, StartPos);
3881
3882      if ((II->getObjCKeywordID() != tok::objc_not_keyword) && previousWasAt) {
3883        CXTok.int_data[0] = CXToken_Keyword;
3884      }
3885      else {
3886        CXTok.int_data[0] = II->getTokenID() == tok::identifier?
3887                                CXToken_Identifier
3888                              : CXToken_Keyword;
3889      }
3890      CXTok.ptr_data = II;
3891    } else if (Tok.is(tok::comment)) {
3892      CXTok.int_data[0] = CXToken_Comment;
3893      CXTok.ptr_data = 0;
3894    } else {
3895      CXTok.int_data[0] = CXToken_Punctuation;
3896      CXTok.ptr_data = 0;
3897    }
3898    CXTokens.push_back(CXTok);
3899    previousWasAt = Tok.is(tok::at);
3900  } while (Lex.getBufferLocation() <= EffectiveBufferEnd);
3901
3902  if (CXTokens.empty())
3903    return;
3904
3905  *Tokens = (CXToken *)malloc(sizeof(CXToken) * CXTokens.size());
3906  memmove(*Tokens, CXTokens.data(), sizeof(CXToken) * CXTokens.size());
3907  *NumTokens = CXTokens.size();
3908}
3909
3910void clang_disposeTokens(CXTranslationUnit TU,
3911                         CXToken *Tokens, unsigned NumTokens) {
3912  free(Tokens);
3913}
3914
3915} // end: extern "C"
3916
3917//===----------------------------------------------------------------------===//
3918// Token annotation APIs.
3919//===----------------------------------------------------------------------===//
3920
3921typedef llvm::DenseMap<unsigned, CXCursor> AnnotateTokensData;
3922static enum CXChildVisitResult AnnotateTokensVisitor(CXCursor cursor,
3923                                                     CXCursor parent,
3924                                                     CXClientData client_data);
3925namespace {
3926class AnnotateTokensWorker {
3927  AnnotateTokensData &Annotated;
3928  CXToken *Tokens;
3929  CXCursor *Cursors;
3930  unsigned NumTokens;
3931  unsigned TokIdx;
3932  unsigned PreprocessingTokIdx;
3933  CursorVisitor AnnotateVis;
3934  SourceManager &SrcMgr;
3935
3936  bool MoreTokens() const { return TokIdx < NumTokens; }
3937  unsigned NextToken() const { return TokIdx; }
3938  void AdvanceToken() { ++TokIdx; }
3939  SourceLocation GetTokenLoc(unsigned tokI) {
3940    return SourceLocation::getFromRawEncoding(Tokens[tokI].int_data[1]);
3941  }
3942
3943public:
3944  AnnotateTokensWorker(AnnotateTokensData &annotated,
3945                       CXToken *tokens, CXCursor *cursors, unsigned numTokens,
3946                       ASTUnit *CXXUnit, SourceRange RegionOfInterest)
3947    : Annotated(annotated), Tokens(tokens), Cursors(cursors),
3948      NumTokens(numTokens), TokIdx(0), PreprocessingTokIdx(0),
3949      AnnotateVis(CXXUnit, AnnotateTokensVisitor, this,
3950                  Decl::MaxPCHLevel, RegionOfInterest),
3951      SrcMgr(CXXUnit->getSourceManager()) {}
3952
3953  void VisitChildren(CXCursor C) { AnnotateVis.VisitChildren(C); }
3954  enum CXChildVisitResult Visit(CXCursor cursor, CXCursor parent);
3955  void AnnotateTokens(CXCursor parent);
3956  void AnnotateTokens() {
3957    AnnotateTokens(clang_getTranslationUnitCursor(AnnotateVis.getASTUnit()));
3958  }
3959};
3960}
3961
3962void AnnotateTokensWorker::AnnotateTokens(CXCursor parent) {
3963  // Walk the AST within the region of interest, annotating tokens
3964  // along the way.
3965  VisitChildren(parent);
3966
3967  for (unsigned I = 0 ; I < TokIdx ; ++I) {
3968    AnnotateTokensData::iterator Pos = Annotated.find(Tokens[I].int_data[1]);
3969    if (Pos != Annotated.end() &&
3970        (clang_isInvalid(Cursors[I].kind) ||
3971         Pos->second.kind != CXCursor_PreprocessingDirective))
3972      Cursors[I] = Pos->second;
3973  }
3974
3975  // Finish up annotating any tokens left.
3976  if (!MoreTokens())
3977    return;
3978
3979  const CXCursor &C = clang_getNullCursor();
3980  for (unsigned I = TokIdx ; I < NumTokens ; ++I) {
3981    AnnotateTokensData::iterator Pos = Annotated.find(Tokens[I].int_data[1]);
3982    Cursors[I] = (Pos == Annotated.end()) ? C : Pos->second;
3983  }
3984}
3985
3986enum CXChildVisitResult
3987AnnotateTokensWorker::Visit(CXCursor cursor, CXCursor parent) {
3988  CXSourceLocation Loc = clang_getCursorLocation(cursor);
3989  SourceRange cursorRange = getRawCursorExtent(cursor);
3990  if (cursorRange.isInvalid())
3991    return CXChildVisit_Recurse;
3992
3993  if (clang_isPreprocessing(cursor.kind)) {
3994    // For macro instantiations, just note where the beginning of the macro
3995    // instantiation occurs.
3996    if (cursor.kind == CXCursor_MacroInstantiation) {
3997      Annotated[Loc.int_data] = cursor;
3998      return CXChildVisit_Recurse;
3999    }
4000
4001    // Items in the preprocessing record are kept separate from items in
4002    // declarations, so we keep a separate token index.
4003    unsigned SavedTokIdx = TokIdx;
4004    TokIdx = PreprocessingTokIdx;
4005
4006    // Skip tokens up until we catch up to the beginning of the preprocessing
4007    // entry.
4008    while (MoreTokens()) {
4009      const unsigned I = NextToken();
4010      SourceLocation TokLoc = GetTokenLoc(I);
4011      switch (LocationCompare(SrcMgr, TokLoc, cursorRange)) {
4012      case RangeBefore:
4013        AdvanceToken();
4014        continue;
4015      case RangeAfter:
4016      case RangeOverlap:
4017        break;
4018      }
4019      break;
4020    }
4021
4022    // Look at all of the tokens within this range.
4023    while (MoreTokens()) {
4024      const unsigned I = NextToken();
4025      SourceLocation TokLoc = GetTokenLoc(I);
4026      switch (LocationCompare(SrcMgr, TokLoc, cursorRange)) {
4027      case RangeBefore:
4028        assert(0 && "Infeasible");
4029      case RangeAfter:
4030        break;
4031      case RangeOverlap:
4032        Cursors[I] = cursor;
4033        AdvanceToken();
4034        continue;
4035      }
4036      break;
4037    }
4038
4039    // Save the preprocessing token index; restore the non-preprocessing
4040    // token index.
4041    PreprocessingTokIdx = TokIdx;
4042    TokIdx = SavedTokIdx;
4043    return CXChildVisit_Recurse;
4044  }
4045
4046  if (cursorRange.isInvalid())
4047    return CXChildVisit_Continue;
4048
4049  SourceLocation L = SourceLocation::getFromRawEncoding(Loc.int_data);
4050
4051  // Adjust the annotated range based specific declarations.
4052  const enum CXCursorKind cursorK = clang_getCursorKind(cursor);
4053  if (cursorK >= CXCursor_FirstDecl && cursorK <= CXCursor_LastDecl) {
4054    Decl *D = cxcursor::getCursorDecl(cursor);
4055    // Don't visit synthesized ObjC methods, since they have no syntatic
4056    // representation in the source.
4057    if (const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(D)) {
4058      if (MD->isSynthesized())
4059        return CXChildVisit_Continue;
4060    }
4061    if (const DeclaratorDecl *DD = dyn_cast<DeclaratorDecl>(D)) {
4062      if (TypeSourceInfo *TI = DD->getTypeSourceInfo()) {
4063        TypeLoc TL = TI->getTypeLoc();
4064        SourceLocation TLoc = TL.getSourceRange().getBegin();
4065        if (TLoc.isValid() && L.isValid() &&
4066            SrcMgr.isBeforeInTranslationUnit(TLoc, L))
4067          cursorRange.setBegin(TLoc);
4068      }
4069    }
4070  }
4071
4072  // If the location of the cursor occurs within a macro instantiation, record
4073  // the spelling location of the cursor in our annotation map.  We can then
4074  // paper over the token labelings during a post-processing step to try and
4075  // get cursor mappings for tokens that are the *arguments* of a macro
4076  // instantiation.
4077  if (L.isMacroID()) {
4078    unsigned rawEncoding = SrcMgr.getSpellingLoc(L).getRawEncoding();
4079    // Only invalidate the old annotation if it isn't part of a preprocessing
4080    // directive.  Here we assume that the default construction of CXCursor
4081    // results in CXCursor.kind being an initialized value (i.e., 0).  If
4082    // this isn't the case, we can fix by doing lookup + insertion.
4083
4084    CXCursor &oldC = Annotated[rawEncoding];
4085    if (!clang_isPreprocessing(oldC.kind))
4086      oldC = cursor;
4087  }
4088
4089  const enum CXCursorKind K = clang_getCursorKind(parent);
4090  const CXCursor updateC =
4091    (clang_isInvalid(K) || K == CXCursor_TranslationUnit)
4092     ? clang_getNullCursor() : parent;
4093
4094  while (MoreTokens()) {
4095    const unsigned I = NextToken();
4096    SourceLocation TokLoc = GetTokenLoc(I);
4097    switch (LocationCompare(SrcMgr, TokLoc, cursorRange)) {
4098      case RangeBefore:
4099        Cursors[I] = updateC;
4100        AdvanceToken();
4101        continue;
4102      case RangeAfter:
4103      case RangeOverlap:
4104        break;
4105    }
4106    break;
4107  }
4108
4109  // Visit children to get their cursor information.
4110  const unsigned BeforeChildren = NextToken();
4111  VisitChildren(cursor);
4112  const unsigned AfterChildren = NextToken();
4113
4114  // Adjust 'Last' to the last token within the extent of the cursor.
4115  while (MoreTokens()) {
4116    const unsigned I = NextToken();
4117    SourceLocation TokLoc = GetTokenLoc(I);
4118    switch (LocationCompare(SrcMgr, TokLoc, cursorRange)) {
4119      case RangeBefore:
4120        assert(0 && "Infeasible");
4121      case RangeAfter:
4122        break;
4123      case RangeOverlap:
4124        Cursors[I] = updateC;
4125        AdvanceToken();
4126        continue;
4127    }
4128    break;
4129  }
4130  const unsigned Last = NextToken();
4131
4132  // Scan the tokens that are at the beginning of the cursor, but are not
4133  // capture by the child cursors.
4134
4135  // For AST elements within macros, rely on a post-annotate pass to
4136  // to correctly annotate the tokens with cursors.  Otherwise we can
4137  // get confusing results of having tokens that map to cursors that really
4138  // are expanded by an instantiation.
4139  if (L.isMacroID())
4140    cursor = clang_getNullCursor();
4141
4142  for (unsigned I = BeforeChildren; I != AfterChildren; ++I) {
4143    if (!clang_isInvalid(clang_getCursorKind(Cursors[I])))
4144      break;
4145
4146    Cursors[I] = cursor;
4147  }
4148  // Scan the tokens that are at the end of the cursor, but are not captured
4149  // but the child cursors.
4150  for (unsigned I = AfterChildren; I != Last; ++I)
4151    Cursors[I] = cursor;
4152
4153  TokIdx = Last;
4154  return CXChildVisit_Continue;
4155}
4156
4157static enum CXChildVisitResult AnnotateTokensVisitor(CXCursor cursor,
4158                                                     CXCursor parent,
4159                                                     CXClientData client_data) {
4160  return static_cast<AnnotateTokensWorker*>(client_data)->Visit(cursor, parent);
4161}
4162
4163// This gets run a separate thread to avoid stack blowout.
4164static void runAnnotateTokensWorker(void *UserData) {
4165  ((AnnotateTokensWorker*)UserData)->AnnotateTokens();
4166}
4167
4168extern "C" {
4169
4170void clang_annotateTokens(CXTranslationUnit TU,
4171                          CXToken *Tokens, unsigned NumTokens,
4172                          CXCursor *Cursors) {
4173
4174  if (NumTokens == 0 || !Tokens || !Cursors)
4175    return;
4176
4177  // Any token we don't specifically annotate will have a NULL cursor.
4178  CXCursor C = clang_getNullCursor();
4179  for (unsigned I = 0; I != NumTokens; ++I)
4180    Cursors[I] = C;
4181
4182  ASTUnit *CXXUnit = static_cast<ASTUnit *>(TU);
4183  if (!CXXUnit)
4184    return;
4185
4186  ASTUnit::ConcurrencyCheck Check(*CXXUnit);
4187
4188  // Determine the region of interest, which contains all of the tokens.
4189  SourceRange RegionOfInterest;
4190  RegionOfInterest.setBegin(cxloc::translateSourceLocation(
4191                                        clang_getTokenLocation(TU, Tokens[0])));
4192  RegionOfInterest.setEnd(cxloc::translateSourceLocation(
4193                                clang_getTokenLocation(TU,
4194                                                       Tokens[NumTokens - 1])));
4195
4196  // A mapping from the source locations found when re-lexing or traversing the
4197  // region of interest to the corresponding cursors.
4198  AnnotateTokensData Annotated;
4199
4200  // Relex the tokens within the source range to look for preprocessing
4201  // directives.
4202  SourceManager &SourceMgr = CXXUnit->getSourceManager();
4203  std::pair<FileID, unsigned> BeginLocInfo
4204    = SourceMgr.getDecomposedLoc(RegionOfInterest.getBegin());
4205  std::pair<FileID, unsigned> EndLocInfo
4206    = SourceMgr.getDecomposedLoc(RegionOfInterest.getEnd());
4207
4208  llvm::StringRef Buffer;
4209  bool Invalid = false;
4210  if (BeginLocInfo.first == EndLocInfo.first &&
4211      ((Buffer = SourceMgr.getBufferData(BeginLocInfo.first, &Invalid)),true) &&
4212      !Invalid) {
4213    Lexer Lex(SourceMgr.getLocForStartOfFile(BeginLocInfo.first),
4214              CXXUnit->getASTContext().getLangOptions(),
4215              Buffer.begin(), Buffer.data() + BeginLocInfo.second,
4216              Buffer.end());
4217    Lex.SetCommentRetentionState(true);
4218
4219    // Lex tokens in raw mode until we hit the end of the range, to avoid
4220    // entering #includes or expanding macros.
4221    while (true) {
4222      Token Tok;
4223      Lex.LexFromRawLexer(Tok);
4224
4225    reprocess:
4226      if (Tok.is(tok::hash) && Tok.isAtStartOfLine()) {
4227        // We have found a preprocessing directive. Gobble it up so that we
4228        // don't see it while preprocessing these tokens later, but keep track
4229        // of all of the token locations inside this preprocessing directive so
4230        // that we can annotate them appropriately.
4231        //
4232        // FIXME: Some simple tests here could identify macro definitions and
4233        // #undefs, to provide specific cursor kinds for those.
4234        std::vector<SourceLocation> Locations;
4235        do {
4236          Locations.push_back(Tok.getLocation());
4237          Lex.LexFromRawLexer(Tok);
4238        } while (!Tok.isAtStartOfLine() && !Tok.is(tok::eof));
4239
4240        using namespace cxcursor;
4241        CXCursor Cursor
4242          = MakePreprocessingDirectiveCursor(SourceRange(Locations.front(),
4243                                                         Locations.back()),
4244                                           CXXUnit);
4245        for (unsigned I = 0, N = Locations.size(); I != N; ++I) {
4246          Annotated[Locations[I].getRawEncoding()] = Cursor;
4247        }
4248
4249        if (Tok.isAtStartOfLine())
4250          goto reprocess;
4251
4252        continue;
4253      }
4254
4255      if (Tok.is(tok::eof))
4256        break;
4257    }
4258  }
4259
4260  // Annotate all of the source locations in the region of interest that map to
4261  // a specific cursor.
4262  AnnotateTokensWorker W(Annotated, Tokens, Cursors, NumTokens,
4263                         CXXUnit, RegionOfInterest);
4264
4265  // Run the worker within a CrashRecoveryContext.
4266  llvm::CrashRecoveryContext CRC;
4267  if (!RunSafely(CRC, runAnnotateTokensWorker, &W)) {
4268    fprintf(stderr, "libclang: crash detected while annotating tokens\n");
4269  }
4270}
4271} // end: extern "C"
4272
4273//===----------------------------------------------------------------------===//
4274// Operations for querying linkage of a cursor.
4275//===----------------------------------------------------------------------===//
4276
4277extern "C" {
4278CXLinkageKind clang_getCursorLinkage(CXCursor cursor) {
4279  if (!clang_isDeclaration(cursor.kind))
4280    return CXLinkage_Invalid;
4281
4282  Decl *D = cxcursor::getCursorDecl(cursor);
4283  if (NamedDecl *ND = dyn_cast_or_null<NamedDecl>(D))
4284    switch (ND->getLinkage()) {
4285      case NoLinkage: return CXLinkage_NoLinkage;
4286      case InternalLinkage: return CXLinkage_Internal;
4287      case UniqueExternalLinkage: return CXLinkage_UniqueExternal;
4288      case ExternalLinkage: return CXLinkage_External;
4289    };
4290
4291  return CXLinkage_Invalid;
4292}
4293} // end: extern "C"
4294
4295//===----------------------------------------------------------------------===//
4296// Operations for querying language of a cursor.
4297//===----------------------------------------------------------------------===//
4298
4299static CXLanguageKind getDeclLanguage(const Decl *D) {
4300  switch (D->getKind()) {
4301    default:
4302      break;
4303    case Decl::ImplicitParam:
4304    case Decl::ObjCAtDefsField:
4305    case Decl::ObjCCategory:
4306    case Decl::ObjCCategoryImpl:
4307    case Decl::ObjCClass:
4308    case Decl::ObjCCompatibleAlias:
4309    case Decl::ObjCForwardProtocol:
4310    case Decl::ObjCImplementation:
4311    case Decl::ObjCInterface:
4312    case Decl::ObjCIvar:
4313    case Decl::ObjCMethod:
4314    case Decl::ObjCProperty:
4315    case Decl::ObjCPropertyImpl:
4316    case Decl::ObjCProtocol:
4317      return CXLanguage_ObjC;
4318    case Decl::CXXConstructor:
4319    case Decl::CXXConversion:
4320    case Decl::CXXDestructor:
4321    case Decl::CXXMethod:
4322    case Decl::CXXRecord:
4323    case Decl::ClassTemplate:
4324    case Decl::ClassTemplatePartialSpecialization:
4325    case Decl::ClassTemplateSpecialization:
4326    case Decl::Friend:
4327    case Decl::FriendTemplate:
4328    case Decl::FunctionTemplate:
4329    case Decl::LinkageSpec:
4330    case Decl::Namespace:
4331    case Decl::NamespaceAlias:
4332    case Decl::NonTypeTemplateParm:
4333    case Decl::StaticAssert:
4334    case Decl::TemplateTemplateParm:
4335    case Decl::TemplateTypeParm:
4336    case Decl::UnresolvedUsingTypename:
4337    case Decl::UnresolvedUsingValue:
4338    case Decl::Using:
4339    case Decl::UsingDirective:
4340    case Decl::UsingShadow:
4341      return CXLanguage_CPlusPlus;
4342  }
4343
4344  return CXLanguage_C;
4345}
4346
4347extern "C" {
4348
4349enum CXAvailabilityKind clang_getCursorAvailability(CXCursor cursor) {
4350  if (clang_isDeclaration(cursor.kind))
4351    if (Decl *D = cxcursor::getCursorDecl(cursor)) {
4352      if (D->hasAttr<UnavailableAttr>() ||
4353          (isa<FunctionDecl>(D) && cast<FunctionDecl>(D)->isDeleted()))
4354        return CXAvailability_Available;
4355
4356      if (D->hasAttr<DeprecatedAttr>())
4357        return CXAvailability_Deprecated;
4358    }
4359
4360  return CXAvailability_Available;
4361}
4362
4363CXLanguageKind clang_getCursorLanguage(CXCursor cursor) {
4364  if (clang_isDeclaration(cursor.kind))
4365    return getDeclLanguage(cxcursor::getCursorDecl(cursor));
4366
4367  return CXLanguage_Invalid;
4368}
4369
4370CXCursor clang_getCursorSemanticParent(CXCursor cursor) {
4371  if (clang_isDeclaration(cursor.kind)) {
4372    if (Decl *D = getCursorDecl(cursor)) {
4373      DeclContext *DC = D->getDeclContext();
4374      return MakeCXCursor(cast<Decl>(DC), getCursorASTUnit(cursor));
4375    }
4376  }
4377
4378  if (clang_isStatement(cursor.kind) || clang_isExpression(cursor.kind)) {
4379    if (Decl *D = getCursorDecl(cursor))
4380      return MakeCXCursor(D, getCursorASTUnit(cursor));
4381  }
4382
4383  return clang_getNullCursor();
4384}
4385
4386CXCursor clang_getCursorLexicalParent(CXCursor cursor) {
4387  if (clang_isDeclaration(cursor.kind)) {
4388    if (Decl *D = getCursorDecl(cursor)) {
4389      DeclContext *DC = D->getLexicalDeclContext();
4390      return MakeCXCursor(cast<Decl>(DC), getCursorASTUnit(cursor));
4391    }
4392  }
4393
4394  // FIXME: Note that we can't easily compute the lexical context of a
4395  // statement or expression, so we return nothing.
4396  return clang_getNullCursor();
4397}
4398
4399static void CollectOverriddenMethods(DeclContext *Ctx,
4400                                     ObjCMethodDecl *Method,
4401                            llvm::SmallVectorImpl<ObjCMethodDecl *> &Methods) {
4402  if (!Ctx)
4403    return;
4404
4405  // If we have a class or category implementation, jump straight to the
4406  // interface.
4407  if (ObjCImplDecl *Impl = dyn_cast<ObjCImplDecl>(Ctx))
4408    return CollectOverriddenMethods(Impl->getClassInterface(), Method, Methods);
4409
4410  ObjCContainerDecl *Container = dyn_cast<ObjCContainerDecl>(Ctx);
4411  if (!Container)
4412    return;
4413
4414  // Check whether we have a matching method at this level.
4415  if (ObjCMethodDecl *Overridden = Container->getMethod(Method->getSelector(),
4416                                                    Method->isInstanceMethod()))
4417    if (Method != Overridden) {
4418      // We found an override at this level; there is no need to look
4419      // into other protocols or categories.
4420      Methods.push_back(Overridden);
4421      return;
4422    }
4423
4424  if (ObjCProtocolDecl *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) {
4425    for (ObjCProtocolDecl::protocol_iterator P = Protocol->protocol_begin(),
4426                                          PEnd = Protocol->protocol_end();
4427         P != PEnd; ++P)
4428      CollectOverriddenMethods(*P, Method, Methods);
4429  }
4430
4431  if (ObjCCategoryDecl *Category = dyn_cast<ObjCCategoryDecl>(Container)) {
4432    for (ObjCCategoryDecl::protocol_iterator P = Category->protocol_begin(),
4433                                          PEnd = Category->protocol_end();
4434         P != PEnd; ++P)
4435      CollectOverriddenMethods(*P, Method, Methods);
4436  }
4437
4438  if (ObjCInterfaceDecl *Interface = dyn_cast<ObjCInterfaceDecl>(Container)) {
4439    for (ObjCInterfaceDecl::protocol_iterator P = Interface->protocol_begin(),
4440                                           PEnd = Interface->protocol_end();
4441         P != PEnd; ++P)
4442      CollectOverriddenMethods(*P, Method, Methods);
4443
4444    for (ObjCCategoryDecl *Category = Interface->getCategoryList();
4445         Category; Category = Category->getNextClassCategory())
4446      CollectOverriddenMethods(Category, Method, Methods);
4447
4448    // We only look into the superclass if we haven't found anything yet.
4449    if (Methods.empty())
4450      if (ObjCInterfaceDecl *Super = Interface->getSuperClass())
4451        return CollectOverriddenMethods(Super, Method, Methods);
4452  }
4453}
4454
4455void clang_getOverriddenCursors(CXCursor cursor,
4456                                CXCursor **overridden,
4457                                unsigned *num_overridden) {
4458  if (overridden)
4459    *overridden = 0;
4460  if (num_overridden)
4461    *num_overridden = 0;
4462  if (!overridden || !num_overridden)
4463    return;
4464
4465  if (!clang_isDeclaration(cursor.kind))
4466    return;
4467
4468  Decl *D = getCursorDecl(cursor);
4469  if (!D)
4470    return;
4471
4472  // Handle C++ member functions.
4473  ASTUnit *CXXUnit = getCursorASTUnit(cursor);
4474  if (CXXMethodDecl *CXXMethod = dyn_cast<CXXMethodDecl>(D)) {
4475    *num_overridden = CXXMethod->size_overridden_methods();
4476    if (!*num_overridden)
4477      return;
4478
4479    *overridden = new CXCursor [*num_overridden];
4480    unsigned I = 0;
4481    for (CXXMethodDecl::method_iterator
4482              M = CXXMethod->begin_overridden_methods(),
4483           MEnd = CXXMethod->end_overridden_methods();
4484         M != MEnd; (void)++M, ++I)
4485      (*overridden)[I] = MakeCXCursor(const_cast<CXXMethodDecl*>(*M), CXXUnit);
4486    return;
4487  }
4488
4489  ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(D);
4490  if (!Method)
4491    return;
4492
4493  // Handle Objective-C methods.
4494  llvm::SmallVector<ObjCMethodDecl *, 4> Methods;
4495  CollectOverriddenMethods(Method->getDeclContext(), Method, Methods);
4496
4497  if (Methods.empty())
4498    return;
4499
4500  *num_overridden = Methods.size();
4501  *overridden = new CXCursor [Methods.size()];
4502  for (unsigned I = 0, N = Methods.size(); I != N; ++I)
4503    (*overridden)[I] = MakeCXCursor(Methods[I], CXXUnit);
4504}
4505
4506void clang_disposeOverriddenCursors(CXCursor *overridden) {
4507  delete [] overridden;
4508}
4509
4510CXFile clang_getIncludedFile(CXCursor cursor) {
4511  if (cursor.kind != CXCursor_InclusionDirective)
4512    return 0;
4513
4514  InclusionDirective *ID = getCursorInclusionDirective(cursor);
4515  return (void *)ID->getFile();
4516}
4517
4518} // end: extern "C"
4519
4520
4521//===----------------------------------------------------------------------===//
4522// C++ AST instrospection.
4523//===----------------------------------------------------------------------===//
4524
4525extern "C" {
4526unsigned clang_CXXMethod_isStatic(CXCursor C) {
4527  if (!clang_isDeclaration(C.kind))
4528    return 0;
4529
4530  CXXMethodDecl *Method = 0;
4531  Decl *D = cxcursor::getCursorDecl(C);
4532  if (FunctionTemplateDecl *FunTmpl = dyn_cast_or_null<FunctionTemplateDecl>(D))
4533    Method = dyn_cast<CXXMethodDecl>(FunTmpl->getTemplatedDecl());
4534  else
4535    Method = dyn_cast_or_null<CXXMethodDecl>(D);
4536  return (Method && Method->isStatic()) ? 1 : 0;
4537}
4538
4539} // end: extern "C"
4540
4541//===----------------------------------------------------------------------===//
4542// Attribute introspection.
4543//===----------------------------------------------------------------------===//
4544
4545extern "C" {
4546CXType clang_getIBOutletCollectionType(CXCursor C) {
4547  if (C.kind != CXCursor_IBOutletCollectionAttr)
4548    return cxtype::MakeCXType(QualType(), cxcursor::getCursorASTUnit(C));
4549
4550  IBOutletCollectionAttr *A =
4551    cast<IBOutletCollectionAttr>(cxcursor::getCursorAttr(C));
4552
4553  return cxtype::MakeCXType(A->getInterface(), cxcursor::getCursorASTUnit(C));
4554}
4555} // end: extern "C"
4556
4557//===----------------------------------------------------------------------===//
4558// CXString Operations.
4559//===----------------------------------------------------------------------===//
4560
4561extern "C" {
4562const char *clang_getCString(CXString string) {
4563  return string.Spelling;
4564}
4565
4566void clang_disposeString(CXString string) {
4567  if (string.MustFreeString && string.Spelling)
4568    free((void*)string.Spelling);
4569}
4570
4571} // end: extern "C"
4572
4573namespace clang { namespace cxstring {
4574CXString createCXString(const char *String, bool DupString){
4575  CXString Str;
4576  if (DupString) {
4577    Str.Spelling = strdup(String);
4578    Str.MustFreeString = 1;
4579  } else {
4580    Str.Spelling = String;
4581    Str.MustFreeString = 0;
4582  }
4583  return Str;
4584}
4585
4586CXString createCXString(llvm::StringRef String, bool DupString) {
4587  CXString Result;
4588  if (DupString || (!String.empty() && String.data()[String.size()] != 0)) {
4589    char *Spelling = (char *)malloc(String.size() + 1);
4590    memmove(Spelling, String.data(), String.size());
4591    Spelling[String.size()] = 0;
4592    Result.Spelling = Spelling;
4593    Result.MustFreeString = 1;
4594  } else {
4595    Result.Spelling = String.data();
4596    Result.MustFreeString = 0;
4597  }
4598  return Result;
4599}
4600}}
4601
4602//===----------------------------------------------------------------------===//
4603// Misc. utility functions.
4604//===----------------------------------------------------------------------===//
4605
4606/// Default to using an 8 MB stack size on "safety" threads.
4607static unsigned SafetyStackThreadSize = 8 << 20;
4608
4609namespace clang {
4610
4611bool RunSafely(llvm::CrashRecoveryContext &CRC,
4612               void (*Fn)(void*), void *UserData) {
4613  if (unsigned Size = GetSafetyThreadStackSize())
4614    return CRC.RunSafelyOnThread(Fn, UserData, Size);
4615  return CRC.RunSafely(Fn, UserData);
4616}
4617
4618unsigned GetSafetyThreadStackSize() {
4619  return SafetyStackThreadSize;
4620}
4621
4622void SetSafetyThreadStackSize(unsigned Value) {
4623  SafetyStackThreadSize = Value;
4624}
4625
4626}
4627
4628extern "C" {
4629
4630CXString clang_getClangVersion() {
4631  return createCXString(getClangFullVersion());
4632}
4633
4634} // end: extern "C"
4635