Skip to content

Commit 1e6c919

Browse files
committed
[AST] InitAccessors: init accessor properties without setters use special write strategy
Such properties could be mutated only within initializer context so they can employ a special "init accessor" strategy.
1 parent 511bd07 commit 1e6c919

File tree

1 file changed

+9
-2
lines changed

1 file changed

+9
-2
lines changed

lib/AST/Decl.cpp

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2395,10 +2395,15 @@ getDirectReadAccessStrategy(const AbstractStorageDecl *storage) {
23952395
static AccessStrategy
23962396
getDirectWriteAccessStrategy(const AbstractStorageDecl *storage) {
23972397
switch (storage->getWriteImpl()) {
2398-
case WriteImplKind::Immutable:
2398+
case WriteImplKind::Immutable: {
2399+
if (storage->hasInitAccessor())
2400+
return AccessStrategy::getAccessor(AccessorKind::Init,
2401+
/*dispatch=*/false);
2402+
23992403
assert(isa<VarDecl>(storage) && cast<VarDecl>(storage)->isLet() &&
24002404
"mutation of a immutable variable that isn't a let");
24012405
return AccessStrategy::getStorage();
2406+
}
24022407
case WriteImplKind::Stored:
24032408
return AccessStrategy::getStorage();
24042409
case WriteImplKind::StoredWithObservers:
@@ -2475,7 +2480,9 @@ getOpaqueReadAccessStrategy(const AbstractStorageDecl *storage, bool dispatch) {
24752480
}
24762481

24772482
static AccessStrategy
2478-
getOpaqueWriteAccessStrategy(const AbstractStorageDecl *storage, bool dispatch){
2483+
getOpaqueWriteAccessStrategy(const AbstractStorageDecl *storage, bool dispatch) {
2484+
if (storage->hasInitAccessor() && !storage->getAccessor(AccessorKind::Set))
2485+
return AccessStrategy::getAccessor(AccessorKind::Init, dispatch);
24792486
return AccessStrategy::getAccessor(AccessorKind::Set, dispatch);
24802487
}
24812488

0 commit comments

Comments
 (0)