Home | History | Annotate | Line # | Download | only in AST
      1 //===--- TypeLocVisitor.h - Visitor for TypeLoc subclasses ------*- C++ -*-===//
      2 //
      3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
      4 // See https://llvm.org/LICENSE.txt for license information.
      5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
      6 //
      7 //===----------------------------------------------------------------------===//
      8 //
      9 //  This file defines the TypeLocVisitor interface.
     10 //
     11 //===----------------------------------------------------------------------===//
     12 #ifndef LLVM_CLANG_AST_TYPELOCVISITOR_H
     13 #define LLVM_CLANG_AST_TYPELOCVISITOR_H
     14 
     15 #include "clang/AST/TypeLoc.h"
     16 #include "llvm/Support/ErrorHandling.h"
     17 
     18 namespace clang {
     19 
     20 #define DISPATCH(CLASSNAME) \
     21   return static_cast<ImplClass*>(this)-> \
     22     Visit##CLASSNAME(TyLoc.castAs<CLASSNAME>())
     23 
     24 template<typename ImplClass, typename RetTy=void>
     25 class TypeLocVisitor {
     26 public:
     27   RetTy Visit(TypeLoc TyLoc) {
     28     switch (TyLoc.getTypeLocClass()) {
     29 #define ABSTRACT_TYPELOC(CLASS, PARENT)
     30 #define TYPELOC(CLASS, PARENT) \
     31     case TypeLoc::CLASS: DISPATCH(CLASS##TypeLoc);
     32 #include "clang/AST/TypeLocNodes.def"
     33     }
     34     llvm_unreachable("unexpected type loc class!");
     35   }
     36 
     37   RetTy Visit(UnqualTypeLoc TyLoc) {
     38     switch (TyLoc.getTypeLocClass()) {
     39 #define ABSTRACT_TYPELOC(CLASS, PARENT)
     40 #define TYPELOC(CLASS, PARENT) \
     41     case TypeLoc::CLASS: DISPATCH(CLASS##TypeLoc);
     42 #include "clang/AST/TypeLocNodes.def"
     43     }
     44     llvm_unreachable("unexpected type loc class!");
     45   }
     46 
     47 #define TYPELOC(CLASS, PARENT)      \
     48   RetTy Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc) { \
     49     DISPATCH(PARENT);               \
     50   }
     51 #include "clang/AST/TypeLocNodes.def"
     52 
     53   RetTy VisitTypeLoc(TypeLoc TyLoc) { return RetTy(); }
     54 };
     55 
     56 #undef DISPATCH
     57 
     58 }  // end namespace clang
     59 
     60 #endif // LLVM_CLANG_AST_TYPELOCVISITOR_H
     61