aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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
+ }
+ }
}