Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
14 pmbaty 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
 
16
namespace clang {
17
namespace comments {
18
template <template <typename> class Ptr, typename ImplClass,
19
          typename RetTy = void, class... ParamTys>
20
class CommentVisitorBase {
21
public:
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
 
57
template <typename ImplClass, typename RetTy = void, class... ParamTys>
58
class CommentVisitor : public CommentVisitorBase<std::add_pointer, ImplClass,
59
                                                 RetTy, ParamTys...> {};
60
 
61
template <typename ImplClass, typename RetTy = void, class... ParamTys>
62
class 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