blob: 22e7bcd40a5e2a447456541f00cf986a6242bb77 (
plain) (
tree)
|
|
class A
class B extends A
class C {
def foo[T](x: T) = x
def foo(x: Int) = "a"
def foo(x: A) = x
}
object Test extends App {
val cm = reflect.runtime.currentMirror
val u = cm.universe
val c = new C
val im = cm.reflect(c)
val term = u.typeOf[C] member u.newTermName("foo") asTermSymbol
val f1 = term.resolveOverloaded(
posVargs = List(u.typeOf[Int]),
expected = u.typeOf[String]
)
val f2 = term.resolveOverloaded(
targs = List(u.typeOf[String]),
posVargs = List(u.typeOf[String]),
expected = u.typeOf[String]
)
val f3 = term.resolveOverloaded(
posVargs = List(u.typeOf[A]),
expected = u.typeOf[A]
)
val f4 = term.resolveOverloaded(
targs = List(u.typeOf[A]),
posVargs = List(u.typeOf[A]),
expected = u.typeOf[A]
)
val f5 = term.resolveOverloaded(
targs = List(u.typeOf[B]),
posVargs = List(u.typeOf[B]),
expected = u.typeOf[B]
)
val f6 = term.resolveOverloaded(
targs = List(u.typeOf[B]),
posVargs = List(u.typeOf[B]),
expected = u.typeOf[A]
)
val f7 = term.resolveOverloaded(
targs = List(u.typeOf[A]),
posVargs = List(u.typeOf[B]),
expected = u.typeOf[A]
)
val m1 = im.reflectMethod(f1 asMethodSymbol)
val m2 = im.reflectMethod(f2 asMethodSymbol)
val m3 = im.reflectMethod(f3 asMethodSymbol)
val m4 = im.reflectMethod(f4 asMethodSymbol)
val m5 = im.reflectMethod(f5 asMethodSymbol)
val m6 = im.reflectMethod(f6 asMethodSymbol)
val m7 = im.reflectMethod(f7 asMethodSymbol)
val a = new A
val b = new B
assert(m1(2) == (c.foo(2): String))
assert(m2("xyz") == (c.foo[String]("xyz"): String))
assert(m3(a) == (c.foo(a): A))
assert(m4(a) == (c.foo[A](a): A))
assert(m5(b) == (c.foo[B](b): B))
assert(m6(b) == (c.foo[B](b): A))
assert(m7(b) == (c.foo[A](b): A))
}
|