]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/tools/clang/include/clang/Sema/TemplateInstCallback.h
Merge llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp
[FreeBSD/FreeBSD.git] / contrib / llvm / tools / clang / 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
19 namespace clang {
20
21 /// This is a base class for callbacks that will be notified at every
22 /// template instantiation.
23 class TemplateInstantiationCallback {
24 public:
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
42 template <class TemplateInstantiationCallbackPtrs>
43 void initialize(TemplateInstantiationCallbackPtrs &Callbacks,
44                 const Sema &TheSema) {
45   for (auto &C : Callbacks) {
46     if (C)
47       C->initialize(TheSema);
48   }
49 }
50
51 template <class TemplateInstantiationCallbackPtrs>
52 void finalize(TemplateInstantiationCallbackPtrs &Callbacks,
53               const Sema &TheSema) {
54   for (auto &C : Callbacks) {
55     if (C)
56       C->finalize(TheSema);
57   }
58 }
59
60 template <class TemplateInstantiationCallbackPtrs>
61 void atTemplateBegin(TemplateInstantiationCallbackPtrs &Callbacks,
62                      const Sema &TheSema,
63                      const Sema::CodeSynthesisContext &Inst) {
64   for (auto &C : Callbacks) {
65     if (C)
66       C->atTemplateBegin(TheSema, Inst);
67   }
68 }
69
70 template <class TemplateInstantiationCallbackPtrs>
71 void atTemplateEnd(TemplateInstantiationCallbackPtrs &Callbacks,
72                    const Sema &TheSema,
73                    const Sema::CodeSynthesisContext &Inst) {
74   for (auto &C : Callbacks) {
75     if (C)
76       C->atTemplateEnd(TheSema, Inst);
77   }
78 }
79
80 } // namespace clang
81
82 #endif