Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Blame | Last modification | View Log | Download | RSS feed

  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
  70.