File indexing completed on 2026-05-10 08:36:55
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014 #ifndef LLVM_CLANG_FRONTEND_MULTIPLEXCONSUMER_H
0015 #define LLVM_CLANG_FRONTEND_MULTIPLEXCONSUMER_H
0016
0017 #include "clang/Basic/LLVM.h"
0018 #include "clang/Sema/SemaConsumer.h"
0019 #include "clang/Serialization/ASTDeserializationListener.h"
0020 #include <memory>
0021 #include <vector>
0022
0023 namespace clang {
0024
0025 class MultiplexASTMutationListener;
0026
0027
0028
0029 class MultiplexASTDeserializationListener : public ASTDeserializationListener {
0030 public:
0031
0032 MultiplexASTDeserializationListener(
0033 const std::vector<ASTDeserializationListener *> &L);
0034 void ReaderInitialized(ASTReader *Reader) override;
0035 void IdentifierRead(serialization::IdentifierID ID, IdentifierInfo *II) override;
0036 void MacroRead(serialization::MacroID ID, MacroInfo *MI) override;
0037 void TypeRead(serialization::TypeIdx Idx, QualType T) override;
0038 void DeclRead(GlobalDeclID ID, const Decl *D) override;
0039 void PredefinedDeclBuilt(PredefinedDeclIDs ID, const Decl *D) override;
0040 void SelectorRead(serialization::SelectorID iD, Selector Sel) override;
0041 void MacroDefinitionRead(serialization::PreprocessedEntityID,
0042 MacroDefinitionRecord *MD) override;
0043 void ModuleRead(serialization::SubmoduleID ID, Module *Mod) override;
0044 void ModuleImportRead(serialization::SubmoduleID ID,
0045 SourceLocation ImportLoc) override;
0046
0047 private:
0048 std::vector<ASTDeserializationListener *> Listeners;
0049 };
0050
0051
0052 class MultiplexConsumer : public SemaConsumer {
0053 public:
0054
0055 MultiplexConsumer(std::vector<std::unique_ptr<ASTConsumer>> C);
0056 MultiplexConsumer(std::unique_ptr<ASTConsumer> C);
0057 ~MultiplexConsumer() override;
0058
0059
0060 void Initialize(ASTContext &Context) override;
0061 void HandleCXXStaticMemberVarInstantiation(VarDecl *VD) override;
0062 bool HandleTopLevelDecl(DeclGroupRef D) override;
0063 void HandleInlineFunctionDefinition(FunctionDecl *D) override;
0064 void HandleInterestingDecl(DeclGroupRef D) override;
0065 void HandleTranslationUnit(ASTContext &Ctx) override;
0066 void HandleTagDeclDefinition(TagDecl *D) override;
0067 void HandleTagDeclRequiredDefinition(const TagDecl *D) override;
0068 void HandleCXXImplicitFunctionInstantiation(FunctionDecl *D) override;
0069 void HandleTopLevelDeclInObjCContainer(DeclGroupRef D) override;
0070 void HandleImplicitImportDecl(ImportDecl *D) override;
0071 void CompleteTentativeDefinition(VarDecl *D) override;
0072 void CompleteExternalDeclaration(DeclaratorDecl *D) override;
0073 void AssignInheritanceModel(CXXRecordDecl *RD) override;
0074 void HandleVTable(CXXRecordDecl *RD) override;
0075 ASTMutationListener *GetASTMutationListener() override;
0076 ASTDeserializationListener *GetASTDeserializationListener() override;
0077 void PrintStats() override;
0078 bool shouldSkipFunctionBody(Decl *D) override;
0079
0080
0081 void InitializeSema(Sema &S) override;
0082 void ForgetSema() override;
0083
0084 protected:
0085 std::vector<std::unique_ptr<ASTConsumer>> Consumers;
0086 std::unique_ptr<MultiplexASTMutationListener> MutationListener;
0087 std::unique_ptr<MultiplexASTDeserializationListener> DeserializationListener;
0088 };
0089
0090 }
0091
0092 #endif