Clang Project

clang_source_code/include/clang/Frontend/MultiplexConsumer.h
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
23namespace clang {
24
25class MultiplexASTMutationListener;
26
27// This ASTDeserializationListener forwards its notifications to a set of
28// child listeners.
29class MultiplexASTDeserializationListener : public ASTDeserializationListener {
30public:
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 IDIdentifierInfo *II) override;
36  void MacroRead(serialization::MacroID IDMacroInfo *MI) override;
37  void TypeRead(serialization::TypeIdx IdxQualType T) override;
38  void DeclRead(serialization::DeclID IDconst Decl *D) override;
39  void SelectorRead(serialization::SelectorID iDSelector Sel) override;
40  void MacroDefinitionRead(serialization::PreprocessedEntityID,
41                           MacroDefinitionRecord *MD) override;
42  void ModuleRead(serialization::SubmoduleID IDModule *Mod) override;
43
44private:
45  std::vector<ASTDeserializationListener *> Listeners;
46};
47
48// Has a list of ASTConsumers and calls each of them. Owns its children.
49class MultiplexConsumer : public SemaConsumer {
50public:
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 AssignInheritanceModel(CXXRecordDecl *RD) override;
69  void HandleVTable(CXXRecordDecl *RD) override;
70  ASTMutationListener *GetASTMutationListener() override;
71  ASTDeserializationListener *GetASTDeserializationListener() override;
72  void PrintStats() override;
73  bool shouldSkipFunctionBody(Decl *D) override;
74
75  // SemaConsumer
76  void InitializeSema(Sema &S) override;
77  void ForgetSema() override;
78
79private:
80  std::vector<std::unique_ptr<ASTConsumer>> Consumers// Owns these.
81  std::unique_ptr<MultiplexASTMutationListenerMutationListener;
82  std::unique_ptr<MultiplexASTDeserializationListenerDeserializationListener;
83};
84
85}  // end namespace clang
86
87#endif
88
clang::MultiplexASTDeserializationListener::ReaderInitialized
clang::MultiplexASTDeserializationListener::IdentifierRead
clang::MultiplexASTDeserializationListener::MacroRead
clang::MultiplexASTDeserializationListener::TypeRead
clang::MultiplexASTDeserializationListener::DeclRead
clang::MultiplexASTDeserializationListener::SelectorRead
clang::MultiplexASTDeserializationListener::MacroDefinitionRead
clang::MultiplexASTDeserializationListener::ModuleRead
clang::MultiplexASTDeserializationListener::Listeners
clang::MultiplexConsumer::Initialize
clang::MultiplexConsumer::HandleCXXStaticMemberVarInstantiation
clang::MultiplexConsumer::HandleTopLevelDecl
clang::MultiplexConsumer::HandleInlineFunctionDefinition
clang::MultiplexConsumer::HandleInterestingDecl
clang::MultiplexConsumer::HandleTranslationUnit
clang::MultiplexConsumer::HandleTagDeclDefinition
clang::MultiplexConsumer::HandleTagDeclRequiredDefinition
clang::MultiplexConsumer::HandleCXXImplicitFunctionInstantiation
clang::MultiplexConsumer::HandleTopLevelDeclInObjCContainer
clang::MultiplexConsumer::HandleImplicitImportDecl
clang::MultiplexConsumer::CompleteTentativeDefinition
clang::MultiplexConsumer::AssignInheritanceModel
clang::MultiplexConsumer::HandleVTable
clang::MultiplexConsumer::GetASTMutationListener
clang::MultiplexConsumer::GetASTDeserializationListener
clang::MultiplexConsumer::PrintStats
clang::MultiplexConsumer::shouldSkipFunctionBody
clang::MultiplexConsumer::InitializeSema
clang::MultiplexConsumer::ForgetSema
clang::MultiplexConsumer::Consumers
clang::MultiplexConsumer::MutationListener
clang::MultiplexConsumer::DeserializationListener