diff options
author | Jason Zaugg <jzaugg@gmail.com> | 2012-12-10 11:57:12 +0100 |
---|---|---|
committer | Jason Zaugg <jzaugg@gmail.com> | 2012-12-10 11:57:12 +0100 |
commit | 1359c3cd1750a95260bcc9d0dcbe56ef10c35d68 (patch) | |
tree | bc5331bae89c2f5bbadfa6e5e055277d32612a30 /src | |
parent | 8b7e520b7d66abe14560508a24fe88d99fbedd9e (diff) | |
download | scala-async-1359c3cd1750a95260bcc9d0dcbe56ef10c35d68.tar.gz scala-async-1359c3cd1750a95260bcc9d0dcbe56ef10c35d68.tar.bz2 scala-async-1359c3cd1750a95260bcc9d0dcbe56ef10c35d68.zip |
Prohibit lazy vals in async blocks.
Diffstat (limited to 'src')
-rw-r--r-- | src/main/scala/scala/async/AsyncAnalysis.scala | 9 | ||||
-rw-r--r-- | src/test/scala/scala/async/neg/NakedAwait.scala | 12 |
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 + } + } } |