1198092Srdivacky//===--- TypeLocVisitor.h - Visitor for TypeLoc subclasses ------*- C++ -*-===//
2198092Srdivacky//
3198092Srdivacky//                     The LLVM Compiler Infrastructure
4198092Srdivacky//
5198092Srdivacky// This file is distributed under the University of Illinois Open Source
6198092Srdivacky// License. See LICENSE.TXT for details.
7198092Srdivacky//
8198092Srdivacky//===----------------------------------------------------------------------===//
9198092Srdivacky//
10198092Srdivacky//  This file defines the TypeLocVisitor interface.
11198092Srdivacky//
12198092Srdivacky//===----------------------------------------------------------------------===//
13198092Srdivacky#ifndef LLVM_CLANG_AST_TYPELOCVISITOR_H
14198092Srdivacky#define LLVM_CLANG_AST_TYPELOCVISITOR_H
15198092Srdivacky
16198092Srdivacky#include "clang/AST/TypeLoc.h"
17198092Srdivacky#include "clang/AST/TypeVisitor.h"
18198398Srdivacky#include "llvm/Support/ErrorHandling.h"
19198092Srdivacky
20198092Srdivackynamespace clang {
21198092Srdivacky
22198398Srdivacky#define DISPATCH(CLASSNAME) \
23198398Srdivacky  return static_cast<ImplClass*>(this)-> \
24249423Sdim    Visit##CLASSNAME(TyLoc.castAs<CLASSNAME>())
25198092Srdivacky
26198092Srdivackytemplate<typename ImplClass, typename RetTy=void>
27198092Srdivackyclass TypeLocVisitor {
28198092Srdivackypublic:
29198092Srdivacky  RetTy Visit(TypeLoc TyLoc) {
30198398Srdivacky    switch (TyLoc.getTypeLocClass()) {
31198398Srdivacky#define ABSTRACT_TYPELOC(CLASS, PARENT)
32198398Srdivacky#define TYPELOC(CLASS, PARENT) \
33198398Srdivacky    case TypeLoc::CLASS: DISPATCH(CLASS##TypeLoc);
34198398Srdivacky#include "clang/AST/TypeLocNodes.def"
35198398Srdivacky    }
36200583Srdivacky    llvm_unreachable("unexpected type loc class!");
37198112Srdivacky  }
38198112Srdivacky
39198112Srdivacky  RetTy Visit(UnqualTypeLoc TyLoc) {
40198398Srdivacky    switch (TyLoc.getTypeLocClass()) {
41198398Srdivacky#define ABSTRACT_TYPELOC(CLASS, PARENT)
42198398Srdivacky#define TYPELOC(CLASS, PARENT) \
43198398Srdivacky    case TypeLoc::CLASS: DISPATCH(CLASS##TypeLoc);
44198398Srdivacky#include "clang/AST/TypeLocNodes.def"
45198398Srdivacky    }
46202879Srdivacky    llvm_unreachable("unexpected type loc class!");
47198092Srdivacky  }
48198092Srdivacky
49198112Srdivacky#define TYPELOC(CLASS, PARENT)      \
50198398Srdivacky  RetTy Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc) { \
51198112Srdivacky    DISPATCH(PARENT);               \
52198112Srdivacky  }
53198092Srdivacky#include "clang/AST/TypeLocNodes.def"
54198092Srdivacky
55198092Srdivacky  RetTy VisitTypeLoc(TypeLoc TyLoc) { return RetTy(); }
56198092Srdivacky};
57198092Srdivacky
58198092Srdivacky#undef DISPATCH
59198092Srdivacky
60198092Srdivacky}  // end namespace clang
61198092Srdivacky
62198092Srdivacky#endif // LLVM_CLANG_AST_TYPELOCVISITOR_H
63