diff options
author | Jason Zaugg <jzaugg@gmail.com> | 2012-11-26 15:48:10 +0100 |
---|---|---|
committer | Jason Zaugg <jzaugg@gmail.com> | 2012-11-26 16:26:55 +0100 |
commit | 37de4d569e30f29f854aeeeeb4f1f7f53dcda97f (patch) | |
tree | b1cb4e5c86acc81bdbbd251b17a9266a19f3cd8c | |
parent | be275dcf295f0addf8d41c9a3b4cfe2acaadfaa4 (diff) | |
download | scala-async-37de4d569e30f29f854aeeeeb4f1f7f53dcda97f.tar.gz scala-async-37de4d569e30f29f854aeeeeb4f1f7f53dcda97f.tar.bz2 scala-async-37de4d569e30f29f854aeeeeb4f1f7f53dcda97f.zip |
Make the name uniqification more selective.
We need not, and should not, rename definitions
beyond the scope of the async transform, e.g.
in nested classes of function bodies.
-rw-r--r-- | src/main/scala/scala/async/AnfTransform.scala | 22 | ||||
-rw-r--r-- | src/test/scala/scala/async/run/hygiene/Hygiene.scala | 2 |
2 files changed, 12 insertions, 12 deletions
diff --git a/src/main/scala/scala/async/AnfTransform.scala b/src/main/scala/scala/async/AnfTransform.scala index d216e44..a2d21f6 100644 --- a/src/main/scala/scala/async/AnfTransform.scala +++ b/src/main/scala/scala/async/AnfTransform.scala @@ -31,20 +31,20 @@ 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 { - 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[Symbol] = { + class DuplicateNameTraverser extends AsyncTraverser { + val result = collection.mutable.Buffer[Symbol]() + + override def traverse(tree: Tree) { + tree match { + case dt: DefTree => result += dt.symbol + 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 + dupNameTraverser.result.groupBy(x => x.name).filter(_._2.size > 1).values.flatten.toSet[Symbol] } /** Stepping outside of the public Macro API to call [[scala.reflect.internal.Symbols.Symbol.name_=]] */ @@ -54,7 +54,7 @@ private[async] final case class AnfTransform[C <: Context](c: C) { override def transform(tree: Tree): Tree = { tree match { - case defTree: DefTree if repeatedNames(defTree.symbol.name) => + case defTree: DefTree if repeatedNames(defTree.symbol) => val trans = super.transform(defTree) val origName = defTree.symbol.name val sym = defTree.symbol.asInstanceOf[symtab.Symbol] diff --git a/src/test/scala/scala/async/run/hygiene/Hygiene.scala b/src/test/scala/scala/async/run/hygiene/Hygiene.scala index 5306ecc..9d1df21 100644 --- a/src/test/scala/scala/async/run/hygiene/Hygiene.scala +++ b/src/test/scala/scala/async/run/hygiene/Hygiene.scala @@ -76,7 +76,7 @@ class HygieneSpec { val f1 = async { state + 2 } val x = await(f1) val y = await(async { result }) - val z = await(async { resume() }) + val z = await(async(await(async { resume() }))) (x, y, z) } res._1 mustBe (25) |