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 /src | |
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.
Diffstat (limited to 'src')
-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) |