Skip to content

Commit b57f352

Browse files
committed
Serialize opaque return type of var/subscript decls.
1 parent 0fcc7cd commit b57f352

File tree

5 files changed

+33
-2
lines changed

5 files changed

+33
-2
lines changed

include/swift/Serialization/ModuleFormat.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1039,6 +1039,7 @@ namespace decls_block {
10391039
DeclIDField, // overridden decl
10401040
AccessLevelField, // access level
10411041
AccessLevelField, // setter access, if applicable
1042+
DeclIDField, // opaque return type decl
10421043
BCArray<TypeIDField> // accessors and dependencies
10431044
>;
10441045

@@ -1198,6 +1199,7 @@ namespace decls_block {
11981199
AccessLevelField, // setter access, if applicable
11991200
StaticSpellingKindField, // is subscript static?
12001201
BCVBR<5>, // number of parameter name components
1202+
DeclIDField, // opaque return type decl
12011203
BCArray<IdentifierIDField> // name components,
12021204
// followed by DeclID accessors,
12031205
// followed by TypeID dependencies

lib/Serialization/Deserialization.cpp

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2620,7 +2620,7 @@ class swift::DeclDeserializer {
26202620
uint8_t rawAccessLevel, rawSetterAccessLevel;
26212621
TypeID interfaceTypeID;
26222622
ModuleFile::AccessorRecord accessors;
2623-
DeclID overriddenID;
2623+
DeclID overriddenID, opaqueReturnTypeID;
26242624
ArrayRef<uint64_t> accessorAndDependencyIDs;
26252625

26262626
decls_block::VarLayout::readRecord(scratch, nameID, contextID,
@@ -2633,6 +2633,7 @@ class swift::DeclDeserializer {
26332633
interfaceTypeID,
26342634
overriddenID,
26352635
rawAccessLevel, rawSetterAccessLevel,
2636+
opaqueReturnTypeID,
26362637
accessorAndDependencyIDs);
26372638

26382639
Identifier name = MF.getIdentifier(nameID);
@@ -2733,6 +2734,11 @@ class swift::DeclDeserializer {
27332734
if (var->hasStorage())
27342735
AddAttribute(new (ctx) HasStorageAttr(/*isImplicit:*/true));
27352736

2737+
if (opaqueReturnTypeID) {
2738+
var->setOpaqueResultTypeDecl(
2739+
cast<OpaqueTypeDecl>(MF.getDecl(opaqueReturnTypeID)));
2740+
}
2741+
27362742
return var;
27372743
}
27382744

@@ -3543,7 +3549,7 @@ class swift::DeclDeserializer {
35433549
GenericEnvironmentID genericEnvID;
35443550
TypeID elemInterfaceTypeID;
35453551
ModuleFile::AccessorRecord accessors;
3546-
DeclID overriddenID;
3552+
DeclID overriddenID, opaqueReturnTypeID;
35473553
uint8_t rawAccessLevel, rawSetterAccessLevel, rawStaticSpelling;
35483554
uint8_t opaqueReadOwnership, readImpl, writeImpl, readWriteImpl;
35493555
unsigned numArgNames, numAccessors;
@@ -3560,6 +3566,7 @@ class swift::DeclDeserializer {
35603566
overriddenID, rawAccessLevel,
35613567
rawSetterAccessLevel,
35623568
rawStaticSpelling, numArgNames,
3569+
opaqueReturnTypeID,
35633570
argNameAndDependencyIDs);
35643571
// Resolve the name ids.
35653572
SmallVector<Identifier, 2> argNames;
@@ -3644,6 +3651,12 @@ class swift::DeclDeserializer {
36443651
subscript->setOverriddenDecl(cast_or_null<SubscriptDecl>(overridden.get()));
36453652
if (subscript->getOverriddenDecl())
36463653
AddAttribute(new (ctx) OverrideAttr(SourceLoc()));
3654+
3655+
if (opaqueReturnTypeID) {
3656+
subscript->setOpaqueResultTypeDecl(
3657+
cast<OpaqueTypeDecl>(MF.getDecl(opaqueReturnTypeID)));
3658+
}
3659+
36473660
return subscript;
36483661
}
36493662

lib/Serialization/Serialization.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3284,6 +3284,7 @@ void Serializer::writeDecl(const Decl *D) {
32843284
addTypeRef(ty),
32853285
addDeclRef(var->getOverriddenDecl()),
32863286
rawAccessLevel, rawSetterAccessLevel,
3287+
addDeclRef(var->getOpaqueResultTypeDecl()),
32873288
accessorsAndDependencies);
32883289
break;
32893290
}
@@ -3548,6 +3549,7 @@ void Serializer::writeDecl(const Decl *D) {
35483549
rawStaticSpelling,
35493550
subscript->
35503551
getFullName().getArgumentNames().size(),
3552+
addDeclRef(subscript->getOpaqueResultTypeDecl()),
35513553
nameComponentsAndDependencies);
35523554

35533555
writeGenericParams(subscript->getGenericParams());

test/Serialization/Inputs/OpaqueCrossFileB.swift

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,15 @@ public struct FooImpl: Foo {
77
public func anyFoo() -> some Foo {
88
return FooImpl()
99
}
10+
11+
public var anyFooProp: some Foo {
12+
return FooImpl()
13+
}
14+
15+
public struct Subscript {
16+
public init() {}
17+
18+
public subscript() -> some Foo {
19+
return FooImpl()
20+
}
21+
}

test/Serialization/opaque_cross_file.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,6 @@
55
import OpaqueCrossFileB
66

77
dump(anyFoo())
8+
dump(anyFooProp)
9+
dump(Subscript()[])
810

0 commit comments

Comments
 (0)