Merge pull request #84180 from meg-gupta/borrowandmutatepr

Add preliminary support for borrow accessors
This commit is contained in:
Meghana Gupta
2025-09-15 10:01:15 -07:00
committed by GitHub
97 changed files with 2410 additions and 193 deletions

View File

@@ -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");