mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
Merge pull request #84180 from meg-gupta/borrowandmutatepr
Add preliminary support for borrow accessors
This commit is contained in:
@@ -291,6 +291,12 @@ DescriptiveDeclKind Decl::getDescriptiveKind() const {
|
||||
|
||||
case AccessorKind::Init:
|
||||
return DescriptiveDeclKind::InitAccessor;
|
||||
|
||||
case AccessorKind::Borrow:
|
||||
return DescriptiveDeclKind::BorrowAccessor;
|
||||
|
||||
case AccessorKind::Mutate:
|
||||
return DescriptiveDeclKind::MutateAccessor;
|
||||
}
|
||||
llvm_unreachable("bad accessor kind");
|
||||
}
|
||||
@@ -402,6 +408,8 @@ StringRef Decl::getDescriptiveKindName(DescriptiveDeclKind K) {
|
||||
ENTRY(Macro, "macro");
|
||||
ENTRY(MacroExpansion, "pound literal");
|
||||
ENTRY(Using, "using");
|
||||
ENTRY(BorrowAccessor, "borrow accessor");
|
||||
ENTRY(MutateAccessor, "Mutate accessor");
|
||||
}
|
||||
#undef ENTRY
|
||||
llvm_unreachable("bad DescriptiveDeclKind");
|
||||
@@ -3079,6 +3087,9 @@ getDirectReadAccessStrategy(const AbstractStorageDecl *storage) {
|
||||
case ReadImplKind::Read2:
|
||||
return AccessStrategy::getAccessor(AccessorKind::Read2,
|
||||
/*dispatch*/ false);
|
||||
case ReadImplKind::Borrow:
|
||||
return AccessStrategy::getAccessor(AccessorKind::Borrow,
|
||||
/*dispatch*/ false);
|
||||
}
|
||||
llvm_unreachable("bad impl kind");
|
||||
}
|
||||
@@ -3117,6 +3128,9 @@ getDirectWriteAccessStrategy(const AbstractStorageDecl *storage) {
|
||||
case WriteImplKind::Modify2:
|
||||
return AccessStrategy::getAccessor(AccessorKind::Modify2,
|
||||
/*dispatch*/ false);
|
||||
case WriteImplKind::Mutate:
|
||||
return AccessStrategy::getAccessor(AccessorKind::Mutate,
|
||||
/*dispatch*/ false);
|
||||
}
|
||||
llvm_unreachable("bad impl kind");
|
||||
}
|
||||
@@ -3175,6 +3189,9 @@ getDirectReadWriteAccessStrategy(const AbstractStorageDecl *storage) {
|
||||
return AccessStrategy::getMaterializeToTemporary(
|
||||
getDirectReadAccessStrategy(storage),
|
||||
getDirectWriteAccessStrategy(storage));
|
||||
case ReadWriteImplKind::Mutate:
|
||||
return AccessStrategy::getAccessor(AccessorKind::Mutate,
|
||||
/*dispatch*/ false);
|
||||
}
|
||||
llvm_unreachable("bad impl kind");
|
||||
}
|
||||
@@ -3404,11 +3421,28 @@ bool AbstractStorageDecl::requiresOpaqueAccessor(AccessorKind kind) const {
|
||||
llvm_unreachable("bad accessor kind");
|
||||
}
|
||||
|
||||
bool AbstractStorageDecl::requiresOpaqueSetter() const {
|
||||
if (!supportsMutation()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// If a mutate accessor is present, we don't need a setter.
|
||||
if (getAccessor(AccessorKind::Mutate)) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool AbstractStorageDecl::requiresOpaqueReadCoroutine() const {
|
||||
ASTContext &ctx = getASTContext();
|
||||
if (ctx.LangOpts.hasFeature(Feature::CoroutineAccessors))
|
||||
return requiresCorrespondingUnderscoredCoroutineAccessor(
|
||||
AccessorKind::Read2);
|
||||
|
||||
// If a borrow accessor is present, we don't need a read coroutine.
|
||||
if (getAccessor(AccessorKind::Borrow)) {
|
||||
return false;
|
||||
}
|
||||
return getOpaqueReadOwnership() != OpaqueReadOwnership::Owned;
|
||||
}
|
||||
|
||||
@@ -3416,6 +3450,11 @@ bool AbstractStorageDecl::requiresOpaqueRead2Coroutine() const {
|
||||
ASTContext &ctx = getASTContext();
|
||||
if (!ctx.LangOpts.hasFeature(Feature::CoroutineAccessors))
|
||||
return false;
|
||||
|
||||
// If a borrow accessor is present, we don't need a read coroutine.
|
||||
if (getAccessor(AccessorKind::Borrow)) {
|
||||
return false;
|
||||
}
|
||||
return getOpaqueReadOwnership() != OpaqueReadOwnership::Owned;
|
||||
}
|
||||
|
||||
@@ -7554,6 +7593,10 @@ StringRef swift::getAccessorNameForDiagnostic(AccessorKind accessorKind,
|
||||
return "'didSet'";
|
||||
case AccessorKind::Init:
|
||||
return article ? "an init accessor" : "init accessor";
|
||||
case AccessorKind::Borrow:
|
||||
return article ? " a 'borrow' accessor" : "borrow accessor";
|
||||
case AccessorKind::Mutate:
|
||||
return article ? "a 'mutate' accessor" : "mutate accessor";
|
||||
}
|
||||
llvm_unreachable("bad accessor kind");
|
||||
}
|
||||
@@ -9846,6 +9889,8 @@ DeclName AbstractFunctionDecl::getEffectiveFullName() const {
|
||||
case AccessorKind::Read2:
|
||||
case AccessorKind::Modify:
|
||||
case AccessorKind::Modify2:
|
||||
case AccessorKind::Borrow:
|
||||
case AccessorKind::Mutate:
|
||||
return subscript ? subscript->getName()
|
||||
: DeclName(ctx, storage->getBaseName(),
|
||||
ArrayRef<Identifier>());
|
||||
@@ -11206,6 +11251,8 @@ StringRef AccessorDecl::implicitParameterNameFor(AccessorKind kind) {
|
||||
case AccessorKind::Modify2:
|
||||
case AccessorKind::Address:
|
||||
case AccessorKind::MutableAddress:
|
||||
case AccessorKind::Borrow:
|
||||
case AccessorKind::Mutate:
|
||||
return StringRef();
|
||||
}
|
||||
}
|
||||
@@ -11217,6 +11264,7 @@ bool AccessorDecl::isAssumedNonMutating() const {
|
||||
case AccessorKind::Address:
|
||||
case AccessorKind::Read:
|
||||
case AccessorKind::Read2:
|
||||
case AccessorKind::Borrow:
|
||||
return true;
|
||||
|
||||
case AccessorKind::Set:
|
||||
@@ -11226,6 +11274,7 @@ bool AccessorDecl::isAssumedNonMutating() const {
|
||||
case AccessorKind::Modify:
|
||||
case AccessorKind::Modify2:
|
||||
case AccessorKind::Init:
|
||||
case AccessorKind::Mutate:
|
||||
return false;
|
||||
}
|
||||
llvm_unreachable("bad accessor kind");
|
||||
|
||||
Reference in New Issue
Block a user