diff options
author | Martin Odersky <odersky@gmail.com> | 2015-06-18 15:07:25 +0200 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2015-06-22 11:40:20 +0200 |
commit | 204158d4141254d1148534e14d3d26b361b7bc12 (patch) | |
tree | c296fd0202c69961b2f7eea7ec6ccb1efc284a13 /src | |
parent | 131ab5c1261608715cf2fde3aa44a04777cbda64 (diff) | |
download | dotty-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.
Diffstat (limited to 'src')
-rw-r--r-- | src/dotty/DottyPredef.scala | 30 |
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 } |