TypeLocVisitor.h revision 9f61aa9e280adea9fbf3365f0e4f6ed568c9885a
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)-> \ 2451bd803fbdade51d674598ed45da3d54190a656cJohn McCall Visit##CLASSNAME(cast<CLASSNAME>(TyLoc)) 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 } 460c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis } 470c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis 4834a0447b8072e0da14c0980597da9d03a1495662John McCall#define TYPELOC(CLASS, PARENT) \ 4951bd803fbdade51d674598ed45da3d54190a656cJohn McCall RetTy Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc) { \ 5034a0447b8072e0da14c0980597da9d03a1495662John McCall DISPATCH(PARENT); \ 5134a0447b8072e0da14c0980597da9d03a1495662John McCall } 520c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis#include "clang/AST/TypeLocNodes.def" 530c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis 540c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis RetTy VisitTypeLoc(TypeLoc TyLoc) { return RetTy(); } 550c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis}; 560c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis 570c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis#undef DISPATCH 580c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis 590c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis} // end namespace clang 600c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis 610c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis#endif // LLVM_CLANG_AST_TYPELOCVISITOR_H 62