diff options
author | Jason Zaugg <jzaugg@gmail.com> | 2012-11-26 14:05:04 +0100 |
---|---|---|
committer | Jason Zaugg <jzaugg@gmail.com> | 2012-11-26 16:25:16 +0100 |
commit | be275dcf295f0addf8d41c9a3b4cfe2acaadfaa4 (patch) | |
tree | 70426486df39db37860ab90f15ecb41ff51994c1 /src/main/scala/scala/async/AnfTransform.scala | |
parent | 4da04eee1893ead433a624f6b146d56aca46cb7e (diff) | |
download | scala-async-be275dcf295f0addf8d41c9a3b4cfe2acaadfaa4.tar.gz scala-async-be275dcf295f0addf8d41c9a3b4cfe2acaadfaa4.tar.bz2 scala-async-be275dcf295f0addf8d41c9a3b4cfe2acaadfaa4.zip |
Rewrite the state machine to a class, rather than an object.
To avoid suprises in tree retyping, the instance of this
class is immediately upcase to
StateMachine[Promise[T], ExecContext].
Allow nested non-case classes. These pop up when
we use nested async calls.
Only look for duplicate names in the subtrees
traversed by AsyncTraverser.
Diffstat (limited to 'src/main/scala/scala/async/AnfTransform.scala')
-rw-r--r-- | src/main/scala/scala/async/AnfTransform.scala | 23 |
1 files changed, 20 insertions, 3 deletions
diff --git a/src/main/scala/scala/async/AnfTransform.scala b/src/main/scala/scala/async/AnfTransform.scala index 055676d..d216e44 100644 --- a/src/main/scala/scala/async/AnfTransform.scala +++ b/src/main/scala/scala/async/AnfTransform.scala @@ -10,7 +10,9 @@ import scala.reflect.macros.Context private[async] final case class AnfTransform[C <: Context](c: C) { import c.universe._ + val utils = TransformUtils[c.type](c) + import utils._ def apply(tree: Tree): List[Tree] = { @@ -29,9 +31,21 @@ private[async] final case class AnfTransform[C <: Context](c: C) { * This step is needed to allow us to safely merge blocks during the `inline` transform below. */ private final class UniqueNames(tree: Tree) extends Transformer { - val repeatedNames: Set[Name] = tree.collect { - case dt: DefTree => dt.symbol.name - }.groupBy(x => x).filter(_._2.size > 1).keySet + class DuplicateNameTraverser extends AsyncTraverser { + val result = collection.mutable.Buffer[Name]() + + override def traverse(tree: Tree) { + tree match { + case dt: DefTree => result += dt.symbol.name + case _ => super.traverse(tree) + } + } + } + val repeatedNames: Set[Name] = { + val dupNameTraverser = new DuplicateNameTraverser + dupNameTraverser.traverse(tree) + dupNameTraverser.result.groupBy(x => x).filter(_._2.size > 1).keySet + } /** Stepping outside of the public Macro API to call [[scala.reflect.internal.Symbols.Symbol.name_=]] */ val symtab = c.universe.asInstanceOf[reflect.internal.SymbolTable] @@ -81,7 +95,9 @@ private[async] final case class AnfTransform[C <: Context](c: C) { private object trace { private var indent = -1 + def indentString = " " * indent + def apply[T](prefix: String, args: Any)(t: => T): T = { indent += 1 def oneLine(s: Any) = s.toString.replaceAll( """\n""", "\\\\n").take(127) @@ -242,4 +258,5 @@ private[async] final case class AnfTransform[C <: Context](c: C) { } } } + } |