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