10SN/A//===--- TypeLocVisitor.h - Visitor for TypeLoc subclasses ------*- C++ -*-===//
2157SN/A//
30SN/A//                     The LLVM Compiler Infrastructure
40SN/A//
50SN/A// This file is distributed under the University of Illinois Open Source
60SN/A// License. See LICENSE.TXT for details.
7157SN/A//
80SN/A//===----------------------------------------------------------------------===//
9157SN/A//
100SN/A//  This file defines the TypeLocVisitor interface.
110SN/A//
120SN/A//===----------------------------------------------------------------------===//
130SN/A#ifndef LLVM_CLANG_AST_TYPELOCVISITOR_H
140SN/A#define LLVM_CLANG_AST_TYPELOCVISITOR_H
150SN/A
160SN/A#include "clang/AST/TypeLoc.h"
170SN/A#include "clang/AST/TypeVisitor.h"
180SN/A#include "llvm/Support/ErrorHandling.h"
190SN/A
200SN/Anamespace clang {
21157SN/A
22157SN/A#define DISPATCH(CLASSNAME) \
23157SN/A  return static_cast<ImplClass*>(this)-> \
240SN/A    Visit##CLASSNAME(TyLoc.castAs<CLASSNAME>())
250SN/A
260SN/Atemplate<typename ImplClass, typename RetTy=void>
270SN/Aclass TypeLocVisitor {
280SN/Apublic:
29704Savstepan  RetTy Visit(TypeLoc TyLoc) {
30704Savstepan    switch (TyLoc.getTypeLocClass()) {
31704Savstepan#define ABSTRACT_TYPELOC(CLASS, PARENT)
32704Savstepan#define TYPELOC(CLASS, PARENT) \
33704Savstepan    case TypeLoc::CLASS: DISPATCH(CLASS##TypeLoc);
34704Savstepan#include "clang/AST/TypeLocNodes.def"
35704Savstepan    }
36704Savstepan    llvm_unreachable("unexpected type loc class!");
37704Savstepan  }
38704Savstepan
39704Savstepan  RetTy Visit(UnqualTypeLoc TyLoc) {
40704Savstepan    switch (TyLoc.getTypeLocClass()) {
41704Savstepan#define ABSTRACT_TYPELOC(CLASS, PARENT)
42704Savstepan#define TYPELOC(CLASS, PARENT) \
43704Savstepan    case TypeLoc::CLASS: DISPATCH(CLASS##TypeLoc);
44704Savstepan#include "clang/AST/TypeLocNodes.def"
45704Savstepan    }
46704Savstepan    llvm_unreachable("unexpected type loc class!");
47704Savstepan  }
48704Savstepan
490SN/A#define TYPELOC(CLASS, PARENT)      \
500SN/A  RetTy Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc) { \
510SN/A    DISPATCH(PARENT);               \
520SN/A  }
530SN/A#include "clang/AST/TypeLocNodes.def"
540SN/A
550SN/A  RetTy VisitTypeLoc(TypeLoc TyLoc) { return RetTy(); }
560SN/A};
570SN/A
580SN/A#undef DISPATCH
590SN/A
600SN/A}  // end namespace clang
610SN/A
620SN/A#endif // LLVM_CLANG_AST_TYPELOCVISITOR_H
630SN/A