1 //===--- TypeLocVisitor.h - Visitor for TypeLoc 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 TypeLocVisitor interface. 11 // 12 //===----------------------------------------------------------------------===// 13 #ifndef LLVM_CLANG_AST_TYPELOCVISITOR_H 14 #define LLVM_CLANG_AST_TYPELOCVISITOR_H 15 16 #include "clang/AST/TypeLoc.h" 17 #include "clang/AST/TypeVisitor.h" 18 #include "llvm/Support/ErrorHandling.h" 19 20 namespace clang { 21 22 #define DISPATCH(CLASSNAME) \ 23 return static_cast<ImplClass*>(this)-> \ 24 Visit##CLASSNAME(cast<CLASSNAME>(TyLoc)) 25 26 template<typename ImplClass, typename RetTy=void> 27 class TypeLocVisitor { 28 public: Visit(TypeLoc TyLoc)29 RetTy Visit(TypeLoc TyLoc) { 30 switch (TyLoc.getTypeLocClass()) { 31 #define ABSTRACT_TYPELOC(CLASS, PARENT) 32 #define TYPELOC(CLASS, PARENT) \ 33 case TypeLoc::CLASS: DISPATCH(CLASS##TypeLoc); 34 #include "clang/AST/TypeLocNodes.def" 35 } 36 llvm_unreachable("unexpected type loc class!"); 37 } 38 Visit(UnqualTypeLoc TyLoc)39 RetTy Visit(UnqualTypeLoc TyLoc) { 40 switch (TyLoc.getTypeLocClass()) { 41 #define ABSTRACT_TYPELOC(CLASS, PARENT) 42 #define TYPELOC(CLASS, PARENT) \ 43 case TypeLoc::CLASS: DISPATCH(CLASS##TypeLoc); 44 #include "clang/AST/TypeLocNodes.def" 45 } 46 llvm_unreachable("unexpected type loc class!"); 47 } 48 49 #define TYPELOC(CLASS, PARENT) \ 50 RetTy Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc) { \ 51 DISPATCH(PARENT); \ 52 } 53 #include "clang/AST/TypeLocNodes.def" 54 VisitTypeLoc(TypeLoc TyLoc)55 RetTy VisitTypeLoc(TypeLoc TyLoc) { return RetTy(); } 56 }; 57 58 #undef DISPATCH 59 60 } // end namespace clang 61 62 #endif // LLVM_CLANG_AST_TYPELOCVISITOR_H 63