aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Zaugg <jzaugg@gmail.com>2012-11-26 15:48:10 +0100
committerJason Zaugg <jzaugg@gmail.com>2012-11-26 16:26:55 +0100
commit37de4d569e30f29f854aeeeeb4f1f7f53dcda97f (patch)
treeb1cb4e5c86acc81bdbbd251b17a9266a19f3cd8c
parentbe275dcf295f0addf8d41c9a3b4cfe2acaadfaa4 (diff)
downloadscala-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.scala22
-rw-r--r--src/test/scala/scala/async/run/hygiene/Hygiene.scala2
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)