• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===--- CommentVisitor.h - Visitor for Comment subclasses ------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 #ifndef LLVM_CLANG_AST_COMMENTVISITOR_H
11 #define LLVM_CLANG_AST_COMMENTVISITOR_H
12 
13 #include "clang/AST/Comment.h"
14 #include "llvm/Support/ErrorHandling.h"
15 
16 namespace clang {
17 namespace comments {
18 
19 template <typename T> struct make_ptr       { typedef       T *type; };
20 template <typename T> struct make_const_ptr { typedef const T *type; };
21 
22 template<template <typename> class Ptr, typename ImplClass, typename RetTy=void>
23 class CommentVisitorBase {
24 public:
25 #define PTR(CLASS) typename Ptr<CLASS>::type
26 #define DISPATCH(NAME, CLASS) \
27  return static_cast<ImplClass*>(this)->visit ## NAME(static_cast<PTR(CLASS)>(C))
28 
visit(PTR (Comment)C)29   RetTy visit(PTR(Comment) C) {
30     if (!C)
31       return RetTy();
32 
33     switch (C->getCommentKind()) {
34     default: llvm_unreachable("Unknown comment kind!");
35 #define ABSTRACT_COMMENT(COMMENT)
36 #define COMMENT(CLASS, PARENT) \
37     case Comment::CLASS##Kind: DISPATCH(CLASS, CLASS);
38 #include "clang/AST/CommentNodes.inc"
39 #undef ABSTRACT_COMMENT
40 #undef COMMENT
41     }
42   }
43 
44   // If the derived class does not implement a certain Visit* method, fall back
45   // on Visit* method for the superclass.
46 #define ABSTRACT_COMMENT(COMMENT) COMMENT
47 #define COMMENT(CLASS, PARENT) \
48   RetTy visit ## CLASS(PTR(CLASS) C) { DISPATCH(PARENT, PARENT); }
49 #include "clang/AST/CommentNodes.inc"
50 #undef ABSTRACT_COMMENT
51 #undef COMMENT
52 
visitComment(PTR (Comment)C)53   RetTy visitComment(PTR(Comment) C) { return RetTy(); }
54 
55 #undef PTR
56 #undef DISPATCH
57 };
58 
59 template<typename ImplClass, typename RetTy=void>
60 class CommentVisitor :
61     public CommentVisitorBase<make_ptr, ImplClass, RetTy> {};
62 
63 template<typename ImplClass, typename RetTy=void>
64 class ConstCommentVisitor :
65     public CommentVisitorBase<make_const_ptr, ImplClass, RetTy> {};
66 
67 } // end namespace comments
68 } // end namespace clang
69 
70 #endif
71