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