Skip to content

Commit 1c16b09

Browse files
committed
[CoroutineAccessors] Separate requires predicates.
Whether read2/modify2 are required will not always be identical to whether read/modify are required. Add separate prediates for the former. For now, duplicate the latter's implementation.
1 parent 757d91b commit 1c16b09

File tree

2 files changed

+28
-2
lines changed

2 files changed

+28
-2
lines changed

include/swift/AST/Decl.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6032,13 +6032,20 @@ class AbstractStorageDecl : public ValueDecl {
60326032
/// Does this storage require a '_read' accessor in its opaque-accessors set?
60336033
bool requiresOpaqueReadCoroutine() const;
60346034

6035+
/// Does this storage require a 'read' accessor in its opaque-accessors set?
6036+
bool requiresOpaqueRead2Coroutine() const;
6037+
60356038
/// Does this storage require a 'set' accessor in its opaque-accessors set?
60366039
bool requiresOpaqueSetter() const { return supportsMutation(); }
60376040

60386041
/// Does this storage require a '_modify' accessor in its opaque-accessors
60396042
/// set?
60406043
bool requiresOpaqueModifyCoroutine() const;
60416044

6045+
/// Does this storage require a 'modify' accessor in its opaque-accessors
6046+
/// set?
6047+
bool requiresOpaqueModify2Coroutine() const;
6048+
60426049
/// Does this storage have any explicit observers (willSet or didSet) attached
60436050
/// to it?
60446051
bool hasObservers() const {

lib/AST/Decl.cpp

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2990,11 +2990,13 @@ bool AbstractStorageDecl::requiresOpaqueAccessor(AccessorKind kind) const {
29902990
case AccessorKind::Set:
29912991
return requiresOpaqueSetter();
29922992
case AccessorKind::Read:
2993-
case AccessorKind::Read2:
29942993
return requiresOpaqueReadCoroutine();
2994+
case AccessorKind::Read2:
2995+
return requiresOpaqueRead2Coroutine();
29952996
case AccessorKind::Modify:
2996-
case AccessorKind::Modify2:
29972997
return requiresOpaqueModifyCoroutine();
2998+
case AccessorKind::Modify2:
2999+
return requiresOpaqueModify2Coroutine();
29983000

29993001
// Other accessors are never part of the opaque-accessors set.
30003002
#define OPAQUE_ACCESSOR(ID, KEYWORD)
@@ -3010,13 +3012,30 @@ bool AbstractStorageDecl::requiresOpaqueReadCoroutine() const {
30103012
return getOpaqueReadOwnership() != OpaqueReadOwnership::Owned;
30113013
}
30123014

3015+
bool AbstractStorageDecl::requiresOpaqueRead2Coroutine() const {
3016+
ASTContext &ctx = getASTContext();
3017+
if (!ctx.LangOpts.hasFeature(Feature::CoroutineAccessors))
3018+
return false;
3019+
return getOpaqueReadOwnership() != OpaqueReadOwnership::Owned;
3020+
}
3021+
30133022
bool AbstractStorageDecl::requiresOpaqueModifyCoroutine() const {
30143023
ASTContext &ctx = getASTContext();
30153024
return evaluateOrDefault(ctx.evaluator,
30163025
RequiresOpaqueModifyCoroutineRequest{const_cast<AbstractStorageDecl *>(this)},
30173026
false);
30183027
}
30193028

3029+
bool AbstractStorageDecl::requiresOpaqueModify2Coroutine() const {
3030+
ASTContext &ctx = getASTContext();
3031+
if (!ctx.LangOpts.hasFeature(Feature::CoroutineAccessors))
3032+
return false;
3033+
return evaluateOrDefault(ctx.evaluator,
3034+
RequiresOpaqueModifyCoroutineRequest{
3035+
const_cast<AbstractStorageDecl *>(this)},
3036+
false);
3037+
}
3038+
30203039
AccessorDecl *AbstractStorageDecl::getSynthesizedAccessor(AccessorKind kind) const {
30213040
if (auto *accessor = getAccessor(kind))
30223041
return accessor;

0 commit comments

Comments
 (0)