xref: /openbsd-src/gnu/llvm/clang/lib/Frontend/MultiplexConsumer.cpp (revision 12c855180aad702bbcca06e0398d774beeafb155)
1e5dd7070Spatrick //===- MultiplexConsumer.cpp - AST Consumer for PCH Generation --*- C++ -*-===//
2e5dd7070Spatrick //
3e5dd7070Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4e5dd7070Spatrick // See https://llvm.org/LICENSE.txt for license information.
5e5dd7070Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6e5dd7070Spatrick //
7e5dd7070Spatrick //===----------------------------------------------------------------------===//
8e5dd7070Spatrick //
9e5dd7070Spatrick //  This file defines the MultiplexConsumer class. It also declares and defines
10e5dd7070Spatrick //  MultiplexASTDeserializationListener and  MultiplexASTMutationListener, which
11e5dd7070Spatrick //  are implementation details of MultiplexConsumer.
12e5dd7070Spatrick //
13e5dd7070Spatrick //===----------------------------------------------------------------------===//
14e5dd7070Spatrick 
15e5dd7070Spatrick #include "clang/Frontend/MultiplexConsumer.h"
16e5dd7070Spatrick #include "clang/AST/ASTMutationListener.h"
17e5dd7070Spatrick #include "clang/AST/DeclGroup.h"
18e5dd7070Spatrick 
19e5dd7070Spatrick using namespace clang;
20e5dd7070Spatrick 
21e5dd7070Spatrick namespace clang {
22e5dd7070Spatrick 
MultiplexASTDeserializationListener(const std::vector<ASTDeserializationListener * > & L)23e5dd7070Spatrick MultiplexASTDeserializationListener::MultiplexASTDeserializationListener(
24e5dd7070Spatrick       const std::vector<ASTDeserializationListener*>& L)
25e5dd7070Spatrick     : Listeners(L) {
26e5dd7070Spatrick }
27e5dd7070Spatrick 
ReaderInitialized(ASTReader * Reader)28e5dd7070Spatrick void MultiplexASTDeserializationListener::ReaderInitialized(
29e5dd7070Spatrick     ASTReader *Reader) {
30e5dd7070Spatrick   for (size_t i = 0, e = Listeners.size(); i != e; ++i)
31e5dd7070Spatrick     Listeners[i]->ReaderInitialized(Reader);
32e5dd7070Spatrick }
33e5dd7070Spatrick 
IdentifierRead(serialization::IdentID ID,IdentifierInfo * II)34e5dd7070Spatrick void MultiplexASTDeserializationListener::IdentifierRead(
35e5dd7070Spatrick     serialization::IdentID ID, IdentifierInfo *II) {
36e5dd7070Spatrick   for (size_t i = 0, e = Listeners.size(); i != e; ++i)
37e5dd7070Spatrick     Listeners[i]->IdentifierRead(ID, II);
38e5dd7070Spatrick }
39e5dd7070Spatrick 
MacroRead(serialization::MacroID ID,MacroInfo * MI)40e5dd7070Spatrick void MultiplexASTDeserializationListener::MacroRead(
41e5dd7070Spatrick     serialization::MacroID ID, MacroInfo *MI) {
42e5dd7070Spatrick   for (auto &Listener : Listeners)
43e5dd7070Spatrick     Listener->MacroRead(ID, MI);
44e5dd7070Spatrick }
45e5dd7070Spatrick 
TypeRead(serialization::TypeIdx Idx,QualType T)46e5dd7070Spatrick void MultiplexASTDeserializationListener::TypeRead(
47e5dd7070Spatrick     serialization::TypeIdx Idx, QualType T) {
48e5dd7070Spatrick   for (size_t i = 0, e = Listeners.size(); i != e; ++i)
49e5dd7070Spatrick     Listeners[i]->TypeRead(Idx, T);
50e5dd7070Spatrick }
51e5dd7070Spatrick 
DeclRead(serialization::DeclID ID,const Decl * D)52e5dd7070Spatrick void MultiplexASTDeserializationListener::DeclRead(
53e5dd7070Spatrick     serialization::DeclID ID, const Decl *D) {
54e5dd7070Spatrick   for (size_t i = 0, e = Listeners.size(); i != e; ++i)
55e5dd7070Spatrick     Listeners[i]->DeclRead(ID, D);
56e5dd7070Spatrick }
57e5dd7070Spatrick 
SelectorRead(serialization::SelectorID ID,Selector Sel)58e5dd7070Spatrick void MultiplexASTDeserializationListener::SelectorRead(
59e5dd7070Spatrick     serialization::SelectorID ID, Selector Sel) {
60e5dd7070Spatrick   for (size_t i = 0, e = Listeners.size(); i != e; ++i)
61e5dd7070Spatrick     Listeners[i]->SelectorRead(ID, Sel);
62e5dd7070Spatrick }
63e5dd7070Spatrick 
MacroDefinitionRead(serialization::PreprocessedEntityID ID,MacroDefinitionRecord * MD)64e5dd7070Spatrick void MultiplexASTDeserializationListener::MacroDefinitionRead(
65e5dd7070Spatrick     serialization::PreprocessedEntityID ID, MacroDefinitionRecord *MD) {
66e5dd7070Spatrick   for (size_t i = 0, e = Listeners.size(); i != e; ++i)
67e5dd7070Spatrick     Listeners[i]->MacroDefinitionRead(ID, MD);
68e5dd7070Spatrick }
69e5dd7070Spatrick 
ModuleRead(serialization::SubmoduleID ID,Module * Mod)70e5dd7070Spatrick void MultiplexASTDeserializationListener::ModuleRead(
71e5dd7070Spatrick     serialization::SubmoduleID ID, Module *Mod) {
72e5dd7070Spatrick   for (auto &Listener : Listeners)
73e5dd7070Spatrick     Listener->ModuleRead(ID, Mod);
74e5dd7070Spatrick }
75e5dd7070Spatrick 
ModuleImportRead(serialization::SubmoduleID ID,SourceLocation ImportLoc)76*12c85518Srobert void MultiplexASTDeserializationListener::ModuleImportRead(
77*12c85518Srobert     serialization::SubmoduleID ID, SourceLocation ImportLoc) {
78*12c85518Srobert   for (auto &Listener : Listeners)
79*12c85518Srobert     Listener->ModuleImportRead(ID, ImportLoc);
80*12c85518Srobert }
81*12c85518Srobert 
82e5dd7070Spatrick // This ASTMutationListener forwards its notifications to a set of
83e5dd7070Spatrick // child listeners.
84e5dd7070Spatrick class MultiplexASTMutationListener : public ASTMutationListener {
85e5dd7070Spatrick public:
86e5dd7070Spatrick   // Does NOT take ownership of the elements in L.
87e5dd7070Spatrick   MultiplexASTMutationListener(ArrayRef<ASTMutationListener*> L);
88e5dd7070Spatrick   void CompletedTagDefinition(const TagDecl *D) override;
89e5dd7070Spatrick   void AddedVisibleDecl(const DeclContext *DC, const Decl *D) override;
90e5dd7070Spatrick   void AddedCXXImplicitMember(const CXXRecordDecl *RD, const Decl *D) override;
91e5dd7070Spatrick   void AddedCXXTemplateSpecialization(const ClassTemplateDecl *TD,
92e5dd7070Spatrick                             const ClassTemplateSpecializationDecl *D) override;
93e5dd7070Spatrick   void AddedCXXTemplateSpecialization(const VarTemplateDecl *TD,
94e5dd7070Spatrick                                const VarTemplateSpecializationDecl *D) override;
95e5dd7070Spatrick   void AddedCXXTemplateSpecialization(const FunctionTemplateDecl *TD,
96e5dd7070Spatrick                                       const FunctionDecl *D) override;
97e5dd7070Spatrick   void ResolvedExceptionSpec(const FunctionDecl *FD) override;
98e5dd7070Spatrick   void DeducedReturnType(const FunctionDecl *FD, QualType ReturnType) override;
99e5dd7070Spatrick   void ResolvedOperatorDelete(const CXXDestructorDecl *DD,
100e5dd7070Spatrick                               const FunctionDecl *Delete,
101e5dd7070Spatrick                               Expr *ThisArg) override;
102e5dd7070Spatrick   void CompletedImplicitDefinition(const FunctionDecl *D) override;
103e5dd7070Spatrick   void InstantiationRequested(const ValueDecl *D) override;
104e5dd7070Spatrick   void VariableDefinitionInstantiated(const VarDecl *D) override;
105e5dd7070Spatrick   void FunctionDefinitionInstantiated(const FunctionDecl *D) override;
106e5dd7070Spatrick   void DefaultArgumentInstantiated(const ParmVarDecl *D) override;
107e5dd7070Spatrick   void DefaultMemberInitializerInstantiated(const FieldDecl *D) override;
108e5dd7070Spatrick   void AddedObjCCategoryToInterface(const ObjCCategoryDecl *CatD,
109e5dd7070Spatrick                                     const ObjCInterfaceDecl *IFD) override;
110e5dd7070Spatrick   void DeclarationMarkedUsed(const Decl *D) override;
111e5dd7070Spatrick   void DeclarationMarkedOpenMPThreadPrivate(const Decl *D) override;
112e5dd7070Spatrick   void DeclarationMarkedOpenMPAllocate(const Decl *D, const Attr *A) override;
113e5dd7070Spatrick   void DeclarationMarkedOpenMPDeclareTarget(const Decl *D,
114e5dd7070Spatrick                                             const Attr *Attr) override;
115e5dd7070Spatrick   void RedefinedHiddenDefinition(const NamedDecl *D, Module *M) override;
116e5dd7070Spatrick   void AddedAttributeToRecord(const Attr *Attr,
117e5dd7070Spatrick                               const RecordDecl *Record) override;
118e5dd7070Spatrick 
119e5dd7070Spatrick private:
120e5dd7070Spatrick   std::vector<ASTMutationListener*> Listeners;
121e5dd7070Spatrick };
122e5dd7070Spatrick 
MultiplexASTMutationListener(ArrayRef<ASTMutationListener * > L)123e5dd7070Spatrick MultiplexASTMutationListener::MultiplexASTMutationListener(
124e5dd7070Spatrick     ArrayRef<ASTMutationListener*> L)
125e5dd7070Spatrick     : Listeners(L.begin(), L.end()) {
126e5dd7070Spatrick }
127e5dd7070Spatrick 
CompletedTagDefinition(const TagDecl * D)128e5dd7070Spatrick void MultiplexASTMutationListener::CompletedTagDefinition(const TagDecl *D) {
129e5dd7070Spatrick   for (size_t i = 0, e = Listeners.size(); i != e; ++i)
130e5dd7070Spatrick     Listeners[i]->CompletedTagDefinition(D);
131e5dd7070Spatrick }
132e5dd7070Spatrick 
AddedVisibleDecl(const DeclContext * DC,const Decl * D)133e5dd7070Spatrick void MultiplexASTMutationListener::AddedVisibleDecl(
134e5dd7070Spatrick     const DeclContext *DC, const Decl *D) {
135e5dd7070Spatrick   for (size_t i = 0, e = Listeners.size(); i != e; ++i)
136e5dd7070Spatrick     Listeners[i]->AddedVisibleDecl(DC, D);
137e5dd7070Spatrick }
138e5dd7070Spatrick 
AddedCXXImplicitMember(const CXXRecordDecl * RD,const Decl * D)139e5dd7070Spatrick void MultiplexASTMutationListener::AddedCXXImplicitMember(
140e5dd7070Spatrick     const CXXRecordDecl *RD, const Decl *D) {
141e5dd7070Spatrick   for (size_t i = 0, e = Listeners.size(); i != e; ++i)
142e5dd7070Spatrick     Listeners[i]->AddedCXXImplicitMember(RD, D);
143e5dd7070Spatrick }
AddedCXXTemplateSpecialization(const ClassTemplateDecl * TD,const ClassTemplateSpecializationDecl * D)144e5dd7070Spatrick void MultiplexASTMutationListener::AddedCXXTemplateSpecialization(
145e5dd7070Spatrick     const ClassTemplateDecl *TD, const ClassTemplateSpecializationDecl *D) {
146e5dd7070Spatrick   for (size_t i = 0, e = Listeners.size(); i != e; ++i)
147e5dd7070Spatrick     Listeners[i]->AddedCXXTemplateSpecialization(TD, D);
148e5dd7070Spatrick }
AddedCXXTemplateSpecialization(const VarTemplateDecl * TD,const VarTemplateSpecializationDecl * D)149e5dd7070Spatrick void MultiplexASTMutationListener::AddedCXXTemplateSpecialization(
150e5dd7070Spatrick     const VarTemplateDecl *TD, const VarTemplateSpecializationDecl *D) {
151e5dd7070Spatrick   for (size_t i = 0, e = Listeners.size(); i != e; ++i)
152e5dd7070Spatrick     Listeners[i]->AddedCXXTemplateSpecialization(TD, D);
153e5dd7070Spatrick }
AddedCXXTemplateSpecialization(const FunctionTemplateDecl * TD,const FunctionDecl * D)154e5dd7070Spatrick void MultiplexASTMutationListener::AddedCXXTemplateSpecialization(
155e5dd7070Spatrick     const FunctionTemplateDecl *TD, const FunctionDecl *D) {
156e5dd7070Spatrick   for (size_t i = 0, e = Listeners.size(); i != e; ++i)
157e5dd7070Spatrick     Listeners[i]->AddedCXXTemplateSpecialization(TD, D);
158e5dd7070Spatrick }
ResolvedExceptionSpec(const FunctionDecl * FD)159e5dd7070Spatrick void MultiplexASTMutationListener::ResolvedExceptionSpec(
160e5dd7070Spatrick     const FunctionDecl *FD) {
161e5dd7070Spatrick   for (auto &Listener : Listeners)
162e5dd7070Spatrick     Listener->ResolvedExceptionSpec(FD);
163e5dd7070Spatrick }
DeducedReturnType(const FunctionDecl * FD,QualType ReturnType)164e5dd7070Spatrick void MultiplexASTMutationListener::DeducedReturnType(const FunctionDecl *FD,
165e5dd7070Spatrick                                                      QualType ReturnType) {
166e5dd7070Spatrick   for (size_t i = 0, e = Listeners.size(); i != e; ++i)
167e5dd7070Spatrick     Listeners[i]->DeducedReturnType(FD, ReturnType);
168e5dd7070Spatrick }
ResolvedOperatorDelete(const CXXDestructorDecl * DD,const FunctionDecl * Delete,Expr * ThisArg)169e5dd7070Spatrick void MultiplexASTMutationListener::ResolvedOperatorDelete(
170e5dd7070Spatrick     const CXXDestructorDecl *DD, const FunctionDecl *Delete, Expr *ThisArg) {
171e5dd7070Spatrick   for (auto *L : Listeners)
172e5dd7070Spatrick     L->ResolvedOperatorDelete(DD, Delete, ThisArg);
173e5dd7070Spatrick }
CompletedImplicitDefinition(const FunctionDecl * D)174e5dd7070Spatrick void MultiplexASTMutationListener::CompletedImplicitDefinition(
175e5dd7070Spatrick                                                         const FunctionDecl *D) {
176e5dd7070Spatrick   for (size_t i = 0, e = Listeners.size(); i != e; ++i)
177e5dd7070Spatrick     Listeners[i]->CompletedImplicitDefinition(D);
178e5dd7070Spatrick }
InstantiationRequested(const ValueDecl * D)179e5dd7070Spatrick void MultiplexASTMutationListener::InstantiationRequested(const ValueDecl *D) {
180e5dd7070Spatrick   for (size_t i = 0, e = Listeners.size(); i != e; ++i)
181e5dd7070Spatrick     Listeners[i]->InstantiationRequested(D);
182e5dd7070Spatrick }
VariableDefinitionInstantiated(const VarDecl * D)183e5dd7070Spatrick void MultiplexASTMutationListener::VariableDefinitionInstantiated(
184e5dd7070Spatrick     const VarDecl *D) {
185e5dd7070Spatrick   for (size_t i = 0, e = Listeners.size(); i != e; ++i)
186e5dd7070Spatrick     Listeners[i]->VariableDefinitionInstantiated(D);
187e5dd7070Spatrick }
FunctionDefinitionInstantiated(const FunctionDecl * D)188e5dd7070Spatrick void MultiplexASTMutationListener::FunctionDefinitionInstantiated(
189e5dd7070Spatrick     const FunctionDecl *D) {
190e5dd7070Spatrick   for (auto &Listener : Listeners)
191e5dd7070Spatrick     Listener->FunctionDefinitionInstantiated(D);
192e5dd7070Spatrick }
DefaultArgumentInstantiated(const ParmVarDecl * D)193e5dd7070Spatrick void MultiplexASTMutationListener::DefaultArgumentInstantiated(
194e5dd7070Spatrick                                                          const ParmVarDecl *D) {
195e5dd7070Spatrick   for (size_t i = 0, e = Listeners.size(); i != e; ++i)
196e5dd7070Spatrick     Listeners[i]->DefaultArgumentInstantiated(D);
197e5dd7070Spatrick }
DefaultMemberInitializerInstantiated(const FieldDecl * D)198e5dd7070Spatrick void MultiplexASTMutationListener::DefaultMemberInitializerInstantiated(
199e5dd7070Spatrick                                                            const FieldDecl *D) {
200e5dd7070Spatrick   for (size_t i = 0, e = Listeners.size(); i != e; ++i)
201e5dd7070Spatrick     Listeners[i]->DefaultMemberInitializerInstantiated(D);
202e5dd7070Spatrick }
AddedObjCCategoryToInterface(const ObjCCategoryDecl * CatD,const ObjCInterfaceDecl * IFD)203e5dd7070Spatrick void MultiplexASTMutationListener::AddedObjCCategoryToInterface(
204e5dd7070Spatrick                                                  const ObjCCategoryDecl *CatD,
205e5dd7070Spatrick                                                  const ObjCInterfaceDecl *IFD) {
206e5dd7070Spatrick   for (size_t i = 0, e = Listeners.size(); i != e; ++i)
207e5dd7070Spatrick     Listeners[i]->AddedObjCCategoryToInterface(CatD, IFD);
208e5dd7070Spatrick }
DeclarationMarkedUsed(const Decl * D)209e5dd7070Spatrick void MultiplexASTMutationListener::DeclarationMarkedUsed(const Decl *D) {
210e5dd7070Spatrick   for (size_t i = 0, e = Listeners.size(); i != e; ++i)
211e5dd7070Spatrick     Listeners[i]->DeclarationMarkedUsed(D);
212e5dd7070Spatrick }
DeclarationMarkedOpenMPThreadPrivate(const Decl * D)213e5dd7070Spatrick void MultiplexASTMutationListener::DeclarationMarkedOpenMPThreadPrivate(
214e5dd7070Spatrick     const Decl *D) {
215e5dd7070Spatrick   for (size_t i = 0, e = Listeners.size(); i != e; ++i)
216e5dd7070Spatrick     Listeners[i]->DeclarationMarkedOpenMPThreadPrivate(D);
217e5dd7070Spatrick }
DeclarationMarkedOpenMPAllocate(const Decl * D,const Attr * A)218e5dd7070Spatrick void MultiplexASTMutationListener::DeclarationMarkedOpenMPAllocate(
219e5dd7070Spatrick     const Decl *D, const Attr *A) {
220e5dd7070Spatrick   for (ASTMutationListener *L : Listeners)
221e5dd7070Spatrick     L->DeclarationMarkedOpenMPAllocate(D, A);
222e5dd7070Spatrick }
DeclarationMarkedOpenMPDeclareTarget(const Decl * D,const Attr * Attr)223e5dd7070Spatrick void MultiplexASTMutationListener::DeclarationMarkedOpenMPDeclareTarget(
224e5dd7070Spatrick     const Decl *D, const Attr *Attr) {
225e5dd7070Spatrick   for (auto *L : Listeners)
226e5dd7070Spatrick     L->DeclarationMarkedOpenMPDeclareTarget(D, Attr);
227e5dd7070Spatrick }
RedefinedHiddenDefinition(const NamedDecl * D,Module * M)228e5dd7070Spatrick void MultiplexASTMutationListener::RedefinedHiddenDefinition(const NamedDecl *D,
229e5dd7070Spatrick                                                              Module *M) {
230e5dd7070Spatrick   for (auto *L : Listeners)
231e5dd7070Spatrick     L->RedefinedHiddenDefinition(D, M);
232e5dd7070Spatrick }
233e5dd7070Spatrick 
AddedAttributeToRecord(const Attr * Attr,const RecordDecl * Record)234e5dd7070Spatrick void MultiplexASTMutationListener::AddedAttributeToRecord(
235e5dd7070Spatrick                                                     const Attr *Attr,
236e5dd7070Spatrick                                                     const RecordDecl *Record) {
237e5dd7070Spatrick   for (auto *L : Listeners)
238e5dd7070Spatrick     L->AddedAttributeToRecord(Attr, Record);
239e5dd7070Spatrick }
240e5dd7070Spatrick 
241e5dd7070Spatrick }  // end namespace clang
242e5dd7070Spatrick 
MultiplexConsumer(std::vector<std::unique_ptr<ASTConsumer>> C)243e5dd7070Spatrick MultiplexConsumer::MultiplexConsumer(
244e5dd7070Spatrick     std::vector<std::unique_ptr<ASTConsumer>> C)
245*12c85518Srobert     : Consumers(std::move(C)) {
246e5dd7070Spatrick   // Collect the mutation listeners and deserialization listeners of all
247e5dd7070Spatrick   // children, and create a multiplex listener each if so.
248e5dd7070Spatrick   std::vector<ASTMutationListener *> mutationListeners;
249e5dd7070Spatrick   std::vector<ASTDeserializationListener*> serializationListeners;
250e5dd7070Spatrick   for (auto &Consumer : Consumers) {
251e5dd7070Spatrick     if (auto *mutationListener = Consumer->GetASTMutationListener())
252e5dd7070Spatrick       mutationListeners.push_back(mutationListener);
253e5dd7070Spatrick     if (auto *serializationListener = Consumer->GetASTDeserializationListener())
254e5dd7070Spatrick       serializationListeners.push_back(serializationListener);
255e5dd7070Spatrick   }
256e5dd7070Spatrick   if (!mutationListeners.empty()) {
257e5dd7070Spatrick     MutationListener =
258e5dd7070Spatrick         std::make_unique<MultiplexASTMutationListener>(mutationListeners);
259e5dd7070Spatrick   }
260e5dd7070Spatrick   if (!serializationListeners.empty()) {
261e5dd7070Spatrick     DeserializationListener =
262e5dd7070Spatrick         std::make_unique<MultiplexASTDeserializationListener>(
263e5dd7070Spatrick             serializationListeners);
264e5dd7070Spatrick   }
265e5dd7070Spatrick }
266e5dd7070Spatrick 
~MultiplexConsumer()267e5dd7070Spatrick MultiplexConsumer::~MultiplexConsumer() {}
268e5dd7070Spatrick 
Initialize(ASTContext & Context)269e5dd7070Spatrick void MultiplexConsumer::Initialize(ASTContext &Context) {
270e5dd7070Spatrick   for (auto &Consumer : Consumers)
271e5dd7070Spatrick     Consumer->Initialize(Context);
272e5dd7070Spatrick }
273e5dd7070Spatrick 
HandleTopLevelDecl(DeclGroupRef D)274e5dd7070Spatrick bool MultiplexConsumer::HandleTopLevelDecl(DeclGroupRef D) {
275e5dd7070Spatrick   bool Continue = true;
276e5dd7070Spatrick   for (auto &Consumer : Consumers)
277e5dd7070Spatrick     Continue = Continue && Consumer->HandleTopLevelDecl(D);
278e5dd7070Spatrick   return Continue;
279e5dd7070Spatrick }
280e5dd7070Spatrick 
HandleInlineFunctionDefinition(FunctionDecl * D)281e5dd7070Spatrick void MultiplexConsumer::HandleInlineFunctionDefinition(FunctionDecl *D) {
282e5dd7070Spatrick   for (auto &Consumer : Consumers)
283e5dd7070Spatrick     Consumer->HandleInlineFunctionDefinition(D);
284e5dd7070Spatrick }
285e5dd7070Spatrick 
HandleCXXStaticMemberVarInstantiation(VarDecl * VD)286e5dd7070Spatrick void MultiplexConsumer::HandleCXXStaticMemberVarInstantiation(VarDecl *VD) {
287e5dd7070Spatrick   for (auto &Consumer : Consumers)
288e5dd7070Spatrick     Consumer->HandleCXXStaticMemberVarInstantiation(VD);
289e5dd7070Spatrick }
290e5dd7070Spatrick 
HandleInterestingDecl(DeclGroupRef D)291e5dd7070Spatrick void MultiplexConsumer::HandleInterestingDecl(DeclGroupRef D) {
292e5dd7070Spatrick   for (auto &Consumer : Consumers)
293e5dd7070Spatrick     Consumer->HandleInterestingDecl(D);
294e5dd7070Spatrick }
295e5dd7070Spatrick 
HandleTranslationUnit(ASTContext & Ctx)296e5dd7070Spatrick void MultiplexConsumer::HandleTranslationUnit(ASTContext &Ctx) {
297e5dd7070Spatrick   for (auto &Consumer : Consumers)
298e5dd7070Spatrick     Consumer->HandleTranslationUnit(Ctx);
299e5dd7070Spatrick }
300e5dd7070Spatrick 
HandleTagDeclDefinition(TagDecl * D)301e5dd7070Spatrick void MultiplexConsumer::HandleTagDeclDefinition(TagDecl *D) {
302e5dd7070Spatrick   for (auto &Consumer : Consumers)
303e5dd7070Spatrick     Consumer->HandleTagDeclDefinition(D);
304e5dd7070Spatrick }
305e5dd7070Spatrick 
HandleTagDeclRequiredDefinition(const TagDecl * D)306e5dd7070Spatrick void MultiplexConsumer::HandleTagDeclRequiredDefinition(const TagDecl *D) {
307e5dd7070Spatrick   for (auto &Consumer : Consumers)
308e5dd7070Spatrick     Consumer->HandleTagDeclRequiredDefinition(D);
309e5dd7070Spatrick }
310e5dd7070Spatrick 
HandleCXXImplicitFunctionInstantiation(FunctionDecl * D)311e5dd7070Spatrick void MultiplexConsumer::HandleCXXImplicitFunctionInstantiation(FunctionDecl *D){
312e5dd7070Spatrick   for (auto &Consumer : Consumers)
313e5dd7070Spatrick     Consumer->HandleCXXImplicitFunctionInstantiation(D);
314e5dd7070Spatrick }
315e5dd7070Spatrick 
HandleTopLevelDeclInObjCContainer(DeclGroupRef D)316e5dd7070Spatrick void MultiplexConsumer::HandleTopLevelDeclInObjCContainer(DeclGroupRef D) {
317e5dd7070Spatrick   for (auto &Consumer : Consumers)
318e5dd7070Spatrick     Consumer->HandleTopLevelDeclInObjCContainer(D);
319e5dd7070Spatrick }
320e5dd7070Spatrick 
HandleImplicitImportDecl(ImportDecl * D)321e5dd7070Spatrick void MultiplexConsumer::HandleImplicitImportDecl(ImportDecl *D) {
322e5dd7070Spatrick   for (auto &Consumer : Consumers)
323e5dd7070Spatrick     Consumer->HandleImplicitImportDecl(D);
324e5dd7070Spatrick }
325e5dd7070Spatrick 
CompleteTentativeDefinition(VarDecl * D)326e5dd7070Spatrick void MultiplexConsumer::CompleteTentativeDefinition(VarDecl *D) {
327e5dd7070Spatrick   for (auto &Consumer : Consumers)
328e5dd7070Spatrick     Consumer->CompleteTentativeDefinition(D);
329e5dd7070Spatrick }
330e5dd7070Spatrick 
CompleteExternalDeclaration(VarDecl * D)331e5dd7070Spatrick void MultiplexConsumer::CompleteExternalDeclaration(VarDecl *D) {
332e5dd7070Spatrick   for (auto &Consumer : Consumers)
333e5dd7070Spatrick     Consumer->CompleteExternalDeclaration(D);
334e5dd7070Spatrick }
335e5dd7070Spatrick 
AssignInheritanceModel(CXXRecordDecl * RD)336e5dd7070Spatrick void MultiplexConsumer::AssignInheritanceModel(CXXRecordDecl *RD) {
337e5dd7070Spatrick   for (auto &Consumer : Consumers)
338e5dd7070Spatrick     Consumer->AssignInheritanceModel(RD);
339e5dd7070Spatrick }
340e5dd7070Spatrick 
HandleVTable(CXXRecordDecl * RD)341e5dd7070Spatrick void MultiplexConsumer::HandleVTable(CXXRecordDecl *RD) {
342e5dd7070Spatrick   for (auto &Consumer : Consumers)
343e5dd7070Spatrick     Consumer->HandleVTable(RD);
344e5dd7070Spatrick }
345e5dd7070Spatrick 
GetASTMutationListener()346e5dd7070Spatrick ASTMutationListener *MultiplexConsumer::GetASTMutationListener() {
347e5dd7070Spatrick   return MutationListener.get();
348e5dd7070Spatrick }
349e5dd7070Spatrick 
GetASTDeserializationListener()350e5dd7070Spatrick ASTDeserializationListener *MultiplexConsumer::GetASTDeserializationListener() {
351e5dd7070Spatrick   return DeserializationListener.get();
352e5dd7070Spatrick }
353e5dd7070Spatrick 
PrintStats()354e5dd7070Spatrick void MultiplexConsumer::PrintStats() {
355e5dd7070Spatrick   for (auto &Consumer : Consumers)
356e5dd7070Spatrick     Consumer->PrintStats();
357e5dd7070Spatrick }
358e5dd7070Spatrick 
shouldSkipFunctionBody(Decl * D)359e5dd7070Spatrick bool MultiplexConsumer::shouldSkipFunctionBody(Decl *D) {
360e5dd7070Spatrick   bool Skip = true;
361e5dd7070Spatrick   for (auto &Consumer : Consumers)
362e5dd7070Spatrick     Skip = Skip && Consumer->shouldSkipFunctionBody(D);
363e5dd7070Spatrick   return Skip;
364e5dd7070Spatrick }
365e5dd7070Spatrick 
InitializeSema(Sema & S)366e5dd7070Spatrick void MultiplexConsumer::InitializeSema(Sema &S) {
367e5dd7070Spatrick   for (auto &Consumer : Consumers)
368e5dd7070Spatrick     if (SemaConsumer *SC = dyn_cast<SemaConsumer>(Consumer.get()))
369e5dd7070Spatrick       SC->InitializeSema(S);
370e5dd7070Spatrick }
371e5dd7070Spatrick 
ForgetSema()372e5dd7070Spatrick void MultiplexConsumer::ForgetSema() {
373e5dd7070Spatrick   for (auto &Consumer : Consumers)
374e5dd7070Spatrick     if (SemaConsumer *SC = dyn_cast<SemaConsumer>(Consumer.get()))
375e5dd7070Spatrick       SC->ForgetSema();
376e5dd7070Spatrick }
377