10b57cec5SDimitry Andric //===- TemplateInstCallback.h - Template Instantiation Callback - C++ --===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===---------------------------------------------------------------------===//
80b57cec5SDimitry Andric //
90b57cec5SDimitry Andric // This file defines the TemplateInstantiationCallback class, which is the
100b57cec5SDimitry Andric // base class for callbacks that will be notified at template instantiations.
110b57cec5SDimitry Andric //
120b57cec5SDimitry Andric //===---------------------------------------------------------------------===//
130b57cec5SDimitry Andric
14*04eeddc0SDimitry Andric #ifndef LLVM_CLANG_SEMA_TEMPLATEINSTCALLBACK_H
15*04eeddc0SDimitry Andric #define LLVM_CLANG_SEMA_TEMPLATEINSTCALLBACK_H
160b57cec5SDimitry Andric
170b57cec5SDimitry Andric #include "clang/Sema/Sema.h"
180b57cec5SDimitry Andric
190b57cec5SDimitry Andric namespace clang {
200b57cec5SDimitry Andric
210b57cec5SDimitry Andric /// This is a base class for callbacks that will be notified at every
220b57cec5SDimitry Andric /// template instantiation.
230b57cec5SDimitry Andric class TemplateInstantiationCallback {
240b57cec5SDimitry Andric public:
250b57cec5SDimitry Andric virtual ~TemplateInstantiationCallback() = default;
260b57cec5SDimitry Andric
270b57cec5SDimitry Andric /// Called before doing AST-parsing.
280b57cec5SDimitry Andric virtual void initialize(const Sema &TheSema) = 0;
290b57cec5SDimitry Andric
300b57cec5SDimitry Andric /// Called after AST-parsing is completed.
310b57cec5SDimitry Andric virtual void finalize(const Sema &TheSema) = 0;
320b57cec5SDimitry Andric
330b57cec5SDimitry Andric /// Called when instantiation of a template just began.
340b57cec5SDimitry Andric virtual void atTemplateBegin(const Sema &TheSema,
350b57cec5SDimitry Andric const Sema::CodeSynthesisContext &Inst) = 0;
360b57cec5SDimitry Andric
370b57cec5SDimitry Andric /// Called when instantiation of a template is just about to end.
380b57cec5SDimitry Andric virtual void atTemplateEnd(const Sema &TheSema,
390b57cec5SDimitry Andric const Sema::CodeSynthesisContext &Inst) = 0;
400b57cec5SDimitry Andric };
410b57cec5SDimitry Andric
420b57cec5SDimitry Andric template <class TemplateInstantiationCallbackPtrs>
initialize(TemplateInstantiationCallbackPtrs & Callbacks,const Sema & TheSema)430b57cec5SDimitry Andric void initialize(TemplateInstantiationCallbackPtrs &Callbacks,
440b57cec5SDimitry Andric const Sema &TheSema) {
450b57cec5SDimitry Andric for (auto &C : Callbacks) {
460b57cec5SDimitry Andric if (C)
470b57cec5SDimitry Andric C->initialize(TheSema);
480b57cec5SDimitry Andric }
490b57cec5SDimitry Andric }
500b57cec5SDimitry Andric
510b57cec5SDimitry Andric template <class TemplateInstantiationCallbackPtrs>
finalize(TemplateInstantiationCallbackPtrs & Callbacks,const Sema & TheSema)520b57cec5SDimitry Andric void finalize(TemplateInstantiationCallbackPtrs &Callbacks,
530b57cec5SDimitry Andric const Sema &TheSema) {
540b57cec5SDimitry Andric for (auto &C : Callbacks) {
550b57cec5SDimitry Andric if (C)
560b57cec5SDimitry Andric C->finalize(TheSema);
570b57cec5SDimitry Andric }
580b57cec5SDimitry Andric }
590b57cec5SDimitry Andric
600b57cec5SDimitry Andric template <class TemplateInstantiationCallbackPtrs>
atTemplateBegin(TemplateInstantiationCallbackPtrs & Callbacks,const Sema & TheSema,const Sema::CodeSynthesisContext & Inst)610b57cec5SDimitry Andric void atTemplateBegin(TemplateInstantiationCallbackPtrs &Callbacks,
620b57cec5SDimitry Andric const Sema &TheSema,
630b57cec5SDimitry Andric const Sema::CodeSynthesisContext &Inst) {
640b57cec5SDimitry Andric for (auto &C : Callbacks) {
650b57cec5SDimitry Andric if (C)
660b57cec5SDimitry Andric C->atTemplateBegin(TheSema, Inst);
670b57cec5SDimitry Andric }
680b57cec5SDimitry Andric }
690b57cec5SDimitry Andric
700b57cec5SDimitry Andric template <class TemplateInstantiationCallbackPtrs>
atTemplateEnd(TemplateInstantiationCallbackPtrs & Callbacks,const Sema & TheSema,const Sema::CodeSynthesisContext & Inst)710b57cec5SDimitry Andric void atTemplateEnd(TemplateInstantiationCallbackPtrs &Callbacks,
720b57cec5SDimitry Andric const Sema &TheSema,
730b57cec5SDimitry Andric const Sema::CodeSynthesisContext &Inst) {
740b57cec5SDimitry Andric for (auto &C : Callbacks) {
750b57cec5SDimitry Andric if (C)
760b57cec5SDimitry Andric C->atTemplateEnd(TheSema, Inst);
770b57cec5SDimitry Andric }
780b57cec5SDimitry Andric }
790b57cec5SDimitry Andric
800b57cec5SDimitry Andric } // namespace clang
810b57cec5SDimitry Andric
820b57cec5SDimitry Andric #endif
83