Skip to content

Commit 4b6350e

Browse files
committed
[Typechecker] Add an hasObservers() convenience method and simplify some code
1 parent 00b7f80 commit 4b6350e

File tree

4 files changed

+25
-31
lines changed

4 files changed

+25
-31
lines changed

include/swift/AST/Decl.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4707,6 +4707,13 @@ class AbstractStorageDecl : public ValueDecl {
47074707
/// Does this storage require a 'modify' accessor in its opaque-accessors set?
47084708
bool requiresOpaqueModifyCoroutine() const;
47094709

4710+
/// Does this storage have any explicit observers (willSet or didSet) attached
4711+
/// to it?
4712+
bool hasObservers() const {
4713+
return getParsedAccessor(AccessorKind::WillSet) ||
4714+
getParsedAccessor(AccessorKind::DidSet);
4715+
}
4716+
47104717
SourceRange getBracesRange() const {
47114718
if (auto info = Accessors.getPointer())
47124719
return info->getBracesRange();

lib/Sema/TypeCheckDeclOverride.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1568,8 +1568,7 @@ static bool checkSingleOverride(ValueDecl *override, ValueDecl *base) {
15681568
// Make sure that the overriding property doesn't have storage.
15691569
if ((overrideASD->hasStorage() ||
15701570
overrideASD->getAttrs().hasAttribute<LazyAttr>()) &&
1571-
!(overrideASD->getParsedAccessor(AccessorKind::WillSet) ||
1572-
overrideASD->getParsedAccessor(AccessorKind::DidSet))) {
1571+
!overrideASD->hasObservers()) {
15731572
bool downgradeToWarning = false;
15741573
if (!ctx.isSwiftVersionAtLeast(5) &&
15751574
overrideASD->getAttrs().hasAttribute<LazyAttr>()) {

lib/Sema/TypeCheckStorage.cpp

Lines changed: 16 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -760,11 +760,6 @@ static Expr *buildStorageReference(AccessorDecl *accessor,
760760
auto var = dyn_cast<VarDecl>(decl);
761761
if (!var)
762762
return None;
763-
bool hasObservers = var->getParsedAccessor(AccessorKind::WillSet) ||
764-
var->getParsedAccessor(AccessorKind::DidSet);
765-
if (accessor->isCoroutine() && hasObservers) {
766-
return None;
767-
}
768763
auto mut = var->getPropertyWrapperMutability();
769764
if (!mut)
770765
return None;
@@ -1536,8 +1531,7 @@ synthesizeSetterBody(AccessorDecl *setter, ASTContext &ctx) {
15361531
}
15371532

15381533
if (var->hasAttachedPropertyWrapper()) {
1539-
if (var->getParsedAccessor(AccessorKind::WillSet) ||
1540-
var->getParsedAccessor(AccessorKind::DidSet)) {
1534+
if (var->hasObservers()) {
15411535
return synthesizeObservedSetterBody(setter, TargetImpl::Wrapper, ctx);
15421536
}
15431537

@@ -1589,20 +1583,19 @@ synthesizeCoroutineAccessorBody(AccessorDecl *accessor, ASTContext &ctx) {
15891583
? TargetImpl::Ordinary
15901584
: TargetImpl::Implementation);
15911585

1592-
bool hasObservers = storage->getParsedAccessor(AccessorKind::DidSet) ||
1593-
storage->getParsedAccessor(AccessorKind::WillSet);
1594-
15951586
// If this is a variable with an attached property wrapper, then
15961587
// the accessors need to yield the wrappedValue or projectedValue.
1597-
if (auto var = dyn_cast<VarDecl>(storage)) {
1598-
if (var->hasAttachedPropertyWrapper() && !hasObservers) {
1599-
target = TargetImpl::Wrapper;
1600-
}
1588+
if (storage->getReadImpl() == ReadImplKind::Read ||
1589+
storageReadWriteImpl == ReadWriteImplKind::Modify) {
1590+
if (auto var = dyn_cast<VarDecl>(storage)) {
1591+
if (var->hasAttachedPropertyWrapper()) {
1592+
target = TargetImpl::Wrapper;
1593+
}
16011594

1602-
if (var->getOriginalWrappedProperty(
1603-
PropertyWrapperSynthesizedPropertyKind::StorageWrapper) &&
1604-
!hasObservers) {
1605-
target = TargetImpl::WrapperStorage;
1595+
if (var->getOriginalWrappedProperty(
1596+
PropertyWrapperSynthesizedPropertyKind::StorageWrapper)) {
1597+
target = TargetImpl::WrapperStorage;
1598+
}
16061599
}
16071600
}
16081601

@@ -2052,8 +2045,7 @@ IsAccessorTransparentRequest::evaluate(Evaluator &evaluator,
20522045
// FIXME: This should be folded into the WriteImplKind below.
20532046
if (auto var = dyn_cast<VarDecl>(storage)) {
20542047
if (var->hasAttachedPropertyWrapper()) {
2055-
if (var->getParsedAccessor(AccessorKind::DidSet) ||
2056-
var->getParsedAccessor(AccessorKind::WillSet))
2048+
if (var->hasObservers())
20572049
return false;
20582050

20592051
break;
@@ -2590,16 +2582,13 @@ static void finishPropertyWrapperImplInfo(VarDecl *var,
25902582
}
25912583
}
25922584

2593-
bool hasObservers = var->getParsedAccessor(AccessorKind::DidSet) ||
2594-
var->getParsedAccessor(AccessorKind::WillSet);
2595-
25962585
if (wrapperSetterIsUsable) {
2597-
if (hasObservers) {
2586+
if (var->hasObservers()) {
25982587
info = StorageImplInfo::getMutableComputed();
2599-
} else {
2600-
info = StorageImplInfo(ReadImplKind::Get, WriteImplKind::Set,
2601-
ReadWriteImplKind::Modify);
2588+
return;
26022589
}
2590+
info = StorageImplInfo(ReadImplKind::Get, WriteImplKind::Set,
2591+
ReadWriteImplKind::Modify);
26032592
} else {
26042593
info = StorageImplInfo::getImmutableComputed();
26052594
}

tools/SourceKit/lib/SwiftLang/SwiftEditor.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1190,8 +1190,7 @@ static bool inferIsSettableSyntactically(const AbstractStorageDecl *D) {
11901190
}
11911191
if (D->hasParsedAccessors()) {
11921192
return D->getParsedAccessor(AccessorKind::Set) != nullptr ||
1193-
D->getParsedAccessor(AccessorKind::WillSet) != nullptr ||
1194-
D->getParsedAccessor(AccessorKind::DidSet) != nullptr;
1193+
D->hasObservers();
11951194
} else {
11961195
return true;
11971196
}

0 commit comments

Comments
 (0)