aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Zaugg <jzaugg@gmail.com>2012-11-23 23:30:22 +0100
committerJason Zaugg <jzaugg@gmail.com>2012-11-23 23:30:22 +0100
commitd193065827c40002de1e56c316eb026907536c17 (patch)
tree258edc000ec085e3888d04a812440200badc4718
parent7253b5e7a62e0e255a3fece591b7b5991a24d3a9 (diff)
downloadscala-async-d193065827c40002de1e56c316eb026907536c17.tar.gz
scala-async-d193065827c40002de1e56c316eb026907536c17.tar.bz2
scala-async-d193065827c40002de1e56c316eb026907536c17.zip
Explicitly prohibit await in nested methods.
-rw-r--r--src/main/scala/scala/async/AsyncAnalysis.scala4
-rw-r--r--src/main/scala/scala/async/TransformUtils.scala4
-rw-r--r--src/test/scala/scala/async/TreeInterrogation.scala3
-rw-r--r--src/test/scala/scala/async/neg/NakedAwait.scala10
4 files changed, 19 insertions, 2 deletions
diff --git a/src/main/scala/scala/async/AsyncAnalysis.scala b/src/main/scala/scala/async/AsyncAnalysis.scala
index 9e24130..38fd22f 100644
--- a/src/main/scala/scala/async/AsyncAnalysis.scala
+++ b/src/main/scala/scala/async/AsyncAnalysis.scala
@@ -45,6 +45,10 @@ private[async] final case class AsyncAnalysis[C <: Context](override val c: C) e
}
}
+ override def nestedMethod(module: DefDef) {
+ reportUnsupportedAwait(module, "nested method")
+ }
+
override def byNameArgument(arg: Tree) {
reportUnsupportedAwait(arg, "by-name argument")
}
diff --git a/src/main/scala/scala/async/TransformUtils.scala b/src/main/scala/scala/async/TransformUtils.scala
index e37f66d..5095875 100644
--- a/src/main/scala/scala/async/TransformUtils.scala
+++ b/src/main/scala/scala/async/TransformUtils.scala
@@ -37,6 +37,9 @@ class TransformUtils[C <: Context](val c: C) {
def nestedModule(module: ModuleDef) {
}
+ def nestedMethod(module: DefDef) {
+ }
+
def byNameArgument(arg: Tree) {
}
@@ -47,6 +50,7 @@ class TransformUtils[C <: Context](val c: C) {
tree match {
case cd: ClassDef => nestedClass(cd)
case md: ModuleDef => nestedModule(md)
+ case dd: DefDef => nestedMethod(dd)
case fun: Function => function(fun)
case Apply(fun, args) =>
val isInByName = isByName(fun)
diff --git a/src/test/scala/scala/async/TreeInterrogation.scala b/src/test/scala/scala/async/TreeInterrogation.scala
index 1212045..08d2c78 100644
--- a/src/test/scala/scala/async/TreeInterrogation.scala
+++ b/src/test/scala/scala/async/TreeInterrogation.scala
@@ -35,8 +35,7 @@ class TreeInterrogation {
varDefs.map(_.decoded).toSet mustBe(Set("state$async", "onCompleteHandler$async", "await$1", "await$2"))
}
-
- //@Test
+ @Test
def sandbox() {
sys.props("scala.async.debug") = "true"
val cm = reflect.runtime.currentMirror
diff --git a/src/test/scala/scala/async/neg/NakedAwait.scala b/src/test/scala/scala/async/neg/NakedAwait.scala
index a0c4e4d..61490e2 100644
--- a/src/test/scala/scala/async/neg/NakedAwait.scala
+++ b/src/test/scala/scala/async/neg/NakedAwait.scala
@@ -117,4 +117,14 @@ class NakedAwait {
""".stripMargin
}
}
+
+ @Test
+ def nestedMethod() {
+ expectError("await must not be used under a nested method.") {
+ """
+ | import _root_.scala.async.AsyncId._
+ | async { def foo = await(false) }
+ """.stripMargin
+ }
+ }
}