mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
[ConstraintSystem] Impact of r-value as l-value fix is higher for functions/subscripts
If the fix is applied to result type of a function or subscript invocation increase its impact because such uses are invalid e.g. assigning a value to a function call `foo() = 42`, or using read-only subscript as mutating.
This commit is contained in:
@@ -8259,7 +8259,6 @@ ConstraintSystem::SolutionKind ConstraintSystem::simplifyFixConstraint(
|
||||
case FixKind::InsertCall:
|
||||
case FixKind::RemoveReturn:
|
||||
case FixKind::RemoveAddressOf:
|
||||
case FixKind::TreatRValueAsLValue:
|
||||
case FixKind::AddMissingArguments:
|
||||
case FixKind::SkipUnhandledConstructInFunctionBuilder:
|
||||
case FixKind::UsePropertyWrapper:
|
||||
@@ -8271,6 +8270,22 @@ ConstraintSystem::SolutionKind ConstraintSystem::simplifyFixConstraint(
|
||||
return recordFix(fix) ? SolutionKind::Error : SolutionKind::Solved;
|
||||
}
|
||||
|
||||
case FixKind::TreatRValueAsLValue: {
|
||||
unsigned impact = 1;
|
||||
// If this is an attempt to use result of a function/subscript call as
|
||||
// an l-value, it has to have an increased impact because it's either
|
||||
// a function - which is completely incorrect, or it's a get-only
|
||||
// subscript, which requires changes to declaration to become mutable.
|
||||
if (auto last = locator.last()) {
|
||||
impact += (last->is<LocatorPathElt::FunctionResult>() ||
|
||||
last->is<LocatorPathElt::SubscriptMember>())
|
||||
? 1
|
||||
: 0;
|
||||
}
|
||||
|
||||
return recordFix(fix, impact) ? SolutionKind::Error : SolutionKind::Solved;
|
||||
}
|
||||
|
||||
case FixKind::AddConformance:
|
||||
case FixKind::SkipSameTypeRequirement:
|
||||
case FixKind::SkipSuperclassRequirement: {
|
||||
|
||||
Reference in New Issue
Block a user