xref: /freebsd-src/contrib/llvm-project/clang/include/clang/Sema/TemplateInstCallback.h (revision 04eeddc0aa8e0a417a16eaf9d7d095207f4a8623)
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