aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Zaugg <jzaugg@gmail.com>2012-12-10 11:57:12 +0100
committerJason Zaugg <jzaugg@gmail.com>2012-12-10 11:57:12 +0100
commit1359c3cd1750a95260bcc9d0dcbe56ef10c35d68 (patch)
treebc5331bae89c2f5bbadfa6e5e055277d32612a30
parent8b7e520b7d66abe14560508a24fe88d99fbedd9e (diff)
downloadscala-async-1359c3cd1750a95260bcc9d0dcbe56ef10c35d68.tar.gz
scala-async-1359c3cd1750a95260bcc9d0dcbe56ef10c35d68.tar.bz2
scala-async-1359c3cd1750a95260bcc9d0dcbe56ef10c35d68.zip
Prohibit lazy vals in async blocks.
-rw-r--r--src/main/scala/scala/async/AsyncAnalysis.scala9
-rw-r--r--src/test/scala/scala/async/neg/NakedAwait.scala12
2 files changed, 18 insertions, 3 deletions
diff --git a/src/main/scala/scala/async/AsyncAnalysis.scala b/src/main/scala/scala/async/AsyncAnalysis.scala
index f62d7a1..7aca269 100644
--- a/src/main/scala/scala/async/AsyncAnalysis.scala
+++ b/src/main/scala/scala/async/AsyncAnalysis.scala
@@ -8,6 +8,7 @@ import scala.reflect.macros.Context
import scala.collection.mutable
private[async] final case class AsyncAnalysis[C <: Context](c: C) {
+
import c.universe._
val utils = TransformUtils[c.type](c)
@@ -74,12 +75,14 @@ private[async] final case class AsyncAnalysis[C <: Context](c: C) {
override def traverse(tree: Tree) {
def containsAwait = tree exists isAwait
tree match {
- case Try(_, _, _) if containsAwait =>
+ case Try(_, _, _) if containsAwait =>
reportUnsupportedAwait(tree, "try/catch")
super.traverse(tree)
- case Return(_) =>
+ case Return(_) =>
c.abort(tree.pos, "return is illegal within a async block")
- case _ =>
+ case ValDef(mods, _, _, _) if mods.hasFlag(Flag.LAZY) =>
+ c.abort(tree.pos, "lazy vals are illegal within an async block")
+ case _ =>
super.traverse(tree)
}
}
diff --git a/src/test/scala/scala/async/neg/NakedAwait.scala b/src/test/scala/scala/async/neg/NakedAwait.scala
index 9974a07..c3537ec 100644
--- a/src/test/scala/scala/async/neg/NakedAwait.scala
+++ b/src/test/scala/scala/async/neg/NakedAwait.scala
@@ -153,4 +153,16 @@ class NakedAwait {
|""".stripMargin
}
}
+
+ @Test
+ def lazyValIllegal() {
+ expectError("lazy vals are illegal") {
+ """
+ | import _root_.scala.async.AsyncId._
+ | def foo(): Any = async { val x = { lazy val y = 0; y } }
+ | ()
+ |
+ |""".stripMargin
+ }
+ }
}