| //===- AttrVisitor.h - Visitor for Attr subclasses --------------*- C++ -*-===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // 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 |