]> CyberLeo.Net >> Repos - FreeBSD/releng/9.2.git/blob - contrib/llvm/tools/clang/include/clang/AST/CommentVisitor.h
- Copy stable/9 to releng/9.2 as part of the 9.2-RELEASE cycle.
[FreeBSD/releng/9.2.git] / contrib / llvm / tools / clang / include / clang / AST / CommentVisitor.h
1 //===--- CommentVisitor.h - Visitor for Comment subclasses ------*- C++ -*-===//
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 #ifndef LLVM_CLANG_AST_COMMENTVISITOR_H
11 #define LLVM_CLANG_AST_COMMENTVISITOR_H
12
13 #include "clang/AST/Comment.h"
14 #include "llvm/Support/ErrorHandling.h"
15
16 namespace clang {
17 namespace comments {
18
19 template <typename T> struct make_ptr       { typedef       T *type; };
20 template <typename T> struct make_const_ptr { typedef const T *type; };
21
22 template<template <typename> class Ptr, typename ImplClass, typename RetTy=void>
23 class CommentVisitorBase {
24 public:
25 #define PTR(CLASS) typename Ptr<CLASS>::type
26 #define DISPATCH(NAME, CLASS) \
27  return static_cast<ImplClass*>(this)->visit ## NAME(static_cast<PTR(CLASS)>(C))
28
29   RetTy visit(PTR(Comment) C) {
30     if (!C)
31       return RetTy();
32
33     switch (C->getCommentKind()) {
34     default: llvm_unreachable("Unknown comment kind!");
35 #define ABSTRACT_COMMENT(COMMENT)
36 #define COMMENT(CLASS, PARENT) \
37     case Comment::CLASS##Kind: DISPATCH(CLASS, CLASS);
38 #include "clang/AST/CommentNodes.inc"
39 #undef ABSTRACT_COMMENT
40 #undef COMMENT
41     }
42   }
43
44   // If the derived class does not implement a certain Visit* method, fall back
45   // on Visit* method for the superclass.
46 #define ABSTRACT_COMMENT(COMMENT) COMMENT
47 #define COMMENT(CLASS, PARENT) \
48   RetTy visit ## CLASS(PTR(CLASS) C) { DISPATCH(PARENT, PARENT); }
49 #include "clang/AST/CommentNodes.inc"
50 #undef ABSTRACT_COMMENT
51 #undef COMMENT
52
53   RetTy visitComment(PTR(Comment) C) { return RetTy(); }
54
55 #undef PTR
56 #undef DISPATCH
57 };
58
59 template<typename ImplClass, typename RetTy=void>
60 class CommentVisitor :
61     public CommentVisitorBase<make_ptr, ImplClass, RetTy> {};
62
63 template<typename ImplClass, typename RetTy=void>
64 class ConstCommentVisitor :
65     public CommentVisitorBase<make_const_ptr, ImplClass, RetTy> {};
66
67 } // end namespace comments
68 } // end namespace clang
69
70 #endif