diff options
author | Jason Zaugg <jzaugg@gmail.com> | 2012-11-23 17:35:52 +0100 |
---|---|---|
committer | Jason Zaugg <jzaugg@gmail.com> | 2012-11-23 17:35:52 +0100 |
commit | f9c25fc4acac6a5965d68584d68eee7539e4ba45 (patch) | |
tree | 2d2ae102e229b6997db7c4cd1fb7c4b16378ec7a | |
parent | 73ab189dcb45bccc0ba6e2e0d445b08057391496 (diff) | |
download | scala-async-f9c25fc4acac6a5965d68584d68eee7539e4ba45.tar.gz scala-async-f9c25fc4acac6a5965d68584d68eee7539e4ba45.tar.bz2 scala-async-f9c25fc4acac6a5965d68584d68eee7539e4ba45.zip |
Forbid await in try/catch.
-rw-r--r-- | src/main/scala/scala/async/AsyncAnalysis.scala | 10 | ||||
-rw-r--r-- | src/test/scala/scala/async/neg/NakedAwait.scala | 30 |
2 files changed, 40 insertions, 0 deletions
diff --git a/src/main/scala/scala/async/AsyncAnalysis.scala b/src/main/scala/scala/async/AsyncAnalysis.scala index 35d2854..c160776 100644 --- a/src/main/scala/scala/async/AsyncAnalysis.scala +++ b/src/main/scala/scala/async/AsyncAnalysis.scala @@ -53,6 +53,16 @@ private[async] final case class AsyncAnalysis[C <: Context](override val c: C) e reportUnsupportedAwait(function, "nested function") } + override def traverse(tree: Tree) { + def containsAwait = tree exists isAwait + tree match { + case Try(_, _, _) if containsAwait => + reportUnsupportedAwait(tree, "try/catch") + case _ => + super.traverse(tree) + } + } + /** * @return true, if the tree contained an unsupported await. */ diff --git a/src/test/scala/scala/async/neg/NakedAwait.scala b/src/test/scala/scala/async/neg/NakedAwait.scala index 8b85977..a0c4e4d 100644 --- a/src/test/scala/scala/async/neg/NakedAwait.scala +++ b/src/test/scala/scala/async/neg/NakedAwait.scala @@ -87,4 +87,34 @@ class NakedAwait { """.stripMargin } } + + @Test + def tryBody() { + expectError("await must not be used under a try/catch.") { + """ + | import _root_.scala.async.AsyncId._ + | async { try { await(false) } catch { case _ => } } + """.stripMargin + } + } + + @Test + def catchBody() { + expectError("await must not be used under a try/catch.") { + """ + | import _root_.scala.async.AsyncId._ + | async { try { () } catch { case _ => await(false) } } + """.stripMargin + } + } + + @Test + def finallyBody() { + expectError("await must not be used under a try/catch.") { + """ + | import _root_.scala.async.AsyncId._ + | async { try { () } finally { await(false) } } + """.stripMargin + } + } } |