summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEugene Burmako <xeno.by@gmail.com>2012-08-06 17:40:28 +0200
committerEugene Burmako <xeno.by@gmail.com>2012-08-06 23:09:32 +0200
commit3c4f4865f6420f98a7ed502257bc65387951e26c (patch)
tree745fe6e869edba8aa64661af6d6d5f5832c85c39
parent3aa221e28c3ae0381b876448e3174f0c527e9abc (diff)
downloadscala-3c4f4865f6420f98a7ed502257bc65387951e26c.tar.gz
scala-3c4f4865f6420f98a7ed502257bc65387951e26c.tar.bz2
scala-3c4f4865f6420f98a7ed502257bc65387951e26c.zip
SI-6181 method mirrors now support by-name args
Arguments provided in by-name positions are now automatically wrapped in Function0 instances by method mirrors.
-rw-r--r--src/reflect/scala/reflect/runtime/JavaMirrors.scala10
-rw-r--r--test/files/run/t6181.check1
-rw-r--r--test/files/run/t6181.scala8
3 files changed, 19 insertions, 0 deletions
diff --git a/src/reflect/scala/reflect/runtime/JavaMirrors.scala b/src/reflect/scala/reflect/runtime/JavaMirrors.scala
index 3a18c60720..1698e99dae 100644
--- a/src/reflect/scala/reflect/runtime/JavaMirrors.scala
+++ b/src/reflect/scala/reflect/runtime/JavaMirrors.scala
@@ -21,6 +21,7 @@ import internal.Flags._
import ReflectionUtils.{singletonInstance}
import language.existentials
import scala.runtime.{ScalaRunTime, BoxesRunTime}
+import scala.reflect.internal.util.Collections._
trait JavaMirrors extends internal.SymbolTable with api.JavaUniverse { self: SymbolTable =>
@@ -262,6 +263,7 @@ trait JavaMirrors extends internal.SymbolTable with api.JavaUniverse { self: Sym
// rather than have them on a hot path them in a unified implementation of the `apply` method
private def mkJavaMethodMirror[T: ClassTag](receiver: T, symbol: MethodSymbol): JavaMethodMirror = {
if (isMagicMethod(symbol)) new JavaMagicMethodMirror(receiver, symbol)
+ else if (symbol.params.flatten exists (p => isByNameParamType(p.info))) new JavaByNameMethodMirror(receiver, symbol)
else new JavaVanillaMethodMirror(receiver, symbol)
}
@@ -281,6 +283,14 @@ trait JavaMirrors extends internal.SymbolTable with api.JavaUniverse { self: Sym
def apply(args: Any*): Any = jmeth.invoke(receiver, args.asInstanceOf[Seq[AnyRef]]: _*)
}
+ private class JavaByNameMethodMirror(val receiver: Any, symbol: MethodSymbol)
+ extends JavaMethodMirror(symbol) {
+ def apply(args: Any*): Any = {
+ val transformed = map2(args.toList, symbol.params.flatten)((arg, param) => if (isByNameParamType(param.info)) () => arg else arg)
+ jmeth.invoke(receiver, transformed.asInstanceOf[Seq[AnyRef]]: _*)
+ }
+ }
+
private class JavaMagicMethodMirror[T: ClassTag](val receiver: T, symbol: MethodSymbol)
extends JavaMethodMirror(symbol) {
def apply(args: Any*): Any = {
diff --git a/test/files/run/t6181.check b/test/files/run/t6181.check
new file mode 100644
index 0000000000..d8263ee986
--- /dev/null
+++ b/test/files/run/t6181.check
@@ -0,0 +1 @@
+2 \ No newline at end of file
diff --git a/test/files/run/t6181.scala b/test/files/run/t6181.scala
new file mode 100644
index 0000000000..fb23eaff63
--- /dev/null
+++ b/test/files/run/t6181.scala
@@ -0,0 +1,8 @@
+import scala.reflect.runtime.universe._
+import scala.reflect.runtime.{currentMirror => cm}
+
+object Test extends App {
+ class C { def test(x: => Int) = println(x) }
+ val mm = cm.reflect(new C).reflectMethod(typeOf[C].member(newTermName("test")).asMethod)
+ mm(2)
+} \ No newline at end of file