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