TypeLocVisitor.h revision 0c411806d540f7158bf12fee5c10f7de2647de76
10c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis//===--- TypeLocVisitor.h - Visitor for TypeLoc subclasses ------*- C++ -*-===//
20c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis//
30c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis//                     The LLVM Compiler Infrastructure
40c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis//
50c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis// This file is distributed under the University of Illinois Open Source
60c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis// License. See LICENSE.TXT for details.
70c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis//
80c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis//===----------------------------------------------------------------------===//
90c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis//
100c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis//  This file defines the TypeLocVisitor interface.
110c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis//
120c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis//===----------------------------------------------------------------------===//
130c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis#ifndef LLVM_CLANG_AST_TYPELOCVISITOR_H
140c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis#define LLVM_CLANG_AST_TYPELOCVISITOR_H
150c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis
160c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis#include "clang/AST/TypeLoc.h"
170c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis#include "clang/AST/TypeVisitor.h"
180c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis
190c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidisnamespace clang {
200c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis
210c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis#define DISPATCH(CLASS) \
220c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis  return static_cast<ImplClass*>(this)->Visit ## CLASS(cast<CLASS>(TyLoc))
230c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis
240c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidistemplate<typename ImplClass, typename RetTy=void>
250c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidisclass TypeLocVisitor {
260c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis  class TypeDispatch : public TypeVisitor<TypeDispatch, RetTy> {
270c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis    ImplClass *Impl;
280c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis    TypeLoc TyLoc;
290c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis
300c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis  public:
310c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis    TypeDispatch(ImplClass *impl, TypeLoc &tyLoc) : Impl(impl), TyLoc(tyLoc) { }
320c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis#define ABSTRACT_TYPELOC(CLASS)
330c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis#define TYPELOC(CLASS, PARENT, TYPE)                              \
340c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis    RetTy Visit##TYPE(TYPE *) {                                   \
350c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis      return Impl->Visit##CLASS(reinterpret_cast<CLASS&>(TyLoc)); \
360c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis    }
370c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis#include "clang/AST/TypeLocNodes.def"
380c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis  };
390c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis
400c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidispublic:
410c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis  RetTy Visit(TypeLoc TyLoc) {
420c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis    TypeDispatch TD(static_cast<ImplClass*>(this), TyLoc);
430c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis    return TD.Visit(TyLoc.getSourceType().getTypePtr());
440c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis  }
450c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis
460c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis#define TYPELOC(CLASS, PARENT, TYPE) RetTy Visit##CLASS(CLASS TyLoc) {       \
470c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis  DISPATCH(PARENT);                                                          \
480c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis}
490c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis#include "clang/AST/TypeLocNodes.def"
500c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis
510c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis  RetTy VisitTypeLoc(TypeLoc TyLoc) { return RetTy(); }
520c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis};
530c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis
540c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis#undef DISPATCH
550c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis
560c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis}  // end namespace clang
570c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis
580c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis#endif // LLVM_CLANG_AST_TYPELOCVISITOR_H
59