Skip to content

Commit 84f8e41

Browse files
committed
[Typechecker] Add an hasObservers() convenience method and simplify some code
1 parent 82a163e commit 84f8e41

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
@@ -4806,6 +4806,13 @@ class AbstractStorageDecl : public ValueDecl {
48064806
/// Does this storage require a 'modify' accessor in its opaque-accessors set?
48074807
bool requiresOpaqueModifyCoroutine() const;
48084808

4809+
/// Does this storage have any explicit observers (willSet or didSet) attached
4810+
/// to it?
4811+
bool hasObservers() const {
4812+
return getParsedAccessor(AccessorKind::WillSet) ||
4813+
getParsedAccessor(AccessorKind::DidSet);
4814+
}
4815+
48094816
SourceRange getBracesRange() const {
48104817
if (auto info = Accessors.getPointer())
48114818
return info->getBracesRange();

lib/Sema/TypeCheckDeclOverride.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1691,8 +1691,7 @@ static bool checkSingleOverride(ValueDecl *override, ValueDecl *base) {
16911691
// Make sure that the overriding property doesn't have storage.
16921692
if ((overrideASD->hasStorage() ||
16931693
overrideASD->getAttrs().hasAttribute<LazyAttr>()) &&
1694-
!(overrideASD->getParsedAccessor(AccessorKind::WillSet) ||
1695-
overrideASD->getParsedAccessor(AccessorKind::DidSet))) {
1694+
!overrideASD->hasObservers()) {
16961695
bool downgradeToWarning = false;
16971696
if (!ctx.isSwiftVersionAtLeast(5) &&
16981697
overrideASD->getAttrs().hasAttribute<LazyAttr>()) {

lib/Sema/TypeCheckStorage.cpp

Lines changed: 16 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -769,11 +769,6 @@ static Expr *buildStorageReference(AccessorDecl *accessor,
769769
auto var = dyn_cast<VarDecl>(decl);
770770
if (!var)
771771
return None;
772-
bool hasObservers = var->getParsedAccessor(AccessorKind::WillSet) ||
773-
var->getParsedAccessor(AccessorKind::DidSet);
774-
if (accessor->isCoroutine() && hasObservers) {
775-
return None;
776-
}
777772
auto mut = var->getPropertyWrapperMutability();
778773
if (!mut)
779774
return None;
@@ -1561,8 +1556,7 @@ synthesizeSetterBody(AccessorDecl *setter, ASTContext &ctx) {
15611556
}
15621557

15631558
if (var->hasAttachedPropertyWrapper()) {
1564-
if (var->getParsedAccessor(AccessorKind::WillSet) ||
1565-
var->getParsedAccessor(AccessorKind::DidSet)) {
1559+
if (var->hasObservers()) {
15661560
return synthesizeObservedSetterBody(setter, TargetImpl::Wrapper, ctx);
15671561
}
15681562

@@ -1673,20 +1667,19 @@ synthesizeCoroutineAccessorBody(AccessorDecl *accessor, ASTContext &ctx) {
16731667
? TargetImpl::Ordinary
16741668
: TargetImpl::Implementation);
16751669

1676-
bool hasObservers = storage->getParsedAccessor(AccessorKind::DidSet) ||
1677-
storage->getParsedAccessor(AccessorKind::WillSet);
1678-
16791670
// If this is a variable with an attached property wrapper, then
16801671
// the accessors need to yield the wrappedValue or projectedValue.
1681-
if (auto var = dyn_cast<VarDecl>(storage)) {
1682-
if (var->hasAttachedPropertyWrapper() && !hasObservers) {
1683-
target = TargetImpl::Wrapper;
1684-
}
1672+
if (storage->getReadImpl() == ReadImplKind::Read ||
1673+
storageReadWriteImpl == ReadWriteImplKind::Modify) {
1674+
if (auto var = dyn_cast<VarDecl>(storage)) {
1675+
if (var->hasAttachedPropertyWrapper()) {
1676+
target = TargetImpl::Wrapper;
1677+
}
16851678

1686-
if (var->getOriginalWrappedProperty(
1687-
PropertyWrapperSynthesizedPropertyKind::StorageWrapper) &&
1688-
!hasObservers) {
1689-
target = TargetImpl::WrapperStorage;
1679+
if (var->getOriginalWrappedProperty(
1680+
PropertyWrapperSynthesizedPropertyKind::StorageWrapper)) {
1681+
target = TargetImpl::WrapperStorage;
1682+
}
16901683
}
16911684
}
16921685

@@ -2143,8 +2136,7 @@ IsAccessorTransparentRequest::evaluate(Evaluator &evaluator,
21432136
// FIXME: This should be folded into the WriteImplKind below.
21442137
if (auto var = dyn_cast<VarDecl>(storage)) {
21452138
if (var->hasAttachedPropertyWrapper()) {
2146-
if (var->getParsedAccessor(AccessorKind::DidSet) ||
2147-
var->getParsedAccessor(AccessorKind::WillSet))
2139+
if (var->hasObservers())
21482140
return false;
21492141

21502142
break;
@@ -2692,16 +2684,13 @@ static void finishPropertyWrapperImplInfo(VarDecl *var,
26922684
}
26932685
}
26942686

2695-
bool hasObservers = var->getParsedAccessor(AccessorKind::DidSet) ||
2696-
var->getParsedAccessor(AccessorKind::WillSet);
2697-
26982687
if (wrapperSetterIsUsable) {
2699-
if (hasObservers) {
2688+
if (var->hasObservers()) {
27002689
info = StorageImplInfo::getMutableComputed();
2701-
} else {
2702-
info = StorageImplInfo(ReadImplKind::Get, WriteImplKind::Set,
2703-
ReadWriteImplKind::Modify);
2690+
return;
27042691
}
2692+
info = StorageImplInfo(ReadImplKind::Get, WriteImplKind::Set,
2693+
ReadWriteImplKind::Modify);
27052694
} else {
27062695
info = StorageImplInfo::getImmutableComputed();
27072696
}

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)