//===- AttrVisitor.h - Visitor for Attr subclasses --------------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
//  This file defines the AttrVisitor interface.
//
//===----------------------------------------------------------------------===//

#ifndef LLVM_CLANG_AST_ATTRVISITOR_H
#define LLVM_CLANG_AST_ATTRVISITOR_H

#include "clang/AST/Attr.h"

namespace clang {

namespace attrvisitor {

/// A simple visitor class that helps create attribute visitors.
template <template <typename> class Ptr, typename ImplClass,
          typename RetTy = void, class... ParamTys>
class Base {
public:
#define PTR(CLASS) typename Ptr<CLASS>::type
#define DISPATCH(NAME)                                                         \
  return static_cast<ImplClass *>(this)->Visit##NAME(static_cast<PTR(NAME)>(A))

  RetTy Visit(PTR(Attr) A) {
    switch (A->getKind()) {

#define ATTR(NAME)                                                             \
  case attr::NAME:                                                             \
    DISPATCH(NAME##Attr);
#include "clang/Basic/AttrList.inc"
    }
    llvm_unreachable("Attr that isn't part of AttrList.inc!");
  }

  // If the implementation chooses not to implement a certain visit
  // method, fall back to the parent.
#define ATTR(NAME)                                                             \
  RetTy Visit##NAME##Attr(PTR(NAME##Attr) A) { DISPATCH(Attr); }
#include "clang/Basic/AttrList.inc"

  RetTy VisitAttr(PTR(Attr)) { return RetTy(); }

#undef PTR
#undef DISPATCH
};

} // namespace attrvisitor

/// A simple visitor class that helps create attribute visitors.
///
/// This class does not preserve constness of Attr pointers (see
/// also ConstAttrVisitor).
template <typename ImplClass, typename RetTy = void, typename... ParamTys>
class AttrVisitor : public attrvisitor::Base<std::add_pointer, ImplClass, RetTy,
                                             ParamTys...> {};

/// A simple visitor class that helps create attribute visitors.
///
/// This class preserves constness of Attr pointers (see also
/// AttrVisitor).
template <typename ImplClass, typename RetTy = void, typename... ParamTys>
class ConstAttrVisitor
    : public attrvisitor::Base<llvm::make_const_ptr, ImplClass, RetTy,
                               ParamTys...> {};

} // namespace clang

#endif // LLVM_CLANG_AST_ATTRVISITOR_H
