1//===--- TypeLocVisitor.h - Visitor for TypeLoc subclasses ------*- C++ -*-===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// This file defines the TypeLocVisitor interface. 11// 12//===----------------------------------------------------------------------===// 13#ifndef LLVM_CLANG_AST_TYPELOCVISITOR_H 14#define LLVM_CLANG_AST_TYPELOCVISITOR_H 15 16#include "clang/AST/TypeLoc.h" 17#include "clang/AST/TypeVisitor.h"
| 1//===--- TypeLocVisitor.h - Visitor for TypeLoc subclasses ------*- C++ -*-===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// This file defines the TypeLocVisitor interface. 11// 12//===----------------------------------------------------------------------===// 13#ifndef LLVM_CLANG_AST_TYPELOCVISITOR_H 14#define LLVM_CLANG_AST_TYPELOCVISITOR_H 15 16#include "clang/AST/TypeLoc.h" 17#include "clang/AST/TypeVisitor.h"
|
| 18#include "llvm/Support/ErrorHandling.h"
|
18 19namespace clang { 20
| 19 20namespace clang { 21
|
21#define DISPATCH(CLASS) \ 22 return static_cast<ImplClass*>(this)->Visit ## CLASS(cast<CLASS>(TyLoc))
| 22#define DISPATCH(CLASSNAME) \ 23 return static_cast<ImplClass*>(this)-> \ 24 Visit##CLASSNAME(cast<CLASSNAME>(TyLoc))
|
23 24template<typename ImplClass, typename RetTy=void> 25class TypeLocVisitor {
| 25 26template<typename ImplClass, typename RetTy=void> 27class TypeLocVisitor {
|
26 class TypeDispatch : public TypeVisitor<TypeDispatch, RetTy> { 27 ImplClass *Impl; 28 UnqualTypeLoc TyLoc; 29 30 public: 31 TypeDispatch(ImplClass *impl, UnqualTypeLoc &tyLoc) 32 : Impl(impl), TyLoc(tyLoc) { } 33#define TYPELOC(CLASS, BASE) 34#define ABSTRACT_TYPELOC(CLASS) 35#define UNQUAL_TYPELOC(CLASS, PARENT, TYPE) \ 36 RetTy Visit##TYPE(TYPE *) { \ 37 return Impl->Visit##CLASS(reinterpret_cast<CLASS&>(TyLoc)); \ 38 } 39#include "clang/AST/TypeLocNodes.def" 40 }; 41
| |
42public: 43 RetTy Visit(TypeLoc TyLoc) {
| 28public: 29 RetTy Visit(TypeLoc TyLoc) {
|
44 if (isa<QualifiedLoc>(TyLoc)) 45 return static_cast<ImplClass*>(this)-> 46 VisitQualifiedLoc(cast<QualifiedLoc>(TyLoc)); 47 48 return Visit(cast<UnqualTypeLoc>(TyLoc));
| 30 switch (TyLoc.getTypeLocClass()) { 31#define ABSTRACT_TYPELOC(CLASS, PARENT) 32#define TYPELOC(CLASS, PARENT) \ 33 case TypeLoc::CLASS: DISPATCH(CLASS##TypeLoc); 34#include "clang/AST/TypeLocNodes.def" 35 } 36 llvm::llvm_unreachable("unexpected type loc class!");
|
49 } 50 51 RetTy Visit(UnqualTypeLoc TyLoc) {
| 37 } 38 39 RetTy Visit(UnqualTypeLoc TyLoc) {
|
52 TypeDispatch TD(static_cast<ImplClass*>(this), TyLoc); 53 return TD.Visit(TyLoc.getSourceTypePtr());
| 40 switch (TyLoc.getTypeLocClass()) { 41#define ABSTRACT_TYPELOC(CLASS, PARENT) 42#define TYPELOC(CLASS, PARENT) \ 43 case TypeLoc::CLASS: DISPATCH(CLASS##TypeLoc); 44#include "clang/AST/TypeLocNodes.def" 45 }
|
54 } 55 56#define TYPELOC(CLASS, PARENT) \
| 46 } 47 48#define TYPELOC(CLASS, PARENT) \
|
57 RetTy Visit##CLASS(CLASS TyLoc) { \
| 49 RetTy Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc) { \
|
58 DISPATCH(PARENT); \ 59 } 60#include "clang/AST/TypeLocNodes.def" 61 62 RetTy VisitTypeLoc(TypeLoc TyLoc) { return RetTy(); } 63}; 64 65#undef DISPATCH 66 67} // end namespace clang 68 69#endif // LLVM_CLANG_AST_TYPELOCVISITOR_H
| 50 DISPATCH(PARENT); \ 51 } 52#include "clang/AST/TypeLocNodes.def" 53 54 RetTy VisitTypeLoc(TypeLoc TyLoc) { return RetTy(); } 55}; 56 57#undef DISPATCH 58 59} // end namespace clang 60 61#endif // LLVM_CLANG_AST_TYPELOCVISITOR_H
|