1 //===--- DeclVisitor.h - Visitor for Decl subclasses ------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file defines the DeclVisitor interface. 11 // 12 //===----------------------------------------------------------------------===// 13 #ifndef LLVM_CLANG_AST_DECLVISITOR_H 14 #define LLVM_CLANG_AST_DECLVISITOR_H 15 16 #include "clang/AST/Decl.h" 17 #include "clang/AST/DeclObjC.h" 18 #include "clang/AST/DeclCXX.h" 19 #include "clang/AST/DeclFriend.h" 20 #include "clang/AST/DeclTemplate.h" 21 22 namespace clang { 23 24 #define DISPATCH(NAME, CLASS) \ 25 return static_cast<ImplClass*>(this)-> Visit##NAME(static_cast<CLASS*>(D)) 26 27 /// \brief A simple visitor class that helps create declaration visitors. 28 template<typename ImplClass, typename RetTy=void> 29 class DeclVisitor { 30 public: Visit(Decl * D)31 RetTy Visit(Decl *D) { 32 switch (D->getKind()) { 33 #define DECL(DERIVED, BASE) \ 34 case Decl::DERIVED: DISPATCH(DERIVED##Decl, DERIVED##Decl); 35 #define ABSTRACT_DECL(DECL) 36 #include "clang/AST/DeclNodes.inc" 37 } 38 llvm_unreachable("Decl that isn't part of DeclNodes.inc!"); 39 } 40 41 // If the implementation chooses not to implement a certain visit 42 // method, fall back to the parent. 43 #define DECL(DERIVED, BASE) \ 44 RetTy Visit##DERIVED##Decl(DERIVED##Decl *D) { DISPATCH(BASE, BASE); } 45 #include "clang/AST/DeclNodes.inc" 46 VisitDecl(Decl * D)47 RetTy VisitDecl(Decl *D) { return RetTy(); } 48 }; 49 50 #undef DISPATCH 51 52 } // end namespace clang 53 54 #endif // LLVM_CLANG_AST_DECLVISITOR_H 55