1 //===--- Comment.cpp - Comment AST node implementation --------------------===//
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 #include "clang/AST/Comment.h"
11 #include "llvm/Support/ErrorHandling.h"
12 
13 namespace clang {
14 namespace comments {
15 
16 const char *Comment::getCommentKindName() const {
17   switch (getCommentKind()) {
18   case NoCommentKind: return "NoCommentKind";
19 #define ABSTRACT_COMMENT(COMMENT)
20 #define COMMENT(CLASS, PARENT) \
21   case CLASS##Kind: \
22     return #CLASS;
23 #include "clang/AST/CommentNodes.inc"
24 #undef COMMENT
25 #undef ABSTRACT_COMMENT
26   }
27   llvm_unreachable("Unknown comment kind!");
28 }
29 
30 namespace {
31 struct good {};
32 struct bad {};
33 
34 template <typename T>
35 good implements_child_begin_end(Comment::child_iterator (T::*)() const) {
36   return good();
37 }
38 
39 static inline bad implements_child_begin_end(
40                       Comment::child_iterator (Comment::*)() const) {
41   return bad();
42 }
43 
44 #define ASSERT_IMPLEMENTS_child_begin(function) \
45   (void) sizeof(good(implements_child_begin_end(function)))
46 
47 static inline void CheckCommentASTNodes() {
48 #define ABSTRACT_COMMENT(COMMENT)
49 #define COMMENT(CLASS, PARENT) \
50   ASSERT_IMPLEMENTS_child_begin(&CLASS::child_begin); \
51   ASSERT_IMPLEMENTS_child_begin(&CLASS::child_end);
52 #include "clang/AST/CommentNodes.inc"
53 #undef COMMENT
54 #undef ABSTRACT_COMMENT
55 }
56 
57 #undef ASSERT_IMPLEMENTS_child_begin
58 
59 } // end unnamed namespace
60 
61 Comment::child_iterator Comment::child_begin() const {
62   switch (getCommentKind()) {
63   case NoCommentKind: llvm_unreachable("comment without a kind");
64 #define ABSTRACT_COMMENT(COMMENT)
65 #define COMMENT(CLASS, PARENT) \
66   case CLASS##Kind: \
67     return static_cast<const CLASS *>(this)->child_begin();
68 #include "clang/AST/CommentNodes.inc"
69 #undef COMMENT
70 #undef ABSTRACT_COMMENT
71   }
72   llvm_unreachable("Unknown comment kind!");
73 }
74 
75 Comment::child_iterator Comment::child_end() const {
76   switch (getCommentKind()) {
77   case NoCommentKind: llvm_unreachable("comment without a kind");
78 #define ABSTRACT_COMMENT(COMMENT)
79 #define COMMENT(CLASS, PARENT) \
80   case CLASS##Kind: \
81     return static_cast<const CLASS *>(this)->child_end();
82 #include "clang/AST/CommentNodes.inc"
83 #undef COMMENT
84 #undef ABSTRACT_COMMENT
85   }
86   llvm_unreachable("Unknown comment kind!");
87 }
88 
89 
90 } // end namespace comments
91 } // end namespace clang
92