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