CursorVisitor.h revision 011d8b93b7cfa8492b8a9c909a850d6577e08dca
1e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis//===- CursorVisitor.h - CursorVisitor interface --------------------------===//
2e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis//
3e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis//                     The LLVM Compiler Infrastructure
4e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis//
5e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis// This file is distributed under the University of Illinois Open Source
6e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis// License. See LICENSE.TXT for details.
7e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis//
8e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis//===----------------------------------------------------------------------===//
9e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis
10e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis#ifndef LLVM_CLANG_LIBCLANG_CURSORVISITOR_H
11e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis#define LLVM_CLANG_LIBCLANG_CURSORVISITOR_H
12e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis
13e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis#include "Index_Internal.h"
14e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis#include "CXCursor.h"
15e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis#include "CXTranslationUnit.h"
16e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis
17e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis#include "clang/AST/DeclVisitor.h"
18e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis#include "clang/AST/TypeLocVisitor.h"
19e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis
20e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidisnamespace clang {
21e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  class PreprocessingRecord;
22e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  class ASTUnit;
23e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis
24e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidisnamespace cxcursor {
25e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis
26e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidisclass VisitorJob {
27e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidispublic:
28e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  enum Kind { DeclVisitKind, StmtVisitKind, MemberExprPartsKind,
29e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis              TypeLocVisitKind, OverloadExprPartsKind,
30e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis              DeclRefExprPartsKind, LabelRefVisitKind,
31e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis              ExplicitTemplateArgsVisitKind,
32e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis              NestedNameSpecifierLocVisitKind,
33e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis              DeclarationNameInfoVisitKind,
34011d8b93b7cfa8492b8a9c909a850d6577e08dcaDouglas Gregor              MemberRefVisitKind, SizeOfPackExprPartsKind,
35011d8b93b7cfa8492b8a9c909a850d6577e08dcaDouglas Gregor              LambdaExprPartsKind };
36e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidisprotected:
37e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  void *data[3];
38e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  CXCursor parent;
39e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  Kind K;
40e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  VisitorJob(CXCursor C, Kind k, void *d1, void *d2 = 0, void *d3 = 0)
41e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis    : parent(C), K(k) {
42e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis    data[0] = d1;
43e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis    data[1] = d2;
44e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis    data[2] = d3;
45e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  }
46e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidispublic:
47e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  Kind getKind() const { return K; }
48e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  const CXCursor &getParent() const { return parent; }
49e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  static bool classof(VisitorJob *VJ) { return true; }
50e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis};
51e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis
52e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidistypedef SmallVector<VisitorJob, 10> VisitorWorkList;
53e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis
54e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis// Cursor visitor.
55e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidisclass CursorVisitor : public DeclVisitor<CursorVisitor, bool>,
56e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis                      public TypeLocVisitor<CursorVisitor, bool>
57e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis{
58e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  /// \brief The translation unit we are traversing.
59e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  CXTranslationUnit TU;
60e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  ASTUnit *AU;
61e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis
62e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  /// \brief The parent cursor whose children we are traversing.
63e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  CXCursor Parent;
64e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis
65e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  /// \brief The declaration that serves at the parent of any statement or
66e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  /// expression nodes.
67e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  Decl *StmtParent;
68e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis
69e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  /// \brief The visitor function.
70e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  CXCursorVisitor Visitor;
71e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis
72e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  /// \brief The opaque client data, to be passed along to the visitor.
73e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  CXClientData ClientData;
74e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis
75e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  /// \brief Whether we should visit the preprocessing record entries last,
76e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  /// after visiting other declarations.
77e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  bool VisitPreprocessorLast;
78e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis
79e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  /// \brief Whether we should visit declarations or preprocessing record
80e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  /// entries that are #included inside the \arg RegionOfInterest.
81e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  bool VisitIncludedEntities;
82e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis
83e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  /// \brief When valid, a source range to which the cursor should restrict
84e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  /// its search.
85e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  SourceRange RegionOfInterest;
86e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis
87b49e728a4d1a84b72f3aebf60ff494684f9cb004Argyrios Kyrtzidis  /// \brief Whether we should only visit declarations and not preprocessing
88b49e728a4d1a84b72f3aebf60ff494684f9cb004Argyrios Kyrtzidis  /// record entries.
89b49e728a4d1a84b72f3aebf60ff494684f9cb004Argyrios Kyrtzidis  bool VisitDeclsOnly;
90b49e728a4d1a84b72f3aebf60ff494684f9cb004Argyrios Kyrtzidis
91e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  // FIXME: Eventually remove.  This part of a hack to support proper
92e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  // iteration over all Decls contained lexically within an ObjC container.
93e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  DeclContext::decl_iterator *DI_current;
94e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  DeclContext::decl_iterator DE_current;
9503ee2dd9fc5d5fc62b5eb0fb88ee56e553f8cda7Argyrios Kyrtzidis  SmallVectorImpl<Decl *>::iterator *FileDI_current;
9603ee2dd9fc5d5fc62b5eb0fb88ee56e553f8cda7Argyrios Kyrtzidis  SmallVectorImpl<Decl *>::iterator FileDE_current;
97e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis
98e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  // Cache of pre-allocated worklists for data-recursion walk of Stmts.
99e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  SmallVector<VisitorWorkList*, 5> WorkListFreeList;
100e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  SmallVector<VisitorWorkList*, 5> WorkListCache;
101e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis
102e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  using DeclVisitor<CursorVisitor, bool>::Visit;
103e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  using TypeLocVisitor<CursorVisitor, bool>::Visit;
104e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis
105e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  /// \brief Determine whether this particular source range comes before, comes
106e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  /// after, or overlaps the region of interest.
107e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  ///
108e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  /// \param R a half-open source range retrieved from the abstract syntax tree.
109e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  RangeComparisonResult CompareRegionOfInterest(SourceRange R);
110e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis
111e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  void visitDeclsFromFileRegion(FileID File, unsigned Offset, unsigned Length);
112e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis
113e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  class SetParentRAII {
114e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis    CXCursor &Parent;
115e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis    Decl *&StmtParent;
116e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis    CXCursor OldParent;
117e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis
118e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  public:
119e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis    SetParentRAII(CXCursor &Parent, Decl *&StmtParent, CXCursor NewParent)
120e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis      : Parent(Parent), StmtParent(StmtParent), OldParent(Parent)
121e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis    {
122e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis      Parent = NewParent;
123e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis      if (clang_isDeclaration(Parent.kind))
124e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis        StmtParent = getCursorDecl(Parent);
125e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis    }
126e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis
127e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis    ~SetParentRAII() {
128e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis      Parent = OldParent;
129e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis      if (clang_isDeclaration(Parent.kind))
130e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis        StmtParent = getCursorDecl(Parent);
131e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis    }
132e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  };
133e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis
134e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidispublic:
135e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  CursorVisitor(CXTranslationUnit TU, CXCursorVisitor Visitor,
136e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis                CXClientData ClientData,
137e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis                bool VisitPreprocessorLast,
138e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis                bool VisitIncludedPreprocessingEntries = false,
139b49e728a4d1a84b72f3aebf60ff494684f9cb004Argyrios Kyrtzidis                SourceRange RegionOfInterest = SourceRange(),
140b49e728a4d1a84b72f3aebf60ff494684f9cb004Argyrios Kyrtzidis                bool VisitDeclsOnly = false)
141e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis    : TU(TU), AU(static_cast<ASTUnit*>(TU->TUData)),
142e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis      Visitor(Visitor), ClientData(ClientData),
143e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis      VisitPreprocessorLast(VisitPreprocessorLast),
144e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis      VisitIncludedEntities(VisitIncludedPreprocessingEntries),
145b49e728a4d1a84b72f3aebf60ff494684f9cb004Argyrios Kyrtzidis      RegionOfInterest(RegionOfInterest),
146b49e728a4d1a84b72f3aebf60ff494684f9cb004Argyrios Kyrtzidis      VisitDeclsOnly(VisitDeclsOnly),
147b49e728a4d1a84b72f3aebf60ff494684f9cb004Argyrios Kyrtzidis      DI_current(0), FileDI_current(0)
148e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  {
149e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis    Parent.kind = CXCursor_NoDeclFound;
150e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis    Parent.data[0] = 0;
151e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis    Parent.data[1] = 0;
152e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis    Parent.data[2] = 0;
153e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis    StmtParent = 0;
154e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  }
155e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis
156e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  ~CursorVisitor() {
157e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis    // Free the pre-allocated worklists for data-recursion.
158e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis    for (SmallVectorImpl<VisitorWorkList*>::iterator
159e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis          I = WorkListCache.begin(), E = WorkListCache.end(); I != E; ++I) {
160e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis      delete *I;
161e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis    }
162e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  }
163e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis
164e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  ASTUnit *getASTUnit() const { return static_cast<ASTUnit*>(TU->TUData); }
165e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  CXTranslationUnit getTU() const { return TU; }
166e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis
167e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  bool Visit(CXCursor Cursor, bool CheckedRegionOfInterest = false);
168e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis
169e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  /// \brief Visit declarations and preprocessed entities for the file region
170e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  /// designated by \see RegionOfInterest.
171e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  void visitFileRegion();
172e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis
173e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  bool visitPreprocessedEntitiesInRegion();
174e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis
175e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  bool shouldVisitIncludedEntities() const {
176e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis    return VisitIncludedEntities;
177e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  }
178e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis
179e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  template<typename InputIterator>
180e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  bool visitPreprocessedEntities(InputIterator First, InputIterator Last,
181e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis                                 PreprocessingRecord &PPRec,
182e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis                                 FileID FID = FileID());
183e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis
184e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  bool VisitChildren(CXCursor Parent);
185e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis
186e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  // Declaration visitors
187e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  bool VisitTypeAliasDecl(TypeAliasDecl *D);
188e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  bool VisitAttributes(Decl *D);
189e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  bool VisitBlockDecl(BlockDecl *B);
190e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  bool VisitCXXRecordDecl(CXXRecordDecl *D);
191e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  llvm::Optional<bool> shouldVisitCursor(CXCursor C);
192e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  bool VisitDeclContext(DeclContext *DC);
193e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  bool VisitTranslationUnitDecl(TranslationUnitDecl *D);
194e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  bool VisitTypedefDecl(TypedefDecl *D);
195e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  bool VisitTagDecl(TagDecl *D);
196e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  bool VisitClassTemplateSpecializationDecl(ClassTemplateSpecializationDecl *D);
197e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  bool VisitClassTemplatePartialSpecializationDecl(
198e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis                                     ClassTemplatePartialSpecializationDecl *D);
199e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  bool VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D);
200e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  bool VisitEnumConstantDecl(EnumConstantDecl *D);
201e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  bool VisitDeclaratorDecl(DeclaratorDecl *DD);
202e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  bool VisitFunctionDecl(FunctionDecl *ND);
203e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  bool VisitFieldDecl(FieldDecl *D);
204e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  bool VisitVarDecl(VarDecl *);
205e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  bool VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D);
206e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  bool VisitFunctionTemplateDecl(FunctionTemplateDecl *D);
207e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  bool VisitClassTemplateDecl(ClassTemplateDecl *D);
208e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  bool VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D);
209e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  bool VisitObjCMethodDecl(ObjCMethodDecl *ND);
210e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  bool VisitObjCContainerDecl(ObjCContainerDecl *D);
211e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  bool VisitObjCCategoryDecl(ObjCCategoryDecl *ND);
212e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  bool VisitObjCProtocolDecl(ObjCProtocolDecl *PID);
213e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  bool VisitObjCPropertyDecl(ObjCPropertyDecl *PD);
214e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  bool VisitObjCInterfaceDecl(ObjCInterfaceDecl *D);
215e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  bool VisitObjCImplDecl(ObjCImplDecl *D);
216e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  bool VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D);
217e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  bool VisitObjCImplementationDecl(ObjCImplementationDecl *D);
218e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  // FIXME: ObjCCompatibleAliasDecl requires aliased-class locations.
219e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  bool VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *PD);
220e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  bool VisitLinkageSpecDecl(LinkageSpecDecl *D);
221e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  bool VisitNamespaceDecl(NamespaceDecl *D);
222e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  bool VisitNamespaceAliasDecl(NamespaceAliasDecl *D);
223e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  bool VisitUsingDirectiveDecl(UsingDirectiveDecl *D);
224e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  bool VisitUsingDecl(UsingDecl *D);
225e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  bool VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D);
226e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  bool VisitUnresolvedUsingTypenameDecl(UnresolvedUsingTypenameDecl *D);
227e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis
228e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  // Name visitor
229e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  bool VisitDeclarationNameInfo(DeclarationNameInfo Name);
230e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  bool VisitNestedNameSpecifier(NestedNameSpecifier *NNS, SourceRange Range);
231e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  bool VisitNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS);
232e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis
233e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  // Template visitors
234e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  bool VisitTemplateParameters(const TemplateParameterList *Params);
235e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  bool VisitTemplateName(TemplateName Name, SourceLocation Loc);
236e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  bool VisitTemplateArgumentLoc(const TemplateArgumentLoc &TAL);
237e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis
238e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  // Type visitors
239e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis#define ABSTRACT_TYPELOC(CLASS, PARENT)
240e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis#define TYPELOC(CLASS, PARENT) \
241e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  bool Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc);
242e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis#include "clang/AST/TypeLocNodes.def"
243e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis
244e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  bool VisitTagTypeLoc(TagTypeLoc TL);
245e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  bool VisitArrayTypeLoc(ArrayTypeLoc TL);
246e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  bool VisitFunctionTypeLoc(FunctionTypeLoc TL, bool SkipResultType = false);
247e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis
248e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  // Data-recursive visitor functions.
249e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  bool IsInRegionOfInterest(CXCursor C);
250e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  bool RunVisitorWorkList(VisitorWorkList &WL);
251e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  void EnqueueWorkList(VisitorWorkList &WL, Stmt *S);
252e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis  LLVM_ATTRIBUTE_NOINLINE bool Visit(Stmt *S);
253e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis};
254e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis
255e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis}
256e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis}
257e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis
258e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis#endif
259e397bf1bd90cfceb0166606ebcd2580b7671a828Argyrios Kyrtzidis
260