diff options
Diffstat (limited to 'clang-r353983/include/clang/AST/CommentVisitor.h')
| -rw-r--r-- | clang-r353983/include/clang/AST/CommentVisitor.h | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/clang-r353983/include/clang/AST/CommentVisitor.h b/clang-r353983/include/clang/AST/CommentVisitor.h new file mode 100644 index 00000000..d9a7439f --- /dev/null +++ b/clang-r353983/include/clang/AST/CommentVisitor.h @@ -0,0 +1,69 @@ +//===- CommentVisitor.h - Visitor for Comment 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 +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_CLANG_AST_COMMENTVISITOR_H +#define LLVM_CLANG_AST_COMMENTVISITOR_H + +#include "clang/AST/Comment.h" +#include "llvm/ADT/STLExtras.h" +#include "llvm/Support/ErrorHandling.h" + +namespace clang { +namespace comments { +template <template <typename> class Ptr, typename ImplClass, + typename RetTy = void, class... ParamTys> +class CommentVisitorBase { +public: +#define PTR(CLASS) typename Ptr<CLASS>::type +#define DISPATCH(NAME, CLASS) \ + return static_cast<ImplClass *>(this)->visit##NAME( \ + static_cast<PTR(CLASS)>(C), std::forward<ParamTys>(P)...) + + RetTy visit(PTR(Comment) C, ParamTys... P) { + if (!C) + return RetTy(); + + switch (C->getCommentKind()) { + default: llvm_unreachable("Unknown comment kind!"); +#define ABSTRACT_COMMENT(COMMENT) +#define COMMENT(CLASS, PARENT) \ + case Comment::CLASS##Kind: DISPATCH(CLASS, CLASS); +#include "clang/AST/CommentNodes.inc" +#undef ABSTRACT_COMMENT +#undef COMMENT + } + } + + // If the derived class does not implement a certain Visit* method, fall back + // on Visit* method for the superclass. +#define ABSTRACT_COMMENT(COMMENT) COMMENT +#define COMMENT(CLASS, PARENT) \ + RetTy visit##CLASS(PTR(CLASS) C, ParamTys... P) { DISPATCH(PARENT, PARENT); } +#include "clang/AST/CommentNodes.inc" +#undef ABSTRACT_COMMENT +#undef COMMENT + + RetTy visitComment(PTR(Comment) C, ParamTys... P) { return RetTy(); } + +#undef PTR +#undef DISPATCH +}; + +template <typename ImplClass, typename RetTy = void, class... ParamTys> +class CommentVisitor : public CommentVisitorBase<std::add_pointer, ImplClass, + RetTy, ParamTys...> {}; + +template <typename ImplClass, typename RetTy = void, class... ParamTys> +class ConstCommentVisitor + : public CommentVisitorBase<llvm::make_const_ptr, ImplClass, RetTy, + ParamTys...> {}; + +} // namespace comments +} // namespace clang + +#endif // LLVM_CLANG_AST_COMMENTVISITOR_H |
