Skip to content

Commit 6218673

Browse files
committed
[Property delegates] Use $$foo for the backing storage and make it private.
When the property delegate type overrides the delegate value by providing a delegateValue property, name the backing storage $$foo and make it private.
1 parent faa176f commit 6218673

File tree

2 files changed

+14
-4
lines changed

2 files changed

+14
-4
lines changed

lib/Sema/CodeSynthesis.cpp

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1535,7 +1535,7 @@ PropertyDelegateBackingPropertyInfoRequest::evaluate(Evaluator &evaluator,
15351535
ASTContext &ctx = var->getASTContext();
15361536
SmallString<64> nameBuf;
15371537
if (delegateInfo.delegateValueVar)
1538-
nameBuf = "$__delegate_storage_$_";
1538+
nameBuf = "$$";
15391539
else
15401540
nameBuf = "$";
15411541
nameBuf += var->getName().str();
@@ -1596,14 +1596,19 @@ PropertyDelegateBackingPropertyInfoRequest::evaluate(Evaluator &evaluator,
15961596
if (dc->getSelfClassDecl())
15971597
makeFinal(ctx, backingVar);
15981598

1599+
// When there is a `delegateValue`, lower the access of the
1600+
AccessLevel defaultAccess =
1601+
delegateInfo.delegateValueVar ? AccessLevel::Private
1602+
: AccessLevel::Internal;
1603+
15991604
// Determine the access level for the backing property.
16001605
AccessLevel access =
1601-
std::min(AccessLevel::Internal, var->getFormalAccess());
1606+
std::min(defaultAccess, var->getFormalAccess());
16021607
backingVar->overwriteAccess(access);
16031608

16041609
// Determine setter access.
16051610
AccessLevel setterAccess =
1606-
std::min(AccessLevel::Internal, var->getSetterFormalAccess());
1611+
std::min(defaultAccess, var->getSetterFormalAccess());
16071612
backingVar->overwriteSetterAccess(setterAccess);
16081613

16091614
// If there is a storage delegate property (delegateVar) in the delegate,

test/decl/var/property_delegates.swift

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -627,7 +627,11 @@ extension Wrapper {
627627
}
628628

629629
struct TestStorageRef {
630-
@WrapperWithStorageRef var x: Int
630+
@WrapperWithStorageRef var x: Int // expected-note{{'$$x' declared here}}
631+
632+
init(x: Int) {
633+
self.$$x = WrapperWithStorageRef(value: x)
634+
}
631635

632636
mutating func test() {
633637
let _: Wrapper = $x
@@ -642,6 +646,7 @@ struct TestStorageRef {
642646

643647
func testStorageRef(tsr: TestStorageRef) {
644648
let _: Wrapper = tsr.$x
649+
_ = tsr.$$x // expected-error{{'$$x' is inaccessible due to 'private' protection level}}
645650
}
646651

647652
// ---------------------------------------------------------------------------

0 commit comments

Comments
 (0)