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"
20c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev#include "clang/AST/DeclOpenMP.h"
218211effbd3abc5948a5d6924c87e72323016a376Anders Carlsson#include "clang/AST/DeclTemplate.h"
228211effbd3abc5948a5d6924c87e72323016a376Anders Carlsson
238dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregornamespace clang {
24ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkonamespace declvisitor {
258dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor
26ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkotemplate <typename T> struct make_ptr       { typedef       T *type; };
27ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkotemplate <typename T> struct make_const_ptr { typedef const T *type; };
288dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor
298dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor/// \brief A simple visitor class that helps create declaration visitors.
30ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkotemplate<template <typename> class Ptr, typename ImplClass, typename RetTy=void>
31ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkoclass Base {
328dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregorpublic:
33ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko
34ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko#define PTR(CLASS) typename Ptr<CLASS>::type
35ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko#define DISPATCH(NAME, CLASS) \
36ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko  return static_cast<ImplClass*>(this)->Visit##NAME(static_cast<PTR(CLASS)>(D))
37ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko
38ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko  RetTy Visit(PTR(Decl) D) {
398dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor    switch (D->getKind()) {
409a55591af3e5506b95a9718e15380129fbfc5ebcSean Hunt#define DECL(DERIVED, BASE) \
419a55591af3e5506b95a9718e15380129fbfc5ebcSean Hunt      case Decl::DERIVED: DISPATCH(DERIVED##Decl, DERIVED##Decl);
429a55591af3e5506b95a9718e15380129fbfc5ebcSean Hunt#define ABSTRACT_DECL(DECL)
439a55591af3e5506b95a9718e15380129fbfc5ebcSean Hunt#include "clang/AST/DeclNodes.inc"
448dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor    }
45561d3abc881033776ece385a01a510e1cbc1fa92David Blaikie    llvm_unreachable("Decl that isn't part of DeclNodes.inc!");
468dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor  }
478dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor
488dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor  // If the implementation chooses not to implement a certain visit
498dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor  // method, fall back to the parent.
509a55591af3e5506b95a9718e15380129fbfc5ebcSean Hunt#define DECL(DERIVED, BASE) \
51ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko  RetTy Visit##DERIVED##Decl(PTR(DERIVED##Decl) D) { DISPATCH(BASE, BASE); }
529a55591af3e5506b95a9718e15380129fbfc5ebcSean Hunt#include "clang/AST/DeclNodes.inc"
538dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor
54ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko  RetTy VisitDecl(PTR(Decl) D) { return RetTy(); }
558dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor
56ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko#undef PTR
578dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor#undef DISPATCH
58ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko};
59ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko
60ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko} // end namespace declvisitor
61ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko
62ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko/// \brief A simple visitor class that helps create declaration visitors.
63ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko///
64ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko/// This class does not preserve constness of Decl pointers (see also
65ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko/// ConstDeclVisitor).
66ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkotemplate<typename ImplClass, typename RetTy=void>
67ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkoclass DeclVisitor
68ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko : public declvisitor::Base<declvisitor::make_ptr, ImplClass, RetTy> {};
69ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko
70ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko/// \brief A simple visitor class that helps create declaration visitors.
71ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko///
72ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko/// This class preserves constness of Decl pointers (see also DeclVisitor).
73ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkotemplate<typename ImplClass, typename RetTy=void>
74ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkoclass ConstDeclVisitor
75ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko : public declvisitor::Base<declvisitor::make_const_ptr, ImplClass, RetTy> {};
768dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor
778dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor}  // end namespace clang
788dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor
798dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor#endif // LLVM_CLANG_AST_DECLVISITOR_H
80