Clang Project

clang_source_code/include/clang/Sema/TemplateInstCallback.h
1//===- TemplateInstCallback.h - Template Instantiation Callback - C++ --===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===---------------------------------------------------------------------===//
8//
9// This file defines the TemplateInstantiationCallback class, which is the
10// base class for callbacks that will be notified at template instantiations.
11//
12//===---------------------------------------------------------------------===//
13
14#ifndef LLVM_CLANG_TEMPLATE_INST_CALLBACK_H
15#define LLVM_CLANG_TEMPLATE_INST_CALLBACK_H
16
17#include "clang/Sema/Sema.h"
18
19namespace clang {
20
21/// This is a base class for callbacks that will be notified at every
22/// template instantiation.
23class TemplateInstantiationCallback {
24public:
25  virtual ~TemplateInstantiationCallback() = default;
26
27  /// Called before doing AST-parsing.
28  virtual void initialize(const Sema &TheSema) = 0;
29
30  /// Called after AST-parsing is completed.
31  virtual void finalize(const Sema &TheSema) = 0;
32
33  /// Called when instantiation of a template just began.
34  virtual void atTemplateBegin(const Sema &TheSema,
35                               const Sema::CodeSynthesisContext &Inst) = 0;
36
37  /// Called when instantiation of a template is just about to end.
38  virtual void atTemplateEnd(const Sema &TheSema,
39                             const Sema::CodeSynthesisContext &Inst) = 0;
40};
41
42template <class TemplateInstantiationCallbackPtrs>
43void initialize(TemplateInstantiationCallbackPtrs &Callbacks,
44                const Sema &TheSema) {
45  for (auto &C : Callbacks) {
46    if (C)
47      C->initialize(TheSema);
48  }
49}
50
51template <class TemplateInstantiationCallbackPtrs>
52void finalize(TemplateInstantiationCallbackPtrs &Callbacks,
53              const Sema &TheSema) {
54  for (auto &C : Callbacks) {
55    if (C)
56      C->finalize(TheSema);
57  }
58}
59
60template <class TemplateInstantiationCallbackPtrs>
61void atTemplateBegin(TemplateInstantiationCallbackPtrs &Callbacks,
62                     const Sema &TheSema,
63                     const Sema::CodeSynthesisContext &Inst) {
64  for (auto &C : Callbacks) {
65    if (C)
66      C->atTemplateBegin(TheSemaInst);
67  }
68}
69
70template <class TemplateInstantiationCallbackPtrs>
71void atTemplateEnd(TemplateInstantiationCallbackPtrs &Callbacks,
72                   const Sema &TheSema,
73                   const Sema::CodeSynthesisContext &Inst) {
74  for (auto &C : Callbacks) {
75    if (C)
76      C->atTemplateEnd(TheSemaInst);
77  }
78}
79
80// namespace clang
81
82#endif
83
clang::TemplateInstantiationCallback::initialize
clang::TemplateInstantiationCallback::finalize
clang::TemplateInstantiationCallback::atTemplateBegin
clang::TemplateInstantiationCallback::atTemplateEnd