1 //===- ASTDeserializationListener.h - Decl/Type PCH Read Events -*- 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 defines the ASTDeserializationListener class, which is notified 10 // by the ASTReader whenever a type or declaration is deserialized. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #ifndef LLVM_CLANG_SERIALIZATION_ASTDESERIALIZATIONLISTENER_H 15 #define LLVM_CLANG_SERIALIZATION_ASTDESERIALIZATIONLISTENER_H 16 17 #include "clang/Basic/IdentifierTable.h" 18 #include "clang/Serialization/ASTBitCodes.h" 19 20 namespace clang { 21 22 class Decl; 23 class ASTReader; 24 class QualType; 25 class MacroDefinitionRecord; 26 class MacroInfo; 27 class Module; 28 class SourceLocation; 29 30 // IMPORTANT: when you add a new interface to this class, please update the 31 // DelegatingDeserializationListener below. 32 class ASTDeserializationListener { 33 public: 34 virtual ~ASTDeserializationListener(); 35 36 /// The ASTReader was initialized. ReaderInitialized(ASTReader * Reader)37 virtual void ReaderInitialized(ASTReader *Reader) { } 38 39 /// An identifier was deserialized from the AST file. IdentifierRead(serialization::IdentifierID ID,IdentifierInfo * II)40 virtual void IdentifierRead(serialization::IdentifierID ID, 41 IdentifierInfo *II) { } 42 /// A macro was read from the AST file. MacroRead(serialization::MacroID ID,MacroInfo * MI)43 virtual void MacroRead(serialization::MacroID ID, MacroInfo *MI) { } 44 /// A type was deserialized from the AST file. The ID here has the 45 /// qualifier bits already removed, and T is guaranteed to be locally 46 /// unqualified. TypeRead(serialization::TypeIdx Idx,QualType T)47 virtual void TypeRead(serialization::TypeIdx Idx, QualType T) { } 48 /// A decl was deserialized from the AST file. 49 // 50 // Note: Implementors should be cautious when introducing additional 51 // serialization (e.g., printing the qualified name of the declaration) within 52 // the callback. Doing so may lead to unintended and complex side effects, or 53 // even cause a crash. DeclRead(GlobalDeclID ID,const Decl * D)54 virtual void DeclRead(GlobalDeclID ID, const Decl *D) {} 55 /// A predefined decl was built during the serialization. PredefinedDeclBuilt(PredefinedDeclIDs ID,const Decl * D)56 virtual void PredefinedDeclBuilt(PredefinedDeclIDs ID, const Decl *D) {} 57 /// A selector was read from the AST file. SelectorRead(serialization::SelectorID iD,Selector Sel)58 virtual void SelectorRead(serialization::SelectorID iD, Selector Sel) {} 59 /// A macro definition was read from the AST file. MacroDefinitionRead(serialization::PreprocessedEntityID,MacroDefinitionRecord * MD)60 virtual void MacroDefinitionRead(serialization::PreprocessedEntityID, 61 MacroDefinitionRecord *MD) {} 62 /// A module definition was read from the AST file. ModuleRead(serialization::SubmoduleID ID,Module * Mod)63 virtual void ModuleRead(serialization::SubmoduleID ID, Module *Mod) {} 64 /// A module import was read from the AST file. ModuleImportRead(serialization::SubmoduleID ID,SourceLocation ImportLoc)65 virtual void ModuleImportRead(serialization::SubmoduleID ID, 66 SourceLocation ImportLoc) {} 67 }; 68 69 class DelegatingDeserializationListener : public ASTDeserializationListener { 70 ASTDeserializationListener *Previous; 71 bool DeletePrevious; 72 73 public: DelegatingDeserializationListener(ASTDeserializationListener * Previous,bool DeletePrevious)74 explicit DelegatingDeserializationListener( 75 ASTDeserializationListener *Previous, bool DeletePrevious) 76 : Previous(Previous), DeletePrevious(DeletePrevious) {} ~DelegatingDeserializationListener()77 ~DelegatingDeserializationListener() override { 78 if (DeletePrevious) 79 delete Previous; 80 } 81 82 DelegatingDeserializationListener(const DelegatingDeserializationListener &) = 83 delete; 84 DelegatingDeserializationListener & 85 operator=(const DelegatingDeserializationListener &) = delete; 86 ReaderInitialized(ASTReader * Reader)87 void ReaderInitialized(ASTReader *Reader) override { 88 if (Previous) 89 Previous->ReaderInitialized(Reader); 90 } IdentifierRead(serialization::IdentifierID ID,IdentifierInfo * II)91 void IdentifierRead(serialization::IdentifierID ID, 92 IdentifierInfo *II) override { 93 if (Previous) 94 Previous->IdentifierRead(ID, II); 95 } MacroRead(serialization::MacroID ID,MacroInfo * MI)96 void MacroRead(serialization::MacroID ID, MacroInfo *MI) override { 97 if (Previous) 98 Previous->MacroRead(ID, MI); 99 } TypeRead(serialization::TypeIdx Idx,QualType T)100 void TypeRead(serialization::TypeIdx Idx, QualType T) override { 101 if (Previous) 102 Previous->TypeRead(Idx, T); 103 } DeclRead(GlobalDeclID ID,const Decl * D)104 void DeclRead(GlobalDeclID ID, const Decl *D) override { 105 if (Previous) 106 Previous->DeclRead(ID, D); 107 } PredefinedDeclBuilt(PredefinedDeclIDs ID,const Decl * D)108 void PredefinedDeclBuilt(PredefinedDeclIDs ID, const Decl *D) override { 109 if (Previous) 110 Previous->PredefinedDeclBuilt(ID, D); 111 } SelectorRead(serialization::SelectorID ID,Selector Sel)112 void SelectorRead(serialization::SelectorID ID, Selector Sel) override { 113 if (Previous) 114 Previous->SelectorRead(ID, Sel); 115 } MacroDefinitionRead(serialization::PreprocessedEntityID PPID,MacroDefinitionRecord * MD)116 void MacroDefinitionRead(serialization::PreprocessedEntityID PPID, 117 MacroDefinitionRecord *MD) override { 118 if (Previous) 119 Previous->MacroDefinitionRead(PPID, MD); 120 } ModuleRead(serialization::SubmoduleID ID,Module * Mod)121 void ModuleRead(serialization::SubmoduleID ID, Module *Mod) override { 122 if (Previous) 123 Previous->ModuleRead(ID, Mod); 124 } ModuleImportRead(serialization::SubmoduleID ID,SourceLocation ImportLoc)125 void ModuleImportRead(serialization::SubmoduleID ID, 126 SourceLocation ImportLoc) override { 127 if (Previous) 128 Previous->ModuleImportRead(ID, ImportLoc); 129 } 130 }; 131 132 } // namespace clang 133 134 #endif 135