diff options
author | phaller <hallerp@gmail.com> | 2012-12-19 00:22:13 +0100 |
---|---|---|
committer | phaller <hallerp@gmail.com> | 2012-12-19 00:22:13 +0100 |
commit | e8e84ba8d3e3ebf266250cdb48176a9fef5361d9 (patch) | |
tree | fc0fd882aa34b8b5e5571e26164c62b551e2c9fe /src/main/scala/scala/async/AsyncAnalysis.scala | |
parent | 3859c11bca3ce9d9d2b18ec629dcc4b6218cf2e0 (diff) | |
download | scala-async-e8e84ba8d3e3ebf266250cdb48176a9fef5361d9.tar.gz scala-async-e8e84ba8d3e3ebf266250cdb48176a9fef5361d9.tar.bz2 scala-async-e8e84ba8d3e3ebf266250cdb48176a9fef5361d9.zip |
New fix for #1861: Add fall-back to CPS for all unsupported uses of await
This is a re-implementation of a previous fix. It is more modular, since
it enables the definition of a CPS-based fall-back as a subclass of `AsyncBase`.
Thus, it's possible to define fall-back-enabled subclasses of `AsyncBase`
targetting not only Scala Futures.
Diffstat (limited to 'src/main/scala/scala/async/AsyncAnalysis.scala')
-rw-r--r-- | src/main/scala/scala/async/AsyncAnalysis.scala | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/src/main/scala/scala/async/AsyncAnalysis.scala b/src/main/scala/scala/async/AsyncAnalysis.scala index 8bb5bcd..bda4d5c 100644 --- a/src/main/scala/scala/async/AsyncAnalysis.scala +++ b/src/main/scala/scala/async/AsyncAnalysis.scala @@ -7,7 +7,7 @@ package scala.async import scala.reflect.macros.Context import scala.collection.mutable -private[async] final case class AsyncAnalysis[C <: Context](c: C) { +private[async] final case class AsyncAnalysis[C <: Context](c: C, asyncBase: AsyncBase) { import c.universe._ val utils = TransformUtils[c.type](c) @@ -20,8 +20,10 @@ private[async] final case class AsyncAnalysis[C <: Context](c: C) { * * Must be called on the original tree, not on the ANF transformed tree. */ - def reportUnsupportedAwaits(tree: Tree) { - new UnsupportedAwaitAnalyzer().traverse(tree) + def reportUnsupportedAwaits(tree: Tree): Boolean = { + val analyzer = new UnsupportedAwaitAnalyzer + analyzer.traverse(tree) + analyzer.hasUnsupportedAwaits } /** @@ -39,6 +41,8 @@ private[async] final case class AsyncAnalysis[C <: Context](c: C) { } private class UnsupportedAwaitAnalyzer extends AsyncTraverser { + var hasUnsupportedAwaits = false + override def nestedClass(classDef: ClassDef) { val kind = if (classDef.symbol.asClass.isTrait) "trait" else "class" if (!reportUnsupportedAwait(classDef, s"nested $kind")) { @@ -89,10 +93,16 @@ private[async] final case class AsyncAnalysis[C <: Context](c: C) { } badAwaits foreach { tree => - c.error(tree.pos, s"await must not be used under a $whyUnsupported.") + reportError(tree.pos, s"await must not be used under a $whyUnsupported.") } badAwaits.nonEmpty } + + private def reportError(pos: Position, msg: String) { + hasUnsupportedAwaits = true + if (!asyncBase.fallbackEnabled) + c.error(pos, msg) + } } private class AsyncDefinitionUseAnalyzer extends AsyncTraverser { |