From be275dcf295f0addf8d41c9a3b4cfe2acaadfaa4 Mon Sep 17 00:00:00 2001 From: Jason Zaugg Date: Mon, 26 Nov 2012 14:05:04 +0100 Subject: Rewrite the state machine to a class, rather than an object. To avoid suprises in tree retyping, the instance of this class is immediately upcase to StateMachine[Promise[T], ExecContext]. Allow nested non-case classes. These pop up when we use nested async calls. Only look for duplicate names in the subtrees traversed by AsyncTraverser. --- src/test/scala/scala/async/TreeInterrogation.scala | 14 ++++- .../scala/scala/async/neg/LocalClasses0Spec.scala | 12 ++-- .../scala/scala/async/run/hygiene/Hygiene.scala | 70 +++++----------------- 3 files changed, 33 insertions(+), 63 deletions(-) (limited to 'src/test') diff --git a/src/test/scala/scala/async/TreeInterrogation.scala b/src/test/scala/scala/async/TreeInterrogation.scala index 14749ca..9a31337 100644 --- a/src/test/scala/scala/async/TreeInterrogation.scala +++ b/src/test/scala/scala/async/TreeInterrogation.scala @@ -57,11 +57,21 @@ object TreeInterrogation extends App { val tb = mkToolbox("-cp target/scala-2.10/classes -Xprint:all") val tree = tb.parse( """ import _root_.scala.async.AsyncId._ - | async { val a = 0; val x = await(a) - 1; def foo(z: Any) = (a.toDouble, x.toDouble, z); foo(await(2)) } + | val state = 23 + | val result: Any = "result" + | def resume(): Any = "resume" + | val res = async { + | val f1 = async { state + 2 } + | val x = await(f1) + | val y = await(async { result }) + | val z = await(async { resume() }) + | (x, y, z) + | } + | () | """.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/LocalClasses0Spec.scala b/src/test/scala/scala/async/neg/LocalClasses0Spec.scala index 06a0e71..2569303 100644 --- a/src/test/scala/scala/async/neg/LocalClasses0Spec.scala +++ b/src/test/scala/scala/async/neg/LocalClasses0Spec.scala @@ -18,7 +18,7 @@ class LocalClasses0Spec { @Test def `reject a local class`() { - expectError("Local class Person illegal within `async` block", "-cp target/scala-2.10/classes -deprecation -Xfatal-warnings") { + expectError("Local case class Person illegal within `async` block") { """ | import scala.concurrent.ExecutionContext.Implicits.global | import scala.async.Async._ @@ -32,7 +32,7 @@ class LocalClasses0Spec { @Test def `reject a local class 2`() { - expectError("Local class Person illegal within `async` block", "-cp target/scala-2.10/classes -deprecation -Xfatal-warnings") { + expectError("Local case class Person illegal within `async` block") { """ | import scala.concurrent.{Future, ExecutionContext} | import ExecutionContext.Implicits.global @@ -50,7 +50,7 @@ class LocalClasses0Spec { @Test def `reject a local class 3`() { - expectError("Local class Person illegal within `async` block", "-cp target/scala-2.10/classes -deprecation -Xfatal-warnings") { + expectError("Local case class Person illegal within `async` block") { """ | import scala.concurrent.{Future, ExecutionContext} | import ExecutionContext.Implicits.global @@ -68,7 +68,7 @@ class LocalClasses0Spec { @Test def `reject a local class with symbols in its name`() { - expectError("Local class :: illegal within `async` block", "-cp target/scala-2.10/classes -deprecation -Xfatal-warnings") { + expectError("Local case class :: illegal within `async` block") { """ | import scala.concurrent.{Future, ExecutionContext} | import ExecutionContext.Implicits.global @@ -86,7 +86,7 @@ class LocalClasses0Spec { @Test def `reject a nested local class`() { - expectError("Local class Person illegal within `async` block", "-cp target/scala-2.10/classes -deprecation -Xfatal-warnings") { + expectError("Local case class Person illegal within `async` block") { """ | import scala.concurrent.{Future, ExecutionContext} | import ExecutionContext.Implicits.global @@ -110,7 +110,7 @@ class LocalClasses0Spec { @Test def `reject a local singleton object`() { - expectError("Local object Person illegal within `async` block", "-cp target/scala-2.10/classes -deprecation -Xfatal-warnings") { + expectError("Local object Person illegal within `async` block") { """ | import scala.concurrent.ExecutionContext.Implicits.global | import scala.async.Async._ diff --git a/src/test/scala/scala/async/run/hygiene/Hygiene.scala b/src/test/scala/scala/async/run/hygiene/Hygiene.scala index bb28d5b..5306ecc 100644 --- a/src/test/scala/scala/async/run/hygiene/Hygiene.scala +++ b/src/test/scala/scala/async/run/hygiene/Hygiene.scala @@ -30,28 +30,6 @@ class HygieneSpec { res mustBe ((25, "result", "resume")) } -/* TODO: -[error] /Users/phaller/git/async/src/test/scala/scala/async/run/hygiene/Hygiene.scala:52: not found: value tr$1 -[error] val f1 = async { state + 2 } -[error] ^ - @Test - def `is hygenic`() { - val state = 23 - val result: Any = "result" - def resume(): Any = "resume" - val res = async { - val f1 = async { state + 2 } - val x = await(f1) - val y = await(async { result }) - val z = await(async { resume() }) - (x, y, z) - } - res._1 mustBe (25) - res._2 mustBe ("result") - res._3 mustBe ("resume") - } -*/ - @Test def `external var as result of await`() { var ext = 0 @@ -88,39 +66,21 @@ class HygieneSpec { ext mustBe (14) } - trait T1 { - def blerg = 0 - } - - object O1 extends T1 { - override def blerg = 1 - - def check() { - val blerg = 3 - AsyncId.async { - assert(this == O1, this.getClass) - assert(this.blerg == 1) - assert(super.blerg == 0) - assert(super[T1].blerg == 0) - } - } - } - - @Test def `this reference is maintained`() { - O1.check() - } - - @Test def `this reference is maintained to local class`() { - object O2 { - def blerg = 2 - - def check() { - AsyncId.async { - assert(this.blerg == 2) - assert(this == O2, this.getClass) - } - } + @Test + def `is hygenic nested`() { + val state = 23 + val result: Any = "result" + def resume(): Any = "resume" + import AsyncId.{await, async} + val res = async { + val f1 = async { state + 2 } + val x = await(f1) + val y = await(async { result }) + val z = await(async { resume() }) + (x, y, z) } - O2.check() + res._1 mustBe (25) + res._2 mustBe ("result") + res._3 mustBe ("resume") } } -- cgit v1.2.3