Skip to content

Commit 6403923

Browse files
hokeingithub-actions[bot]
authored andcommitted
Automerge: [clang] Implement some missing interfaces for DelegatingDeserializationListener (#133424)
Split from the llvm/llvm-project#133395 per the review comment. This patch also moves the `DelegatingDeserializationListener` close to `ASTDeserializationListener`.
2 parents 699a54a + db04c3e commit 6403923

File tree

2 files changed

+72
-47
lines changed

2 files changed

+72
-47
lines changed

clang/include/clang/Serialization/ASTDeserializationListener.h

+72-1
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ class MacroInfo;
2727
class Module;
2828
class SourceLocation;
2929

30+
// IMPORTANT: when you add a new interface to this class, please update the
31+
// DelegatingDeserializationListener below.
3032
class ASTDeserializationListener {
3133
public:
3234
virtual ~ASTDeserializationListener();
@@ -44,6 +46,11 @@ class ASTDeserializationListener {
4446
/// unqualified.
4547
virtual void TypeRead(serialization::TypeIdx Idx, QualType T) { }
4648
/// 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.
4754
virtual void DeclRead(GlobalDeclID ID, const Decl *D) {}
4855
/// A predefined decl was built during the serialization.
4956
virtual void PredefinedDeclBuilt(PredefinedDeclIDs ID, const Decl *D) {}
@@ -58,6 +65,70 @@ class ASTDeserializationListener {
5865
virtual void ModuleImportRead(serialization::SubmoduleID ID,
5966
SourceLocation ImportLoc) {}
6067
};
61-
}
68+
69+
class DelegatingDeserializationListener : public ASTDeserializationListener {
70+
ASTDeserializationListener *Previous;
71+
bool DeletePrevious;
72+
73+
public:
74+
explicit DelegatingDeserializationListener(
75+
ASTDeserializationListener *Previous, bool DeletePrevious)
76+
: Previous(Previous), DeletePrevious(DeletePrevious) {}
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+
87+
void ReaderInitialized(ASTReader *Reader) override {
88+
if (Previous)
89+
Previous->ReaderInitialized(Reader);
90+
}
91+
void IdentifierRead(serialization::IdentifierID ID,
92+
IdentifierInfo *II) override {
93+
if (Previous)
94+
Previous->IdentifierRead(ID, II);
95+
}
96+
void MacroRead(serialization::MacroID ID, MacroInfo *MI) override {
97+
if (Previous)
98+
Previous->MacroRead(ID, MI);
99+
}
100+
void TypeRead(serialization::TypeIdx Idx, QualType T) override {
101+
if (Previous)
102+
Previous->TypeRead(Idx, T);
103+
}
104+
void DeclRead(GlobalDeclID ID, const Decl *D) override {
105+
if (Previous)
106+
Previous->DeclRead(ID, D);
107+
}
108+
void PredefinedDeclBuilt(PredefinedDeclIDs ID, const Decl *D) override {
109+
if (Previous)
110+
Previous->PredefinedDeclBuilt(ID, D);
111+
}
112+
void SelectorRead(serialization::SelectorID ID, Selector Sel) override {
113+
if (Previous)
114+
Previous->SelectorRead(ID, Sel);
115+
}
116+
void MacroDefinitionRead(serialization::PreprocessedEntityID PPID,
117+
MacroDefinitionRecord *MD) override {
118+
if (Previous)
119+
Previous->MacroDefinitionRead(PPID, MD);
120+
}
121+
void ModuleRead(serialization::SubmoduleID ID, Module *Mod) override {
122+
if (Previous)
123+
Previous->ModuleRead(ID, Mod);
124+
}
125+
void ModuleImportRead(serialization::SubmoduleID ID,
126+
SourceLocation ImportLoc) override {
127+
if (Previous)
128+
Previous->ModuleImportRead(ID, ImportLoc);
129+
}
130+
};
131+
132+
} // namespace clang
62133

63134
#endif

clang/lib/Frontend/FrontendAction.cpp

-46
Original file line numberDiff line numberDiff line change
@@ -49,52 +49,6 @@ LLVM_INSTANTIATE_REGISTRY(FrontendPluginRegistry)
4949

5050
namespace {
5151

52-
class DelegatingDeserializationListener : public ASTDeserializationListener {
53-
ASTDeserializationListener *Previous;
54-
bool DeletePrevious;
55-
56-
public:
57-
explicit DelegatingDeserializationListener(
58-
ASTDeserializationListener *Previous, bool DeletePrevious)
59-
: Previous(Previous), DeletePrevious(DeletePrevious) {}
60-
~DelegatingDeserializationListener() override {
61-
if (DeletePrevious)
62-
delete Previous;
63-
}
64-
65-
DelegatingDeserializationListener(const DelegatingDeserializationListener &) =
66-
delete;
67-
DelegatingDeserializationListener &
68-
operator=(const DelegatingDeserializationListener &) = delete;
69-
70-
void ReaderInitialized(ASTReader *Reader) override {
71-
if (Previous)
72-
Previous->ReaderInitialized(Reader);
73-
}
74-
void IdentifierRead(serialization::IdentifierID ID,
75-
IdentifierInfo *II) override {
76-
if (Previous)
77-
Previous->IdentifierRead(ID, II);
78-
}
79-
void TypeRead(serialization::TypeIdx Idx, QualType T) override {
80-
if (Previous)
81-
Previous->TypeRead(Idx, T);
82-
}
83-
void DeclRead(GlobalDeclID ID, const Decl *D) override {
84-
if (Previous)
85-
Previous->DeclRead(ID, D);
86-
}
87-
void SelectorRead(serialization::SelectorID ID, Selector Sel) override {
88-
if (Previous)
89-
Previous->SelectorRead(ID, Sel);
90-
}
91-
void MacroDefinitionRead(serialization::PreprocessedEntityID PPID,
92-
MacroDefinitionRecord *MD) override {
93-
if (Previous)
94-
Previous->MacroDefinitionRead(PPID, MD);
95-
}
96-
};
97-
9852
/// Dumps deserialized declarations.
9953
class DeserializedDeclsDumper : public DelegatingDeserializationListener {
10054
public:

0 commit comments

Comments
 (0)