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