1336815Sdim//===- TemplateInstCallback.h - Template Instantiation Callback - C++ --===// 2336815Sdim// 3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4353358Sdim// See https://llvm.org/LICENSE.txt for license information. 5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6336815Sdim// 7336815Sdim//===---------------------------------------------------------------------===// 8336815Sdim// 9336815Sdim// This file defines the TemplateInstantiationCallback class, which is the 10336815Sdim// base class for callbacks that will be notified at template instantiations. 11336815Sdim// 12336815Sdim//===---------------------------------------------------------------------===// 13336815Sdim 14336815Sdim#ifndef LLVM_CLANG_TEMPLATE_INST_CALLBACK_H 15336815Sdim#define LLVM_CLANG_TEMPLATE_INST_CALLBACK_H 16336815Sdim 17336815Sdim#include "clang/Sema/Sema.h" 18336815Sdim 19336815Sdimnamespace clang { 20336815Sdim 21336815Sdim/// This is a base class for callbacks that will be notified at every 22336815Sdim/// template instantiation. 23336815Sdimclass TemplateInstantiationCallback { 24336815Sdimpublic: 25336815Sdim virtual ~TemplateInstantiationCallback() = default; 26336815Sdim 27336815Sdim /// Called before doing AST-parsing. 28336815Sdim virtual void initialize(const Sema &TheSema) = 0; 29336815Sdim 30336815Sdim /// Called after AST-parsing is completed. 31336815Sdim virtual void finalize(const Sema &TheSema) = 0; 32336815Sdim 33336815Sdim /// Called when instantiation of a template just began. 34336815Sdim virtual void atTemplateBegin(const Sema &TheSema, 35336815Sdim const Sema::CodeSynthesisContext &Inst) = 0; 36336815Sdim 37336815Sdim /// Called when instantiation of a template is just about to end. 38336815Sdim virtual void atTemplateEnd(const Sema &TheSema, 39336815Sdim const Sema::CodeSynthesisContext &Inst) = 0; 40336815Sdim}; 41336815Sdim 42336815Sdimtemplate <class TemplateInstantiationCallbackPtrs> 43336815Sdimvoid initialize(TemplateInstantiationCallbackPtrs &Callbacks, 44336815Sdim const Sema &TheSema) { 45336815Sdim for (auto &C : Callbacks) { 46336815Sdim if (C) 47336815Sdim C->initialize(TheSema); 48336815Sdim } 49336815Sdim} 50336815Sdim 51336815Sdimtemplate <class TemplateInstantiationCallbackPtrs> 52336815Sdimvoid finalize(TemplateInstantiationCallbackPtrs &Callbacks, 53336815Sdim const Sema &TheSema) { 54336815Sdim for (auto &C : Callbacks) { 55336815Sdim if (C) 56336815Sdim C->finalize(TheSema); 57336815Sdim } 58336815Sdim} 59336815Sdim 60336815Sdimtemplate <class TemplateInstantiationCallbackPtrs> 61336815Sdimvoid atTemplateBegin(TemplateInstantiationCallbackPtrs &Callbacks, 62336815Sdim const Sema &TheSema, 63336815Sdim const Sema::CodeSynthesisContext &Inst) { 64336815Sdim for (auto &C : Callbacks) { 65336815Sdim if (C) 66336815Sdim C->atTemplateBegin(TheSema, Inst); 67336815Sdim } 68336815Sdim} 69336815Sdim 70336815Sdimtemplate <class TemplateInstantiationCallbackPtrs> 71336815Sdimvoid atTemplateEnd(TemplateInstantiationCallbackPtrs &Callbacks, 72336815Sdim const Sema &TheSema, 73336815Sdim const Sema::CodeSynthesisContext &Inst) { 74336815Sdim for (auto &C : Callbacks) { 75336815Sdim if (C) 76336815Sdim C->atTemplateEnd(TheSema, Inst); 77336815Sdim } 78336815Sdim} 79336815Sdim 80336815Sdim} // namespace clang 81336815Sdim 82336815Sdim#endif 83