summaryrefslogtreecommitdiff
path: root/test/files/run/reflect-resolveoverload-expected.scala
blob: 1378090309a18cd23321a4769f48abfb3df57576 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
class A {
  override def equals(x: Any) = {
    x.isInstanceOf[A] && !x.isInstanceOf[B]
  }
}
class B extends A {
  override def equals(x: Any) = {
    x.isInstanceOf[B]
  }
}

class C {
   def a(x: String) = 1
   def a(x: Array[_]) = "a"
   def b(x: String) = new A
   def b(x: Array[_]) = new B
   def c(x: String) = new B
   def c(x: Array[_]) = "a"
}

object Test extends App {
  val cm = reflect.runtime.currentMirror
  val u = cm.universe
  val c = new C
  val im = cm.reflect(c)
  def invoke(s: String, expectedType: u.Type, expectedResult: Any) {
    val ol = (u.typeOf[C] member u.newTermName(s)).asTermSymbol
    val methodSym = ol.resolveOverloaded(posVargs = List(u.typeOf[Null]), expected = expectedType).asMethodSymbol
    val sig = methodSym.typeSignature.asInstanceOf[u.MethodType]
    val method = im.reflectMethod(methodSym)
    assert(method(null) == expectedResult)
  }

  invoke("a", u.typeOf[Int], c.a(null): Int)
  invoke("a", u.typeOf[String], c.a(null): String)
  invoke("b", u.typeOf[B], c.b(null): B)
  invoke("c", u.typeOf[A], c.c(null): A)
  invoke("c", u.typeOf[A], c.c(null): A)
  invoke("c", u.typeOf[B], c.c(null): B)
  invoke("c", u.typeOf[String], c.c(null): String)

}