File tree Expand file tree Collapse file tree 5 files changed +39
-2
lines changed
compiler/src/dotty/tools/dotc Expand file tree Collapse file tree 5 files changed +39
-2
lines changed Original file line number Diff line number Diff line change @@ -1639,8 +1639,6 @@ object desugar {
16391639 if ctx.mode.is(Mode .Type ) then
16401640 AppliedTypeTree (ref(defn.NamedTupleTypeRef ), namesTuple :: tup :: Nil )
16411641 else
1642- if names.length == 1 && ctx.scope.lookup(names.head).is(Flags .Mutable ) then
1643- report.migrationWarning(AmbiguousNamedTupleAssignment (names.head, elemValues.head), tree.srcPos)
16441642 Apply (
16451643 Apply (
16461644 TypeApply (
Original file line number Diff line number Diff line change @@ -3398,6 +3398,7 @@ class Typer(@constructorOnly nestingLevel: Int = 0) extends Namer
33983398 /** Translate tuples of all arities */
33993399 def typedTuple (tree : untpd.Tuple , pt : Type )(using Context ): Tree =
34003400 val tree1 = desugar.tuple(tree, pt)
3401+ checkAmbiguousNamedTuple(tree)
34013402 if tree1 ne tree then typed(tree1, pt)
34023403 else
34033404 val arity = tree.trees.length
@@ -3423,6 +3424,15 @@ class Typer(@constructorOnly nestingLevel: Int = 0) extends Namer
34233424 val resTpe = TypeOps .nestedPairs(elemTpes)
34243425 app1.cast(resTpe)
34253426
3427+ def checkAmbiguousNamedTuple (tree : untpd.Tuple )(using Context ): Unit =
3428+ tree.trees match
3429+ case List (NamedArg (name, value)) =>
3430+ val typedName = typedIdent(untpd.Ident (name), WildcardType )
3431+ val sym = typedName.symbol
3432+ if sym.exists && (sym.is(Flags .Mutable ) || sym.setter.exists) then
3433+ report.migrationWarning(AmbiguousNamedTupleAssignment (name, value), tree.srcPos)
3434+ case _ =>
3435+
34263436 /** Retrieve symbol attached to given tree */
34273437 protected def retrieveSym (tree : untpd.Tree )(using Context ): Symbol = tree.removeAttachment(SymOfTree ) match {
34283438 case Some (sym) =>
Original file line number Diff line number Diff line change 1+ def test1 () =
2+ class Person :
3+ def age : Int = ???
4+ def age_= (x : Int ): Unit = ???
5+
6+ val person = Person ()
7+
8+ (person.age = 29 ) // no warn (interpreted as `person.age_=(29)`)
9+
10+ def test2 () =
11+ class Person :
12+ var age : Int = 28
13+
14+ val person = Person ()
15+
16+ (person.age = 29 ) // no warn (interpreted as `person.age_=(29)`)
17+
Original file line number Diff line number Diff line change 1+ -- [E203] Syntax Migration Warning: tests/warn/21681b.scala:4:2 --------------------------------------------------------
2+ 4 | (age = 29) // warn
3+ | ^^^^^^^^^^
4+ | Ambiguous syntax: this is interpreted as a named tuple with one element,
5+ | not as an assignment.
6+ |
7+ | To assign a value, use curly braces: `{age = 29}`.
Original file line number Diff line number Diff line change 1+
2+ object Test :
3+ var age : Int = 28
4+ (age = 29 ) // warn
5+
You can’t perform that action at this time.
0 commit comments