From f9c25fc4acac6a5965d68584d68eee7539e4ba45 Mon Sep 17 00:00:00 2001 From: Jason Zaugg Date: Fri, 23 Nov 2012 17:35:52 +0100 Subject: Forbid await in try/catch. --- src/main/scala/scala/async/AsyncAnalysis.scala | 10 +++++++++ src/test/scala/scala/async/neg/NakedAwait.scala | 30 +++++++++++++++++++++++++ 2 files changed, 40 insertions(+) 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 + } + } } -- cgit v1.2.3