diff options
Diffstat (limited to 'test')
-rw-r--r-- | test/files/pos/typerep-stephane.scala | 48 | ||||
-rw-r--r-- | test/files/pos/typerep.scala | 21 | ||||
-rw-r--r-- | test/files/run/t091.check | 1 | ||||
-rw-r--r-- | test/files/run/t091.scala | 13 |
4 files changed, 83 insertions, 0 deletions
diff --git a/test/files/pos/typerep-stephane.scala b/test/files/pos/typerep-stephane.scala new file mode 100644 index 0000000000..1061212369 --- /dev/null +++ b/test/files/pos/typerep-stephane.scala @@ -0,0 +1,48 @@ +object typerep { + + class TypeRep[T] { + def getType: TypeRep[T] = this + } + + object BooleanRep extends TypeRep[Boolean] { + override def toString = "Boolean" + } + object CharRep extends TypeRep[Char] { + override def toString = "Char" + } + object IntRep extends TypeRep[Int] { + override def toString = "Int" + } + object LongRep extends TypeRep[Long] { + override def toString = "Long" + } + object FloatRep extends TypeRep[Float] { + override def toString = "Float" + } + object DoubleRep extends TypeRep[Double] { + override def toString = "Double" + } + class ListRep[U, T <: List[U]](val elemRep: TypeRep[U]) extends TypeRep[T] { + override def toString = "List[" + elemRep + "]" + } + + implicit def typeRep(x: Boolean): TypeRep[Boolean] = BooleanRep + implicit def typeRep(x: Char ): TypeRep[Char ] = CharRep + implicit def typeRep(x: Long ): TypeRep[Long ] = LongRep + implicit def typeRep(x: Float ): TypeRep[Float ] = FloatRep + implicit def typeRep(x: Double ): TypeRep[Double ] = DoubleRep + implicit def typeRep(x: Int ): TypeRep[Int ] = IntRep +/* + implicit def typeRep[T](xs: List[T])(implicit rep: T => TypeRep[T]): TypeRep[List[T]] = + new ListRep(rep(xs.head)) +*/ + implicit def typeRep[T <% TypeRep[T]](xs: List[T]): TypeRep[List[T]] = + new ListRep(xs.head) + +} + +object test extends Application { + import typerep._ + println(3.getType) + println(List(3).getType) +} diff --git a/test/files/pos/typerep.scala b/test/files/pos/typerep.scala new file mode 100644 index 0000000000..7faa8a1928 --- /dev/null +++ b/test/files/pos/typerep.scala @@ -0,0 +1,21 @@ +object typerep extends Application { + class TypeRep[T] {} + case object IntRep extends TypeRep[Int] { + override def toString = "Int" + } + case object BooleanRep extends TypeRep[Boolean] { + override def toString = "Boolean" + } + case class ListRep[T](elemrep: TypeRep[T]) extends TypeRep[List[T]] { + override def toString = "List" + } + + implicit def intRep: TypeRep[Int] = IntRep + implicit def booleanRep: TypeRep[Boolean] = BooleanRep + implicit def listRep[T](implicit elemrep: TypeRep[T]): TypeRep[List[T]] = ListRep(elemrep) + + def getType[T](x: T)(implicit rep: TypeRep[T]): TypeRep[T] = rep + + println(getType(1)) + println(getType(List(1))) +} diff --git a/test/files/run/t091.check b/test/files/run/t091.check new file mode 100644 index 0000000000..7ed6ff82de --- /dev/null +++ b/test/files/run/t091.check @@ -0,0 +1 @@ +5 diff --git a/test/files/run/t091.scala b/test/files/run/t091.scala new file mode 100644 index 0000000000..eaddde0dbf --- /dev/null +++ b/test/files/run/t091.scala @@ -0,0 +1,13 @@ +trait A { def x : Int } +trait B { val m : A } +object C extends B { + object m extends A { def x = 5 } +} +object Test { + // The type annotation here is necessary, otherwise + // the compiler would reference C$m$ directly. + def o : B = C + def main(argv : Array[String]) : Unit = { + println(o.m.x) + } +} |