Comment.cpp revision 4d48b5c1d58c381e6e0c719701ef433b530e0e1a
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 13namespace clang { 14namespace comments { 15 16const 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 30namespace { 31struct good {}; 32struct bad {}; 33 34template <typename T> 35good implements_child_begin_end(Comment::child_iterator (T::*)() const) { 36 return good(); 37} 38 39static 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 47static 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 61Comment::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 75Comment::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