TypeLocVisitor.h revision 0c411806d540f7158bf12fee5c10f7de2647de76
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" 180c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis 190c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidisnamespace clang { 200c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis 210c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis#define DISPATCH(CLASS) \ 220c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis return static_cast<ImplClass*>(this)->Visit ## CLASS(cast<CLASS>(TyLoc)) 230c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis 240c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidistemplate<typename ImplClass, typename RetTy=void> 250c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidisclass TypeLocVisitor { 260c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis class TypeDispatch : public TypeVisitor<TypeDispatch, RetTy> { 270c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis ImplClass *Impl; 280c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis TypeLoc TyLoc; 290c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis 300c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis public: 310c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis TypeDispatch(ImplClass *impl, TypeLoc &tyLoc) : Impl(impl), TyLoc(tyLoc) { } 320c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis#define ABSTRACT_TYPELOC(CLASS) 330c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis#define TYPELOC(CLASS, PARENT, TYPE) \ 340c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis RetTy Visit##TYPE(TYPE *) { \ 350c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis return Impl->Visit##CLASS(reinterpret_cast<CLASS&>(TyLoc)); \ 360c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis } 370c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis#include "clang/AST/TypeLocNodes.def" 380c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis }; 390c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis 400c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidispublic: 410c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis RetTy Visit(TypeLoc TyLoc) { 420c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis TypeDispatch TD(static_cast<ImplClass*>(this), TyLoc); 430c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis return TD.Visit(TyLoc.getSourceType().getTypePtr()); 440c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis } 450c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis 460c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis#define TYPELOC(CLASS, PARENT, TYPE) RetTy Visit##CLASS(CLASS TyLoc) { \ 470c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis DISPATCH(PARENT); \ 480c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis} 490c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis#include "clang/AST/TypeLocNodes.def" 500c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis 510c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis RetTy VisitTypeLoc(TypeLoc TyLoc) { return RetTy(); } 520c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis}; 530c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis 540c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis#undef DISPATCH 550c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis 560c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis} // end namespace clang 570c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis 580c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis#endif // LLVM_CLANG_AST_TYPELOCVISITOR_H 59