10c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis//===--- TypeLocVisitor.h - Visitor for TypeLoc subclasses ------*- C++ -*-===// 20c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis// 30c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis// The LLVM Compiler Infrastructure 40c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis// 50c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis// This file is distributed under the University of Illinois Open Source 60c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis// License. See LICENSE.TXT for details. 70c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis// 80c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis//===----------------------------------------------------------------------===// 90c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis// 100c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis// This file defines the TypeLocVisitor interface. 110c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis// 120c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis//===----------------------------------------------------------------------===// 130c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis#ifndef LLVM_CLANG_AST_TYPELOCVISITOR_H 140c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis#define LLVM_CLANG_AST_TYPELOCVISITOR_H 150c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis 160c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis#include "clang/AST/TypeLoc.h" 170c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis#include "clang/AST/TypeVisitor.h" 1851bd803fbdade51d674598ed45da3d54190a656cJohn McCall#include "llvm/Support/ErrorHandling.h" 190c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis 200c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidisnamespace clang { 210c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis 2251bd803fbdade51d674598ed45da3d54190a656cJohn McCall#define DISPATCH(CLASSNAME) \ 2351bd803fbdade51d674598ed45da3d54190a656cJohn McCall return static_cast<ImplClass*>(this)-> \ 2439e6ab4be93d9c5e729a578ddd9d415cd2d49872David Blaikie Visit##CLASSNAME(TyLoc.castAs<CLASSNAME>()) 250c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis 260c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidistemplate<typename ImplClass, typename RetTy=void> 270c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidisclass TypeLocVisitor { 280c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidispublic: 290c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis RetTy Visit(TypeLoc TyLoc) { 3051bd803fbdade51d674598ed45da3d54190a656cJohn McCall switch (TyLoc.getTypeLocClass()) { 3151bd803fbdade51d674598ed45da3d54190a656cJohn McCall#define ABSTRACT_TYPELOC(CLASS, PARENT) 3251bd803fbdade51d674598ed45da3d54190a656cJohn McCall#define TYPELOC(CLASS, PARENT) \ 3351bd803fbdade51d674598ed45da3d54190a656cJohn McCall case TypeLoc::CLASS: DISPATCH(CLASS##TypeLoc); 3451bd803fbdade51d674598ed45da3d54190a656cJohn McCall#include "clang/AST/TypeLocNodes.def" 3551bd803fbdade51d674598ed45da3d54190a656cJohn McCall } 369f61aa9e280adea9fbf3365f0e4f6ed568c9885aJeffrey Yasskin llvm_unreachable("unexpected type loc class!"); 3734a0447b8072e0da14c0980597da9d03a1495662John McCall } 3834a0447b8072e0da14c0980597da9d03a1495662John McCall 3934a0447b8072e0da14c0980597da9d03a1495662John McCall RetTy Visit(UnqualTypeLoc TyLoc) { 4051bd803fbdade51d674598ed45da3d54190a656cJohn McCall switch (TyLoc.getTypeLocClass()) { 4151bd803fbdade51d674598ed45da3d54190a656cJohn McCall#define ABSTRACT_TYPELOC(CLASS, PARENT) 4251bd803fbdade51d674598ed45da3d54190a656cJohn McCall#define TYPELOC(CLASS, PARENT) \ 4351bd803fbdade51d674598ed45da3d54190a656cJohn McCall case TypeLoc::CLASS: DISPATCH(CLASS##TypeLoc); 4451bd803fbdade51d674598ed45da3d54190a656cJohn McCall#include "clang/AST/TypeLocNodes.def" 4551bd803fbdade51d674598ed45da3d54190a656cJohn McCall } 46b7fd588ea95bfbe8436380091ab0f61a4210ba4bMike Stump llvm_unreachable("unexpected type loc class!"); 470c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis } 480c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis 4934a0447b8072e0da14c0980597da9d03a1495662John McCall#define TYPELOC(CLASS, PARENT) \ 5051bd803fbdade51d674598ed45da3d54190a656cJohn McCall RetTy Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc) { \ 5134a0447b8072e0da14c0980597da9d03a1495662John McCall DISPATCH(PARENT); \ 5234a0447b8072e0da14c0980597da9d03a1495662John McCall } 530c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis#include "clang/AST/TypeLocNodes.def" 540c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis 550c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis RetTy VisitTypeLoc(TypeLoc TyLoc) { return RetTy(); } 560c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis}; 570c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis 580c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis#undef DISPATCH 590c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis 600c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis} // end namespace clang 610c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis 620c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis#endif // LLVM_CLANG_AST_TYPELOCVISITOR_H 63