Skip to content

Commit eea4189

Browse files
authored
Merge pull request #83718 from tshortli/dont-automatically-apply-dynamic-member-lookup-subscript-access-fix-it
2 parents 5e2dfdf + db117bf commit eea4189

File tree

5 files changed

+38
-17
lines changed

5 files changed

+38
-17
lines changed

lib/Sema/MiscDiagnostics.cpp

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6471,7 +6471,7 @@ void swift::performStmtDiagnostics(const Stmt *S, DeclContext *DC) {
64716471

64726472
void swift::fixItAccess(InFlightDiagnostic &diag, ValueDecl *VD,
64736473
AccessLevel desiredAccess, bool isForSetter,
6474-
bool shouldUseDefaultAccess) {
6474+
bool shouldUseDefaultAccess, bool updateAttr) {
64756475
StringRef fixItString;
64766476
switch (desiredAccess) {
64776477
case AccessLevel::Private: fixItString = "private "; break;
@@ -6486,27 +6486,35 @@ void swift::fixItAccess(InFlightDiagnostic &diag, ValueDecl *VD,
64866486
AbstractAccessControlAttr *attr;
64876487
if (isForSetter) {
64886488
attr = attrs.getAttribute<SetterAccessAttr>();
6489-
cast<AbstractStorageDecl>(VD)->overwriteSetterAccess(desiredAccess);
6489+
if (updateAttr)
6490+
cast<AbstractStorageDecl>(VD)->overwriteSetterAccess(desiredAccess);
64906491
} else {
64916492
attr = attrs.getAttribute<AccessControlAttr>();
6492-
VD->overwriteAccess(desiredAccess);
6493+
if (updateAttr)
6494+
VD->overwriteAccess(desiredAccess);
64936495

64946496
if (auto *ASD = dyn_cast<AbstractStorageDecl>(VD)) {
6495-
if (auto *getter = ASD->getAccessor(AccessorKind::Get))
6496-
getter->overwriteAccess(desiredAccess);
6497+
if (auto *getter = ASD->getAccessor(AccessorKind::Get)) {
6498+
if (updateAttr)
6499+
getter->overwriteAccess(desiredAccess);
6500+
}
64976501

64986502
if (auto *setterAttr = attrs.getAttribute<SetterAccessAttr>()) {
64996503
if (setterAttr->getAccess() > desiredAccess)
6500-
fixItAccess(diag, VD, desiredAccess, true);
6504+
fixItAccess(diag, VD, desiredAccess, /*isForSetter=*/true,
6505+
/*shouldUseDefaultAccess=*/false, updateAttr);
65016506
} else {
6502-
ASD->overwriteSetterAccess(desiredAccess);
6507+
if (updateAttr)
6508+
ASD->overwriteSetterAccess(desiredAccess);
65036509
}
65046510
}
65056511
}
65066512

65076513
if (isForSetter && VD->getFormalAccess() == desiredAccess) {
65086514
assert(attr);
6509-
attr->setInvalid();
6515+
if (updateAttr)
6516+
attr->setInvalid();
6517+
65106518
// Remove the setter attribute.
65116519
diag.fixItRemove(attr->Range);
65126520

@@ -6526,7 +6534,8 @@ void swift::fixItAccess(InFlightDiagnostic &diag, ValueDecl *VD,
65266534
// replace the "(set)" part of a setter attribute.
65276535
diag.fixItReplace(attr->getLocation(), fixItString.drop_back());
65286536
}
6529-
attr->setInvalid();
6537+
if (updateAttr)
6538+
attr->setInvalid();
65306539
}
65316540

65326541
} else if (auto *override = VD->getAttrs().getAttribute<OverrideAttr>()) {

lib/Sema/MiscDiagnostics.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,10 @@ namespace swift {
5353

5454
/// Emit a fix-it to set the access of \p VD to \p desiredAccess.
5555
///
56-
/// This actually updates \p VD as well.
56+
/// This actually updates \p VD as well if \p updateAttr is true.
5757
void fixItAccess(InFlightDiagnostic &diag, ValueDecl *VD,
5858
AccessLevel desiredAccess, bool isForSetter = false,
59-
bool shouldUseDefaultAccess = false);
59+
bool shouldUseDefaultAccess = false, bool updateAttr = true);
6060

6161
/// Compute the location of the 'var' keyword for a 'var'-to-'let' Fix-It.
6262
SourceLoc getFixItLocForVarToLet(VarDecl *var);

lib/Sema/TypeCheckAttr.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2171,7 +2171,9 @@ visitDynamicMemberLookupAttr(DynamicMemberLookupAttr *attr) {
21712171
diag::dynamic_member_lookup_candidate_inaccessible,
21722172
inaccessibleCandidate);
21732173
fixItAccess(diag, inaccessibleCandidate,
2174-
requiredAccessScope.requiredAccessForDiagnostics());
2174+
requiredAccessScope.requiredAccessForDiagnostics(),
2175+
/*isForSetter=*/false, /*useDefaultAccess=*/false,
2176+
/*updateAttr=*/false);
21752177
diag.warnUntilSwiftVersionIf(!shouldError, futureVersion);
21762178

21772179
if (shouldError) {

test/attr/attr_dynamic_member_lookup.swift

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -253,9 +253,8 @@ public struct Inaccessible1 {
253253

254254
@dynamicMemberLookup
255255
public struct Inaccessible2 {
256-
// expected-non-resilient-warning @+3 {{'@dynamicMemberLookup' requires 'subscript(dynamicMember:)' to be as accessible as its enclosing type; this will be an error in a future Swift language mode}}{{21-29=public}}
257-
// expected-resilient-error @+2 {{'@dynamicMemberLookup' requires 'subscript(dynamicMember:)' to be as accessible as its enclosing type}}{{21-29=public}}
258-
// expected-error @+1 {{'@usableFromInline' attribute can only be applied to internal or package declarations, but subscript 'subscript(dynamicMember:)' is public}}
256+
// expected-non-resilient-warning @+2 {{'@dynamicMemberLookup' requires 'subscript(dynamicMember:)' to be as accessible as its enclosing type; this will be an error in a future Swift language mode}}{{21-29=public}}
257+
// expected-resilient-error @+1 {{'@dynamicMemberLookup' requires 'subscript(dynamicMember:)' to be as accessible as its enclosing type}}{{21-29=public}}
259258
@usableFromInline internal subscript(dynamicMember member: String) -> Int {
260259
return 42
261260
}
@@ -279,6 +278,18 @@ private struct Inaccessible4 {
279278
}
280279
}
281280

281+
@dynamicMemberLookup
282+
public struct Inaccessible5 {
283+
internal struct Nested { }
284+
var nested: Nested
285+
286+
// expected-non-resilient-warning @+2 {{'@dynamicMemberLookup' requires 'subscript(dynamicMember:)' to be as accessible as its enclosing type; this will be an error in a future Swift language mode}}{{3-11=public}}
287+
// expected-resilient-error @+1 {{'@dynamicMemberLookup' requires 'subscript(dynamicMember:)' to be as accessible as its enclosing type}}{{3-11=public}}
288+
internal subscript<Value>(dynamicMember keyPath: KeyPath<Nested, Value>) -> Value {
289+
nested[keyPath: keyPath]
290+
}
291+
}
292+
282293
//===----------------------------------------------------------------------===//
283294
// Existentials
284295
//===----------------------------------------------------------------------===//

test/attr/attr_dynamic_member_lookup_swift7.swift

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,7 @@ public struct Inaccessible1 {
5050

5151
@dynamicMemberLookup
5252
public struct Inaccessible2 {
53-
// expected-error @+2 {{'@dynamicMemberLookup' requires 'subscript(dynamicMember:)' to be as accessible as its enclosing type}}{{21-29=public}}
54-
// expected-error @+1 {{'@usableFromInline' attribute can only be applied to internal or package declarations, but subscript 'subscript(dynamicMember:)' is public}}
53+
// expected-error @+1 {{'@dynamicMemberLookup' requires 'subscript(dynamicMember:)' to be as accessible as its enclosing type}}{{21-29=public}}
5554
@usableFromInline internal subscript(dynamicMember member: String) -> Int {
5655
return 42
5756
}

0 commit comments

Comments
 (0)