From 081e2fb747892a7efe12f1e9b0138b9d1726ab6b Mon Sep 17 00:00:00 2001 From: Paul Phillips Date: Tue, 20 Oct 2009 19:49:20 +0000 Subject: Fix and test case for #2260. Hooray for the ability to influence the priority of implicits. --- src/library/scala/Ordered.scala | 6 +++++- src/library/scala/Ordering.scala | 17 ++++++++++++----- src/library/scala/Predef.scala | 4 ---- test/files/pos/bug2260.scala | 10 ++++++++++ 4 files changed, 27 insertions(+), 10 deletions(-) create mode 100644 test/files/pos/bug2260.scala diff --git a/src/library/scala/Ordered.scala b/src/library/scala/Ordered.scala index 009502619c..45e10b3a25 100644 --- a/src/library/scala/Ordered.scala +++ b/src/library/scala/Ordered.scala @@ -48,6 +48,10 @@ trait Ordered[A] extends java.lang.Comparable[A] { def <= (that: A): Boolean = (this compare that) <= 0 def >= (that: A): Boolean = (this compare that) >= 0 def compareTo(that: A): Int = compare(that) +} - +object Ordered { + /** Lens from Ordering[T] to Ordered[T] */ + implicit def orderingToOrdered[T](x: T)(implicit ord: Ordering[T]): Ordered[T] = + new Ordered[T] { def compare(that: T): Int = ord.compare(x, that) } } diff --git a/src/library/scala/Ordering.scala b/src/library/scala/Ordering.scala index fed776147f..8b4db3f549 100644 --- a/src/library/scala/Ordering.scala +++ b/src/library/scala/Ordering.scala @@ -104,7 +104,18 @@ trait Ordering[T] extends Comparator[T] with PartialOrdering[T] { implicit def mkOrderingOps(lhs: T): Ops = new Ops(lhs) } -object Ordering { +/** This would conflict with all the nice implicit Orderings + * available, but thanks to the magic of prioritized implicits + * via subclassing we can make Ordered[A] => Ordering[A] only + * turn up if nothing else works. + */ +trait LowPriorityOrderingImplicits { + implicit def ordered[A <: Ordered[A]]: Ordering[A] = new Ordering[A] { + def compare(x: A, y: A) = x.compare(y) + } +} + +object Ordering extends LowPriorityOrderingImplicits { def apply[T](implicit ord : Ordering[T]) = ord @@ -112,10 +123,6 @@ object Ordering { def compare(x: T, y: T) = if (cmp(x, y)) -1 else if (cmp(y, x)) 1 else 0 } - def ordered[A <: Ordered[A]]: Ordering[A] = new Ordering[A] { - def compare(x: A, y: A) = x.compare(y) - } - trait UnitOrdering extends Ordering[Unit] { def compare(x: Unit, y: Unit) = 0 } diff --git a/src/library/scala/Predef.scala b/src/library/scala/Predef.scala index 6cb073b173..71fdd64832 100644 --- a/src/library/scala/Predef.scala +++ b/src/library/scala/Predef.scala @@ -247,10 +247,6 @@ object Predef extends LowPriorityImplicits { implicit def exceptionWrapper(exc: Throwable) = new runtime.RichException(exc) - /** Lens from Ordering[T] to Ordered[T] */ - implicit def orderingToOrdered[T](x: T)(implicit ord: Ordering[T]): Ordered[T] = - new Ordered[T] { def compare(that: T): Int = ord.compare(x, that) } - implicit def byte2short(x: Byte): Short = x.toShort implicit def byte2int(x: Byte): Int = x.toInt implicit def byte2long(x: Byte): Long = x.toLong diff --git a/test/files/pos/bug2260.scala b/test/files/pos/bug2260.scala new file mode 100644 index 0000000000..4e4cc5ab2c --- /dev/null +++ b/test/files/pos/bug2260.scala @@ -0,0 +1,10 @@ +package top + +class Text(val value: String) extends Ordered[Text] { + def compare(that: Text) = value.compare(that.value) +} + +object Index { + import scala.collection.immutable.TreeMap + val tree = TreeMap.empty[Text, String] +} -- cgit v1.2.3