From 390a44cdd0b3f43df0969368f62314d78a25c699 Mon Sep 17 00:00:00 2001 From: Nicolas Stucki Date: Thu, 25 Aug 2016 09:57:18 +0200 Subject: Fix #1474: Fix applies to applyDynamic. --- tests/run/applydynamic_sip.check | 29 +++++++++++++++++ tests/run/applydynamic_sip.flags | 2 ++ tests/run/applydynamic_sip.scala | 67 ++++++++++++++++++++++++++++++++++++++++ tests/run/t6353.check | 1 + tests/run/t6353.scala | 12 +++++++ 5 files changed, 111 insertions(+) create mode 100644 tests/run/applydynamic_sip.check create mode 100644 tests/run/applydynamic_sip.flags create mode 100644 tests/run/applydynamic_sip.scala create mode 100644 tests/run/t6353.check create mode 100644 tests/run/t6353.scala (limited to 'tests/run') diff --git a/tests/run/applydynamic_sip.check b/tests/run/applydynamic_sip.check new file mode 100644 index 000000000..6d04dc452 --- /dev/null +++ b/tests/run/applydynamic_sip.check @@ -0,0 +1,29 @@ +qual.applyDynamic(sel)() +qual.applyDynamic(sel)(a) +qual.applyDynamic(sel)(a) +.apply(a2) +qual.applyDynamic(sel)(a) +qual.applyDynamic(sel)(a) +.apply(a2) +qual.applyDynamicNamed(sel)((arg,a)) +qual.applyDynamicNamed(sel)((arg,a)) +qual.applyDynamicNamed(sel)((,a), (arg2,a2)) +qual.updateDynamic(sel)(expr) +qual.selectDynamic(sel) +qual.selectDynamic(sel) +qual.selectDynamic(sel) +.update(1, expr) +qual.selectDynamic(sel) +.update(expr) +qual.selectDynamic(sel) +.apply(1) +qual.selectDynamic(sel) +.apply +.update(1, 1) +qual.applyDynamic(apply)(a) +qual.applyDynamic(apply)(a) +qual.applyDynamic(apply)(a) +qual.applyDynamic(apply)(a) +qual.applyDynamicNamed(apply)((arg,a)) +qual.applyDynamicNamed(apply)((,a), (arg2,a2)) +qual.applyDynamic(update)(a, a2) diff --git a/tests/run/applydynamic_sip.flags b/tests/run/applydynamic_sip.flags new file mode 100644 index 000000000..ba6d37305 --- /dev/null +++ b/tests/run/applydynamic_sip.flags @@ -0,0 +1,2 @@ +-Yrangepos:false +-language:dynamics 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 +} diff --git a/tests/run/t6353.check b/tests/run/t6353.check new file mode 100644 index 000000000..5676bed24 --- /dev/null +++ b/tests/run/t6353.check @@ -0,0 +1 @@ +applyDynamic(apply)(9) diff --git a/tests/run/t6353.scala b/tests/run/t6353.scala new file mode 100644 index 000000000..7077eaeda --- /dev/null +++ b/tests/run/t6353.scala @@ -0,0 +1,12 @@ +import language.dynamics + +object Test extends dotty.runtime.LegacyApp { + val x = new X(3) + val y = x(9) + class X(i: Int) extends Dynamic { + def applyDynamic(name: String)(in: Int): Int = { + println(s"applyDynamic($name)($in)") + i + in + } + } +} -- cgit v1.2.3