aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2015-06-18 15:07:25 +0200
committerMartin Odersky <odersky@gmail.com>2015-06-22 11:40:20 +0200
commit204158d4141254d1148534e14d3d26b361b7bc12 (patch)
treec296fd0202c69961b2f7eea7ec6ccb1efc284a13
parent131ab5c1261608715cf2fde3aa44a04777cbda64 (diff)
downloaddotty-204158d4141254d1148534e14d3d26b361b7bc12.tar.gz
dotty-204158d4141254d1148534e14d3d26b361b7bc12.tar.bz2
dotty-204158d4141254d1148534e14d3d26b361b7bc12.zip
Stratify classTags in DottyPredef
Test case in pending/run/array-addition.scala. The problem was that implicit search failed to insert `genericArrayOps` around `Array()`. The reason was that the implicit parameter for `genericArrayOps` was ambiguous, multiple `classTag` methods matched the expected type `ClassTag[?T >: Nothing]`. Stratifying ClassTags in DottyPredef into layers according to implicit priority avoids this problem. This is a temporary solution until we have proper ClassTag handling in place.
-rw-r--r--src/dotty/DottyPredef.scala30
1 files changed, 21 insertions, 9 deletions
diff --git a/src/dotty/DottyPredef.scala b/src/dotty/DottyPredef.scala
index 7c8098bd1..0a5d4d7f3 100644
--- a/src/dotty/DottyPredef.scala
+++ b/src/dotty/DottyPredef.scala
@@ -4,22 +4,34 @@ import scala.reflect.ClassTag
import scala.reflect.runtime.universe.TypeTag
import scala.Predef.??? // this is currently ineffective, because of #530
-object DottyPredef {
- /** implicits for ClassTag and TypeTag. Should be implemented with macros */
+abstract class I1 {
implicit def classTag[T]: ClassTag[T] = scala.Predef.???
implicit def typeTag[T]: TypeTag[T] = scala.Predef.???
-
-
- /** ClassTags for final classes */
+ implicit val DoubleClassTag: ClassTag[Double] = ClassTag.Double
+}
+abstract class I2 extends I1 {
+ implicit val FloatClassTag: ClassTag[Double] = ClassTag.Double
+}
+abstract class I3 extends I2 {
+ implicit val LongClassTag: ClassTag[Long] = ClassTag.Long
+}
+abstract class I4 extends I3 {
implicit val IntClassTag: ClassTag[Int] = ClassTag.Int
- implicit val ByteClassTag: ClassTag[Byte] = ClassTag.Byte
+}
+abstract class I5 extends I4 {
implicit val ShortClassTag: ClassTag[Short] = ClassTag.Short
+}
+abstract class I6 extends I5 {
+ implicit val ByteClassTag: ClassTag[Byte] = ClassTag.Byte
implicit val CharClassTag: ClassTag[Char] = ClassTag.Char
- implicit val LongClassTag: ClassTag[Long] = ClassTag.Long
- implicit val FloatClassTag: ClassTag[Float] = ClassTag.Float
- implicit val DoubleClassTag: ClassTag[Double] = ClassTag.Double
implicit val BooleanClassTag: ClassTag[Boolean] = ClassTag.Boolean
implicit val UnitClassTag: ClassTag[Unit] = ClassTag.Unit
implicit val NullClassTag: ClassTag[Null] = ClassTag.Null
+}
+
+/** implicits for ClassTag and TypeTag. Should be implemented with macros */
+object DottyPredef extends I6 {
+
+ /** ClassTags for final classes */
implicit val NothingClassTag: ClassTag[Nothing] = ClassTag.Nothing
}