blob: 16735eab4f7bb0618762f6fc5736841fbfffb4df (
plain) (
tree)
|
|
import scala.reflect.runtime.universe._
object Test {
trait ToS { final override def toString = getClass.getName }
def f1 = { case class Bar() extends ToS; Bar }
def f2 = { case class Bar() extends ToS; Bar() }
def f3 = { class Bar() extends ToS; object Bar extends ToS; Bar }
def f4 = { class Bar() extends ToS; new Bar() }
def f5 = { object Bar extends ToS; Bar }
def f6 = { () => { object Bar extends ToS ; Bar } }
def f7 = { val f = { () => { object Bar extends ToS ; Bar } } ; f }
def f8 = { trait A ; trait B extends A ; class C extends B with ToS; new C { } }
def f9 = { trait A ; trait B ; class C extends B with A with ToS; new C { } }
def f10 = { class A { type T1 } ; List[A#T1]() }
def f11 = { abstract class A extends Seq[Int] ; List[A]() }
def f12 = { abstract class A extends Seq[U forSome { type U <: Int }] ; List[A]() }
val g1 = { case class Bar() extends ToS; Bar }
val g2 = { case class Bar() extends ToS; Bar() }
val g3 = { class Bar() extends ToS; object Bar extends ToS; Bar }
val g4 = { class Bar() extends ToS; new Bar() }
val g5 = { object Bar extends ToS; Bar }
val g6 = { () => { object Bar extends ToS ; Bar } }
val g7 = { val f = { () => { object Bar extends ToS ; Bar } } ; f }
val g8 = { trait A ; trait B extends A ; class C extends B with ToS; new C { } }
val g9 = { trait A ; trait B ; class C extends B with A with ToS; new C { } }
val g10 = { class A { type T1 } ; List[A#T1]() }
val g11 = { abstract class A extends Seq[Int] ; List[A]() }
val g12 = { abstract class A extends Seq[U forSome { type U <: Int }] ; List[A]() }
def printTpe(t: Type) = {
val s = if (t.typeSymbol.isFreeType) t.typeSymbol.typeSignature.toString else t.typeSymbol.toString
println("%s, t=%s, s=%s".format(t, t.asInstanceOf[Product].productPrefix, s))
}
def m[T: TypeTag](x: T) = printTpe(typeOf[T])
def m2[T: AbsTypeTag](x: T) = printTpe(implicitly[AbsTypeTag[T]].tpe)
// tags do work for f10/g10
def main(args: Array[String]): Unit = {
m(f1)
m(f2)
m(f3)
m(f4)
m(f5)
m(f6)
m(f7)
m(f8)
m(f9)
m2(f10)
m(f11)
m(f12)
m(g1)
m(g2)
m(g3)
m(g4)
m(g5)
m(g6)
m(g7)
m(g8)
m(g9)
m2(g10)
m(g11)
m(g12)
}
}
object Misc {
trait Bippy { def bippy = "I'm Bippy!" }
object o1 {
def f1 = { trait A extends Seq[U forSome { type U <: Bippy }] ; abstract class B extends A ; trait C extends B ; (null: C) }
def f2 = f1.head.bippy
}
def g1 = o1.f1 _
def g2 = o1.f2 _
}
|