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