From 30cc3cc68f01bd34786f5ae652483c41526a7563 Mon Sep 17 00:00:00 2001 From: Kacper Korban Date: Sun, 18 May 2025 22:48:37 +0200 Subject: [PATCH] Allow params and param accessors to be inferred private local --- .../dotty/tools/dotc/core/SymDenotations.scala | 4 +--- tests/init/crash/rbtree.scala | 16 ++++++++-------- tests/neg/i22620.scala | 4 ---- tests/pos/extend-java-enum.scala | 4 ++-- tests/pos/i22620.scala | 5 +++++ tests/pos/private-local-override-1.scala | 11 +++++++++++ tests/pos/private-local-override.scala | 11 +++++++++++ tests/pos/rbtree.scala | 16 ++++++++-------- tests/warn/i15503c.scala | 2 +- 9 files changed, 47 insertions(+), 26 deletions(-) delete mode 100644 tests/neg/i22620.scala create mode 100644 tests/pos/i22620.scala create mode 100644 tests/pos/private-local-override-1.scala create mode 100644 tests/pos/private-local-override.scala diff --git a/compiler/src/dotty/tools/dotc/core/SymDenotations.scala b/compiler/src/dotty/tools/dotc/core/SymDenotations.scala index 81a54cdc1f29..8fcdc9350275 100644 --- a/compiler/src/dotty/tools/dotc/core/SymDenotations.scala +++ b/compiler/src/dotty/tools/dotc/core/SymDenotations.scala @@ -2658,11 +2658,9 @@ object SymDenotations { * This holds for all symbols except * - constructors, since they can never be referred to as members of their * own, fully elaborated `this`. - * - parameters and parameter accessors, since their Local status is already - * determined by whether they have a `val` or `var` or not. */ def canBeLocal(name: Name, flags: FlagSet)(using Context) = - !name.isConstructorName && !flags.is(Param) && !flags.is(ParamAccessor) + !name.isConstructorName /** Factory method for SymDenotion creation. All creations * should be done via this method. diff --git a/tests/init/crash/rbtree.scala b/tests/init/crash/rbtree.scala index 6fa03938f5a3..6f1b0b737ca7 100644 --- a/tests/init/crash/rbtree.scala +++ b/tests/init/crash/rbtree.scala @@ -439,18 +439,18 @@ object RedBlackTree { def black: Tree[A, B] def red: Tree[A, B] } - final class RedTree[A, +B](key: A, - value: B, - left: Tree[A, B], - right: Tree[A, B]) extends Tree[A, B](key, value, left, right) { + final class RedTree[A, +B](_key: A, + _value: B, + _left: Tree[A, B], + _right: Tree[A, B]) extends Tree[A, B](_key, _value, _left, _right) { override def black: Tree[A, B] = BlackTree(key, value, left, right) override def red: Tree[A, B] = this override def toString: String = "RedTree(" + key + ", " + value + ", " + left + ", " + right + ")" } - final class BlackTree[A, +B](key: A, - value: B, - left: Tree[A, B], - right: Tree[A, B]) extends Tree[A, B](key, value, left, right) { + final class BlackTree[A, +B](_key: A, + _value: B, + _left: Tree[A, B], + _right: Tree[A, B]) extends Tree[A, B](_key, _value, _left, _right) { override def black: Tree[A, B] = this override def red: Tree[A, B] = RedTree(key, value, left, right) override def toString: String = "BlackTree(" + key + ", " + value + ", " + left + ", " + right + ")" diff --git a/tests/neg/i22620.scala b/tests/neg/i22620.scala deleted file mode 100644 index 97d1d55e3302..000000000000 --- a/tests/neg/i22620.scala +++ /dev/null @@ -1,4 +0,0 @@ - -import scala.collection.mutable.ArrayBuffer - -class PrivateTest[-M](private val v: ArrayBuffer[M]) // error diff --git a/tests/pos/extend-java-enum.scala b/tests/pos/extend-java-enum.scala index f58922f81749..3e5b2cde05f2 100644 --- a/tests/pos/extend-java-enum.scala +++ b/tests/pos/extend-java-enum.scala @@ -2,8 +2,8 @@ import java.{lang as jl} -final class ConfigSyntax private (name: String, ordinal: Int) - extends jl.Enum[ConfigSyntax](name, ordinal) +final class ConfigSyntax private (_name: String, ordinal: Int) + extends jl.Enum[ConfigSyntax](_name, ordinal) object ConfigSyntax { diff --git a/tests/pos/i22620.scala b/tests/pos/i22620.scala new file mode 100644 index 000000000000..7478e5c11d0f --- /dev/null +++ b/tests/pos/i22620.scala @@ -0,0 +1,5 @@ +import scala.collection.mutable.ArrayBuffer + +class PrivateTest[-M](private val v: ArrayBuffer[M]) + +class PrivateTest1[-M](v: ArrayBuffer[M]) diff --git a/tests/pos/private-local-override-1.scala b/tests/pos/private-local-override-1.scala new file mode 100644 index 000000000000..66e52d7b0100 --- /dev/null +++ b/tests/pos/private-local-override-1.scala @@ -0,0 +1,11 @@ +sealed abstract class Tree[+A]( + final val key: A +) +final class RedTree[+A](private val _key: A) extends Tree[A](_key) +final class BlackTree[+A](private val _key: A) extends Tree[A](_key) +object RedTree { + def unapply[A](t: RedTree[A]) = Some((t.key)) +} +object BlackTree { + def unapply[A](t: BlackTree[A]) = Some((t.key)) +} \ No newline at end of file diff --git a/tests/pos/private-local-override.scala b/tests/pos/private-local-override.scala new file mode 100644 index 000000000000..a78a87dd9f1d --- /dev/null +++ b/tests/pos/private-local-override.scala @@ -0,0 +1,11 @@ +sealed abstract class Tree[+A]( + final val key: A +) +final class RedTree[+A](_key: A) extends Tree[A](_key) +final class BlackTree[+A](_key: A) extends Tree[A](_key) +object RedTree { + def unapply[A](t: RedTree[A]) = Some((t.key)) +} +object BlackTree { + def unapply[A](t: BlackTree[A]) = Some((t.key)) +} diff --git a/tests/pos/rbtree.scala b/tests/pos/rbtree.scala index ffa44f743137..2b954fa8463c 100644 --- a/tests/pos/rbtree.scala +++ b/tests/pos/rbtree.scala @@ -439,18 +439,18 @@ object RedBlackTree { def black: Tree[A, B] def red: Tree[A, B] } - final class RedTree[A, +B](key: A, - value: B, - left: Tree[A, B], - right: Tree[A, B]) extends Tree[A, B](key, value, left, right) { + final class RedTree[A, +B](_key: A, + _value: B, + _left: Tree[A, B], + _right: Tree[A, B]) extends Tree[A, B](_key, _value, _left, _right) { override def black: Tree[A, B] = BlackTree(key, value, left, right) override def red: Tree[A, B] = this override def toString: String = "RedTree(" + key + ", " + value + ", " + left + ", " + right + ")" } - final class BlackTree[A, +B](key: A, - value: B, - left: Tree[A, B], - right: Tree[A, B]) extends Tree[A, B](key, value, left, right) { + final class BlackTree[A, +B](_key: A, + _value: B, + _left: Tree[A, B], + _right: Tree[A, B]) extends Tree[A, B](_key, _value, _left, _right) { override def black: Tree[A, B] = this override def red: Tree[A, B] = RedTree(key, value, left, right) override def toString: String = "BlackTree(" + key + ", " + value + ", " + left + ", " + right + ")" diff --git a/tests/warn/i15503c.scala b/tests/warn/i15503c.scala index 86b972487e17..97f87c941678 100644 --- a/tests/warn/i15503c.scala +++ b/tests/warn/i15503c.scala @@ -36,7 +36,7 @@ package foo.test.constructors: case class A private (x: Int) // OK class B private (val x: Int) // OK object B { def default = B(42) } - class C private (private val xy: Int) // warn + class C private (private val xy: Int) object C { def default = C(42) } class D private (private val x: Int): // OK def y = x