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::IdentifierID 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(GlobalDeclID ID, const Decl *D) override; 39 void PredefinedDeclBuilt(PredefinedDeclIDs 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 void ModuleImportRead(serialization::SubmoduleID ID, 45 SourceLocation ImportLoc) override; 46 47 private: 48 std::vector<ASTDeserializationListener *> Listeners; 49 }; 50 51 // Has a list of ASTConsumers and calls each of them. Owns its children. 52 class MultiplexConsumer : public SemaConsumer { 53 public: 54 // Takes ownership of the pointers in C. 55 MultiplexConsumer(std::vector<std::unique_ptr<ASTConsumer>> C); 56 MultiplexConsumer(std::unique_ptr<ASTConsumer> C); 57 ~MultiplexConsumer() override; 58 59 // ASTConsumer 60 void Initialize(ASTContext &Context) override; 61 void HandleCXXStaticMemberVarInstantiation(VarDecl *VD) override; 62 bool HandleTopLevelDecl(DeclGroupRef D) override; 63 void HandleInlineFunctionDefinition(FunctionDecl *D) override; 64 void HandleInterestingDecl(DeclGroupRef D) override; 65 void HandleTranslationUnit(ASTContext &Ctx) override; 66 void HandleTagDeclDefinition(TagDecl *D) override; 67 void HandleTagDeclRequiredDefinition(const TagDecl *D) override; 68 void HandleCXXImplicitFunctionInstantiation(FunctionDecl *D) override; 69 void HandleTopLevelDeclInObjCContainer(DeclGroupRef D) override; 70 void HandleImplicitImportDecl(ImportDecl *D) override; 71 void CompleteTentativeDefinition(VarDecl *D) override; 72 void CompleteExternalDeclaration(DeclaratorDecl *D) override; 73 void AssignInheritanceModel(CXXRecordDecl *RD) override; 74 void HandleVTable(CXXRecordDecl *RD) override; 75 ASTMutationListener *GetASTMutationListener() override; 76 ASTDeserializationListener *GetASTDeserializationListener() override; 77 void PrintStats() override; 78 bool shouldSkipFunctionBody(Decl *D) override; 79 80 // SemaConsumer 81 void InitializeSema(Sema &S) override; 82 void ForgetSema() override; 83 84 protected: 85 std::vector<std::unique_ptr<ASTConsumer>> Consumers; // Owns these. 86 std::unique_ptr<MultiplexASTMutationListener> MutationListener; 87 std::unique_ptr<MultiplexASTDeserializationListener> DeserializationListener; 88 }; 89 90 } // end namespace clang 91 92 #endif 93