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