]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - contrib/llvm/tools/clang/include/clang/AST/TypeLocVisitor.h
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / contrib / llvm / tools / clang / include / clang / AST / TypeLocVisitor.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"
19
20 namespace clang {
21
22 #define DISPATCH(CLASSNAME) \
23   return static_cast<ImplClass*>(this)-> \
24     Visit##CLASSNAME(TyLoc.castAs<CLASSNAME>())
25
26 template<typename ImplClass, typename RetTy=void>
27 class TypeLocVisitor {
28 public:
29   RetTy Visit(TypeLoc 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_unreachable("unexpected type loc class!");
37   }
38
39   RetTy Visit(UnqualTypeLoc TyLoc) {
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     }
46     llvm_unreachable("unexpected type loc class!");
47   }
48
49 #define TYPELOC(CLASS, PARENT)      \
50   RetTy Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc) { \
51     DISPATCH(PARENT);               \
52   }
53 #include "clang/AST/TypeLocNodes.def"
54
55   RetTy VisitTypeLoc(TypeLoc TyLoc) { return RetTy(); }
56 };
57
58 #undef DISPATCH
59
60 }  // end namespace clang
61
62 #endif // LLVM_CLANG_AST_TYPELOCVISITOR_H