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 1091d243b6011ed74f6d3a446b1b792f6c11475ee4Argyrios Kyrtzidis#ifndef LLVM_CLANG_AST_COMMENTVISITOR_H 1191d243b6011ed74f6d3a446b1b792f6c11475ee4Argyrios Kyrtzidis#define LLVM_CLANG_AST_COMMENTVISITOR_H 1291d243b6011ed74f6d3a446b1b792f6c11475ee4Argyrios Kyrtzidis 138d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#include "clang/AST/Comment.h" 148d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#include "llvm/Support/ErrorHandling.h" 158d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 168d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkonamespace clang { 178d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkonamespace comments { 188d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 198d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkotemplate <typename T> struct make_ptr { typedef T *type; }; 208d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkotemplate <typename T> struct make_const_ptr { typedef const T *type; }; 218d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 228d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkotemplate<template <typename> class Ptr, typename ImplClass, typename RetTy=void> 238d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoclass CommentVisitorBase { 248d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkopublic: 258d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#define PTR(CLASS) typename Ptr<CLASS>::type 268d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#define DISPATCH(NAME, CLASS) \ 278d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return static_cast<ImplClass*>(this)->visit ## NAME(static_cast<PTR(CLASS)>(C)) 288d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 298d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko RetTy visit(PTR(Comment) C) { 30ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko if (!C) 31ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko return RetTy(); 32ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko 338d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko switch (C->getCommentKind()) { 348d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko default: llvm_unreachable("Unknown comment kind!"); 358d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#define ABSTRACT_COMMENT(COMMENT) 368d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#define COMMENT(CLASS, PARENT) \ 378d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko case Comment::CLASS##Kind: DISPATCH(CLASS, CLASS); 388d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#include "clang/AST/CommentNodes.inc" 398d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#undef ABSTRACT_COMMENT 408d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#undef COMMENT 418d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 428d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 438d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 448d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko // If the derived class does not implement a certain Visit* method, fall back 458d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko // on Visit* method for the superclass. 468d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#define ABSTRACT_COMMENT(COMMENT) COMMENT 478d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#define COMMENT(CLASS, PARENT) \ 488d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko RetTy visit ## CLASS(PTR(CLASS) C) { DISPATCH(PARENT, PARENT); } 498d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#include "clang/AST/CommentNodes.inc" 508d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#undef ABSTRACT_COMMENT 518d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#undef COMMENT 528d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 538d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko RetTy visitComment(PTR(Comment) C) { return RetTy(); } 548d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 558d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#undef PTR 568d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#undef DISPATCH 578d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko}; 588d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 598d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkotemplate<typename ImplClass, typename RetTy=void> 608d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoclass CommentVisitor : 618d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko public CommentVisitorBase<make_ptr, ImplClass, RetTy> {}; 628d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 638d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkotemplate<typename ImplClass, typename RetTy=void> 648d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoclass ConstCommentVisitor : 658d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko public CommentVisitorBase<make_const_ptr, ImplClass, RetTy> {}; 668d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 678d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko} // end namespace comments 688d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko} // end namespace clang 698d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 7091d243b6011ed74f6d3a446b1b792f6c11475ee4Argyrios Kyrtzidis#endif 71