Skip to content

Commit b80de16

Browse files
committed
Rename Eql to CanEqual
1 parent 51dee4b commit b80de16

File tree

8 files changed

+53
-19
lines changed

8 files changed

+53
-19
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -840,7 +840,7 @@ class Definitions {
840840

841841
@tu lazy val TastyReflectionClass: ClassSymbol = requiredClass("scala.tasty.Reflection")
842842

843-
@tu lazy val EqlClass: ClassSymbol = requiredClass("scala.Eql")
843+
@tu lazy val EqlClass: ClassSymbol = getClassIfDefined("scala.Eql").orElse(requiredClass("scala.CanEqual")).asClass
844844
def Eql_eqlAny(using Context): TermSymbol = EqlClass.companionModule.requiredMethod(nme.eqlAny)
845845

846846
@tu lazy val TypeBoxClass: ClassSymbol = requiredClass("scala.runtime.TypeBox")

compiler/test-resources/repl/i4184

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ scala> object foo { class Foo }
22
// defined object foo
33
scala> object bar { class Foo }
44
// defined object bar
5-
scala> implicit def eqFoo: Eql[foo.Foo, foo.Foo] = Eql.derived
6-
def eqFoo: Eql[foo.Foo, foo.Foo]
5+
scala> implicit def eqFoo: CanEqual[foo.Foo, foo.Foo] = CanEqual.derived
6+
def eqFoo: CanEqual[foo.Foo, foo.Foo]
77
scala> object Bar { new foo.Foo == new bar.Foo }
88
1 | object Bar { new foo.Foo == new bar.Foo }
99
| ^^^^^^^^^^^^^^^^^^^^^^^^^^

compiler/test-resources/repl/i7644

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
1-
scala> class T extends Eql
2-
1 | class T extends Eql
1+
scala> class T extends CanEqual
2+
1 | class T extends CanEqual
33
| ^
4-
| Cannot extend sealed trait Eql in a different source file
5-
1 | class T extends Eql
6-
| ^^^
7-
| Missing type parameter for Eql
8-
scala> class T extends Eql
9-
1 | class T extends Eql
4+
| Cannot extend sealed trait CanEqual in a different source file
5+
1 | class T extends CanEqual
6+
| ^^^^^^^^
7+
| Missing type parameter for CanEqual
8+
scala> class T extends CanEqual
9+
1 | class T extends CanEqual
1010
| ^
11-
| Cannot extend sealed trait Eql in a different source file
12-
1 | class T extends Eql
13-
| ^^^
14-
| Missing type parameter for Eql
11+
| Cannot extend sealed trait CanEqual in a different source file
12+
1 | class T extends CanEqual
13+
| ^^^^^^^^
14+
| Missing type parameter for CanEqual
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package scala
2+
3+
import annotation.implicitNotFound
4+
import scala.collection.{Seq, Set}
5+
6+
/** A marker trait indicating that values of type `L` can be compared to values of type `R`. */
7+
@implicitNotFound("Values of types ${L} and ${R} cannot be compared with == or !=")
8+
sealed trait CanEqual[-L, -R]
9+
10+
/** Companion object containing a few universally known `CanEqual` instances.
11+
* CanEqual instances involving primitive types or the Null type are handled directly in
12+
* the compiler (see Implicits.synthesizedCanEqual), so they are not included here.
13+
*/
14+
object CanEqual {
15+
/** A universal `CanEqual` instance. */
16+
object derived extends CanEqual[Any, Any]
17+
18+
/** A fall-back instance to compare values of any types.
19+
* Even though this method is not declared as given, the compiler will
20+
* synthesize implicit arguments as solutions to `CanEqual[T, U]` queries if
21+
* the rules of multiversal equality require it.
22+
*/
23+
def eqlAny[L, R]: CanEqual[L, R] = derived
24+
25+
// Instances of `CanEqual` for common Java types
26+
given eqlNumber as CanEqual[Number, Number] = derived
27+
given eqlString as CanEqual[String, String] = derived
28+
29+
// The next three definitions can go into the companion objects of classes
30+
// Seq and Set. For now they are here in order not to have to touch the
31+
// source code of these classes
32+
given eqlSeq[T, U](using eq: CanEqual[T, U]) as CanEqual[Seq[T], Seq[U]] = derived
33+
given eqlSet[T, U](using eq: CanEqual[T, U]) as CanEqual[Set[T], Set[U]] = derived
34+
}

tests/semanticdb/expect/Enums.expect.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ object Enums/*<-_empty_::Enums.*/:
88
enum Directions/*<-_empty_::Enums.Directions#*/:
99
case North/*<-_empty_::Enums.Directions.North.*/, East/*<-_empty_::Enums.Directions.East.*/, South/*<-_empty_::Enums.Directions.South.*/, West/*<-_empty_::Enums.Directions.West.*/
1010

11-
enum Suits/*<-_empty_::Enums.Suits#*/ derives /*->scala::Eql.derived.*/Eql:
11+
enum Suits/*<-_empty_::Enums.Suits#*/ derives /*->scala::CanEqual.derived.*/CanEqual:
1212
case Hearts/*<-_empty_::Enums.Suits.Hearts.*/, Spades/*<-_empty_::Enums.Suits.Spades.*/, Clubs/*<-_empty_::Enums.Suits.Clubs.*/, Diamonds/*<-_empty_::Enums.Suits.Diamonds.*/
1313

1414
object Suits/*<-_empty_::Enums.Suits.*/:

tests/semanticdb/expect/Enums.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ object Enums:
88
enum Directions:
99
case North, East, South, West
1010

11-
enum Suits derives Eql:
11+
enum Suits derives CanEqual:
1212
case Hearts, Spades, Clubs, Diamonds
1313

1414
object Suits:

tests/semanticdb/metac.expect

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -755,7 +755,7 @@ _empty_/Enums.Suits.Clubs. => case val static enum method Clubs
755755
_empty_/Enums.Suits.Diamonds. => case val static enum method Diamonds
756756
_empty_/Enums.Suits.Hearts. => case val static enum method Hearts
757757
_empty_/Enums.Suits.Spades. => case val static enum method Spades
758-
_empty_/Enums.Suits.derived$Eql(). => implicit method derived$Eql
758+
_empty_/Enums.Suits.derived$CanEqual(). => implicit method derived$CanEqual
759759
_empty_/Enums.Suits.fromOrdinal(). => method fromOrdinal
760760
_empty_/Enums.Suits.fromOrdinal().(ordinal) => param ordinal
761761
_empty_/Enums.Suits.isBlack(). => method isBlack
@@ -844,7 +844,7 @@ Occurrences:
844844
[8:29..8:33): West <- _empty_/Enums.Directions.West.
845845
[10:7..10:12): Suits <- _empty_/Enums.Suits#
846846
[10:21..10:21): <- _empty_/Enums.Suits#`<init>`().
847-
[10:21..10:21): -> scala/Eql.derived.
847+
[10:21..10:21): -> scala/CanEqual.derived.
848848
[11:9..11:15): Hearts <- _empty_/Enums.Suits.Hearts.
849849
[11:17..11:23): Spades <- _empty_/Enums.Suits.Spades.
850850
[11:25..11:30): Clubs <- _empty_/Enums.Suits.Clubs.

0 commit comments

Comments
 (0)