1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- #pragma once
- #ifdef __GNUC__
- #pragma GCC diagnostic push
- #pragma GCC diagnostic ignored "-Wunused-parameter"
- #endif
- //===- DeclVisitor.h - Visitor for Decl 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 DeclVisitor interface.
- //
- //===----------------------------------------------------------------------===//
- #ifndef LLVM_CLANG_AST_DECLVISITOR_H
- #define LLVM_CLANG_AST_DECLVISITOR_H
- #include "clang/AST/Decl.h"
- #include "clang/AST/DeclBase.h"
- #include "clang/AST/DeclCXX.h"
- #include "clang/AST/DeclFriend.h"
- #include "clang/AST/DeclObjC.h"
- #include "clang/AST/DeclOpenMP.h"
- #include "clang/AST/DeclTemplate.h"
- #include "llvm/ADT/STLExtras.h"
- #include "llvm/Support/ErrorHandling.h"
- namespace clang {
- namespace declvisitor {
- /// A simple visitor class that helps create declaration visitors.
- template<template <typename> class Ptr, typename ImplClass, typename RetTy=void>
- class Base {
- public:
- #define PTR(CLASS) typename Ptr<CLASS>::type
- #define DISPATCH(NAME, CLASS) \
- return static_cast<ImplClass*>(this)->Visit##NAME(static_cast<PTR(CLASS)>(D))
- RetTy Visit(PTR(Decl) D) {
- switch (D->getKind()) {
- #define DECL(DERIVED, BASE) \
- case Decl::DERIVED: DISPATCH(DERIVED##Decl, DERIVED##Decl);
- #define ABSTRACT_DECL(DECL)
- #include "clang/AST/DeclNodes.inc"
- }
- llvm_unreachable("Decl that isn't part of DeclNodes.inc!");
- }
- // If the implementation chooses not to implement a certain visit
- // method, fall back to the parent.
- #define DECL(DERIVED, BASE) \
- RetTy Visit##DERIVED##Decl(PTR(DERIVED##Decl) D) { DISPATCH(BASE, BASE); }
- #include "clang/AST/DeclNodes.inc"
- RetTy VisitDecl(PTR(Decl) D) { return RetTy(); }
- #undef PTR
- #undef DISPATCH
- };
- } // namespace declvisitor
- /// A simple visitor class that helps create declaration visitors.
- ///
- /// This class does not preserve constness of Decl pointers (see also
- /// ConstDeclVisitor).
- template <typename ImplClass, typename RetTy = void>
- class DeclVisitor
- : public declvisitor::Base<std::add_pointer, ImplClass, RetTy> {};
- /// A simple visitor class that helps create declaration visitors.
- ///
- /// This class preserves constness of Decl pointers (see also DeclVisitor).
- template <typename ImplClass, typename RetTy = void>
- class ConstDeclVisitor
- : public declvisitor::Base<llvm::make_const_ptr, ImplClass, RetTy> {};
- } // namespace clang
- #endif // LLVM_CLANG_AST_DECLVISITOR_H
- #ifdef __GNUC__
- #pragma GCC diagnostic pop
- #endif
|