CommentVisitor.h revision 8d3ba23f2d9e6c87794d059412a0808c9cbacb25
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) {
278d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko    switch (C->getCommentKind()) {
288d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko    default: llvm_unreachable("Unknown comment kind!");
298d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#define ABSTRACT_COMMENT(COMMENT)
308d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#define COMMENT(CLASS, PARENT) \
318d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko    case Comment::CLASS##Kind: DISPATCH(CLASS, CLASS);
328d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#include "clang/AST/CommentNodes.inc"
338d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#undef ABSTRACT_COMMENT
348d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#undef COMMENT
358d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko    }
368d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  }
378d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
388d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  // If the derived class does not implement a certain Visit* method, fall back
398d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  // on Visit* method for the superclass.
408d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#define ABSTRACT_COMMENT(COMMENT) COMMENT
418d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#define COMMENT(CLASS, PARENT) \
428d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  RetTy visit ## CLASS(PTR(CLASS) C) { DISPATCH(PARENT, PARENT); }
438d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#include "clang/AST/CommentNodes.inc"
448d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#undef ABSTRACT_COMMENT
458d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#undef COMMENT
468d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
478d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  RetTy visitComment(PTR(Comment) C) { return RetTy(); }
488d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
498d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#undef PTR
508d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#undef DISPATCH
518d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko};
528d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
538d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkotemplate<typename ImplClass, typename RetTy=void>
548d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoclass CommentVisitor :
558d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko    public CommentVisitorBase<make_ptr, ImplClass, RetTy> {};
568d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
578d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkotemplate<typename ImplClass, typename RetTy=void>
588d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoclass ConstCommentVisitor :
598d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko    public CommentVisitorBase<make_const_ptr, ImplClass, RetTy> {};
608d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
618d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko} // end namespace comments
628d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko} // end namespace clang
638d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
64