1 //===-- MultiplexConsumer.h - AST Consumer for PCH Generation ---*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // This file declares the MultiplexConsumer class, which can be used to 10 // multiplex ASTConsumer and SemaConsumer messages to many consumers. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #ifndef LLVM_CLANG_FRONTEND_MULTIPLEXCONSUMER_H 15 #define LLVM_CLANG_FRONTEND_MULTIPLEXCONSUMER_H 16 17 #include "clang/Basic/LLVM.h" 18 #include "clang/Sema/SemaConsumer.h" 19 #include "clang/Serialization/ASTDeserializationListener.h" 20 #include <memory> 21 #include <vector> 22 23 namespace clang { 24 25 class MultiplexASTMutationListener; 26 27 // This ASTDeserializationListener forwards its notifications to a set of 28 // child listeners. 29 class MultiplexASTDeserializationListener : public ASTDeserializationListener { 30 public: 31 // Does NOT take ownership of the elements in L. 32 MultiplexASTDeserializationListener( 33 const std::vector<ASTDeserializationListener *> &L); 34 void ReaderInitialized(ASTReader *Reader) override; 35 void IdentifierRead(serialization::IdentID ID, IdentifierInfo *II) override; 36 void MacroRead(serialization::MacroID ID, MacroInfo *MI) override; 37 void TypeRead(serialization::TypeIdx Idx, QualType T) override; 38 void DeclRead(serialization::DeclID ID, const Decl *D) override; 39 void SelectorRead(serialization::SelectorID iD, Selector Sel) override; 40 void MacroDefinitionRead(serialization::PreprocessedEntityID, 41 MacroDefinitionRecord *MD) override; 42 void ModuleRead(serialization::SubmoduleID ID, Module *Mod) override; 43 44 private: 45 std::vector<ASTDeserializationListener *> Listeners; 46 }; 47 48 // Has a list of ASTConsumers and calls each of them. Owns its children. 49 class MultiplexConsumer : public SemaConsumer { 50 public: 51 // Takes ownership of the pointers in C. 52 MultiplexConsumer(std::vector<std::unique_ptr<ASTConsumer>> C); 53 ~MultiplexConsumer() override; 54 55 // ASTConsumer 56 void Initialize(ASTContext &Context) override; 57 void HandleCXXStaticMemberVarInstantiation(VarDecl *VD) override; 58 bool HandleTopLevelDecl(DeclGroupRef D) override; 59 void HandleInlineFunctionDefinition(FunctionDecl *D) override; 60 void HandleInterestingDecl(DeclGroupRef D) override; 61 void HandleTranslationUnit(ASTContext &Ctx) override; 62 void HandleTagDeclDefinition(TagDecl *D) override; 63 void HandleTagDeclRequiredDefinition(const TagDecl *D) override; 64 void HandleCXXImplicitFunctionInstantiation(FunctionDecl *D) override; 65 void HandleTopLevelDeclInObjCContainer(DeclGroupRef D) override; 66 void HandleImplicitImportDecl(ImportDecl *D) override; 67 void CompleteTentativeDefinition(VarDecl *D) override; 68 void CompleteExternalDeclaration(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