10b57cec5SDimitry Andric //===- MultiplexConsumer.cpp - AST Consumer for PCH Generation --*- C++ -*-===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric //
90b57cec5SDimitry Andric //  This file defines the MultiplexConsumer class. It also declares and defines
100b57cec5SDimitry Andric //  MultiplexASTDeserializationListener and  MultiplexASTMutationListener, which
110b57cec5SDimitry Andric //  are implementation details of MultiplexConsumer.
120b57cec5SDimitry Andric //
130b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
140b57cec5SDimitry Andric 
150b57cec5SDimitry Andric #include "clang/Frontend/MultiplexConsumer.h"
160b57cec5SDimitry Andric #include "clang/AST/ASTMutationListener.h"
170b57cec5SDimitry Andric #include "clang/AST/DeclGroup.h"
180b57cec5SDimitry Andric 
190b57cec5SDimitry Andric using namespace clang;
200b57cec5SDimitry Andric 
210b57cec5SDimitry Andric namespace clang {
220b57cec5SDimitry Andric 
MultiplexASTDeserializationListener(const std::vector<ASTDeserializationListener * > & L)230b57cec5SDimitry Andric MultiplexASTDeserializationListener::MultiplexASTDeserializationListener(
240b57cec5SDimitry Andric       const std::vector<ASTDeserializationListener*>& L)
250b57cec5SDimitry Andric     : Listeners(L) {
260b57cec5SDimitry Andric }
270b57cec5SDimitry Andric 
ReaderInitialized(ASTReader * Reader)280b57cec5SDimitry Andric void MultiplexASTDeserializationListener::ReaderInitialized(
290b57cec5SDimitry Andric     ASTReader *Reader) {
300b57cec5SDimitry Andric   for (size_t i = 0, e = Listeners.size(); i != e; ++i)
310b57cec5SDimitry Andric     Listeners[i]->ReaderInitialized(Reader);
320b57cec5SDimitry Andric }
330b57cec5SDimitry Andric 
IdentifierRead(serialization::IdentID ID,IdentifierInfo * II)340b57cec5SDimitry Andric void MultiplexASTDeserializationListener::IdentifierRead(
350b57cec5SDimitry Andric     serialization::IdentID ID, IdentifierInfo *II) {
360b57cec5SDimitry Andric   for (size_t i = 0, e = Listeners.size(); i != e; ++i)
370b57cec5SDimitry Andric     Listeners[i]->IdentifierRead(ID, II);
380b57cec5SDimitry Andric }
390b57cec5SDimitry Andric 
MacroRead(serialization::MacroID ID,MacroInfo * MI)400b57cec5SDimitry Andric void MultiplexASTDeserializationListener::MacroRead(
410b57cec5SDimitry Andric     serialization::MacroID ID, MacroInfo *MI) {
420b57cec5SDimitry Andric   for (auto &Listener : Listeners)
430b57cec5SDimitry Andric     Listener->MacroRead(ID, MI);
440b57cec5SDimitry Andric }
450b57cec5SDimitry Andric 
TypeRead(serialization::TypeIdx Idx,QualType T)460b57cec5SDimitry Andric void MultiplexASTDeserializationListener::TypeRead(
470b57cec5SDimitry Andric     serialization::TypeIdx Idx, QualType T) {
480b57cec5SDimitry Andric   for (size_t i = 0, e = Listeners.size(); i != e; ++i)
490b57cec5SDimitry Andric     Listeners[i]->TypeRead(Idx, T);
500b57cec5SDimitry Andric }
510b57cec5SDimitry Andric 
DeclRead(serialization::DeclID ID,const Decl * D)520b57cec5SDimitry Andric void MultiplexASTDeserializationListener::DeclRead(
530b57cec5SDimitry Andric     serialization::DeclID ID, const Decl *D) {
540b57cec5SDimitry Andric   for (size_t i = 0, e = Listeners.size(); i != e; ++i)
550b57cec5SDimitry Andric     Listeners[i]->DeclRead(ID, D);
560b57cec5SDimitry Andric }
570b57cec5SDimitry Andric 
SelectorRead(serialization::SelectorID ID,Selector Sel)580b57cec5SDimitry Andric void MultiplexASTDeserializationListener::SelectorRead(
590b57cec5SDimitry Andric     serialization::SelectorID ID, Selector Sel) {
600b57cec5SDimitry Andric   for (size_t i = 0, e = Listeners.size(); i != e; ++i)
610b57cec5SDimitry Andric     Listeners[i]->SelectorRead(ID, Sel);
620b57cec5SDimitry Andric }
630b57cec5SDimitry Andric 
MacroDefinitionRead(serialization::PreprocessedEntityID ID,MacroDefinitionRecord * MD)640b57cec5SDimitry Andric void MultiplexASTDeserializationListener::MacroDefinitionRead(
650b57cec5SDimitry Andric     serialization::PreprocessedEntityID ID, MacroDefinitionRecord *MD) {
660b57cec5SDimitry Andric   for (size_t i = 0, e = Listeners.size(); i != e; ++i)
670b57cec5SDimitry Andric     Listeners[i]->MacroDefinitionRead(ID, MD);
680b57cec5SDimitry Andric }
690b57cec5SDimitry Andric 
ModuleRead(serialization::SubmoduleID ID,Module * Mod)700b57cec5SDimitry Andric void MultiplexASTDeserializationListener::ModuleRead(
710b57cec5SDimitry Andric     serialization::SubmoduleID ID, Module *Mod) {
720b57cec5SDimitry Andric   for (auto &Listener : Listeners)
730b57cec5SDimitry Andric     Listener->ModuleRead(ID, Mod);
740b57cec5SDimitry Andric }
750b57cec5SDimitry Andric 
ModuleImportRead(serialization::SubmoduleID ID,SourceLocation ImportLoc)7681ad6265SDimitry Andric void MultiplexASTDeserializationListener::ModuleImportRead(
7781ad6265SDimitry Andric     serialization::SubmoduleID ID, SourceLocation ImportLoc) {
7881ad6265SDimitry Andric   for (auto &Listener : Listeners)
7981ad6265SDimitry Andric     Listener->ModuleImportRead(ID, ImportLoc);
8081ad6265SDimitry Andric }
8181ad6265SDimitry Andric 
820b57cec5SDimitry Andric // This ASTMutationListener forwards its notifications to a set of
830b57cec5SDimitry Andric // child listeners.
840b57cec5SDimitry Andric class MultiplexASTMutationListener : public ASTMutationListener {
850b57cec5SDimitry Andric public:
860b57cec5SDimitry Andric   // Does NOT take ownership of the elements in L.
870b57cec5SDimitry Andric   MultiplexASTMutationListener(ArrayRef<ASTMutationListener*> L);
880b57cec5SDimitry Andric   void CompletedTagDefinition(const TagDecl *D) override;
890b57cec5SDimitry Andric   void AddedVisibleDecl(const DeclContext *DC, const Decl *D) override;
900b57cec5SDimitry Andric   void AddedCXXImplicitMember(const CXXRecordDecl *RD, const Decl *D) override;
910b57cec5SDimitry Andric   void AddedCXXTemplateSpecialization(const ClassTemplateDecl *TD,
920b57cec5SDimitry Andric                             const ClassTemplateSpecializationDecl *D) override;
930b57cec5SDimitry Andric   void AddedCXXTemplateSpecialization(const VarTemplateDecl *TD,
940b57cec5SDimitry Andric                                const VarTemplateSpecializationDecl *D) override;
950b57cec5SDimitry Andric   void AddedCXXTemplateSpecialization(const FunctionTemplateDecl *TD,
960b57cec5SDimitry Andric                                       const FunctionDecl *D) override;
970b57cec5SDimitry Andric   void ResolvedExceptionSpec(const FunctionDecl *FD) override;
980b57cec5SDimitry Andric   void DeducedReturnType(const FunctionDecl *FD, QualType ReturnType) override;
990b57cec5SDimitry Andric   void ResolvedOperatorDelete(const CXXDestructorDecl *DD,
1000b57cec5SDimitry Andric                               const FunctionDecl *Delete,
1010b57cec5SDimitry Andric                               Expr *ThisArg) override;
1020b57cec5SDimitry Andric   void CompletedImplicitDefinition(const FunctionDecl *D) override;
1030b57cec5SDimitry Andric   void InstantiationRequested(const ValueDecl *D) override;
1040b57cec5SDimitry Andric   void VariableDefinitionInstantiated(const VarDecl *D) override;
1050b57cec5SDimitry Andric   void FunctionDefinitionInstantiated(const FunctionDecl *D) override;
1060b57cec5SDimitry Andric   void DefaultArgumentInstantiated(const ParmVarDecl *D) override;
1070b57cec5SDimitry Andric   void DefaultMemberInitializerInstantiated(const FieldDecl *D) override;
1080b57cec5SDimitry Andric   void AddedObjCCategoryToInterface(const ObjCCategoryDecl *CatD,
1090b57cec5SDimitry Andric                                     const ObjCInterfaceDecl *IFD) override;
1100b57cec5SDimitry Andric   void DeclarationMarkedUsed(const Decl *D) override;
1110b57cec5SDimitry Andric   void DeclarationMarkedOpenMPThreadPrivate(const Decl *D) override;
1120b57cec5SDimitry Andric   void DeclarationMarkedOpenMPAllocate(const Decl *D, const Attr *A) override;
1130b57cec5SDimitry Andric   void DeclarationMarkedOpenMPDeclareTarget(const Decl *D,
1140b57cec5SDimitry Andric                                             const Attr *Attr) override;
1150b57cec5SDimitry Andric   void RedefinedHiddenDefinition(const NamedDecl *D, Module *M) override;
1160b57cec5SDimitry Andric   void AddedAttributeToRecord(const Attr *Attr,
1170b57cec5SDimitry Andric                               const RecordDecl *Record) override;
1180b57cec5SDimitry Andric 
1190b57cec5SDimitry Andric private:
1200b57cec5SDimitry Andric   std::vector<ASTMutationListener*> Listeners;
1210b57cec5SDimitry Andric };
1220b57cec5SDimitry Andric 
MultiplexASTMutationListener(ArrayRef<ASTMutationListener * > L)1230b57cec5SDimitry Andric MultiplexASTMutationListener::MultiplexASTMutationListener(
1240b57cec5SDimitry Andric     ArrayRef<ASTMutationListener*> L)
1250b57cec5SDimitry Andric     : Listeners(L.begin(), L.end()) {
1260b57cec5SDimitry Andric }
1270b57cec5SDimitry Andric 
CompletedTagDefinition(const TagDecl * D)1280b57cec5SDimitry Andric void MultiplexASTMutationListener::CompletedTagDefinition(const TagDecl *D) {
1290b57cec5SDimitry Andric   for (size_t i = 0, e = Listeners.size(); i != e; ++i)
1300b57cec5SDimitry Andric     Listeners[i]->CompletedTagDefinition(D);
1310b57cec5SDimitry Andric }
1320b57cec5SDimitry Andric 
AddedVisibleDecl(const DeclContext * DC,const Decl * D)1330b57cec5SDimitry Andric void MultiplexASTMutationListener::AddedVisibleDecl(
1340b57cec5SDimitry Andric     const DeclContext *DC, const Decl *D) {
1350b57cec5SDimitry Andric   for (size_t i = 0, e = Listeners.size(); i != e; ++i)
1360b57cec5SDimitry Andric     Listeners[i]->AddedVisibleDecl(DC, D);
1370b57cec5SDimitry Andric }
1380b57cec5SDimitry Andric 
AddedCXXImplicitMember(const CXXRecordDecl * RD,const Decl * D)1390b57cec5SDimitry Andric void MultiplexASTMutationListener::AddedCXXImplicitMember(
1400b57cec5SDimitry Andric     const CXXRecordDecl *RD, const Decl *D) {
1410b57cec5SDimitry Andric   for (size_t i = 0, e = Listeners.size(); i != e; ++i)
1420b57cec5SDimitry Andric     Listeners[i]->AddedCXXImplicitMember(RD, D);
1430b57cec5SDimitry Andric }
AddedCXXTemplateSpecialization(const ClassTemplateDecl * TD,const ClassTemplateSpecializationDecl * D)1440b57cec5SDimitry Andric void MultiplexASTMutationListener::AddedCXXTemplateSpecialization(
1450b57cec5SDimitry Andric     const ClassTemplateDecl *TD, const ClassTemplateSpecializationDecl *D) {
1460b57cec5SDimitry Andric   for (size_t i = 0, e = Listeners.size(); i != e; ++i)
1470b57cec5SDimitry Andric     Listeners[i]->AddedCXXTemplateSpecialization(TD, D);
1480b57cec5SDimitry Andric }
AddedCXXTemplateSpecialization(const VarTemplateDecl * TD,const VarTemplateSpecializationDecl * D)1490b57cec5SDimitry Andric void MultiplexASTMutationListener::AddedCXXTemplateSpecialization(
1500b57cec5SDimitry Andric     const VarTemplateDecl *TD, const VarTemplateSpecializationDecl *D) {
1510b57cec5SDimitry Andric   for (size_t i = 0, e = Listeners.size(); i != e; ++i)
1520b57cec5SDimitry Andric     Listeners[i]->AddedCXXTemplateSpecialization(TD, D);
1530b57cec5SDimitry Andric }
AddedCXXTemplateSpecialization(const FunctionTemplateDecl * TD,const FunctionDecl * D)1540b57cec5SDimitry Andric void MultiplexASTMutationListener::AddedCXXTemplateSpecialization(
1550b57cec5SDimitry Andric     const FunctionTemplateDecl *TD, const FunctionDecl *D) {
1560b57cec5SDimitry Andric   for (size_t i = 0, e = Listeners.size(); i != e; ++i)
1570b57cec5SDimitry Andric     Listeners[i]->AddedCXXTemplateSpecialization(TD, D);
1580b57cec5SDimitry Andric }
ResolvedExceptionSpec(const FunctionDecl * FD)1590b57cec5SDimitry Andric void MultiplexASTMutationListener::ResolvedExceptionSpec(
1600b57cec5SDimitry Andric     const FunctionDecl *FD) {
1610b57cec5SDimitry Andric   for (auto &Listener : Listeners)
1620b57cec5SDimitry Andric     Listener->ResolvedExceptionSpec(FD);
1630b57cec5SDimitry Andric }
DeducedReturnType(const FunctionDecl * FD,QualType ReturnType)1640b57cec5SDimitry Andric void MultiplexASTMutationListener::DeducedReturnType(const FunctionDecl *FD,
1650b57cec5SDimitry Andric                                                      QualType ReturnType) {
1660b57cec5SDimitry Andric   for (size_t i = 0, e = Listeners.size(); i != e; ++i)
1670b57cec5SDimitry Andric     Listeners[i]->DeducedReturnType(FD, ReturnType);
1680b57cec5SDimitry Andric }
ResolvedOperatorDelete(const CXXDestructorDecl * DD,const FunctionDecl * Delete,Expr * ThisArg)1690b57cec5SDimitry Andric void MultiplexASTMutationListener::ResolvedOperatorDelete(
1700b57cec5SDimitry Andric     const CXXDestructorDecl *DD, const FunctionDecl *Delete, Expr *ThisArg) {
1710b57cec5SDimitry Andric   for (auto *L : Listeners)
1720b57cec5SDimitry Andric     L->ResolvedOperatorDelete(DD, Delete, ThisArg);
1730b57cec5SDimitry Andric }
CompletedImplicitDefinition(const FunctionDecl * D)1740b57cec5SDimitry Andric void MultiplexASTMutationListener::CompletedImplicitDefinition(
1750b57cec5SDimitry Andric                                                         const FunctionDecl *D) {
1760b57cec5SDimitry Andric   for (size_t i = 0, e = Listeners.size(); i != e; ++i)
1770b57cec5SDimitry Andric     Listeners[i]->CompletedImplicitDefinition(D);
1780b57cec5SDimitry Andric }
InstantiationRequested(const ValueDecl * D)1790b57cec5SDimitry Andric void MultiplexASTMutationListener::InstantiationRequested(const ValueDecl *D) {
1800b57cec5SDimitry Andric   for (size_t i = 0, e = Listeners.size(); i != e; ++i)
1810b57cec5SDimitry Andric     Listeners[i]->InstantiationRequested(D);
1820b57cec5SDimitry Andric }
VariableDefinitionInstantiated(const VarDecl * D)1830b57cec5SDimitry Andric void MultiplexASTMutationListener::VariableDefinitionInstantiated(
1840b57cec5SDimitry Andric     const VarDecl *D) {
1850b57cec5SDimitry Andric   for (size_t i = 0, e = Listeners.size(); i != e; ++i)
1860b57cec5SDimitry Andric     Listeners[i]->VariableDefinitionInstantiated(D);
1870b57cec5SDimitry Andric }
FunctionDefinitionInstantiated(const FunctionDecl * D)1880b57cec5SDimitry Andric void MultiplexASTMutationListener::FunctionDefinitionInstantiated(
1890b57cec5SDimitry Andric     const FunctionDecl *D) {
1900b57cec5SDimitry Andric   for (auto &Listener : Listeners)
1910b57cec5SDimitry Andric     Listener->FunctionDefinitionInstantiated(D);
1920b57cec5SDimitry Andric }
DefaultArgumentInstantiated(const ParmVarDecl * D)1930b57cec5SDimitry Andric void MultiplexASTMutationListener::DefaultArgumentInstantiated(
1940b57cec5SDimitry Andric                                                          const ParmVarDecl *D) {
1950b57cec5SDimitry Andric   for (size_t i = 0, e = Listeners.size(); i != e; ++i)
1960b57cec5SDimitry Andric     Listeners[i]->DefaultArgumentInstantiated(D);
1970b57cec5SDimitry Andric }
DefaultMemberInitializerInstantiated(const FieldDecl * D)1980b57cec5SDimitry Andric void MultiplexASTMutationListener::DefaultMemberInitializerInstantiated(
1990b57cec5SDimitry Andric                                                            const FieldDecl *D) {
2000b57cec5SDimitry Andric   for (size_t i = 0, e = Listeners.size(); i != e; ++i)
2010b57cec5SDimitry Andric     Listeners[i]->DefaultMemberInitializerInstantiated(D);
2020b57cec5SDimitry Andric }
AddedObjCCategoryToInterface(const ObjCCategoryDecl * CatD,const ObjCInterfaceDecl * IFD)2030b57cec5SDimitry Andric void MultiplexASTMutationListener::AddedObjCCategoryToInterface(
2040b57cec5SDimitry Andric                                                  const ObjCCategoryDecl *CatD,
2050b57cec5SDimitry Andric                                                  const ObjCInterfaceDecl *IFD) {
2060b57cec5SDimitry Andric   for (size_t i = 0, e = Listeners.size(); i != e; ++i)
2070b57cec5SDimitry Andric     Listeners[i]->AddedObjCCategoryToInterface(CatD, IFD);
2080b57cec5SDimitry Andric }
DeclarationMarkedUsed(const Decl * D)2090b57cec5SDimitry Andric void MultiplexASTMutationListener::DeclarationMarkedUsed(const Decl *D) {
2100b57cec5SDimitry Andric   for (size_t i = 0, e = Listeners.size(); i != e; ++i)
2110b57cec5SDimitry Andric     Listeners[i]->DeclarationMarkedUsed(D);
2120b57cec5SDimitry Andric }
DeclarationMarkedOpenMPThreadPrivate(const Decl * D)2130b57cec5SDimitry Andric void MultiplexASTMutationListener::DeclarationMarkedOpenMPThreadPrivate(
2140b57cec5SDimitry Andric     const Decl *D) {
2150b57cec5SDimitry Andric   for (size_t i = 0, e = Listeners.size(); i != e; ++i)
2160b57cec5SDimitry Andric     Listeners[i]->DeclarationMarkedOpenMPThreadPrivate(D);
2170b57cec5SDimitry Andric }
DeclarationMarkedOpenMPAllocate(const Decl * D,const Attr * A)2180b57cec5SDimitry Andric void MultiplexASTMutationListener::DeclarationMarkedOpenMPAllocate(
2190b57cec5SDimitry Andric     const Decl *D, const Attr *A) {
2200b57cec5SDimitry Andric   for (ASTMutationListener *L : Listeners)
2210b57cec5SDimitry Andric     L->DeclarationMarkedOpenMPAllocate(D, A);
2220b57cec5SDimitry Andric }
DeclarationMarkedOpenMPDeclareTarget(const Decl * D,const Attr * Attr)2230b57cec5SDimitry Andric void MultiplexASTMutationListener::DeclarationMarkedOpenMPDeclareTarget(
2240b57cec5SDimitry Andric     const Decl *D, const Attr *Attr) {
2250b57cec5SDimitry Andric   for (auto *L : Listeners)
2260b57cec5SDimitry Andric     L->DeclarationMarkedOpenMPDeclareTarget(D, Attr);
2270b57cec5SDimitry Andric }
RedefinedHiddenDefinition(const NamedDecl * D,Module * M)2280b57cec5SDimitry Andric void MultiplexASTMutationListener::RedefinedHiddenDefinition(const NamedDecl *D,
2290b57cec5SDimitry Andric                                                              Module *M) {
2300b57cec5SDimitry Andric   for (auto *L : Listeners)
2310b57cec5SDimitry Andric     L->RedefinedHiddenDefinition(D, M);
2320b57cec5SDimitry Andric }
2330b57cec5SDimitry Andric 
AddedAttributeToRecord(const Attr * Attr,const RecordDecl * Record)2340b57cec5SDimitry Andric void MultiplexASTMutationListener::AddedAttributeToRecord(
2350b57cec5SDimitry Andric                                                     const Attr *Attr,
2360b57cec5SDimitry Andric                                                     const RecordDecl *Record) {
2370b57cec5SDimitry Andric   for (auto *L : Listeners)
2380b57cec5SDimitry Andric     L->AddedAttributeToRecord(Attr, Record);
2390b57cec5SDimitry Andric }
2400b57cec5SDimitry Andric 
2410b57cec5SDimitry Andric }  // end namespace clang
2420b57cec5SDimitry Andric 
MultiplexConsumer(std::vector<std::unique_ptr<ASTConsumer>> C)2430b57cec5SDimitry Andric MultiplexConsumer::MultiplexConsumer(
2440b57cec5SDimitry Andric     std::vector<std::unique_ptr<ASTConsumer>> C)
24504eeddc0SDimitry Andric     : Consumers(std::move(C)) {
2460b57cec5SDimitry Andric   // Collect the mutation listeners and deserialization listeners of all
2470b57cec5SDimitry Andric   // children, and create a multiplex listener each if so.
2480b57cec5SDimitry Andric   std::vector<ASTMutationListener *> mutationListeners;
2490b57cec5SDimitry Andric   std::vector<ASTDeserializationListener*> serializationListeners;
2500b57cec5SDimitry Andric   for (auto &Consumer : Consumers) {
2510b57cec5SDimitry Andric     if (auto *mutationListener = Consumer->GetASTMutationListener())
2520b57cec5SDimitry Andric       mutationListeners.push_back(mutationListener);
2530b57cec5SDimitry Andric     if (auto *serializationListener = Consumer->GetASTDeserializationListener())
2540b57cec5SDimitry Andric       serializationListeners.push_back(serializationListener);
2550b57cec5SDimitry Andric   }
2560b57cec5SDimitry Andric   if (!mutationListeners.empty()) {
2570b57cec5SDimitry Andric     MutationListener =
258a7dea167SDimitry Andric         std::make_unique<MultiplexASTMutationListener>(mutationListeners);
2590b57cec5SDimitry Andric   }
2600b57cec5SDimitry Andric   if (!serializationListeners.empty()) {
2610b57cec5SDimitry Andric     DeserializationListener =
262a7dea167SDimitry Andric         std::make_unique<MultiplexASTDeserializationListener>(
2630b57cec5SDimitry Andric             serializationListeners);
2640b57cec5SDimitry Andric   }
2650b57cec5SDimitry Andric }
2660b57cec5SDimitry Andric 
~MultiplexConsumer()2670b57cec5SDimitry Andric MultiplexConsumer::~MultiplexConsumer() {}
2680b57cec5SDimitry Andric 
Initialize(ASTContext & Context)2690b57cec5SDimitry Andric void MultiplexConsumer::Initialize(ASTContext &Context) {
2700b57cec5SDimitry Andric   for (auto &Consumer : Consumers)
2710b57cec5SDimitry Andric     Consumer->Initialize(Context);
2720b57cec5SDimitry Andric }
2730b57cec5SDimitry Andric 
HandleTopLevelDecl(DeclGroupRef D)2740b57cec5SDimitry Andric bool MultiplexConsumer::HandleTopLevelDecl(DeclGroupRef D) {
2750b57cec5SDimitry Andric   bool Continue = true;
2760b57cec5SDimitry Andric   for (auto &Consumer : Consumers)
2770b57cec5SDimitry Andric     Continue = Continue && Consumer->HandleTopLevelDecl(D);
2780b57cec5SDimitry Andric   return Continue;
2790b57cec5SDimitry Andric }
2800b57cec5SDimitry Andric 
HandleInlineFunctionDefinition(FunctionDecl * D)2810b57cec5SDimitry Andric void MultiplexConsumer::HandleInlineFunctionDefinition(FunctionDecl *D) {
2820b57cec5SDimitry Andric   for (auto &Consumer : Consumers)
2830b57cec5SDimitry Andric     Consumer->HandleInlineFunctionDefinition(D);
2840b57cec5SDimitry Andric }
2850b57cec5SDimitry Andric 
HandleCXXStaticMemberVarInstantiation(VarDecl * VD)2860b57cec5SDimitry Andric void MultiplexConsumer::HandleCXXStaticMemberVarInstantiation(VarDecl *VD) {
2870b57cec5SDimitry Andric   for (auto &Consumer : Consumers)
2880b57cec5SDimitry Andric     Consumer->HandleCXXStaticMemberVarInstantiation(VD);
2890b57cec5SDimitry Andric }
2900b57cec5SDimitry Andric 
HandleInterestingDecl(DeclGroupRef D)2910b57cec5SDimitry Andric void MultiplexConsumer::HandleInterestingDecl(DeclGroupRef D) {
2920b57cec5SDimitry Andric   for (auto &Consumer : Consumers)
2930b57cec5SDimitry Andric     Consumer->HandleInterestingDecl(D);
2940b57cec5SDimitry Andric }
2950b57cec5SDimitry Andric 
HandleTranslationUnit(ASTContext & Ctx)2960b57cec5SDimitry Andric void MultiplexConsumer::HandleTranslationUnit(ASTContext &Ctx) {
2970b57cec5SDimitry Andric   for (auto &Consumer : Consumers)
2980b57cec5SDimitry Andric     Consumer->HandleTranslationUnit(Ctx);
2990b57cec5SDimitry Andric }
3000b57cec5SDimitry Andric 
HandleTagDeclDefinition(TagDecl * D)3010b57cec5SDimitry Andric void MultiplexConsumer::HandleTagDeclDefinition(TagDecl *D) {
3020b57cec5SDimitry Andric   for (auto &Consumer : Consumers)
3030b57cec5SDimitry Andric     Consumer->HandleTagDeclDefinition(D);
3040b57cec5SDimitry Andric }
3050b57cec5SDimitry Andric 
HandleTagDeclRequiredDefinition(const TagDecl * D)3060b57cec5SDimitry Andric void MultiplexConsumer::HandleTagDeclRequiredDefinition(const TagDecl *D) {
3070b57cec5SDimitry Andric   for (auto &Consumer : Consumers)
3080b57cec5SDimitry Andric     Consumer->HandleTagDeclRequiredDefinition(D);
3090b57cec5SDimitry Andric }
3100b57cec5SDimitry Andric 
HandleCXXImplicitFunctionInstantiation(FunctionDecl * D)3110b57cec5SDimitry Andric void MultiplexConsumer::HandleCXXImplicitFunctionInstantiation(FunctionDecl *D){
3120b57cec5SDimitry Andric   for (auto &Consumer : Consumers)
3130b57cec5SDimitry Andric     Consumer->HandleCXXImplicitFunctionInstantiation(D);
3140b57cec5SDimitry Andric }
3150b57cec5SDimitry Andric 
HandleTopLevelDeclInObjCContainer(DeclGroupRef D)3160b57cec5SDimitry Andric void MultiplexConsumer::HandleTopLevelDeclInObjCContainer(DeclGroupRef D) {
3170b57cec5SDimitry Andric   for (auto &Consumer : Consumers)
3180b57cec5SDimitry Andric     Consumer->HandleTopLevelDeclInObjCContainer(D);
3190b57cec5SDimitry Andric }
3200b57cec5SDimitry Andric 
HandleImplicitImportDecl(ImportDecl * D)3210b57cec5SDimitry Andric void MultiplexConsumer::HandleImplicitImportDecl(ImportDecl *D) {
3220b57cec5SDimitry Andric   for (auto &Consumer : Consumers)
3230b57cec5SDimitry Andric     Consumer->HandleImplicitImportDecl(D);
3240b57cec5SDimitry Andric }
3250b57cec5SDimitry Andric 
CompleteTentativeDefinition(VarDecl * D)3260b57cec5SDimitry Andric void MultiplexConsumer::CompleteTentativeDefinition(VarDecl *D) {
3270b57cec5SDimitry Andric   for (auto &Consumer : Consumers)
3280b57cec5SDimitry Andric     Consumer->CompleteTentativeDefinition(D);
3290b57cec5SDimitry Andric }
3300b57cec5SDimitry Andric 
CompleteExternalDeclaration(VarDecl * D)331480093f4SDimitry Andric void MultiplexConsumer::CompleteExternalDeclaration(VarDecl *D) {
332480093f4SDimitry Andric   for (auto &Consumer : Consumers)
333480093f4SDimitry Andric     Consumer->CompleteExternalDeclaration(D);
334480093f4SDimitry Andric }
335480093f4SDimitry Andric 
AssignInheritanceModel(CXXRecordDecl * RD)3360b57cec5SDimitry Andric void MultiplexConsumer::AssignInheritanceModel(CXXRecordDecl *RD) {
3370b57cec5SDimitry Andric   for (auto &Consumer : Consumers)
3380b57cec5SDimitry Andric     Consumer->AssignInheritanceModel(RD);
3390b57cec5SDimitry Andric }
3400b57cec5SDimitry Andric 
HandleVTable(CXXRecordDecl * RD)3410b57cec5SDimitry Andric void MultiplexConsumer::HandleVTable(CXXRecordDecl *RD) {
3420b57cec5SDimitry Andric   for (auto &Consumer : Consumers)
3430b57cec5SDimitry Andric     Consumer->HandleVTable(RD);
3440b57cec5SDimitry Andric }
3450b57cec5SDimitry Andric 
GetASTMutationListener()3460b57cec5SDimitry Andric ASTMutationListener *MultiplexConsumer::GetASTMutationListener() {
3470b57cec5SDimitry Andric   return MutationListener.get();
3480b57cec5SDimitry Andric }
3490b57cec5SDimitry Andric 
GetASTDeserializationListener()3500b57cec5SDimitry Andric ASTDeserializationListener *MultiplexConsumer::GetASTDeserializationListener() {
3510b57cec5SDimitry Andric   return DeserializationListener.get();
3520b57cec5SDimitry Andric }
3530b57cec5SDimitry Andric 
PrintStats()3540b57cec5SDimitry Andric void MultiplexConsumer::PrintStats() {
3550b57cec5SDimitry Andric   for (auto &Consumer : Consumers)
3560b57cec5SDimitry Andric     Consumer->PrintStats();
3570b57cec5SDimitry Andric }
3580b57cec5SDimitry Andric 
shouldSkipFunctionBody(Decl * D)3590b57cec5SDimitry Andric bool MultiplexConsumer::shouldSkipFunctionBody(Decl *D) {
3600b57cec5SDimitry Andric   bool Skip = true;
3610b57cec5SDimitry Andric   for (auto &Consumer : Consumers)
3620b57cec5SDimitry Andric     Skip = Skip && Consumer->shouldSkipFunctionBody(D);
3630b57cec5SDimitry Andric   return Skip;
3640b57cec5SDimitry Andric }
3650b57cec5SDimitry Andric 
InitializeSema(Sema & S)3660b57cec5SDimitry Andric void MultiplexConsumer::InitializeSema(Sema &S) {
3670b57cec5SDimitry Andric   for (auto &Consumer : Consumers)
3680b57cec5SDimitry Andric     if (SemaConsumer *SC = dyn_cast<SemaConsumer>(Consumer.get()))
3690b57cec5SDimitry Andric       SC->InitializeSema(S);
3700b57cec5SDimitry Andric }
3710b57cec5SDimitry Andric 
ForgetSema()3720b57cec5SDimitry Andric void MultiplexConsumer::ForgetSema() {
3730b57cec5SDimitry Andric   for (auto &Consumer : Consumers)
3740b57cec5SDimitry Andric     if (SemaConsumer *SC = dyn_cast<SemaConsumer>(Consumer.get()))
3750b57cec5SDimitry Andric       SC->ForgetSema();
3760b57cec5SDimitry Andric }
377