15aa74affa5d61d04c4b034b3722ca41aec0cba6eNico Weber//===-- MultiplexConsumer.h - AST Consumer for PCH Generation ---*- C++ -*-===//
25aa74affa5d61d04c4b034b3722ca41aec0cba6eNico Weber//
35aa74affa5d61d04c4b034b3722ca41aec0cba6eNico Weber//                     The LLVM Compiler Infrastructure
45aa74affa5d61d04c4b034b3722ca41aec0cba6eNico Weber//
55aa74affa5d61d04c4b034b3722ca41aec0cba6eNico Weber// This file is distributed under the University of Illinois Open Source
65aa74affa5d61d04c4b034b3722ca41aec0cba6eNico Weber// License. See LICENSE.TXT for details.
75aa74affa5d61d04c4b034b3722ca41aec0cba6eNico Weber//
85aa74affa5d61d04c4b034b3722ca41aec0cba6eNico Weber//===----------------------------------------------------------------------===//
95aa74affa5d61d04c4b034b3722ca41aec0cba6eNico Weber//
105aa74affa5d61d04c4b034b3722ca41aec0cba6eNico Weber//  This file declares the MultiplexConsumer class, which can be used to
115aa74affa5d61d04c4b034b3722ca41aec0cba6eNico Weber//  multiplex ASTConsumer and SemaConsumer messages to many consumers.
125aa74affa5d61d04c4b034b3722ca41aec0cba6eNico Weber//
135aa74affa5d61d04c4b034b3722ca41aec0cba6eNico Weber//===----------------------------------------------------------------------===//
145aa74affa5d61d04c4b034b3722ca41aec0cba6eNico Weber
159856c993d5bbe966290ef36de8dc5428a0097710Sebastian Redl#ifndef CLANG_FRONTEND_MULTIPLEXCONSUMER_H
169856c993d5bbe966290ef36de8dc5428a0097710Sebastian Redl#define CLANG_FRONTEND_MULTIPLEXCONSUMER_H
179856c993d5bbe966290ef36de8dc5428a0097710Sebastian Redl
189ec9ce17652819f6d291606fcf295abde2725894Argyrios Kyrtzidis#include "clang/Basic/LLVM.h"
1930a2e16f6c27f888dd11eba6bbbae1e980078fcbChandler Carruth#include "clang/Sema/SemaConsumer.h"
20651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include <memory>
215aa74affa5d61d04c4b034b3722ca41aec0cba6eNico Weber#include <vector>
225aa74affa5d61d04c4b034b3722ca41aec0cba6eNico Weber
235aa74affa5d61d04c4b034b3722ca41aec0cba6eNico Webernamespace clang {
245aa74affa5d61d04c4b034b3722ca41aec0cba6eNico Weber
255aa74affa5d61d04c4b034b3722ca41aec0cba6eNico Weberclass MultiplexASTMutationListener;
265aa74affa5d61d04c4b034b3722ca41aec0cba6eNico Weberclass MultiplexASTDeserializationListener;
275aa74affa5d61d04c4b034b3722ca41aec0cba6eNico Weber
285aa74affa5d61d04c4b034b3722ca41aec0cba6eNico Weber// Has a list of ASTConsumers and calls each of them. Owns its children.
295aa74affa5d61d04c4b034b3722ca41aec0cba6eNico Weberclass MultiplexConsumer : public SemaConsumer {
305aa74affa5d61d04c4b034b3722ca41aec0cba6eNico Weberpublic:
315aa74affa5d61d04c4b034b3722ca41aec0cba6eNico Weber  // Takes ownership of the pointers in C.
329ec9ce17652819f6d291606fcf295abde2725894Argyrios Kyrtzidis  MultiplexConsumer(ArrayRef<ASTConsumer*> C);
335aa74affa5d61d04c4b034b3722ca41aec0cba6eNico Weber  ~MultiplexConsumer();
345aa74affa5d61d04c4b034b3722ca41aec0cba6eNico Weber
355aa74affa5d61d04c4b034b3722ca41aec0cba6eNico Weber  // ASTConsumer
36651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void Initialize(ASTContext &Context) override;
37651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void HandleCXXStaticMemberVarInstantiation(VarDecl *VD) override;
38651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  bool HandleTopLevelDecl(DeclGroupRef D) override;
396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  void HandleInlineMethodDefinition(CXXMethodDecl *D) override;
40651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void HandleInterestingDecl(DeclGroupRef D) override;
41651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void HandleTranslationUnit(ASTContext &Ctx) override;
42651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void HandleTagDeclDefinition(TagDecl *D) override;
43651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void HandleCXXImplicitFunctionInstantiation(FunctionDecl *D) override;
44651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void HandleTopLevelDeclInObjCContainer(DeclGroupRef D) override;
45651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void CompleteTentativeDefinition(VarDecl *D) override;
46651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void HandleVTable(CXXRecordDecl *RD, bool DefinitionRequired) override;
47651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ASTMutationListener *GetASTMutationListener() override;
48651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ASTDeserializationListener *GetASTDeserializationListener() override;
49651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void PrintStats() override;
505aa74affa5d61d04c4b034b3722ca41aec0cba6eNico Weber
515aa74affa5d61d04c4b034b3722ca41aec0cba6eNico Weber  // SemaConsumer
52651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void InitializeSema(Sema &S) override;
53651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void ForgetSema() override;
545aa74affa5d61d04c4b034b3722ca41aec0cba6eNico Weber
555aa74affa5d61d04c4b034b3722ca41aec0cba6eNico Weberprivate:
565aa74affa5d61d04c4b034b3722ca41aec0cba6eNico Weber  std::vector<ASTConsumer*> Consumers;  // Owns these.
57651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  std::unique_ptr<MultiplexASTMutationListener> MutationListener;
58651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  std::unique_ptr<MultiplexASTDeserializationListener> DeserializationListener;
595aa74affa5d61d04c4b034b3722ca41aec0cba6eNico Weber};
605aa74affa5d61d04c4b034b3722ca41aec0cba6eNico Weber
615aa74affa5d61d04c4b034b3722ca41aec0cba6eNico Weber}  // end namespace clang
629856c993d5bbe966290ef36de8dc5428a0097710Sebastian Redl
639856c993d5bbe966290ef36de8dc5428a0097710Sebastian Redl#endif
64