Skip to content

Commit 668838f

Browse files
committed
Use Eq.derived as the universal Eq instance
1 parent a28a078 commit 668838f

File tree

14 files changed

+79
-77
lines changed

14 files changed

+79
-77
lines changed

compiler/src/dotty/tools/dotc/core/Denotations.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ import collection.mutable.ListBuffer
6767
*/
6868
object Denotations {
6969

70-
implicit def eqDenotation: Eq[Denotation, Denotation] = Eq
70+
implicit def eqDenotation: Eq[Denotation, Denotation] = Eq.derived
7171

7272
/** A PreDenotation represents a group of single denotations or a single multi-denotation
7373
* It is used as an optimization to avoid forming MultiDenotations too eagerly.

compiler/src/dotty/tools/dotc/core/Names.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ object Names {
2525
def toTermName: TermName
2626
}
2727

28-
implicit def eqName: Eq[Name, Name] = Eq
28+
implicit def eqName: Eq[Name, Name] = Eq.derived
2929

3030
/** A common superclass of Name and Symbol. After bootstrap, this should be
3131
* just the type alias Name | Symbol

compiler/src/dotty/tools/dotc/core/Symbols.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -406,7 +406,7 @@ trait Symbols { this: Context =>
406406

407407
object Symbols {
408408

409-
implicit def eqSymbol: Eq[Symbol, Symbol] = Eq
409+
implicit def eqSymbol: Eq[Symbol, Symbol] = Eq.derived
410410

411411
/** Tree attachment containing the identifiers in a tree as a sorted array */
412412
val Ids: Property.Key[Array[String]] = new Property.Key

compiler/src/dotty/tools/dotc/core/Types.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ object Types {
4040

4141
@sharable private[this] var nextId = 0
4242

43-
implicit def eqType: Eq[Type, Type] = Eq
43+
implicit def eqType: Eq[Type, Type] = Eq.derived
4444

4545
/** Main class representing types.
4646
*

compiler/src/dotty/tools/dotc/util/SourceFile.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,7 @@ class SourceFile(val file: AbstractFile, computeContent: => Array[Char]) extends
190190
}
191191
}
192192
object SourceFile {
193-
implicit def eqSource: Eq[SourceFile, SourceFile] = Eq
193+
implicit def eqSource: Eq[SourceFile, SourceFile] = Eq.derived
194194

195195
implicit def fromContext(implicit ctx: Context): SourceFile = ctx.source
196196

compiler/test-resources/repl/i4184

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ scala> object foo { class Foo }
22
// defined object foo
33
scala> object bar { class Foo }
44
// defined object bar
5-
scala> implicit def eqFoo: Eq[foo.Foo, foo.Foo] = Eq
5+
scala> implicit def eqFoo: Eq[foo.Foo, foo.Foo] = Eq.derived
66
def eqFoo: Eq[foo.Foo, foo.Foo]
77
scala> object Bar { new foo.Foo == new bar.Foo }
88
1 | object Bar { new foo.Foo == new bar.Foo }

docs/docs/reference/other-new-features/multiversal-equality.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ would not typecheck if an implicit was declared like this for type `T`
2929
(or an analogous one for type `S`):
3030

3131
```scala
32-
implicit def eqT: Eq[T, T] = Eq
32+
implicit def eqT: Eq[T, T] = Eq.derived
3333
```
3434

3535
This definition effectively says that value of type `T` can (only) be
@@ -55,10 +55,10 @@ definitions below make values of type `A` and type `B` comparable with
5555
each other, but not comparable to anything else:
5656

5757
```scala
58-
implicit def eqA : Eq[A, A] = Eq
59-
implicit def eqB : Eq[B, B] = Eq
60-
implicit def eqAB: Eq[A, B] = Eq
61-
implicit def eqBA: Eq[B, A] = Eq
58+
implicit def eqA : Eq[A, A] = Eq.derived
59+
implicit def eqB : Eq[B, B] = Eq.derived
60+
implicit def eqAB: Eq[A, B] = Eq.derived
61+
implicit def eqBA: Eq[B, A] = Eq.derived
6262
```
6363

6464
(As usual, the names of the implicit definitions don't matter, we have
@@ -75,7 +75,7 @@ over all types that do not themselves have an `Eq` instance. `eqAny` is
7575
defined as follows:
7676

7777
```scala
78-
def eqAny[L, R]: Eq[L, R] = Eq
78+
def eqAny[L, R]: Eq[L, R] = Eq.derived
7979
```
8080

8181
Even though `eqAny` is not declared implicit, the compiler will still

library/src/scala/Eq.scala

Lines changed: 36 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -11,52 +11,52 @@ sealed trait Eq[-L, -R]
1111
* can also be used as a value that's compatible with
1212
* any instance of `Eq`.
1313
*/
14-
object Eq extends Eq[Any, Any] {
15-
def derived: Eq[Any, Any] = Eq
14+
object Eq {
15+
object derived extends Eq[Any, Any]
1616

1717
/** A fall-back "implicit" to compare values of any types.
1818
* Even though this method is not declared implicit, the compiler will
1919
* compute instances as solutions to `Eq[T, U]` queries if `T <: U` or `U <: T`
2020
* or both `T` and `U` are Eq-free. A type `S` is Eq-free if there is no
2121
* implicit instance of type `Eq[S, S]`.
2222
*/
23-
def eqAny[L, R]: Eq[L, R] = Eq
23+
def eqAny[L, R]: Eq[L, R] = derived
2424

2525
// Instances of `Eq` for common types
2626

27-
implicit def eqNumber : Eq[Number, Number] = Eq
28-
implicit def eqString : Eq[String, String] = Eq
29-
implicit def eqBoolean : Eq[Boolean, Boolean] = Eq
30-
implicit def eqByte : Eq[Byte, Byte] = Eq
31-
implicit def eqShort : Eq[Short, Short] = Eq
32-
implicit def eqChar : Eq[Char, Char] = Eq
33-
implicit def eqInt : Eq[Int, Int] = Eq
34-
implicit def eqLong : Eq[Long, Long] = Eq
35-
implicit def eqFloat : Eq[Float, Float] = Eq
36-
implicit def eqDouble : Eq[Double, Double] = Eq
37-
implicit def eqUnit : Eq[Unit, Unit] = Eq
27+
implicit def eqNumber : Eq[Number, Number] = derived
28+
implicit def eqString : Eq[String, String] = derived
29+
implicit def eqBoolean : Eq[Boolean, Boolean] = derived
30+
implicit def eqByte : Eq[Byte, Byte] = derived
31+
implicit def eqShort : Eq[Short, Short] = derived
32+
implicit def eqChar : Eq[Char, Char] = derived
33+
implicit def eqInt : Eq[Int, Int] = derived
34+
implicit def eqLong : Eq[Long, Long] = derived
35+
implicit def eqFloat : Eq[Float, Float] = derived
36+
implicit def eqDouble : Eq[Double, Double] = derived
37+
implicit def eqUnit : Eq[Unit, Unit] = derived
3838

3939
// true asymmetry, modeling the (somewhat problematic) nature of equals on Proxies
40-
implicit def eqProxy : Eq[Proxy, Any] = Eq
41-
42-
implicit def eqSeq[T, U](implicit eq: Eq[T, U]): Eq[GenSeq[T], GenSeq[U]] = Eq
43-
implicit def eqSet[T, U](implicit eq: Eq[T, U]): Eq[Set[T], Set[U]] = Eq
44-
45-
implicit def eqByteNum : Eq[Byte, Number] = Eq
46-
implicit def eqNumByte : Eq[Number, Byte] = Eq
47-
implicit def eqCharNum : Eq[Char, Number] = Eq
48-
implicit def eqNumChar : Eq[Number, Char] = Eq
49-
implicit def eqShortNum : Eq[Short, Number] = Eq
50-
implicit def eqNumShort : Eq[Number, Short] = Eq
51-
implicit def eqIntNum : Eq[Int, Number] = Eq
52-
implicit def eqNumInt : Eq[Number, Int] = Eq
53-
implicit def eqLongNum : Eq[Long, Number] = Eq
54-
implicit def eqNumLong : Eq[Number, Long] = Eq
55-
implicit def eqFloatNum : Eq[Float, Number] = Eq
56-
implicit def eqNumFloat : Eq[Number, Float] = Eq
57-
implicit def eqDoubleNum: Eq[Double, Number] = Eq
58-
implicit def eqNumDouble: Eq[Number, Double] = Eq
59-
60-
implicit def eqSBoolJBool: Eq[Boolean, java.lang.Boolean] = Eq
61-
implicit def eqJBoolSBool: Eq[java.lang.Boolean, Boolean] = Eq
40+
implicit def eqProxy : Eq[Proxy, Any] = derived
41+
42+
implicit def eqSeq[T, U](implicit eq: Eq[T, U]): Eq[GenSeq[T], GenSeq[U]] = derived
43+
implicit def eqSet[T, U](implicit eq: Eq[T, U]): Eq[Set[T], Set[U]] = derived
44+
45+
implicit def eqByteNum : Eq[Byte, Number] = derived
46+
implicit def eqNumByte : Eq[Number, Byte] = derived
47+
implicit def eqCharNum : Eq[Char, Number] = derived
48+
implicit def eqNumChar : Eq[Number, Char] = derived
49+
implicit def eqShortNum : Eq[Short, Number] = derived
50+
implicit def eqNumShort : Eq[Number, Short] = derived
51+
implicit def eqIntNum : Eq[Int, Number] = derived
52+
implicit def eqNumInt : Eq[Number, Int] = derived
53+
implicit def eqLongNum : Eq[Long, Number] = derived
54+
implicit def eqNumLong : Eq[Number, Long] = derived
55+
implicit def eqFloatNum : Eq[Float, Number] = derived
56+
implicit def eqNumFloat : Eq[Number, Float] = derived
57+
implicit def eqDoubleNum: Eq[Double, Number] = derived
58+
implicit def eqNumDouble: Eq[Number, Double] = derived
59+
60+
implicit def eqSBoolJBool: Eq[Boolean, java.lang.Boolean] = derived
61+
implicit def eqJBoolSBool: Eq[java.lang.Boolean, Boolean] = derived
6262
}

tests/neg/EqualityStrawman1.scala

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,10 @@ object EqualityStrawman1 {
88
@implicitNotFound("cannot compare value of type ${T} with a value outside its equality class")
99
trait Impossible[T]
1010

11-
object Eq extends Eq[Any]
12-
11+
object Eq {
12+
object derived extends Eq[Any]
13+
}
14+
1315
trait Base {
1416
def === (other: Any): Boolean = this.equals(other)
1517
def === [T <: CondEquals](other: T)(implicit ce: Impossible[T]): Boolean = ???
@@ -32,11 +34,11 @@ object EqualityStrawman1 {
3234
case class Some[+T](x: T) extends Option[T]
3335
case object None extends Option[Nothing]
3436

35-
implicit def eqStr: Eq[Str] = Eq
36-
//implicit def eqNum: Eq[Num] = Eq
37-
implicit def eqOption[T: Eq]: Eq[Option[T]] = Eq
37+
implicit def eqStr: Eq[Str] = Eq.derived
38+
//implicit def eqNum: Eq[Num] = Eq.derived
39+
implicit def eqOption[T: Eq]: Eq[Option[T]] = Eq.derived
3840

39-
implicit def eqEq[T <: Equals[T]]: Eq[T] = Eq
41+
implicit def eqEq[T <: Equals[T]]: Eq[T] = Eq.derived
4042

4143
def main(args: Array[String]): Unit = {
4244
val x = Str("abc")

tests/neg/derive-eq.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
case class One() derives Eq
33
case class Two() derives Eq
44

5-
implied for Eq[One, Two] = Eq
5+
implied for Eq[One, Two] = Eq.derived
66

77
enum Lst[T] derives Eq {
88
case Cons(x: T, xs: Lst[T])

tests/neg/equality.scala

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,20 +10,20 @@ object equality {
1010
case class Some[+T](x: T) extends Option[T]
1111
case object None extends Option[Nothing]
1212

13-
implicit def eqStr: Eq[Str, Str] = Eq
14-
implicit def eqNum: Eq[Num, Num] = Eq
15-
implicit def eqOption[T, U](implicit e: Eq[T, U]): Eq[Option[T], Option[U]] = Eq
13+
implicit def eqStr: Eq[Str, Str] = Eq.derived
14+
implicit def eqNum: Eq[Num, Num] = Eq.derived
15+
implicit def eqOption[T, U](implicit e: Eq[T, U]): Eq[Option[T], Option[U]] = Eq.derived
1616

1717
case class PString(a: String) extends Proxy {
1818
def self = a
1919
}
2020

2121
/*
22-
implicit def eqString: Eq[String, String] = Eq
23-
implicit def eqInt: Eq[Int, Int] = Eq
24-
implicit def eqNumber: Eq[Number, Number] = Eq
25-
implicit def eqIntNumber: Eq[Int, Number] = Eq
26-
implicit def eqNumberInt: Eq[Number, Int] = Eq
22+
implicit def eqString: Eq[String, String] = Eq.derived
23+
implicit def eqInt: Eq[Int, Int] = Eq.derived
24+
implicit def eqNumber: Eq[Number, Number] = Eq.derived
25+
implicit def eqIntNumber: Eq[Int, Number] = Eq.derived
26+
implicit def eqNumberInt: Eq[Number, Int] = Eq.derived
2727
*/
2828
def main(args: Array[String]): Unit = {
2929
Some(Other(3)) == None

tests/neg/i5546.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,11 @@ object O {
88
val m: Meters = 1.0
99
assert(m == 1.0) // OK
1010
}
11-
implicit def eqM: Eq[Meters, Meters] = Eq
11+
implicit def eqM: Eq[Meters, Meters] = Eq.derived
1212

1313
opaque type Feet = Double
1414
object Feet { def apply(d: Double): Feet = d }
15-
implicit def eqF: Eq[Feet, Feet] = Eq
15+
implicit def eqF: Eq[Feet, Feet] = Eq.derived
1616

1717
def main(args: Array[String]): Unit = {
1818
println(Feet(3) == Meters(3)) // error: cannot compare

tests/pending/neg/EqualityStrawman2.scala

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,23 +7,23 @@ object equality {
77
def ===[U] (y: U)(implicit ce: Eq[T, U]) = x.equals(y)
88
}
99

10-
type EqEq[T] = Eq[T, T]
10+
type EqEq[T] = Eq.derived[T, T]
1111

1212
trait EqClass[T]
1313

14-
implicit def eqAny[T, U]: Eq[T, U] = Eq
14+
implicit def eqAny[T, U]: Eq[T, U] = Eq.derived
1515
/*
16-
implicit def mixedEq1[T, U](implicit ce: Eq[T, U]): Eq[T, Any] = Eq
17-
implicit def mixedEq2[T, U](implicit ce: Eq[T, U]): Eq[Any, T] = Eq
18-
implicit def mixedEq1alt : Eq[Any, EqClass] = Eq
19-
implicit def mixedEq2 : Eq[EqClass, Any] = Eq
20-
implicit def mixedEq2alt : Eq[EqClass, Any] = Eq
16+
implicit def mixedEq1[T, U](implicit ce: Eq[T, U]): Eq[T, Any] = Eq.derived
17+
implicit def mixedEq2[T, U](implicit ce: Eq[T, U]): Eq[Any, T] = Eq.derived
18+
implicit def mixedEq1alt : Eq[Any, EqClass] = Eq.derived
19+
implicit def mixedEq2 : Eq[EqClass, Any] = Eq.derived
20+
implicit def mixedEq2alt : Eq[EqClass, Any] = Eq.derived
2121
implicit def mixedNull1[T]: Eq[T, Null] = Eq
2222
implicit def mixedNull2[T]: Eq[Null, T] = Eq
2323
*/
2424
implicit def eqString: Eq[String, String] = Eq
25-
implicit def eqInt: Eq[Int, Int] = Eq
26-
implicit def eqOption[T, U](implicit ce: Eq[T, U]): Eq[Option[T], Option[U]] = Eq
25+
implicit def eqInt: Eq[Int, Int] = Eq.derived
26+
implicit def eqOption[T, U](implicit ce: Eq[T, U]): Eq[Option[T], Option[U]] = Eq.derived
2727

2828
/*
2929
implicit def eqEq[UE, TE <: UE with EqClass[UE]]: Eq[TE, TE] = Eq
@@ -37,8 +37,8 @@ object equality {
3737
case class Some[+T](x: T) extends Option[T]
3838
case object None extends Option[Nothing]
3939
40-
//implicit def eqStr: Eq[Str, Str] = Eq
41-
//implicit def eqNum: Eq[Num, Num] = Eq
40+
//implicit def eqStr: Eq[Str, Str] = Eq.derived
41+
//implicit def eqNum: Eq[Num, Num] = Eq.derived
4242
4343
implicit def eqOption[T, U](implicit ce: Eq[T, U]): Eq[Option[T], Option[U]] = Eq
4444
*/

tests/pos/derive-eq.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
case class One() derives Eq
33
case class Two() derives Eq
44

5-
implied for Eq[One, Two] = Eq
5+
implied for Eq[One, Two] = Eq.derived
66

77
enum Lst[T] derives Eq {
88
case Cons(x: T, xs: Lst[T])

0 commit comments

Comments
 (0)