@@ -1525,18 +1525,35 @@ class AmbiguousExtensionMethod(tree: untpd.Tree, expansion1: tpd.Tree, expansion
1525
1525
|are possible expansions of $tree"""
1526
1526
def explain (using Context ) = " "
1527
1527
1528
- class ReassignmentToVal (name : Name )(using Context )
1529
- extends TypeMsg (ReassignmentToValID ) {
1530
- def msg (using Context ) = i """ Reassignment to val $name"""
1531
- def explain (using Context ) =
1532
- i """ |You can not assign a new value to $name as values can't be changed.
1533
- |Keep in mind that every statement has a value, so you may e.g. use
1534
- | ${hl(" val" )} $name ${hl(" = if (condition) 2 else 5" )}
1535
- |In case you need a reassignable name, you can declare it as
1536
- |variable
1537
- | ${hl(" var" )} $name ${hl(" =" )} ...
1538
- | """
1539
- }
1528
+ class ReassignmentToVal (sym : Symbol , usage : Name , rhs : untpd.Tree )(using Context ) extends TypeMsg (ReassignmentToValID ):
1529
+ val isSetter = usage.isSetterName && sym.info.firstParamTypes.nonEmpty
1530
+ def msg (using Context ) =
1531
+ if isSetter then i " Bad assignment to setter should use $usage( $rhs) "
1532
+ else if sym.exists then i " Assignment to $sym"
1533
+ else i " Bad assignment to $usage"
1534
+ def explain (using Context ) =
1535
+ val name =
1536
+ if isSetter then usage.asSimpleName.dropRight(2 )
1537
+ else if sym.exists then sym.name
1538
+ else usage
1539
+ if isSetter then
1540
+ i """ |
1541
+ | $usage is a setter name and can be used with assignment syntax:
1542
+ | $name = $rhs
1543
+ | """
1544
+ else
1545
+ val addendum = if ! sym.exists || ! sym.owner.isClass || sym.isSetter then " " else
1546
+ i """ |
1547
+ |Assignment syntax can be used if there is a corresponding setter of the form:
1548
+ | ${hl(" def" )} ${name}${hl(i " _=(x: ${sym.info.resultType}): Unit = ??? " )}
1549
+ | """
1550
+ i """ |Members defined using `val` or `def` can't be assigned to.
1551
+ |If you need to change the value of $name, use `var` instead:
1552
+ | ${hl(" var" )} $name ${hl(" =" )} ???
1553
+ |However, it's more common to initialize a variable just once
1554
+ |with a complex expression or even a block with many statements:
1555
+ | ${hl(" val" )} $name ${hl(" = if (condition) 1 else -1" )}$addendum
1556
+ | """
1540
1557
1541
1558
class TypeDoesNotTakeParameters (tpe : Type , params : List [untpd.Tree ])(using Context )
1542
1559
extends TypeMsg (TypeDoesNotTakeParametersID ) {
0 commit comments