1218887Sdim//===- MultiplexConsumer.cpp - AST Consumer for PCH Generation --*- C++ -*-===//
2218887Sdim//
3218887Sdim//                     The LLVM Compiler Infrastructure
4218887Sdim//
5218887Sdim// This file is distributed under the University of Illinois Open Source
6218887Sdim// License. See LICENSE.TXT for details.
7218887Sdim//
8218887Sdim//===----------------------------------------------------------------------===//
9218887Sdim//
10218887Sdim//  This file defines the MultiplexConsumer class. It also declares and defines
11218887Sdim//  MultiplexASTDeserializationListener and  MultiplexASTMutationListener, which
12218887Sdim//  are implementation details of MultiplexConsumer.
13218887Sdim//
14218887Sdim//===----------------------------------------------------------------------===//
15218887Sdim
16218887Sdim#include "clang/Frontend/MultiplexConsumer.h"
17218887Sdim#include "clang/AST/ASTMutationListener.h"
18218887Sdim#include "clang/AST/DeclGroup.h"
19218887Sdim#include "clang/Serialization/ASTDeserializationListener.h"
20218887Sdim
21218887Sdimusing namespace clang;
22218887Sdim
23218887Sdimnamespace clang {
24218887Sdim
25218887Sdim// This ASTDeserializationListener forwards its notifications to a set of
26218887Sdim// child listeners.
27218887Sdimclass MultiplexASTDeserializationListener
28218887Sdim    : public ASTDeserializationListener {
29218887Sdimpublic:
30218887Sdim  // Does NOT take ownership of the elements in L.
31218887Sdim  MultiplexASTDeserializationListener(
32218887Sdim      const std::vector<ASTDeserializationListener*>& L);
33276479Sdim  void ReaderInitialized(ASTReader *Reader) override;
34276479Sdim  void IdentifierRead(serialization::IdentID ID,
35276479Sdim                      IdentifierInfo *II) override;
36288943Sdim  void MacroRead(serialization::MacroID ID, MacroInfo *MI) override;
37276479Sdim  void TypeRead(serialization::TypeIdx Idx, QualType T) override;
38276479Sdim  void DeclRead(serialization::DeclID ID, const Decl *D) override;
39276479Sdim  void SelectorRead(serialization::SelectorID iD, Selector Sel) override;
40276479Sdim  void MacroDefinitionRead(serialization::PreprocessedEntityID,
41288943Sdim                           MacroDefinitionRecord *MD) override;
42288943Sdim  void ModuleRead(serialization::SubmoduleID ID, Module *Mod) override;
43288943Sdim
44218887Sdimprivate:
45288943Sdim  std::vector<ASTDeserializationListener *> Listeners;
46218887Sdim};
47218887Sdim
48218887SdimMultiplexASTDeserializationListener::MultiplexASTDeserializationListener(
49218887Sdim      const std::vector<ASTDeserializationListener*>& L)
50218887Sdim    : Listeners(L) {
51218887Sdim}
52218887Sdim
53218887Sdimvoid MultiplexASTDeserializationListener::ReaderInitialized(
54218887Sdim    ASTReader *Reader) {
55218887Sdim  for (size_t i = 0, e = Listeners.size(); i != e; ++i)
56218887Sdim    Listeners[i]->ReaderInitialized(Reader);
57218887Sdim}
58218887Sdim
59218887Sdimvoid MultiplexASTDeserializationListener::IdentifierRead(
60218887Sdim    serialization::IdentID ID, IdentifierInfo *II) {
61218887Sdim  for (size_t i = 0, e = Listeners.size(); i != e; ++i)
62218887Sdim    Listeners[i]->IdentifierRead(ID, II);
63218887Sdim}
64218887Sdim
65288943Sdimvoid MultiplexASTDeserializationListener::MacroRead(
66288943Sdim    serialization::MacroID ID, MacroInfo *MI) {
67288943Sdim  for (auto &Listener : Listeners)
68288943Sdim    Listener->MacroRead(ID, MI);
69288943Sdim}
70288943Sdim
71218887Sdimvoid MultiplexASTDeserializationListener::TypeRead(
72218887Sdim    serialization::TypeIdx Idx, QualType T) {
73218887Sdim  for (size_t i = 0, e = Listeners.size(); i != e; ++i)
74218887Sdim    Listeners[i]->TypeRead(Idx, T);
75218887Sdim}
76218887Sdim
77218887Sdimvoid MultiplexASTDeserializationListener::DeclRead(
78218887Sdim    serialization::DeclID ID, const Decl *D) {
79218887Sdim  for (size_t i = 0, e = Listeners.size(); i != e; ++i)
80218887Sdim    Listeners[i]->DeclRead(ID, D);
81218887Sdim}
82218887Sdim
83218887Sdimvoid MultiplexASTDeserializationListener::SelectorRead(
84218887Sdim    serialization::SelectorID ID, Selector Sel) {
85218887Sdim  for (size_t i = 0, e = Listeners.size(); i != e; ++i)
86218887Sdim    Listeners[i]->SelectorRead(ID, Sel);
87218887Sdim}
88218887Sdim
89218887Sdimvoid MultiplexASTDeserializationListener::MacroDefinitionRead(
90288943Sdim    serialization::PreprocessedEntityID ID, MacroDefinitionRecord *MD) {
91218887Sdim  for (size_t i = 0, e = Listeners.size(); i != e; ++i)
92218887Sdim    Listeners[i]->MacroDefinitionRead(ID, MD);
93218887Sdim}
94218887Sdim
95288943Sdimvoid MultiplexASTDeserializationListener::ModuleRead(
96288943Sdim    serialization::SubmoduleID ID, Module *Mod) {
97288943Sdim  for (auto &Listener : Listeners)
98288943Sdim    Listener->ModuleRead(ID, Mod);
99288943Sdim}
100288943Sdim
101218887Sdim// This ASTMutationListener forwards its notifications to a set of
102218887Sdim// child listeners.
103218887Sdimclass MultiplexASTMutationListener : public ASTMutationListener {
104218887Sdimpublic:
105218887Sdim  // Does NOT take ownership of the elements in L.
106234353Sdim  MultiplexASTMutationListener(ArrayRef<ASTMutationListener*> L);
107276479Sdim  void CompletedTagDefinition(const TagDecl *D) override;
108276479Sdim  void AddedVisibleDecl(const DeclContext *DC, const Decl *D) override;
109276479Sdim  void AddedCXXImplicitMember(const CXXRecordDecl *RD, const Decl *D) override;
110276479Sdim  void AddedCXXTemplateSpecialization(const ClassTemplateDecl *TD,
111276479Sdim                            const ClassTemplateSpecializationDecl *D) override;
112276479Sdim  void AddedCXXTemplateSpecialization(const VarTemplateDecl *TD,
113276479Sdim                               const VarTemplateSpecializationDecl *D) override;
114276479Sdim  void AddedCXXTemplateSpecialization(const FunctionTemplateDecl *TD,
115276479Sdim                                      const FunctionDecl *D) override;
116288943Sdim  void ResolvedExceptionSpec(const FunctionDecl *FD) override;
117276479Sdim  void DeducedReturnType(const FunctionDecl *FD, QualType ReturnType) override;
118288943Sdim  void ResolvedOperatorDelete(const CXXDestructorDecl *DD,
119288943Sdim                              const FunctionDecl *Delete) override;
120276479Sdim  void CompletedImplicitDefinition(const FunctionDecl *D) override;
121276479Sdim  void StaticDataMemberInstantiated(const VarDecl *D) override;
122296417Sdim  void DefaultArgumentInstantiated(const ParmVarDecl *D) override;
123276479Sdim  void AddedObjCCategoryToInterface(const ObjCCategoryDecl *CatD,
124276479Sdim                                    const ObjCInterfaceDecl *IFD) override;
125288943Sdim  void FunctionDefinitionInstantiated(const FunctionDecl *D) override;
126276479Sdim  void DeclarationMarkedUsed(const Decl *D) override;
127280031Sdim  void DeclarationMarkedOpenMPThreadPrivate(const Decl *D) override;
128288943Sdim  void RedefinedHiddenDefinition(const NamedDecl *D, Module *M) override;
129288943Sdim  void AddedAttributeToRecord(const Attr *Attr,
130288943Sdim                              const RecordDecl *Record) override;
131261991Sdim
132218887Sdimprivate:
133218887Sdim  std::vector<ASTMutationListener*> Listeners;
134218887Sdim};
135218887Sdim
136218887SdimMultiplexASTMutationListener::MultiplexASTMutationListener(
137234353Sdim    ArrayRef<ASTMutationListener*> L)
138234353Sdim    : Listeners(L.begin(), L.end()) {
139218887Sdim}
140218887Sdim
141218887Sdimvoid MultiplexASTMutationListener::CompletedTagDefinition(const TagDecl *D) {
142218887Sdim  for (size_t i = 0, e = Listeners.size(); i != e; ++i)
143218887Sdim    Listeners[i]->CompletedTagDefinition(D);
144218887Sdim}
145218887Sdim
146218887Sdimvoid MultiplexASTMutationListener::AddedVisibleDecl(
147218887Sdim    const DeclContext *DC, const Decl *D) {
148218887Sdim  for (size_t i = 0, e = Listeners.size(); i != e; ++i)
149218887Sdim    Listeners[i]->AddedVisibleDecl(DC, D);
150218887Sdim}
151218887Sdim
152218887Sdimvoid MultiplexASTMutationListener::AddedCXXImplicitMember(
153218887Sdim    const CXXRecordDecl *RD, const Decl *D) {
154218887Sdim  for (size_t i = 0, e = Listeners.size(); i != e; ++i)
155218887Sdim    Listeners[i]->AddedCXXImplicitMember(RD, D);
156218887Sdim}
157218887Sdimvoid MultiplexASTMutationListener::AddedCXXTemplateSpecialization(
158218887Sdim    const ClassTemplateDecl *TD, const ClassTemplateSpecializationDecl *D) {
159218887Sdim  for (size_t i = 0, e = Listeners.size(); i != e; ++i)
160218887Sdim    Listeners[i]->AddedCXXTemplateSpecialization(TD, D);
161218887Sdim}
162221345Sdimvoid MultiplexASTMutationListener::AddedCXXTemplateSpecialization(
163261991Sdim    const VarTemplateDecl *TD, const VarTemplateSpecializationDecl *D) {
164261991Sdim  for (size_t i = 0, e = Listeners.size(); i != e; ++i)
165261991Sdim    Listeners[i]->AddedCXXTemplateSpecialization(TD, D);
166261991Sdim}
167261991Sdimvoid MultiplexASTMutationListener::AddedCXXTemplateSpecialization(
168221345Sdim    const FunctionTemplateDecl *TD, const FunctionDecl *D) {
169221345Sdim  for (size_t i = 0, e = Listeners.size(); i != e; ++i)
170221345Sdim    Listeners[i]->AddedCXXTemplateSpecialization(TD, D);
171221345Sdim}
172288943Sdimvoid MultiplexASTMutationListener::ResolvedExceptionSpec(
173288943Sdim    const FunctionDecl *FD) {
174288943Sdim  for (auto &Listener : Listeners)
175288943Sdim    Listener->ResolvedExceptionSpec(FD);
176288943Sdim}
177261991Sdimvoid MultiplexASTMutationListener::DeducedReturnType(const FunctionDecl *FD,
178261991Sdim                                                     QualType ReturnType) {
179261991Sdim  for (size_t i = 0, e = Listeners.size(); i != e; ++i)
180261991Sdim    Listeners[i]->DeducedReturnType(FD, ReturnType);
181261991Sdim}
182288943Sdimvoid MultiplexASTMutationListener::ResolvedOperatorDelete(
183288943Sdim    const CXXDestructorDecl *DD, const FunctionDecl *Delete) {
184288943Sdim  for (auto *L : Listeners)
185288943Sdim    L->ResolvedOperatorDelete(DD, Delete);
186288943Sdim}
187221345Sdimvoid MultiplexASTMutationListener::CompletedImplicitDefinition(
188221345Sdim                                                        const FunctionDecl *D) {
189221345Sdim  for (size_t i = 0, e = Listeners.size(); i != e; ++i)
190221345Sdim    Listeners[i]->CompletedImplicitDefinition(D);
191221345Sdim}
192221345Sdimvoid MultiplexASTMutationListener::StaticDataMemberInstantiated(
193221345Sdim                                                             const VarDecl *D) {
194221345Sdim  for (size_t i = 0, e = Listeners.size(); i != e; ++i)
195221345Sdim    Listeners[i]->StaticDataMemberInstantiated(D);
196221345Sdim}
197296417Sdimvoid MultiplexASTMutationListener::DefaultArgumentInstantiated(
198296417Sdim                                                         const ParmVarDecl *D) {
199296417Sdim  for (size_t i = 0, e = Listeners.size(); i != e; ++i)
200296417Sdim    Listeners[i]->DefaultArgumentInstantiated(D);
201296417Sdim}
202234353Sdimvoid MultiplexASTMutationListener::AddedObjCCategoryToInterface(
203234353Sdim                                                 const ObjCCategoryDecl *CatD,
204234353Sdim                                                 const ObjCInterfaceDecl *IFD) {
205234353Sdim  for (size_t i = 0, e = Listeners.size(); i != e; ++i)
206234353Sdim    Listeners[i]->AddedObjCCategoryToInterface(CatD, IFD);
207234353Sdim}
208288943Sdimvoid MultiplexASTMutationListener::FunctionDefinitionInstantiated(
209288943Sdim    const FunctionDecl *D) {
210288943Sdim  for (auto &Listener : Listeners)
211288943Sdim    Listener->FunctionDefinitionInstantiated(D);
212288943Sdim}
213261991Sdimvoid MultiplexASTMutationListener::DeclarationMarkedUsed(const Decl *D) {
214261991Sdim  for (size_t i = 0, e = Listeners.size(); i != e; ++i)
215261991Sdim    Listeners[i]->DeclarationMarkedUsed(D);
216261991Sdim}
217280031Sdimvoid MultiplexASTMutationListener::DeclarationMarkedOpenMPThreadPrivate(
218280031Sdim    const Decl *D) {
219280031Sdim  for (size_t i = 0, e = Listeners.size(); i != e; ++i)
220280031Sdim    Listeners[i]->DeclarationMarkedOpenMPThreadPrivate(D);
221280031Sdim}
222288943Sdimvoid MultiplexASTMutationListener::RedefinedHiddenDefinition(const NamedDecl *D,
223288943Sdim                                                             Module *M) {
224288943Sdim  for (auto *L : Listeners)
225288943Sdim    L->RedefinedHiddenDefinition(D, M);
226288943Sdim}
227288943Sdim
228288943Sdimvoid MultiplexASTMutationListener::AddedAttributeToRecord(
229288943Sdim                                                    const Attr *Attr,
230288943Sdim                                                    const RecordDecl *Record) {
231288943Sdim  for (auto *L : Listeners)
232288943Sdim    L->AddedAttributeToRecord(Attr, Record);
233288943Sdim}
234218887Sdim
235218887Sdim}  // end namespace clang
236218887Sdim
237280031SdimMultiplexConsumer::MultiplexConsumer(
238280031Sdim    std::vector<std::unique_ptr<ASTConsumer>> C)
239280031Sdim    : Consumers(std::move(C)), MutationListener(), DeserializationListener() {
240218887Sdim  // Collect the mutation listeners and deserialization listeners of all
241218887Sdim  // children, and create a multiplex listener each if so.
242218887Sdim  std::vector<ASTMutationListener*> mutationListeners;
243218887Sdim  std::vector<ASTDeserializationListener*> serializationListeners;
244280031Sdim  for (auto &Consumer : Consumers) {
245280031Sdim    if (auto *mutationListener = Consumer->GetASTMutationListener())
246218887Sdim      mutationListeners.push_back(mutationListener);
247280031Sdim    if (auto *serializationListener = Consumer->GetASTDeserializationListener())
248218887Sdim      serializationListeners.push_back(serializationListener);
249218887Sdim  }
250280031Sdim  if (!mutationListeners.empty()) {
251280031Sdim    MutationListener =
252280031Sdim        llvm::make_unique<MultiplexASTMutationListener>(mutationListeners);
253218887Sdim  }
254280031Sdim  if (!serializationListeners.empty()) {
255280031Sdim    DeserializationListener =
256280031Sdim        llvm::make_unique<MultiplexASTDeserializationListener>(
257280031Sdim            serializationListeners);
258218887Sdim  }
259218887Sdim}
260218887Sdim
261280031SdimMultiplexConsumer::~MultiplexConsumer() {}
262218887Sdim
263218887Sdimvoid MultiplexConsumer::Initialize(ASTContext &Context) {
264280031Sdim  for (auto &Consumer : Consumers)
265280031Sdim    Consumer->Initialize(Context);
266218887Sdim}
267218887Sdim
268234353Sdimbool MultiplexConsumer::HandleTopLevelDecl(DeclGroupRef D) {
269234353Sdim  bool Continue = true;
270280031Sdim  for (auto &Consumer : Consumers)
271280031Sdim    Continue = Continue && Consumer->HandleTopLevelDecl(D);
272234353Sdim  return Continue;
273218887Sdim}
274218887Sdim
275276479Sdimvoid MultiplexConsumer::HandleInlineMethodDefinition(CXXMethodDecl *D) {
276280031Sdim  for (auto &Consumer : Consumers)
277280031Sdim    Consumer->HandleInlineMethodDefinition(D);
278276479Sdim}
279276479Sdim
280280031Sdimvoid MultiplexConsumer::HandleCXXStaticMemberVarInstantiation(VarDecl *VD) {
281280031Sdim  for (auto &Consumer : Consumers)
282280031Sdim    Consumer->HandleCXXStaticMemberVarInstantiation(VD);
283234353Sdim}
284234353Sdim
285218887Sdimvoid MultiplexConsumer::HandleInterestingDecl(DeclGroupRef D) {
286280031Sdim  for (auto &Consumer : Consumers)
287280031Sdim    Consumer->HandleInterestingDecl(D);
288218887Sdim}
289218887Sdim
290218887Sdimvoid MultiplexConsumer::HandleTranslationUnit(ASTContext &Ctx) {
291280031Sdim  for (auto &Consumer : Consumers)
292280031Sdim    Consumer->HandleTranslationUnit(Ctx);
293218887Sdim}
294218887Sdim
295218887Sdimvoid MultiplexConsumer::HandleTagDeclDefinition(TagDecl *D) {
296280031Sdim  for (auto &Consumer : Consumers)
297280031Sdim    Consumer->HandleTagDeclDefinition(D);
298218887Sdim}
299218887Sdim
300276479Sdimvoid MultiplexConsumer::HandleTagDeclRequiredDefinition(const TagDecl *D) {
301280031Sdim  for (auto &Consumer : Consumers)
302280031Sdim    Consumer->HandleTagDeclRequiredDefinition(D);
303276479Sdim}
304276479Sdim
305234353Sdimvoid MultiplexConsumer::HandleCXXImplicitFunctionInstantiation(FunctionDecl *D){
306280031Sdim  for (auto &Consumer : Consumers)
307280031Sdim    Consumer->HandleCXXImplicitFunctionInstantiation(D);
308234353Sdim}
309234353Sdim
310234353Sdimvoid MultiplexConsumer::HandleTopLevelDeclInObjCContainer(DeclGroupRef D) {
311280031Sdim  for (auto &Consumer : Consumers)
312280031Sdim    Consumer->HandleTopLevelDeclInObjCContainer(D);
313234353Sdim}
314234353Sdim
315276479Sdimvoid MultiplexConsumer::HandleImplicitImportDecl(ImportDecl *D) {
316280031Sdim  for (auto &Consumer : Consumers)
317280031Sdim    Consumer->HandleImplicitImportDecl(D);
318276479Sdim}
319276479Sdim
320276479Sdimvoid MultiplexConsumer::HandleLinkerOptionPragma(llvm::StringRef Opts) {
321280031Sdim  for (auto &Consumer : Consumers)
322280031Sdim    Consumer->HandleLinkerOptionPragma(Opts);
323276479Sdim}
324276479Sdim
325276479Sdimvoid MultiplexConsumer::HandleDetectMismatch(llvm::StringRef Name, llvm::StringRef Value) {
326280031Sdim  for (auto &Consumer : Consumers)
327280031Sdim    Consumer->HandleDetectMismatch(Name, Value);
328276479Sdim}
329276479Sdim
330276479Sdimvoid MultiplexConsumer::HandleDependentLibrary(llvm::StringRef Lib) {
331280031Sdim  for (auto &Consumer : Consumers)
332280031Sdim    Consumer->HandleDependentLibrary(Lib);
333276479Sdim}
334276479Sdim
335218887Sdimvoid MultiplexConsumer::CompleteTentativeDefinition(VarDecl *D) {
336280031Sdim  for (auto &Consumer : Consumers)
337280031Sdim    Consumer->CompleteTentativeDefinition(D);
338218887Sdim}
339218887Sdim
340288943Sdimvoid MultiplexConsumer::HandleVTable(CXXRecordDecl *RD) {
341280031Sdim  for (auto &Consumer : Consumers)
342288943Sdim    Consumer->HandleVTable(RD);
343218887Sdim}
344218887Sdim
345218887SdimASTMutationListener *MultiplexConsumer::GetASTMutationListener() {
346218887Sdim  return MutationListener.get();
347218887Sdim}
348218887Sdim
349218887SdimASTDeserializationListener *MultiplexConsumer::GetASTDeserializationListener() {
350218887Sdim  return DeserializationListener.get();
351218887Sdim}
352218887Sdim
353218887Sdimvoid MultiplexConsumer::PrintStats() {
354280031Sdim  for (auto &Consumer : Consumers)
355280031Sdim    Consumer->PrintStats();
356218887Sdim}
357218887Sdim
358218887Sdimvoid MultiplexConsumer::InitializeSema(Sema &S) {
359280031Sdim  for (auto &Consumer : Consumers)
360280031Sdim    if (SemaConsumer *SC = dyn_cast<SemaConsumer>(Consumer.get()))
361218887Sdim      SC->InitializeSema(S);
362218887Sdim}
363218887Sdim
364218887Sdimvoid MultiplexConsumer::ForgetSema() {
365280031Sdim  for (auto &Consumer : Consumers)
366280031Sdim    if (SemaConsumer *SC = dyn_cast<SemaConsumer>(Consumer.get()))
367218887Sdim      SC->ForgetSema();
368218887Sdim}
369