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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
|
import scala.reflect.runtime.universe._
import scala.reflect.runtime.{currentMirror => cm}
import scala.language.reflectiveCalls
class Y[T](val i: T) extends AnyVal {
override def toString = s"Y($i)"
}
class Z[T](val i: T) extends AnyRef {
override def toString = s"Z($i)"
}
object a {
def yg_1[T](y: Y[T]) = y.i
def yi_2(y: Y[Int]) = y.i
def ys_3(y: Y[String]) = y.i
def ya_4(ys: Array[Y[String]]) = ys.toList.map(_.i)
def yl_5(ys: List[Y[String]]) = ys.map(_.i)
def yv_6(ys: Y[String]*) = ys.toList.map(_.i)
def yni_7(y: => Y[Int]) = y.i
def yns_8(y: => Y[String]) = y.i
def zg_1[T](z: Z[T]) = z.i
def zi_2(z: Z[Int]) = z.i
def zs_3(z: Z[String]) = z.i
def za_4(zs: Array[Z[String]]) = zs.toList.map(_.i)
def zl_5(zs: List[Z[String]]) = zs.map(_.i)
def zv_6(zs: Z[String]*) = zs.toList.map(_.i)
def zni_7(z: => Z[Int]) = z.i
def zns_8(z: => Z[String]) = z.i
}
object Test extends App {
def test(methName: String, arg: Any) = {
val moduleA = cm.reflect(a)
val msym = moduleA.symbol.typeSignature.declaration(TermName(methName)).asMethod
println(s"meth = $msym")
val mmirror = moduleA.reflectMethod(msym)
val mresult =
try { mmirror(arg) }
catch {
case ex: Exception =>
val ex1 = scala.reflect.runtime.ReflectionUtils.unwrapThrowable(ex)
s"${ex1.getClass}: ${ex1.getMessage}"
}
println(s"as seen by Scala reflection: ${msym.asInstanceOf[scala.reflect.internal.Symbols#Symbol].defString}")
println(s"as seen by Java reflection: ${mmirror.asInstanceOf[{val jmeth: java.lang.reflect.Method}].jmeth}")
println(s"result = $mresult")
}
test("yg_1", new Y(1))
test("yg_1", new Y("1"))
test("yi_2", new Y(2))
test("yi_2", new Y("2"))
test("ys_3", new Y(3))
test("ys_3", new Y("3"))
test("ya_4", Array(new Y(4)))
test("ya_4", Array(new Y("4")))
test("yl_5", List(new Y(5)))
test("yl_5", List(new Y("5")))
// FIXME: disabled because of SI-7056
// test("yv_6", new Y(6))
// test("yv_6", new Y("6"))
test("yni_7", new Y(7))
test("yns_8", new Y("8"))
test("zg_1", new Z(1))
test("zg_1", new Z("1"))
test("zi_2", new Z(2))
test("zi_2", new Z("2"))
test("zs_3", new Z(3))
test("zs_3", new Z("3"))
test("za_4", Array(new Z(4)))
test("za_4", Array(new Z("4")))
test("zl_5", List(new Z(5)))
test("zl_5", List(new Z("5")))
// FIXME: disabled because of SI-7056
// test("zv_6", new Z(6))
// test("zv_6", new Z("6"))
test("zni_7", new Z(7))
test("zns_8", new Z("8"))
}
|