Deleted Added
full compact
TypeLocVisitor.h (198112) TypeLocVisitor.h (198398)
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