DeclVisitor.h revision ae54121c15cdd38f415f6fdda48215ab5e4dcee1
18dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor//===--- DeclVisitor.h - Visitor for Decl subclasses ------------*- C++ -*-===//
28dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor//
38dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor//                     The LLVM Compiler Infrastructure
48dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor//
58dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor// This file is distributed under the University of Illinois Open Source
68dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor// License. See LICENSE.TXT for details.
78dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor//
88dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor//===----------------------------------------------------------------------===//
98dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor//
108dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor//  This file defines the DeclVisitor interface.
118dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor//
128dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor//===----------------------------------------------------------------------===//
138dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor#ifndef LLVM_CLANG_AST_DECLVISITOR_H
148dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor#define LLVM_CLANG_AST_DECLVISITOR_H
158dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor
16c2ee10d79f70036af652a395ac1f8273f3d04e12Douglas Gregor#include "clang/AST/Decl.h"
17c2ee10d79f70036af652a395ac1f8273f3d04e12Douglas Gregor#include "clang/AST/DeclCXX.h"
1892b7f70c924cbf4514e9e434cea7def51ab49860John McCall#include "clang/AST/DeclFriend.h"
1930a2e16f6c27f888dd11eba6bbbae1e980078fcbChandler Carruth#include "clang/AST/DeclObjC.h"
208211effbd3abc5948a5d6924c87e72323016a376Anders Carlsson#include "clang/AST/DeclTemplate.h"
218211effbd3abc5948a5d6924c87e72323016a376Anders Carlsson
228dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregornamespace clang {
23ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkonamespace declvisitor {
248dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor
25ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkotemplate <typename T> struct make_ptr       { typedef       T *type; };
26ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkotemplate <typename T> struct make_const_ptr { typedef const T *type; };
278dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor
288dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor/// \brief A simple visitor class that helps create declaration visitors.
29ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkotemplate<template <typename> class Ptr, typename ImplClass, typename RetTy=void>
30ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkoclass Base {
318dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregorpublic:
32ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko
33ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko#define PTR(CLASS) typename Ptr<CLASS>::type
34ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko#define DISPATCH(NAME, CLASS) \
35ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko  return static_cast<ImplClass*>(this)->Visit##NAME(static_cast<PTR(CLASS)>(D))
36ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko
37ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko  RetTy Visit(PTR(Decl) D) {
388dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor    switch (D->getKind()) {
399a55591af3e5506b95a9718e15380129fbfc5ebcSean Hunt#define DECL(DERIVED, BASE) \
409a55591af3e5506b95a9718e15380129fbfc5ebcSean Hunt      case Decl::DERIVED: DISPATCH(DERIVED##Decl, DERIVED##Decl);
419a55591af3e5506b95a9718e15380129fbfc5ebcSean Hunt#define ABSTRACT_DECL(DECL)
429a55591af3e5506b95a9718e15380129fbfc5ebcSean Hunt#include "clang/AST/DeclNodes.inc"
438dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor    }
44561d3abc881033776ece385a01a510e1cbc1fa92David Blaikie    llvm_unreachable("Decl that isn't part of DeclNodes.inc!");
458dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor  }
468dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor
478dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor  // If the implementation chooses not to implement a certain visit
488dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor  // method, fall back to the parent.
499a55591af3e5506b95a9718e15380129fbfc5ebcSean Hunt#define DECL(DERIVED, BASE) \
50ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko  RetTy Visit##DERIVED##Decl(PTR(DERIVED##Decl) D) { DISPATCH(BASE, BASE); }
519a55591af3e5506b95a9718e15380129fbfc5ebcSean Hunt#include "clang/AST/DeclNodes.inc"
528dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor
53ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko  RetTy VisitDecl(PTR(Decl) D) { return RetTy(); }
548dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor
55ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko#undef PTR
568dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor#undef DISPATCH
57ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko};
58ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko
59ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko} // end namespace declvisitor
60ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko
61ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko/// \brief A simple visitor class that helps create declaration visitors.
62ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko///
63ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko/// This class does not preserve constness of Decl pointers (see also
64ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko/// ConstDeclVisitor).
65ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkotemplate<typename ImplClass, typename RetTy=void>
66ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkoclass DeclVisitor
67ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko : public declvisitor::Base<declvisitor::make_ptr, ImplClass, RetTy> {};
68ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko
69ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko/// \brief A simple visitor class that helps create declaration visitors.
70ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko///
71ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko/// This class preserves constness of Decl pointers (see also DeclVisitor).
72ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkotemplate<typename ImplClass, typename RetTy=void>
73ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkoclass ConstDeclVisitor
74ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko : public declvisitor::Base<declvisitor::make_const_ptr, ImplClass, RetTy> {};
758dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor
768dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor}  // end namespace clang
778dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor
788dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor#endif // LLVM_CLANG_AST_DECLVISITOR_H
79