18d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko//===--- CommentVisitor.h - Visitor for Comment subclasses ------*- C++ -*-===// 28d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko// 38d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko// The LLVM Compiler Infrastructure 48d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko// 58d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko// This file is distributed under the University of Illinois Open Source 68d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko// License. See LICENSE.TXT for details. 78d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko// 88d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko//===----------------------------------------------------------------------===// 98d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 108d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#include "clang/AST/Comment.h" 118d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#include "llvm/Support/ErrorHandling.h" 128d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 138d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkonamespace clang { 148d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkonamespace comments { 158d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 168d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkotemplate <typename T> struct make_ptr { typedef T *type; }; 178d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkotemplate <typename T> struct make_const_ptr { typedef const T *type; }; 188d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 198d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkotemplate<template <typename> class Ptr, typename ImplClass, typename RetTy=void> 208d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoclass CommentVisitorBase { 218d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkopublic: 228d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#define PTR(CLASS) typename Ptr<CLASS>::type 238d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#define DISPATCH(NAME, CLASS) \ 248d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return static_cast<ImplClass*>(this)->visit ## NAME(static_cast<PTR(CLASS)>(C)) 258d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 268d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko RetTy visit(PTR(Comment) C) { 27ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko if (!C) 28ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko return RetTy(); 29ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko 308d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko switch (C->getCommentKind()) { 318d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko default: llvm_unreachable("Unknown comment kind!"); 328d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#define ABSTRACT_COMMENT(COMMENT) 338d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#define COMMENT(CLASS, PARENT) \ 348d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko case Comment::CLASS##Kind: DISPATCH(CLASS, CLASS); 358d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#include "clang/AST/CommentNodes.inc" 368d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#undef ABSTRACT_COMMENT 378d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#undef COMMENT 388d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 398d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 408d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 418d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko // If the derived class does not implement a certain Visit* method, fall back 428d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko // on Visit* method for the superclass. 438d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#define ABSTRACT_COMMENT(COMMENT) COMMENT 448d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#define COMMENT(CLASS, PARENT) \ 458d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko RetTy visit ## CLASS(PTR(CLASS) C) { DISPATCH(PARENT, PARENT); } 468d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#include "clang/AST/CommentNodes.inc" 478d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#undef ABSTRACT_COMMENT 488d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#undef COMMENT 498d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 508d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko RetTy visitComment(PTR(Comment) C) { return RetTy(); } 518d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 528d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#undef PTR 538d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#undef DISPATCH 548d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko}; 558d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 568d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkotemplate<typename ImplClass, typename RetTy=void> 578d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoclass CommentVisitor : 588d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko public CommentVisitorBase<make_ptr, ImplClass, RetTy> {}; 598d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 608d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkotemplate<typename ImplClass, typename RetTy=void> 618d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoclass ConstCommentVisitor : 628d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko public CommentVisitorBase<make_const_ptr, ImplClass, RetTy> {}; 638d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 648d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko} // end namespace comments 658d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko} // end namespace clang 668d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 67