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