Skip to content

Commit b577838

Browse files
committed
[Serialization] Collapse prefix/postfix operator deserialization
...using a template.
1 parent ec95e68 commit b577838

File tree

1 file changed

+14
-28
lines changed

1 file changed

+14
-28
lines changed

lib/Serialization/Deserialization.cpp

Lines changed: 14 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -3165,14 +3165,15 @@ class swift::DeclDeserializer {
31653165
return proto;
31663166
}
31673167

3168-
Expected<Decl *> deserializePrefixOperator(ArrayRef<uint64_t> scratch,
3169-
StringRef blobData) {
3168+
template <typename OperatorLayout, typename OperatorDecl>
3169+
Expected<Decl *> deserializeUnaryOperator(ArrayRef<uint64_t> scratch,
3170+
StringRef blobData) {
31703171
IdentifierID nameID;
31713172
DeclContextID contextID;
31723173
ArrayRef<uint64_t> designatedNominalTypeDeclIDs;
31733174

3174-
decls_block::PrefixOperatorLayout::readRecord(scratch, nameID, contextID,
3175-
designatedNominalTypeDeclIDs);
3175+
OperatorLayout::readRecord(scratch, nameID, contextID,
3176+
designatedNominalTypeDeclIDs);
31763177
auto DC = MF.getDeclContext(contextID);
31773178

31783179
SmallVector<NominalTypeDecl *, 1> designatedNominalTypes;
@@ -3183,39 +3184,24 @@ class swift::DeclDeserializer {
31833184
designatedNominalTypes.push_back(cast<NominalTypeDecl>(nominal.get()));
31843185
}
31853186

3186-
auto result = MF.createDecl<PrefixOperatorDecl>(
3187+
auto result = MF.createDecl<OperatorDecl>(
31873188
DC, SourceLoc(), MF.getIdentifier(nameID), SourceLoc(),
31883189
ctx.AllocateCopy(designatedNominalTypes));
31893190

31903191
declOrOffset = result;
31913192
return result;
31923193
}
31933194

3195+
Expected<Decl *> deserializePrefixOperator(ArrayRef<uint64_t> scratch,
3196+
StringRef blobData) {
3197+
return deserializeUnaryOperator<decls_block::PrefixOperatorLayout,
3198+
PrefixOperatorDecl>(scratch, blobData);
3199+
}
3200+
31943201
Expected<Decl *> deserializePostfixOperator(ArrayRef<uint64_t> scratch,
31953202
StringRef blobData) {
3196-
IdentifierID nameID;
3197-
DeclContextID contextID;
3198-
ArrayRef<uint64_t> designatedNominalTypeDeclIDs;
3199-
3200-
decls_block::PostfixOperatorLayout::readRecord(
3201-
scratch, nameID, contextID, designatedNominalTypeDeclIDs);
3202-
3203-
auto DC = MF.getDeclContext(contextID);
3204-
3205-
SmallVector<NominalTypeDecl *, 1> designatedNominalTypes;
3206-
for (auto id : designatedNominalTypeDeclIDs) {
3207-
Expected<Decl *> nominal = MF.getDeclChecked(id);
3208-
if (!nominal)
3209-
return nominal.takeError();
3210-
designatedNominalTypes.push_back(cast<NominalTypeDecl>(nominal.get()));
3211-
}
3212-
3213-
auto result = MF.createDecl<PostfixOperatorDecl>(
3214-
DC, SourceLoc(), MF.getIdentifier(nameID), SourceLoc(),
3215-
ctx.AllocateCopy(designatedNominalTypes));
3216-
3217-
declOrOffset = result;
3218-
return result;
3203+
return deserializeUnaryOperator<decls_block::PostfixOperatorLayout,
3204+
PostfixOperatorDecl>(scratch, blobData);
32193205
}
32203206

32213207
Expected<Decl *> deserializeInfixOperator(ArrayRef<uint64_t> scratch,

0 commit comments

Comments
 (0)