Skip to content

Commit 9a887fe

Browse files
committed
Make Enum extend Product and Serializable
so that these traits do not leak into inferred types of unions of cases.
1 parent 1003adb commit 9a887fe

File tree

4 files changed

+19
-6
lines changed

4 files changed

+19
-6
lines changed
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package scala
2+
3+
/** A base trait of all enum classes */
4+
trait Enum extends Product, Serializable:
5+
6+
/** A number uniquely identifying a case of an enum */
7+
def ordinal: Int
8+
protected def $ordinal: Int
9+
Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
package scala
22

33
/** A base trait of all enum classes */
4-
trait Enum {
4+
trait Enum:
55

66
/** A number uniquely identifying a case of an enum */
77
def ordinal: Int
88
protected def $ordinal: Int
9-
}

library/src/scala/EnumValue.scala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
package scala
22

33
trait EnumValue extends Product, Serializable:
4-
override def canEqual(that: Any) = true
4+
override def canEqual(that: Any) = this eq that.asInstanceOf[AnyRef]
55
override def productArity: Int = 0
66
override def productPrefix: String = toString
77
override def productElement(n: Int): Any =
8-
throw IndexOutOfBoundsException(n.toString())
8+
throw IndexOutOfBoundsException(n.toString)
99
override def productElementName(n: Int): String =
10-
throw IndexOutOfBoundsException(n.toString())
10+
throw IndexOutOfBoundsException(n.toString)

tests/pos/enum-List-control.scala

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,16 @@ abstract sealed class List[T] extends Enum
22
object List {
33
final class Cons[T](x: T, xs: List[T]) extends List[T] {
44
def $ordinal = 0
5+
def canEqual(that: Any): Boolean = that.isInstanceOf[Cons[_]]
6+
def productArity: Int = 2
7+
def productElement(n: Int): Any = n match
8+
case 0 => x
9+
case 1 => xs
510
}
611
object Cons {
712
def apply[T](x: T, xs: List[T]): List[T] = new Cons(x, xs)
813
}
9-
final class Nil[T]() extends List[T] {
14+
final class Nil[T]() extends List[T], EnumValue {
1015
def $ordinal = 1
1116
}
1217
object Nil {

0 commit comments

Comments
 (0)