From a5cab2959067bc7f9d3884064fbf7bf7ec0b7285 Mon Sep 17 00:00:00 2001 From: Jason Zaugg Date: Sun, 25 Nov 2012 09:52:02 +0100 Subject: Extract vals for all names bound in a pattern. These gives us something to lift to vars to be accessed from multiple states of the state machine. Fixes #35 --- src/test/scala/scala/async/TreeInterrogation.scala | 52 ++++++++++------------ src/test/scala/scala/async/run/match0/Match0.scala | 31 +++++++++++++ 2 files changed, 55 insertions(+), 28 deletions(-) (limited to 'src/test') diff --git a/src/test/scala/scala/async/TreeInterrogation.scala b/src/test/scala/scala/async/TreeInterrogation.scala index dd239a3..f005b8a 100644 --- a/src/test/scala/scala/async/TreeInterrogation.scala +++ b/src/test/scala/scala/async/TreeInterrogation.scala @@ -38,33 +38,29 @@ class TreeInterrogation { } varDefs.map(_.decoded).toSet mustBe (Set("state$async", "onCompleteHandler$async", "await$1", "await$2")) } +} - //@Test - def sandbox() { - sys.props("scala.async.debug") = true.toString - sys.props("scala.async.trace") = false.toString +object TreeInterrogation extends App { + sys.props("scala.async.debug") = true.toString + sys.props("scala.async.trace") = true.toString - val cm = reflect.runtime.currentMirror - val tb = mkToolbox("-cp target/scala-2.10/classes") - val tree = tb.parse( - """ import _root_.scala.async.AsyncId._ - | async { - | var sum = 0 - | var i = 0 - | while (i < 5) { - | var j = 0 - | while (j < 5) { - | sum += await(i) * await(j) - | j += 1 - | } - | i += 1 - | } - | sum - | } - | """.stripMargin) - println(tree) - val tree1 = tb.typeCheck(tree.duplicate) - println(cm.universe.show(tree1)) - println(tb.eval(tree)) - } -} + val cm = reflect.runtime.currentMirror + val tb = mkToolbox("-cp target/scala-2.10/classes -Xprint:all") + val tree = tb.parse( + """ import _root_.scala.async.AsyncId._ + | async { + | val x = 1 + | Option(x) match { + | case op @ Some(x) => + | assert(op != null) + | println((op, x)) + | x + await(x) + | case None => await(0) + | } + | } + | """.stripMargin) + println(tree) + val tree1 = tb.typeCheck(tree.duplicate) + println(cm.universe.show(tree1)) + println(tb.eval(tree)) +} \ No newline at end of file diff --git a/src/test/scala/scala/async/run/match0/Match0.scala b/src/test/scala/scala/async/run/match0/Match0.scala index f550a69..5237629 100644 --- a/src/test/scala/scala/async/run/match0/Match0.scala +++ b/src/test/scala/scala/async/run/match0/Match0.scala @@ -69,4 +69,35 @@ class MatchSpec { val res = Await.result(fut, 2 seconds) res mustBe (5) } + + @Test def `support await in a match expression with binds`() { + val result = AsyncId.async { + val x = 1 + Option(x) match { + case op @ Some(x) => + assert(op == Some(1)) + x + AsyncId.await(x) + case None => AsyncId.await(0) + } + } + result mustBe (2) + } + + @Test def `support await referring to pattern matching vals`() { + import AsyncId.{async, await} + val result = async { + val x = 1 + val opt = Some("") + await(0) + val o @ Some(y) = opt + + { + val o @ Some(y) = Some(".") + } + + await(0) + await((o, y.isEmpty)) + } + result mustBe ((Some(""), true)) + } } -- cgit v1.2.3