1 //===-- MultiplexConsumer.h - AST Consumer for PCH Generation ---*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file declares the MultiplexConsumer class, which can be used to 11 // multiplex ASTConsumer and SemaConsumer messages to many consumers. 12 // 13 //===----------------------------------------------------------------------===// 14 15 #ifndef LLVM_CLANG_FRONTEND_MULTIPLEXCONSUMER_H 16 #define LLVM_CLANG_FRONTEND_MULTIPLEXCONSUMER_H 17 18 #include "clang/Basic/LLVM.h" 19 #include "clang/Sema/SemaConsumer.h" 20 #include "clang/Serialization/ASTDeserializationListener.h" 21 #include <memory> 22 #include <vector> 23 24 namespace clang { 25 26 class MultiplexASTMutationListener; 27 28 // This ASTDeserializationListener forwards its notifications to a set of 29 // child listeners. 30 class MultiplexASTDeserializationListener : public ASTDeserializationListener { 31 public: 32 // Does NOT take ownership of the elements in L. 33 MultiplexASTDeserializationListener( 34 const std::vector<ASTDeserializationListener *> &L); 35 void ReaderInitialized(ASTReader *Reader) override; 36 void IdentifierRead(serialization::IdentID ID, IdentifierInfo *II) override; 37 void MacroRead(serialization::MacroID ID, MacroInfo *MI) override; 38 void TypeRead(serialization::TypeIdx Idx, QualType T) override; 39 void DeclRead(serialization::DeclID ID, const Decl *D) override; 40 void SelectorRead(serialization::SelectorID iD, Selector Sel) override; 41 void MacroDefinitionRead(serialization::PreprocessedEntityID, 42 MacroDefinitionRecord *MD) override; 43 void ModuleRead(serialization::SubmoduleID ID, Module *Mod) override; 44 45 private: 46 std::vector<ASTDeserializationListener *> Listeners; 47 }; 48 49 // Has a list of ASTConsumers and calls each of them. Owns its children. 50 class MultiplexConsumer : public SemaConsumer { 51 public: 52 // Takes ownership of the pointers in C. 53 MultiplexConsumer(std::vector<std::unique_ptr<ASTConsumer>> C); 54 ~MultiplexConsumer() override; 55 56 // ASTConsumer 57 void Initialize(ASTContext &Context) override; 58 void HandleCXXStaticMemberVarInstantiation(VarDecl *VD) override; 59 bool HandleTopLevelDecl(DeclGroupRef D) override; 60 void HandleInlineFunctionDefinition(FunctionDecl *D) override; 61 void HandleInterestingDecl(DeclGroupRef D) override; 62 void HandleTranslationUnit(ASTContext &Ctx) override; 63 void HandleTagDeclDefinition(TagDecl *D) override; 64 void HandleTagDeclRequiredDefinition(const TagDecl *D) override; 65 void HandleCXXImplicitFunctionInstantiation(FunctionDecl *D) override; 66 void HandleTopLevelDeclInObjCContainer(DeclGroupRef D) override; 67 void HandleImplicitImportDecl(ImportDecl *D) override; 68 void CompleteTentativeDefinition(VarDecl *D) override; 69 void AssignInheritanceModel(CXXRecordDecl *RD) override; 70 void HandleVTable(CXXRecordDecl *RD) override; 71 ASTMutationListener *GetASTMutationListener() override; 72 ASTDeserializationListener *GetASTDeserializationListener() override; 73 void PrintStats() override; 74 bool shouldSkipFunctionBody(Decl *D) override; 75 76 // SemaConsumer 77 void InitializeSema(Sema &S) override; 78 void ForgetSema() override; 79 80 private: 81 std::vector<std::unique_ptr<ASTConsumer>> Consumers; // Owns these. 82 std::unique_ptr<MultiplexASTMutationListener> MutationListener; 83 std::unique_ptr<MultiplexASTDeserializationListener> DeserializationListener; 84 }; 85 86 } // end namespace clang 87 88 #endif 89