diff options
author | Jason Zaugg <jzaugg@gmail.com> | 2012-11-25 11:51:34 +0100 |
---|---|---|
committer | Jason Zaugg <jzaugg@gmail.com> | 2012-11-26 16:13:42 +0100 |
commit | 26038aebf1555b582dba35e8bfc3698f126705c5 (patch) | |
tree | 89517670afcf4ff41648bddecf41603661a111dc /src/test | |
parent | a5cab2959067bc7f9d3884064fbf7bf7ec0b7285 (diff) | |
download | scala-async-26038aebf1555b582dba35e8bfc3698f126705c5.tar.gz scala-async-26038aebf1555b582dba35e8bfc3698f126705c5.tar.bz2 scala-async-26038aebf1555b582dba35e8bfc3698f126705c5.zip |
Fix await in if condition / match scrutinee.
The type-checking performed in ANF transform is
precarious, and needed to use the original condition/
scrutinee in a throwaway tree to get things to work.
Diffstat (limited to 'src/test')
-rw-r--r-- | src/test/scala/scala/async/TreeInterrogation.scala | 44 | ||||
-rw-r--r-- | src/test/scala/scala/async/neg/NakedAwait.scala | 11 | ||||
-rw-r--r-- | src/test/scala/scala/async/run/ifelse0/IfElse0.scala | 8 | ||||
-rw-r--r-- | src/test/scala/scala/async/run/match0/Match0.scala | 12 |
4 files changed, 43 insertions, 32 deletions
diff --git a/src/test/scala/scala/async/TreeInterrogation.scala b/src/test/scala/scala/async/TreeInterrogation.scala index f005b8a..e3012c7 100644 --- a/src/test/scala/scala/async/TreeInterrogation.scala +++ b/src/test/scala/scala/async/TreeInterrogation.scala @@ -41,26 +41,28 @@ class TreeInterrogation { } object TreeInterrogation extends App { - sys.props("scala.async.debug") = true.toString - sys.props("scala.async.trace") = true.toString + def withDebug[T](t: => T) { + AsyncUtils.trace = true + AsyncUtils.verbose = true + try t + finally { + AsyncUtils.trace = false + AsyncUtils.verbose = false + } + } - 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)) + withDebug { + 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 { + | await(0) match { case _ => 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/neg/NakedAwait.scala b/src/test/scala/scala/async/neg/NakedAwait.scala index f4cfca2..ecc84f9 100644 --- a/src/test/scala/scala/async/neg/NakedAwait.scala +++ b/src/test/scala/scala/async/neg/NakedAwait.scala @@ -143,15 +143,4 @@ class NakedAwait { |""".stripMargin } } - - // TODO Anf transform if to have a simple condition. - @Test - def ifCondition() { - expectError("await must not be used under a condition.") { - """ - | import _root_.scala.async.AsyncId._ - | async { if (await(true)) () } - |""".stripMargin - } - } } diff --git a/src/test/scala/scala/async/run/ifelse0/IfElse0.scala b/src/test/scala/scala/async/run/ifelse0/IfElse0.scala index 0a72f1e..e2b1ca6 100644 --- a/src/test/scala/scala/async/run/ifelse0/IfElse0.scala +++ b/src/test/scala/scala/async/run/ifelse0/IfElse0.scala @@ -47,4 +47,12 @@ class IfElseSpec { val res = Await.result(fut, 2 seconds) res mustBe (14) } + + @Test def `await in condition`() { + import AsyncId.{async, await} + val result = async { + if ({await(true); await(true)}) await(1) else ??? + } + result mustBe (1) + } } diff --git a/src/test/scala/scala/async/run/match0/Match0.scala b/src/test/scala/scala/async/run/match0/Match0.scala index 5237629..8263e72 100644 --- a/src/test/scala/scala/async/run/match0/Match0.scala +++ b/src/test/scala/scala/async/run/match0/Match0.scala @@ -100,4 +100,16 @@ class MatchSpec { } result mustBe ((Some(""), true)) } + + @Test def `await in scrutinee`() { + import AsyncId.{async, await} + val result = async { + await(if ("".isEmpty) await(1) else ???) match { + case x if x < 0 => ??? + case y: Int => y * await(3) + case _ => ??? + } + } + result mustBe (3) + } } |