aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Zaugg <jzaugg@gmail.com>2012-11-23 17:35:52 +0100
committerJason Zaugg <jzaugg@gmail.com>2012-11-23 17:35:52 +0100
commitf9c25fc4acac6a5965d68584d68eee7539e4ba45 (patch)
tree2d2ae102e229b6997db7c4cd1fb7c4b16378ec7a
parent73ab189dcb45bccc0ba6e2e0d445b08057391496 (diff)
downloadscala-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.scala10
-rw-r--r--src/test/scala/scala/async/neg/NakedAwait.scala30
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
+ }
+ }
}