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