Clang Project

clang_source_code/include/clang/AST/CommentVisitor.h
1//===- CommentVisitor.h - Visitor for Comment 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#ifndef LLVM_CLANG_AST_COMMENTVISITOR_H
10#define LLVM_CLANG_AST_COMMENTVISITOR_H
11
12#include "clang/AST/Comment.h"
13#include "llvm/ADT/STLExtras.h"
14#include "llvm/Support/ErrorHandling.h"
15
16namespace clang {
17namespace comments {
18template <template <typenameclass Ptr, typename ImplClass,
19          typename RetTy = voidclass... ParamTys>
20class CommentVisitorBase {
21public:
22#define PTR(CLASS) typename Ptr<CLASS>::type
23#define DISPATCH(NAME, CLASS)                                                  \
24  return static_cast<ImplClass *>(this)->visit##NAME(                          \
25      static_cast<PTR(CLASS)>(C), std::forward<ParamTys>(P)...)
26
27  RetTy visit(PTR(Comment) C, ParamTys... P) {
28    if (!C)
29      return RetTy();
30
31    switch (C->getCommentKind()) {
32    default: llvm_unreachable("Unknown comment kind!");
33#define ABSTRACT_COMMENT(COMMENT)
34#define COMMENT(CLASS, PARENT) \
35    case Comment::CLASS##Kind: DISPATCH(CLASS, CLASS);
36#include "clang/AST/CommentNodes.inc"
37#undef ABSTRACT_COMMENT
38#undef COMMENT
39    }
40  }
41
42  // If the derived class does not implement a certain Visit* method, fall back
43  // on Visit* method for the superclass.
44#define ABSTRACT_COMMENT(COMMENT) COMMENT
45#define COMMENT(CLASS, PARENT)                                                 \
46  RetTy visit##CLASS(PTR(CLASS) C, ParamTys... P) { DISPATCH(PARENT, PARENT); }
47#include "clang/AST/CommentNodes.inc"
48#undef ABSTRACT_COMMENT
49#undef COMMENT
50
51  RetTy visitComment(PTR(Comment) C, ParamTys... P) { return RetTy(); }
52
53#undef PTR
54#undef DISPATCH
55};
56
57template <typename ImplClass, typename RetTy = voidclass... ParamTys>
58class CommentVisitor : public CommentVisitorBase<std::add_pointer, ImplClass,
59                                                 RetTy, ParamTys...> {};
60
61template <typename ImplClass, typename RetTy = voidclass... ParamTys>
62class ConstCommentVisitor
63    : public CommentVisitorBase<llvm::make_const_ptr, ImplClass, RetTy,
64                                ParamTys...> {};
65
66// namespace comments
67// namespace clang
68
69#endif // LLVM_CLANG_AST_COMMENTVISITOR_H
70
clang::comments::CommentVisitorBase::visit
clang::comments::CommentVisitorBase::visitComment