diff options
author | Nicolas Stucki <nicolas.stucki@gmail.com> | 2016-08-25 09:57:18 +0200 |
---|---|---|
committer | Nicolas Stucki <nicolas.stucki@gmail.com> | 2016-09-05 13:47:51 +0200 |
commit | 390a44cdd0b3f43df0969368f62314d78a25c699 (patch) | |
tree | 0498cdbeff47946751e6ec451b9c3f6b89ede5cd /tests/run/applydynamic_sip.scala | |
parent | 34ef58008168d516d03599097ad1c6189d58a9c8 (diff) | |
download | dotty-390a44cdd0b3f43df0969368f62314d78a25c699.tar.gz dotty-390a44cdd0b3f43df0969368f62314d78a25c699.tar.bz2 dotty-390a44cdd0b3f43df0969368f62314d78a25c699.zip |
Fix #1474: Fix applies to applyDynamic.
Diffstat (limited to 'tests/run/applydynamic_sip.scala')
-rw-r--r-- | tests/run/applydynamic_sip.scala | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/tests/run/applydynamic_sip.scala b/tests/run/applydynamic_sip.scala new file mode 100644 index 000000000..7f81a644a --- /dev/null +++ b/tests/run/applydynamic_sip.scala @@ -0,0 +1,67 @@ +import scala.language.dynamics +object Test extends dotty.runtime.LegacyApp { + object stubUpdate { + def update(as: Any*) = println(".update"+as.toList.mkString("(",", ", ")")) + } + + object stub { + def apply = {println(".apply"); stubUpdate} + def apply(as: Any*) = println(".apply"+as.toList.mkString("(",", ", ")")) + def update(as: Any*) = println(".update"+as.toList.mkString("(",", ", ")")) + } + class MyDynamic extends Dynamic { + def applyDynamic[T](n: String)(as: Any*) = {println("qual.applyDynamic("+ n +")"+ as.toList.mkString("(",", ", ")")); stub} + def applyDynamicNamed[T](n: String)(as: (String, Any)*) = {println("qual.applyDynamicNamed("+ n +")"+ as.toList.mkString("(",", ", ")")); stub} + def selectDynamic[T](n: String) = {println("qual.selectDynamic("+ n +")"); stub} + def updateDynamic(n: String)(x: Any): Unit = {println("qual.updateDynamic("+ n +")("+ x +")")} + } + val qual = new MyDynamic + val expr = "expr" + val a = "a" + val a2 = "a2" + type T = String + + // If qual.sel is followed by a potential type argument list [Ts] and an argument list (arg1, …, argn) where none of the arguments argi are named: + // qual.applyDynamic(“sel”)(arg1, …, argn) + qual.sel() + qual.sel(a) + // qual.sel(a, a2: _*) -- should not accept varargs? + qual.sel(a)(a2) + qual.sel[T](a) + qual.sel[T](a)(a2) + + // If qual.sel is followed by a potential type argument list [Ts] + // and a non-empty named argument list (x1 = arg1, …, xn = argn) where some name prefixes xi = might be missing: + // qual.applyDynamicNamed(“sel”)(xs1 -> arg1, …, xsn -> argn) + qual.sel(arg = a) + qual.sel[T](arg = a) + qual.sel(a, arg2 = "a2") + // qual.sel(a)(a2, arg2 = "a2") + // qual.sel[T](a)(a2, arg2 = "a2") + // qual.sel(arg = a, a2: _*) + // qual.sel(arg, arg2 = "a2", a2: _*) + + // If qual.sel appears immediately on the left-hand side of an assigment + // qual.updateDynamic(“sel”)(expr) + qual.sel = expr + + // If qual.sel, possibly applied to type arguments, but is + // not applied to explicit value arguments, + // nor immediately followed by an assignment operator: + // qual.selectDynamic[Ts](“sel”) + qual.sel + qual.sel[T] + + qual.sel(1) = expr // parser turns this into qual.sel.update(1, expr) + qual.sel() = expr // parser turns this into qual.sel.update(expr) + qual.sel.apply(1) + qual.sel.apply(1) = 1 + + qual.apply(a) + qual.apply[String](a) + qual(a) + qual[String](a) + qual[T](arg = a) + qual(a, arg2 = "a2") + qual(a) = a2 +} |