From d193065827c40002de1e56c316eb026907536c17 Mon Sep 17 00:00:00 2001 From: Jason Zaugg Date: Fri, 23 Nov 2012 23:30:22 +0100 Subject: Explicitly prohibit await in nested methods. --- src/main/scala/scala/async/AsyncAnalysis.scala | 4 ++++ src/main/scala/scala/async/TransformUtils.scala | 4 ++++ src/test/scala/scala/async/TreeInterrogation.scala | 3 +-- src/test/scala/scala/async/neg/NakedAwait.scala | 10 ++++++++++ 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 + } + } } -- cgit v1.2.3