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 260b57cec5SDimitry Andric MultiplexASTDeserializationListener::MultiplexASTDeserializationListener( 270b57cec5SDimitry Andric const std::vector<ASTDeserializationListener*>& L) 280b57cec5SDimitry Andric : Listeners(L) { 290b57cec5SDimitry Andric } 300b57cec5SDimitry Andric 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 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 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 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 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 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 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 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 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 1310b57cec5SDimitry Andric MultiplexASTMutationListener::MultiplexASTMutationListener( 1320b57cec5SDimitry Andric ArrayRef<ASTMutationListener*> L) 1330b57cec5SDimitry Andric : Listeners(L.begin(), L.end()) { 1340b57cec5SDimitry Andric } 1350b57cec5SDimitry Andric 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 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 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 } 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 } 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 } 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 } 1670b57cec5SDimitry Andric void MultiplexASTMutationListener::ResolvedExceptionSpec( 1680b57cec5SDimitry Andric const FunctionDecl *FD) { 1690b57cec5SDimitry Andric for (auto &Listener : Listeners) 1700b57cec5SDimitry Andric Listener->ResolvedExceptionSpec(FD); 1710b57cec5SDimitry Andric } 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 } 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 } 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 } 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 } 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 } 1960b57cec5SDimitry Andric void MultiplexASTMutationListener::FunctionDefinitionInstantiated( 1970b57cec5SDimitry Andric const FunctionDecl *D) { 1980b57cec5SDimitry Andric for (auto &Listener : Listeners) 1990b57cec5SDimitry Andric Listener->FunctionDefinitionInstantiated(D); 2000b57cec5SDimitry Andric } 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 } 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 } 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 } 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 } 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 } 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 } 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 } 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 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 249*0fca6ea1SDimitry Andric void MultiplexASTMutationListener::EnteringModulePurview() { 250*0fca6ea1SDimitry Andric for (auto *L : Listeners) 251*0fca6ea1SDimitry Andric L->EnteringModulePurview(); 252*0fca6ea1SDimitry Andric } 253*0fca6ea1SDimitry Andric 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 } 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 } 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 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 2960b57cec5SDimitry Andric MultiplexConsumer::~MultiplexConsumer() {} 2970b57cec5SDimitry Andric 2980b57cec5SDimitry Andric void MultiplexConsumer::Initialize(ASTContext &Context) { 2990b57cec5SDimitry Andric for (auto &Consumer : Consumers) 3000b57cec5SDimitry Andric Consumer->Initialize(Context); 3010b57cec5SDimitry Andric } 3020b57cec5SDimitry Andric 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 3100b57cec5SDimitry Andric void MultiplexConsumer::HandleInlineFunctionDefinition(FunctionDecl *D) { 3110b57cec5SDimitry Andric for (auto &Consumer : Consumers) 3120b57cec5SDimitry Andric Consumer->HandleInlineFunctionDefinition(D); 3130b57cec5SDimitry Andric } 3140b57cec5SDimitry Andric 3150b57cec5SDimitry Andric void MultiplexConsumer::HandleCXXStaticMemberVarInstantiation(VarDecl *VD) { 3160b57cec5SDimitry Andric for (auto &Consumer : Consumers) 3170b57cec5SDimitry Andric Consumer->HandleCXXStaticMemberVarInstantiation(VD); 3180b57cec5SDimitry Andric } 3190b57cec5SDimitry Andric 3200b57cec5SDimitry Andric void MultiplexConsumer::HandleInterestingDecl(DeclGroupRef D) { 3210b57cec5SDimitry Andric for (auto &Consumer : Consumers) 3220b57cec5SDimitry Andric Consumer->HandleInterestingDecl(D); 3230b57cec5SDimitry Andric } 3240b57cec5SDimitry Andric 3250b57cec5SDimitry Andric void MultiplexConsumer::HandleTranslationUnit(ASTContext &Ctx) { 3260b57cec5SDimitry Andric for (auto &Consumer : Consumers) 3270b57cec5SDimitry Andric Consumer->HandleTranslationUnit(Ctx); 3280b57cec5SDimitry Andric } 3290b57cec5SDimitry Andric 3300b57cec5SDimitry Andric void MultiplexConsumer::HandleTagDeclDefinition(TagDecl *D) { 3310b57cec5SDimitry Andric for (auto &Consumer : Consumers) 3320b57cec5SDimitry Andric Consumer->HandleTagDeclDefinition(D); 3330b57cec5SDimitry Andric } 3340b57cec5SDimitry Andric 3350b57cec5SDimitry Andric void MultiplexConsumer::HandleTagDeclRequiredDefinition(const TagDecl *D) { 3360b57cec5SDimitry Andric for (auto &Consumer : Consumers) 3370b57cec5SDimitry Andric Consumer->HandleTagDeclRequiredDefinition(D); 3380b57cec5SDimitry Andric } 3390b57cec5SDimitry Andric 3400b57cec5SDimitry Andric void MultiplexConsumer::HandleCXXImplicitFunctionInstantiation(FunctionDecl *D){ 3410b57cec5SDimitry Andric for (auto &Consumer : Consumers) 3420b57cec5SDimitry Andric Consumer->HandleCXXImplicitFunctionInstantiation(D); 3430b57cec5SDimitry Andric } 3440b57cec5SDimitry Andric 3450b57cec5SDimitry Andric void MultiplexConsumer::HandleTopLevelDeclInObjCContainer(DeclGroupRef D) { 3460b57cec5SDimitry Andric for (auto &Consumer : Consumers) 3470b57cec5SDimitry Andric Consumer->HandleTopLevelDeclInObjCContainer(D); 3480b57cec5SDimitry Andric } 3490b57cec5SDimitry Andric 3500b57cec5SDimitry Andric void MultiplexConsumer::HandleImplicitImportDecl(ImportDecl *D) { 3510b57cec5SDimitry Andric for (auto &Consumer : Consumers) 3520b57cec5SDimitry Andric Consumer->HandleImplicitImportDecl(D); 3530b57cec5SDimitry Andric } 3540b57cec5SDimitry Andric 3550b57cec5SDimitry Andric void MultiplexConsumer::CompleteTentativeDefinition(VarDecl *D) { 3560b57cec5SDimitry Andric for (auto &Consumer : Consumers) 3570b57cec5SDimitry Andric Consumer->CompleteTentativeDefinition(D); 3580b57cec5SDimitry Andric } 3590b57cec5SDimitry Andric 360*0fca6ea1SDimitry Andric void MultiplexConsumer::CompleteExternalDeclaration(DeclaratorDecl *D) { 361480093f4SDimitry Andric for (auto &Consumer : Consumers) 362480093f4SDimitry Andric Consumer->CompleteExternalDeclaration(D); 363480093f4SDimitry Andric } 364480093f4SDimitry Andric 3650b57cec5SDimitry Andric void MultiplexConsumer::AssignInheritanceModel(CXXRecordDecl *RD) { 3660b57cec5SDimitry Andric for (auto &Consumer : Consumers) 3670b57cec5SDimitry Andric Consumer->AssignInheritanceModel(RD); 3680b57cec5SDimitry Andric } 3690b57cec5SDimitry Andric 3700b57cec5SDimitry Andric void MultiplexConsumer::HandleVTable(CXXRecordDecl *RD) { 3710b57cec5SDimitry Andric for (auto &Consumer : Consumers) 3720b57cec5SDimitry Andric Consumer->HandleVTable(RD); 3730b57cec5SDimitry Andric } 3740b57cec5SDimitry Andric 3750b57cec5SDimitry Andric ASTMutationListener *MultiplexConsumer::GetASTMutationListener() { 3760b57cec5SDimitry Andric return MutationListener.get(); 3770b57cec5SDimitry Andric } 3780b57cec5SDimitry Andric 3790b57cec5SDimitry Andric ASTDeserializationListener *MultiplexConsumer::GetASTDeserializationListener() { 3800b57cec5SDimitry Andric return DeserializationListener.get(); 3810b57cec5SDimitry Andric } 3820b57cec5SDimitry Andric 3830b57cec5SDimitry Andric void MultiplexConsumer::PrintStats() { 3840b57cec5SDimitry Andric for (auto &Consumer : Consumers) 3850b57cec5SDimitry Andric Consumer->PrintStats(); 3860b57cec5SDimitry Andric } 3870b57cec5SDimitry Andric 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 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 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