xref: /freebsd/contrib/llvm-project/clang/lib/Frontend/MultiplexConsumer.cpp (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
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 
23*0fca6ea1SDimitry Andric class NamespaceDecl;
24*0fca6ea1SDimitry Andric class TranslationUnitDecl;
25*0fca6ea1SDimitry Andric 
MultiplexASTDeserializationListener(const std::vector<ASTDeserializationListener * > & L)260b57cec5SDimitry Andric MultiplexASTDeserializationListener::MultiplexASTDeserializationListener(
270b57cec5SDimitry Andric       const std::vector<ASTDeserializationListener*>& L)
280b57cec5SDimitry Andric     : Listeners(L) {
290b57cec5SDimitry Andric }
300b57cec5SDimitry Andric 
ReaderInitialized(ASTReader * Reader)310b57cec5SDimitry Andric void MultiplexASTDeserializationListener::ReaderInitialized(
320b57cec5SDimitry Andric     ASTReader *Reader) {
330b57cec5SDimitry Andric   for (size_t i = 0, e = Listeners.size(); i != e; ++i)
340b57cec5SDimitry Andric     Listeners[i]->ReaderInitialized(Reader);
350b57cec5SDimitry Andric }
360b57cec5SDimitry Andric 
IdentifierRead(serialization::IdentifierID ID,IdentifierInfo * II)370b57cec5SDimitry Andric void MultiplexASTDeserializationListener::IdentifierRead(
38*0fca6ea1SDimitry Andric     serialization::IdentifierID ID, IdentifierInfo *II) {
390b57cec5SDimitry Andric   for (size_t i = 0, e = Listeners.size(); i != e; ++i)
400b57cec5SDimitry Andric     Listeners[i]->IdentifierRead(ID, II);
410b57cec5SDimitry Andric }
420b57cec5SDimitry Andric 
MacroRead(serialization::MacroID ID,MacroInfo * MI)430b57cec5SDimitry Andric void MultiplexASTDeserializationListener::MacroRead(
440b57cec5SDimitry Andric     serialization::MacroID ID, MacroInfo *MI) {
450b57cec5SDimitry Andric   for (auto &Listener : Listeners)
460b57cec5SDimitry Andric     Listener->MacroRead(ID, MI);
470b57cec5SDimitry Andric }
480b57cec5SDimitry Andric 
TypeRead(serialization::TypeIdx Idx,QualType T)490b57cec5SDimitry Andric void MultiplexASTDeserializationListener::TypeRead(
500b57cec5SDimitry Andric     serialization::TypeIdx Idx, QualType T) {
510b57cec5SDimitry Andric   for (size_t i = 0, e = Listeners.size(); i != e; ++i)
520b57cec5SDimitry Andric     Listeners[i]->TypeRead(Idx, T);
530b57cec5SDimitry Andric }
540b57cec5SDimitry Andric 
DeclRead(GlobalDeclID ID,const Decl * D)55*0fca6ea1SDimitry Andric void MultiplexASTDeserializationListener::DeclRead(GlobalDeclID ID,
56*0fca6ea1SDimitry Andric                                                    const Decl *D) {
570b57cec5SDimitry Andric   for (size_t i = 0, e = Listeners.size(); i != e; ++i)
580b57cec5SDimitry Andric     Listeners[i]->DeclRead(ID, D);
590b57cec5SDimitry Andric }
600b57cec5SDimitry Andric 
SelectorRead(serialization::SelectorID ID,Selector Sel)610b57cec5SDimitry Andric void MultiplexASTDeserializationListener::SelectorRead(
620b57cec5SDimitry Andric     serialization::SelectorID ID, Selector Sel) {
630b57cec5SDimitry Andric   for (size_t i = 0, e = Listeners.size(); i != e; ++i)
640b57cec5SDimitry Andric     Listeners[i]->SelectorRead(ID, Sel);
650b57cec5SDimitry Andric }
660b57cec5SDimitry Andric 
MacroDefinitionRead(serialization::PreprocessedEntityID ID,MacroDefinitionRecord * MD)670b57cec5SDimitry Andric void MultiplexASTDeserializationListener::MacroDefinitionRead(
680b57cec5SDimitry Andric     serialization::PreprocessedEntityID ID, MacroDefinitionRecord *MD) {
690b57cec5SDimitry Andric   for (size_t i = 0, e = Listeners.size(); i != e; ++i)
700b57cec5SDimitry Andric     Listeners[i]->MacroDefinitionRead(ID, MD);
710b57cec5SDimitry Andric }
720b57cec5SDimitry Andric 
ModuleRead(serialization::SubmoduleID ID,Module * Mod)730b57cec5SDimitry Andric void MultiplexASTDeserializationListener::ModuleRead(
740b57cec5SDimitry Andric     serialization::SubmoduleID ID, Module *Mod) {
750b57cec5SDimitry Andric   for (auto &Listener : Listeners)
760b57cec5SDimitry Andric     Listener->ModuleRead(ID, Mod);
770b57cec5SDimitry Andric }
780b57cec5SDimitry Andric 
ModuleImportRead(serialization::SubmoduleID ID,SourceLocation ImportLoc)7981ad6265SDimitry Andric void MultiplexASTDeserializationListener::ModuleImportRead(
8081ad6265SDimitry Andric     serialization::SubmoduleID ID, SourceLocation ImportLoc) {
8181ad6265SDimitry Andric   for (auto &Listener : Listeners)
8281ad6265SDimitry Andric     Listener->ModuleImportRead(ID, ImportLoc);
8381ad6265SDimitry Andric }
8481ad6265SDimitry Andric 
850b57cec5SDimitry Andric // This ASTMutationListener forwards its notifications to a set of
860b57cec5SDimitry Andric // child listeners.
870b57cec5SDimitry Andric class MultiplexASTMutationListener : public ASTMutationListener {
880b57cec5SDimitry Andric public:
890b57cec5SDimitry Andric   // Does NOT take ownership of the elements in L.
900b57cec5SDimitry Andric   MultiplexASTMutationListener(ArrayRef<ASTMutationListener*> L);
910b57cec5SDimitry Andric   void CompletedTagDefinition(const TagDecl *D) override;
920b57cec5SDimitry Andric   void AddedVisibleDecl(const DeclContext *DC, const Decl *D) override;
930b57cec5SDimitry Andric   void AddedCXXImplicitMember(const CXXRecordDecl *RD, const Decl *D) override;
940b57cec5SDimitry Andric   void AddedCXXTemplateSpecialization(const ClassTemplateDecl *TD,
950b57cec5SDimitry Andric                             const ClassTemplateSpecializationDecl *D) override;
960b57cec5SDimitry Andric   void AddedCXXTemplateSpecialization(const VarTemplateDecl *TD,
970b57cec5SDimitry Andric                                const VarTemplateSpecializationDecl *D) override;
980b57cec5SDimitry Andric   void AddedCXXTemplateSpecialization(const FunctionTemplateDecl *TD,
990b57cec5SDimitry Andric                                       const FunctionDecl *D) override;
1000b57cec5SDimitry Andric   void ResolvedExceptionSpec(const FunctionDecl *FD) override;
1010b57cec5SDimitry Andric   void DeducedReturnType(const FunctionDecl *FD, QualType ReturnType) override;
1020b57cec5SDimitry Andric   void ResolvedOperatorDelete(const CXXDestructorDecl *DD,
1030b57cec5SDimitry Andric                               const FunctionDecl *Delete,
1040b57cec5SDimitry Andric                               Expr *ThisArg) override;
1050b57cec5SDimitry Andric   void CompletedImplicitDefinition(const FunctionDecl *D) override;
1060b57cec5SDimitry Andric   void InstantiationRequested(const ValueDecl *D) override;
1070b57cec5SDimitry Andric   void VariableDefinitionInstantiated(const VarDecl *D) override;
1080b57cec5SDimitry Andric   void FunctionDefinitionInstantiated(const FunctionDecl *D) override;
1090b57cec5SDimitry Andric   void DefaultArgumentInstantiated(const ParmVarDecl *D) override;
1100b57cec5SDimitry Andric   void DefaultMemberInitializerInstantiated(const FieldDecl *D) override;
1110b57cec5SDimitry Andric   void AddedObjCCategoryToInterface(const ObjCCategoryDecl *CatD,
1120b57cec5SDimitry Andric                                     const ObjCInterfaceDecl *IFD) override;
1130b57cec5SDimitry Andric   void DeclarationMarkedUsed(const Decl *D) override;
1140b57cec5SDimitry Andric   void DeclarationMarkedOpenMPThreadPrivate(const Decl *D) override;
1150b57cec5SDimitry Andric   void DeclarationMarkedOpenMPAllocate(const Decl *D, const Attr *A) override;
1160b57cec5SDimitry Andric   void DeclarationMarkedOpenMPDeclareTarget(const Decl *D,
1170b57cec5SDimitry Andric                                             const Attr *Attr) override;
1180b57cec5SDimitry Andric   void RedefinedHiddenDefinition(const NamedDecl *D, Module *M) override;
1190b57cec5SDimitry Andric   void AddedAttributeToRecord(const Attr *Attr,
1200b57cec5SDimitry Andric                               const RecordDecl *Record) override;
121*0fca6ea1SDimitry Andric   void EnteringModulePurview() override;
122*0fca6ea1SDimitry Andric   void AddedManglingNumber(const Decl *D, unsigned) override;
123*0fca6ea1SDimitry Andric   void AddedStaticLocalNumbers(const Decl *D, unsigned) override;
124*0fca6ea1SDimitry Andric   void AddedAnonymousNamespace(const TranslationUnitDecl *,
125*0fca6ea1SDimitry Andric                                NamespaceDecl *AnonNamespace) override;
1260b57cec5SDimitry Andric 
1270b57cec5SDimitry Andric private:
1280b57cec5SDimitry Andric   std::vector<ASTMutationListener*> Listeners;
1290b57cec5SDimitry Andric };
1300b57cec5SDimitry Andric 
MultiplexASTMutationListener(ArrayRef<ASTMutationListener * > L)1310b57cec5SDimitry Andric MultiplexASTMutationListener::MultiplexASTMutationListener(
1320b57cec5SDimitry Andric     ArrayRef<ASTMutationListener*> L)
1330b57cec5SDimitry Andric     : Listeners(L.begin(), L.end()) {
1340b57cec5SDimitry Andric }
1350b57cec5SDimitry Andric 
CompletedTagDefinition(const TagDecl * D)1360b57cec5SDimitry Andric void MultiplexASTMutationListener::CompletedTagDefinition(const TagDecl *D) {
1370b57cec5SDimitry Andric   for (size_t i = 0, e = Listeners.size(); i != e; ++i)
1380b57cec5SDimitry Andric     Listeners[i]->CompletedTagDefinition(D);
1390b57cec5SDimitry Andric }
1400b57cec5SDimitry Andric 
AddedVisibleDecl(const DeclContext * DC,const Decl * D)1410b57cec5SDimitry Andric void MultiplexASTMutationListener::AddedVisibleDecl(
1420b57cec5SDimitry Andric     const DeclContext *DC, const Decl *D) {
1430b57cec5SDimitry Andric   for (size_t i = 0, e = Listeners.size(); i != e; ++i)
1440b57cec5SDimitry Andric     Listeners[i]->AddedVisibleDecl(DC, D);
1450b57cec5SDimitry Andric }
1460b57cec5SDimitry Andric 
AddedCXXImplicitMember(const CXXRecordDecl * RD,const Decl * D)1470b57cec5SDimitry Andric void MultiplexASTMutationListener::AddedCXXImplicitMember(
1480b57cec5SDimitry Andric     const CXXRecordDecl *RD, const Decl *D) {
1490b57cec5SDimitry Andric   for (size_t i = 0, e = Listeners.size(); i != e; ++i)
1500b57cec5SDimitry Andric     Listeners[i]->AddedCXXImplicitMember(RD, D);
1510b57cec5SDimitry Andric }
AddedCXXTemplateSpecialization(const ClassTemplateDecl * TD,const ClassTemplateSpecializationDecl * D)1520b57cec5SDimitry Andric void MultiplexASTMutationListener::AddedCXXTemplateSpecialization(
1530b57cec5SDimitry Andric     const ClassTemplateDecl *TD, const ClassTemplateSpecializationDecl *D) {
1540b57cec5SDimitry Andric   for (size_t i = 0, e = Listeners.size(); i != e; ++i)
1550b57cec5SDimitry Andric     Listeners[i]->AddedCXXTemplateSpecialization(TD, D);
1560b57cec5SDimitry Andric }
AddedCXXTemplateSpecialization(const VarTemplateDecl * TD,const VarTemplateSpecializationDecl * D)1570b57cec5SDimitry Andric void MultiplexASTMutationListener::AddedCXXTemplateSpecialization(
1580b57cec5SDimitry Andric     const VarTemplateDecl *TD, const VarTemplateSpecializationDecl *D) {
1590b57cec5SDimitry Andric   for (size_t i = 0, e = Listeners.size(); i != e; ++i)
1600b57cec5SDimitry Andric     Listeners[i]->AddedCXXTemplateSpecialization(TD, D);
1610b57cec5SDimitry Andric }
AddedCXXTemplateSpecialization(const FunctionTemplateDecl * TD,const FunctionDecl * D)1620b57cec5SDimitry Andric void MultiplexASTMutationListener::AddedCXXTemplateSpecialization(
1630b57cec5SDimitry Andric     const FunctionTemplateDecl *TD, const FunctionDecl *D) {
1640b57cec5SDimitry Andric   for (size_t i = 0, e = Listeners.size(); i != e; ++i)
1650b57cec5SDimitry Andric     Listeners[i]->AddedCXXTemplateSpecialization(TD, D);
1660b57cec5SDimitry Andric }
ResolvedExceptionSpec(const FunctionDecl * FD)1670b57cec5SDimitry Andric void MultiplexASTMutationListener::ResolvedExceptionSpec(
1680b57cec5SDimitry Andric     const FunctionDecl *FD) {
1690b57cec5SDimitry Andric   for (auto &Listener : Listeners)
1700b57cec5SDimitry Andric     Listener->ResolvedExceptionSpec(FD);
1710b57cec5SDimitry Andric }
DeducedReturnType(const FunctionDecl * FD,QualType ReturnType)1720b57cec5SDimitry Andric void MultiplexASTMutationListener::DeducedReturnType(const FunctionDecl *FD,
1730b57cec5SDimitry Andric                                                      QualType ReturnType) {
1740b57cec5SDimitry Andric   for (size_t i = 0, e = Listeners.size(); i != e; ++i)
1750b57cec5SDimitry Andric     Listeners[i]->DeducedReturnType(FD, ReturnType);
1760b57cec5SDimitry Andric }
ResolvedOperatorDelete(const CXXDestructorDecl * DD,const FunctionDecl * Delete,Expr * ThisArg)1770b57cec5SDimitry Andric void MultiplexASTMutationListener::ResolvedOperatorDelete(
1780b57cec5SDimitry Andric     const CXXDestructorDecl *DD, const FunctionDecl *Delete, Expr *ThisArg) {
1790b57cec5SDimitry Andric   for (auto *L : Listeners)
1800b57cec5SDimitry Andric     L->ResolvedOperatorDelete(DD, Delete, ThisArg);
1810b57cec5SDimitry Andric }
CompletedImplicitDefinition(const FunctionDecl * D)1820b57cec5SDimitry Andric void MultiplexASTMutationListener::CompletedImplicitDefinition(
1830b57cec5SDimitry Andric                                                         const FunctionDecl *D) {
1840b57cec5SDimitry Andric   for (size_t i = 0, e = Listeners.size(); i != e; ++i)
1850b57cec5SDimitry Andric     Listeners[i]->CompletedImplicitDefinition(D);
1860b57cec5SDimitry Andric }
InstantiationRequested(const ValueDecl * D)1870b57cec5SDimitry Andric void MultiplexASTMutationListener::InstantiationRequested(const ValueDecl *D) {
1880b57cec5SDimitry Andric   for (size_t i = 0, e = Listeners.size(); i != e; ++i)
1890b57cec5SDimitry Andric     Listeners[i]->InstantiationRequested(D);
1900b57cec5SDimitry Andric }
VariableDefinitionInstantiated(const VarDecl * D)1910b57cec5SDimitry Andric void MultiplexASTMutationListener::VariableDefinitionInstantiated(
1920b57cec5SDimitry Andric     const VarDecl *D) {
1930b57cec5SDimitry Andric   for (size_t i = 0, e = Listeners.size(); i != e; ++i)
1940b57cec5SDimitry Andric     Listeners[i]->VariableDefinitionInstantiated(D);
1950b57cec5SDimitry Andric }
FunctionDefinitionInstantiated(const FunctionDecl * D)1960b57cec5SDimitry Andric void MultiplexASTMutationListener::FunctionDefinitionInstantiated(
1970b57cec5SDimitry Andric     const FunctionDecl *D) {
1980b57cec5SDimitry Andric   for (auto &Listener : Listeners)
1990b57cec5SDimitry Andric     Listener->FunctionDefinitionInstantiated(D);
2000b57cec5SDimitry Andric }
DefaultArgumentInstantiated(const ParmVarDecl * D)2010b57cec5SDimitry Andric void MultiplexASTMutationListener::DefaultArgumentInstantiated(
2020b57cec5SDimitry Andric                                                          const ParmVarDecl *D) {
2030b57cec5SDimitry Andric   for (size_t i = 0, e = Listeners.size(); i != e; ++i)
2040b57cec5SDimitry Andric     Listeners[i]->DefaultArgumentInstantiated(D);
2050b57cec5SDimitry Andric }
DefaultMemberInitializerInstantiated(const FieldDecl * D)2060b57cec5SDimitry Andric void MultiplexASTMutationListener::DefaultMemberInitializerInstantiated(
2070b57cec5SDimitry Andric                                                            const FieldDecl *D) {
2080b57cec5SDimitry Andric   for (size_t i = 0, e = Listeners.size(); i != e; ++i)
2090b57cec5SDimitry Andric     Listeners[i]->DefaultMemberInitializerInstantiated(D);
2100b57cec5SDimitry Andric }
AddedObjCCategoryToInterface(const ObjCCategoryDecl * CatD,const ObjCInterfaceDecl * IFD)2110b57cec5SDimitry Andric void MultiplexASTMutationListener::AddedObjCCategoryToInterface(
2120b57cec5SDimitry Andric                                                  const ObjCCategoryDecl *CatD,
2130b57cec5SDimitry Andric                                                  const ObjCInterfaceDecl *IFD) {
2140b57cec5SDimitry Andric   for (size_t i = 0, e = Listeners.size(); i != e; ++i)
2150b57cec5SDimitry Andric     Listeners[i]->AddedObjCCategoryToInterface(CatD, IFD);
2160b57cec5SDimitry Andric }
DeclarationMarkedUsed(const Decl * D)2170b57cec5SDimitry Andric void MultiplexASTMutationListener::DeclarationMarkedUsed(const Decl *D) {
2180b57cec5SDimitry Andric   for (size_t i = 0, e = Listeners.size(); i != e; ++i)
2190b57cec5SDimitry Andric     Listeners[i]->DeclarationMarkedUsed(D);
2200b57cec5SDimitry Andric }
DeclarationMarkedOpenMPThreadPrivate(const Decl * D)2210b57cec5SDimitry Andric void MultiplexASTMutationListener::DeclarationMarkedOpenMPThreadPrivate(
2220b57cec5SDimitry Andric     const Decl *D) {
2230b57cec5SDimitry Andric   for (size_t i = 0, e = Listeners.size(); i != e; ++i)
2240b57cec5SDimitry Andric     Listeners[i]->DeclarationMarkedOpenMPThreadPrivate(D);
2250b57cec5SDimitry Andric }
DeclarationMarkedOpenMPAllocate(const Decl * D,const Attr * A)2260b57cec5SDimitry Andric void MultiplexASTMutationListener::DeclarationMarkedOpenMPAllocate(
2270b57cec5SDimitry Andric     const Decl *D, const Attr *A) {
2280b57cec5SDimitry Andric   for (ASTMutationListener *L : Listeners)
2290b57cec5SDimitry Andric     L->DeclarationMarkedOpenMPAllocate(D, A);
2300b57cec5SDimitry Andric }
DeclarationMarkedOpenMPDeclareTarget(const Decl * D,const Attr * Attr)2310b57cec5SDimitry Andric void MultiplexASTMutationListener::DeclarationMarkedOpenMPDeclareTarget(
2320b57cec5SDimitry Andric     const Decl *D, const Attr *Attr) {
2330b57cec5SDimitry Andric   for (auto *L : Listeners)
2340b57cec5SDimitry Andric     L->DeclarationMarkedOpenMPDeclareTarget(D, Attr);
2350b57cec5SDimitry Andric }
RedefinedHiddenDefinition(const NamedDecl * D,Module * M)2360b57cec5SDimitry Andric void MultiplexASTMutationListener::RedefinedHiddenDefinition(const NamedDecl *D,
2370b57cec5SDimitry Andric                                                              Module *M) {
2380b57cec5SDimitry Andric   for (auto *L : Listeners)
2390b57cec5SDimitry Andric     L->RedefinedHiddenDefinition(D, M);
2400b57cec5SDimitry Andric }
2410b57cec5SDimitry Andric 
AddedAttributeToRecord(const Attr * Attr,const RecordDecl * Record)2420b57cec5SDimitry Andric void MultiplexASTMutationListener::AddedAttributeToRecord(
2430b57cec5SDimitry Andric                                                     const Attr *Attr,
2440b57cec5SDimitry Andric                                                     const RecordDecl *Record) {
2450b57cec5SDimitry Andric   for (auto *L : Listeners)
2460b57cec5SDimitry Andric     L->AddedAttributeToRecord(Attr, Record);
2470b57cec5SDimitry Andric }
2480b57cec5SDimitry Andric 
EnteringModulePurview()249*0fca6ea1SDimitry Andric void MultiplexASTMutationListener::EnteringModulePurview() {
250*0fca6ea1SDimitry Andric   for (auto *L : Listeners)
251*0fca6ea1SDimitry Andric     L->EnteringModulePurview();
252*0fca6ea1SDimitry Andric }
253*0fca6ea1SDimitry Andric 
AddedManglingNumber(const Decl * D,unsigned Number)254*0fca6ea1SDimitry Andric void MultiplexASTMutationListener::AddedManglingNumber(const Decl *D,
255*0fca6ea1SDimitry Andric                                                        unsigned Number) {
256*0fca6ea1SDimitry Andric   for (auto *L : Listeners)
257*0fca6ea1SDimitry Andric     L->AddedManglingNumber(D, Number);
258*0fca6ea1SDimitry Andric }
AddedStaticLocalNumbers(const Decl * D,unsigned Number)259*0fca6ea1SDimitry Andric void MultiplexASTMutationListener::AddedStaticLocalNumbers(const Decl *D,
260*0fca6ea1SDimitry Andric                                                            unsigned Number) {
261*0fca6ea1SDimitry Andric   for (auto *L : Listeners)
262*0fca6ea1SDimitry Andric     L->AddedStaticLocalNumbers(D, Number);
263*0fca6ea1SDimitry Andric }
AddedAnonymousNamespace(const TranslationUnitDecl * TU,NamespaceDecl * AnonNamespace)264*0fca6ea1SDimitry Andric void MultiplexASTMutationListener::AddedAnonymousNamespace(
265*0fca6ea1SDimitry Andric     const TranslationUnitDecl *TU, NamespaceDecl *AnonNamespace) {
266*0fca6ea1SDimitry Andric   for (auto *L : Listeners)
267*0fca6ea1SDimitry Andric     L->AddedAnonymousNamespace(TU, AnonNamespace);
268*0fca6ea1SDimitry Andric }
269*0fca6ea1SDimitry Andric 
2700b57cec5SDimitry Andric }  // end namespace clang
2710b57cec5SDimitry Andric 
MultiplexConsumer(std::vector<std::unique_ptr<ASTConsumer>> C)2720b57cec5SDimitry Andric MultiplexConsumer::MultiplexConsumer(
2730b57cec5SDimitry Andric     std::vector<std::unique_ptr<ASTConsumer>> C)
27404eeddc0SDimitry Andric     : Consumers(std::move(C)) {
2750b57cec5SDimitry Andric   // Collect the mutation listeners and deserialization listeners of all
2760b57cec5SDimitry Andric   // children, and create a multiplex listener each if so.
2770b57cec5SDimitry Andric   std::vector<ASTMutationListener *> mutationListeners;
2780b57cec5SDimitry Andric   std::vector<ASTDeserializationListener*> serializationListeners;
2790b57cec5SDimitry Andric   for (auto &Consumer : Consumers) {
2800b57cec5SDimitry Andric     if (auto *mutationListener = Consumer->GetASTMutationListener())
2810b57cec5SDimitry Andric       mutationListeners.push_back(mutationListener);
2820b57cec5SDimitry Andric     if (auto *serializationListener = Consumer->GetASTDeserializationListener())
2830b57cec5SDimitry Andric       serializationListeners.push_back(serializationListener);
2840b57cec5SDimitry Andric   }
2850b57cec5SDimitry Andric   if (!mutationListeners.empty()) {
2860b57cec5SDimitry Andric     MutationListener =
287a7dea167SDimitry Andric         std::make_unique<MultiplexASTMutationListener>(mutationListeners);
2880b57cec5SDimitry Andric   }
2890b57cec5SDimitry Andric   if (!serializationListeners.empty()) {
2900b57cec5SDimitry Andric     DeserializationListener =
291a7dea167SDimitry Andric         std::make_unique<MultiplexASTDeserializationListener>(
2920b57cec5SDimitry Andric             serializationListeners);
2930b57cec5SDimitry Andric   }
2940b57cec5SDimitry Andric }
2950b57cec5SDimitry Andric 
~MultiplexConsumer()2960b57cec5SDimitry Andric MultiplexConsumer::~MultiplexConsumer() {}
2970b57cec5SDimitry Andric 
Initialize(ASTContext & Context)2980b57cec5SDimitry Andric void MultiplexConsumer::Initialize(ASTContext &Context) {
2990b57cec5SDimitry Andric   for (auto &Consumer : Consumers)
3000b57cec5SDimitry Andric     Consumer->Initialize(Context);
3010b57cec5SDimitry Andric }
3020b57cec5SDimitry Andric 
HandleTopLevelDecl(DeclGroupRef D)3030b57cec5SDimitry Andric bool MultiplexConsumer::HandleTopLevelDecl(DeclGroupRef D) {
3040b57cec5SDimitry Andric   bool Continue = true;
3050b57cec5SDimitry Andric   for (auto &Consumer : Consumers)
3060b57cec5SDimitry Andric     Continue = Continue && Consumer->HandleTopLevelDecl(D);
3070b57cec5SDimitry Andric   return Continue;
3080b57cec5SDimitry Andric }
3090b57cec5SDimitry Andric 
HandleInlineFunctionDefinition(FunctionDecl * D)3100b57cec5SDimitry Andric void MultiplexConsumer::HandleInlineFunctionDefinition(FunctionDecl *D) {
3110b57cec5SDimitry Andric   for (auto &Consumer : Consumers)
3120b57cec5SDimitry Andric     Consumer->HandleInlineFunctionDefinition(D);
3130b57cec5SDimitry Andric }
3140b57cec5SDimitry Andric 
HandleCXXStaticMemberVarInstantiation(VarDecl * VD)3150b57cec5SDimitry Andric void MultiplexConsumer::HandleCXXStaticMemberVarInstantiation(VarDecl *VD) {
3160b57cec5SDimitry Andric   for (auto &Consumer : Consumers)
3170b57cec5SDimitry Andric     Consumer->HandleCXXStaticMemberVarInstantiation(VD);
3180b57cec5SDimitry Andric }
3190b57cec5SDimitry Andric 
HandleInterestingDecl(DeclGroupRef D)3200b57cec5SDimitry Andric void MultiplexConsumer::HandleInterestingDecl(DeclGroupRef D) {
3210b57cec5SDimitry Andric   for (auto &Consumer : Consumers)
3220b57cec5SDimitry Andric     Consumer->HandleInterestingDecl(D);
3230b57cec5SDimitry Andric }
3240b57cec5SDimitry Andric 
HandleTranslationUnit(ASTContext & Ctx)3250b57cec5SDimitry Andric void MultiplexConsumer::HandleTranslationUnit(ASTContext &Ctx) {
3260b57cec5SDimitry Andric   for (auto &Consumer : Consumers)
3270b57cec5SDimitry Andric     Consumer->HandleTranslationUnit(Ctx);
3280b57cec5SDimitry Andric }
3290b57cec5SDimitry Andric 
HandleTagDeclDefinition(TagDecl * D)3300b57cec5SDimitry Andric void MultiplexConsumer::HandleTagDeclDefinition(TagDecl *D) {
3310b57cec5SDimitry Andric   for (auto &Consumer : Consumers)
3320b57cec5SDimitry Andric     Consumer->HandleTagDeclDefinition(D);
3330b57cec5SDimitry Andric }
3340b57cec5SDimitry Andric 
HandleTagDeclRequiredDefinition(const TagDecl * D)3350b57cec5SDimitry Andric void MultiplexConsumer::HandleTagDeclRequiredDefinition(const TagDecl *D) {
3360b57cec5SDimitry Andric   for (auto &Consumer : Consumers)
3370b57cec5SDimitry Andric     Consumer->HandleTagDeclRequiredDefinition(D);
3380b57cec5SDimitry Andric }
3390b57cec5SDimitry Andric 
HandleCXXImplicitFunctionInstantiation(FunctionDecl * D)3400b57cec5SDimitry Andric void MultiplexConsumer::HandleCXXImplicitFunctionInstantiation(FunctionDecl *D){
3410b57cec5SDimitry Andric   for (auto &Consumer : Consumers)
3420b57cec5SDimitry Andric     Consumer->HandleCXXImplicitFunctionInstantiation(D);
3430b57cec5SDimitry Andric }
3440b57cec5SDimitry Andric 
HandleTopLevelDeclInObjCContainer(DeclGroupRef D)3450b57cec5SDimitry Andric void MultiplexConsumer::HandleTopLevelDeclInObjCContainer(DeclGroupRef D) {
3460b57cec5SDimitry Andric   for (auto &Consumer : Consumers)
3470b57cec5SDimitry Andric     Consumer->HandleTopLevelDeclInObjCContainer(D);
3480b57cec5SDimitry Andric }
3490b57cec5SDimitry Andric 
HandleImplicitImportDecl(ImportDecl * D)3500b57cec5SDimitry Andric void MultiplexConsumer::HandleImplicitImportDecl(ImportDecl *D) {
3510b57cec5SDimitry Andric   for (auto &Consumer : Consumers)
3520b57cec5SDimitry Andric     Consumer->HandleImplicitImportDecl(D);
3530b57cec5SDimitry Andric }
3540b57cec5SDimitry Andric 
CompleteTentativeDefinition(VarDecl * D)3550b57cec5SDimitry Andric void MultiplexConsumer::CompleteTentativeDefinition(VarDecl *D) {
3560b57cec5SDimitry Andric   for (auto &Consumer : Consumers)
3570b57cec5SDimitry Andric     Consumer->CompleteTentativeDefinition(D);
3580b57cec5SDimitry Andric }
3590b57cec5SDimitry Andric 
CompleteExternalDeclaration(DeclaratorDecl * D)360*0fca6ea1SDimitry Andric void MultiplexConsumer::CompleteExternalDeclaration(DeclaratorDecl *D) {
361480093f4SDimitry Andric   for (auto &Consumer : Consumers)
362480093f4SDimitry Andric     Consumer->CompleteExternalDeclaration(D);
363480093f4SDimitry Andric }
364480093f4SDimitry Andric 
AssignInheritanceModel(CXXRecordDecl * RD)3650b57cec5SDimitry Andric void MultiplexConsumer::AssignInheritanceModel(CXXRecordDecl *RD) {
3660b57cec5SDimitry Andric   for (auto &Consumer : Consumers)
3670b57cec5SDimitry Andric     Consumer->AssignInheritanceModel(RD);
3680b57cec5SDimitry Andric }
3690b57cec5SDimitry Andric 
HandleVTable(CXXRecordDecl * RD)3700b57cec5SDimitry Andric void MultiplexConsumer::HandleVTable(CXXRecordDecl *RD) {
3710b57cec5SDimitry Andric   for (auto &Consumer : Consumers)
3720b57cec5SDimitry Andric     Consumer->HandleVTable(RD);
3730b57cec5SDimitry Andric }
3740b57cec5SDimitry Andric 
GetASTMutationListener()3750b57cec5SDimitry Andric ASTMutationListener *MultiplexConsumer::GetASTMutationListener() {
3760b57cec5SDimitry Andric   return MutationListener.get();
3770b57cec5SDimitry Andric }
3780b57cec5SDimitry Andric 
GetASTDeserializationListener()3790b57cec5SDimitry Andric ASTDeserializationListener *MultiplexConsumer::GetASTDeserializationListener() {
3800b57cec5SDimitry Andric   return DeserializationListener.get();
3810b57cec5SDimitry Andric }
3820b57cec5SDimitry Andric 
PrintStats()3830b57cec5SDimitry Andric void MultiplexConsumer::PrintStats() {
3840b57cec5SDimitry Andric   for (auto &Consumer : Consumers)
3850b57cec5SDimitry Andric     Consumer->PrintStats();
3860b57cec5SDimitry Andric }
3870b57cec5SDimitry Andric 
shouldSkipFunctionBody(Decl * D)3880b57cec5SDimitry Andric bool MultiplexConsumer::shouldSkipFunctionBody(Decl *D) {
3890b57cec5SDimitry Andric   bool Skip = true;
3900b57cec5SDimitry Andric   for (auto &Consumer : Consumers)
3910b57cec5SDimitry Andric     Skip = Skip && Consumer->shouldSkipFunctionBody(D);
3920b57cec5SDimitry Andric   return Skip;
3930b57cec5SDimitry Andric }
3940b57cec5SDimitry Andric 
InitializeSema(Sema & S)3950b57cec5SDimitry Andric void MultiplexConsumer::InitializeSema(Sema &S) {
3960b57cec5SDimitry Andric   for (auto &Consumer : Consumers)
3970b57cec5SDimitry Andric     if (SemaConsumer *SC = dyn_cast<SemaConsumer>(Consumer.get()))
3980b57cec5SDimitry Andric       SC->InitializeSema(S);
3990b57cec5SDimitry Andric }
4000b57cec5SDimitry Andric 
ForgetSema()4010b57cec5SDimitry Andric void MultiplexConsumer::ForgetSema() {
4020b57cec5SDimitry Andric   for (auto &Consumer : Consumers)
4030b57cec5SDimitry Andric     if (SemaConsumer *SC = dyn_cast<SemaConsumer>(Consumer.get()))
4040b57cec5SDimitry Andric       SC->ForgetSema();
4050b57cec5SDimitry Andric }
406