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