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