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