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