10SN/A//===--- TypeLocVisitor.h - Visitor for TypeLoc subclasses ------*- C++ -*-===// 2157SN/A// 30SN/A// The LLVM Compiler Infrastructure 40SN/A// 50SN/A// This file is distributed under the University of Illinois Open Source 60SN/A// License. See LICENSE.TXT for details. 7157SN/A// 80SN/A//===----------------------------------------------------------------------===// 9157SN/A// 100SN/A// This file defines the TypeLocVisitor interface. 110SN/A// 120SN/A//===----------------------------------------------------------------------===// 130SN/A#ifndef LLVM_CLANG_AST_TYPELOCVISITOR_H 140SN/A#define LLVM_CLANG_AST_TYPELOCVISITOR_H 150SN/A 160SN/A#include "clang/AST/TypeLoc.h" 170SN/A#include "clang/AST/TypeVisitor.h" 180SN/A#include "llvm/Support/ErrorHandling.h" 190SN/A 200SN/Anamespace clang { 21157SN/A 22157SN/A#define DISPATCH(CLASSNAME) \ 23157SN/A return static_cast<ImplClass*>(this)-> \ 240SN/A Visit##CLASSNAME(TyLoc.castAs<CLASSNAME>()) 250SN/A 260SN/Atemplate<typename ImplClass, typename RetTy=void> 270SN/Aclass TypeLocVisitor { 280SN/Apublic: 29704Savstepan RetTy Visit(TypeLoc TyLoc) { 30704Savstepan switch (TyLoc.getTypeLocClass()) { 31704Savstepan#define ABSTRACT_TYPELOC(CLASS, PARENT) 32704Savstepan#define TYPELOC(CLASS, PARENT) \ 33704Savstepan case TypeLoc::CLASS: DISPATCH(CLASS##TypeLoc); 34704Savstepan#include "clang/AST/TypeLocNodes.def" 35704Savstepan } 36704Savstepan llvm_unreachable("unexpected type loc class!"); 37704Savstepan } 38704Savstepan 39704Savstepan RetTy Visit(UnqualTypeLoc TyLoc) { 40704Savstepan switch (TyLoc.getTypeLocClass()) { 41704Savstepan#define ABSTRACT_TYPELOC(CLASS, PARENT) 42704Savstepan#define TYPELOC(CLASS, PARENT) \ 43704Savstepan case TypeLoc::CLASS: DISPATCH(CLASS##TypeLoc); 44704Savstepan#include "clang/AST/TypeLocNodes.def" 45704Savstepan } 46704Savstepan llvm_unreachable("unexpected type loc class!"); 47704Savstepan } 48704Savstepan 490SN/A#define TYPELOC(CLASS, PARENT) \ 500SN/A RetTy Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc) { \ 510SN/A DISPATCH(PARENT); \ 520SN/A } 530SN/A#include "clang/AST/TypeLocNodes.def" 540SN/A 550SN/A RetTy VisitTypeLoc(TypeLoc TyLoc) { return RetTy(); } 560SN/A}; 570SN/A 580SN/A#undef DISPATCH 590SN/A 600SN/A} // end namespace clang 610SN/A 620SN/A#endif // LLVM_CLANG_AST_TYPELOCVISITOR_H 630SN/A