1198092Srdivacky//===--- TypeLocVisitor.h - Visitor for TypeLoc subclasses ------*- C++ -*-===// 2198092Srdivacky// 3198092Srdivacky// The LLVM Compiler Infrastructure 4198092Srdivacky// 5198092Srdivacky// This file is distributed under the University of Illinois Open Source 6198092Srdivacky// License. See LICENSE.TXT for details. 7198092Srdivacky// 8198092Srdivacky//===----------------------------------------------------------------------===// 9198092Srdivacky// 10198092Srdivacky// This file defines the TypeLocVisitor interface. 11198092Srdivacky// 12198092Srdivacky//===----------------------------------------------------------------------===// 13198092Srdivacky#ifndef LLVM_CLANG_AST_TYPELOCVISITOR_H 14198092Srdivacky#define LLVM_CLANG_AST_TYPELOCVISITOR_H 15198092Srdivacky 16198092Srdivacky#include "clang/AST/TypeLoc.h" 17198092Srdivacky#include "clang/AST/TypeVisitor.h" 18198398Srdivacky#include "llvm/Support/ErrorHandling.h" 19198092Srdivacky 20198092Srdivackynamespace clang { 21198092Srdivacky 22198398Srdivacky#define DISPATCH(CLASSNAME) \ 23198398Srdivacky return static_cast<ImplClass*>(this)-> \ 24249423Sdim Visit##CLASSNAME(TyLoc.castAs<CLASSNAME>()) 25198092Srdivacky 26198092Srdivackytemplate<typename ImplClass, typename RetTy=void> 27198092Srdivackyclass TypeLocVisitor { 28198092Srdivackypublic: 29198092Srdivacky RetTy Visit(TypeLoc TyLoc) { 30198398Srdivacky switch (TyLoc.getTypeLocClass()) { 31198398Srdivacky#define ABSTRACT_TYPELOC(CLASS, PARENT) 32198398Srdivacky#define TYPELOC(CLASS, PARENT) \ 33198398Srdivacky case TypeLoc::CLASS: DISPATCH(CLASS##TypeLoc); 34198398Srdivacky#include "clang/AST/TypeLocNodes.def" 35198398Srdivacky } 36200583Srdivacky llvm_unreachable("unexpected type loc class!"); 37198112Srdivacky } 38198112Srdivacky 39198112Srdivacky RetTy Visit(UnqualTypeLoc TyLoc) { 40198398Srdivacky switch (TyLoc.getTypeLocClass()) { 41198398Srdivacky#define ABSTRACT_TYPELOC(CLASS, PARENT) 42198398Srdivacky#define TYPELOC(CLASS, PARENT) \ 43198398Srdivacky case TypeLoc::CLASS: DISPATCH(CLASS##TypeLoc); 44198398Srdivacky#include "clang/AST/TypeLocNodes.def" 45198398Srdivacky } 46202879Srdivacky llvm_unreachable("unexpected type loc class!"); 47198092Srdivacky } 48198092Srdivacky 49198112Srdivacky#define TYPELOC(CLASS, PARENT) \ 50198398Srdivacky RetTy Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc) { \ 51198112Srdivacky DISPATCH(PARENT); \ 52198112Srdivacky } 53198092Srdivacky#include "clang/AST/TypeLocNodes.def" 54198092Srdivacky 55198092Srdivacky RetTy VisitTypeLoc(TypeLoc TyLoc) { return RetTy(); } 56198092Srdivacky}; 57198092Srdivacky 58198092Srdivacky#undef DISPATCH 59198092Srdivacky 60198092Srdivacky} // end namespace clang 61198092Srdivacky 62198092Srdivacky#endif // LLVM_CLANG_AST_TYPELOCVISITOR_H 63