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