From d332b4614dfd07b4fd91576dac3ff3fddd657106 Mon Sep 17 00:00:00 2001 From: Jason Zaugg Date: Wed, 10 Apr 2013 16:32:34 +0200 Subject: Scala 2.10.1 compat: apply renaming to originals of TypeTrees --- src/main/scala/scala/async/TransformUtils.scala | 7 +++++ src/test/scala/scala/async/TreeInterrogation.scala | 4 ++- src/test/scala/scala/async/run/match0/Match0.scala | 35 +++++++++++----------- 3 files changed, 27 insertions(+), 19 deletions(-) diff --git a/src/main/scala/scala/async/TransformUtils.scala b/src/main/scala/scala/async/TransformUtils.scala index db82ed6..434d6fd 100644 --- a/src/main/scala/scala/async/TransformUtils.scala +++ b/src/main/scala/scala/async/TransformUtils.scala @@ -58,6 +58,13 @@ private[async] final case class TransformUtils[C <: Context](c: C) { val renamer = new Transformer { override def transform(tree: Tree) = tree match { case Ident(_) => (renameMap get tree.symbol).fold(tree)(Ident(_)) + case tt: TypeTree if tt.original != EmptyTree && tt.original != null => + // We also have to apply our renaming transform on originals of TypeTrees. + // TODO 2.10.1 Can we find a cleaner way? + val symTab = c.universe.asInstanceOf[reflect.internal.SymbolTable] + val tt1 = tt.asInstanceOf[symTab.TypeTree] + tt1.setOriginal(transform(tt.original).asInstanceOf[symTab.Tree]) + super.transform(tree) case _ => super.transform(tree) } } diff --git a/src/test/scala/scala/async/TreeInterrogation.scala b/src/test/scala/scala/async/TreeInterrogation.scala index 2bc4770..4d611e5 100644 --- a/src/test/scala/scala/async/TreeInterrogation.scala +++ b/src/test/scala/scala/async/TreeInterrogation.scala @@ -69,8 +69,10 @@ object TreeInterrogation extends App { withDebug { val cm = reflect.runtime.currentMirror val tb = mkToolbox("-cp target/scala-2.10/classes -Xprint:flatten") + import scala.async.Async._ val tree = tb.parse( - """ async { + """ import scala.async.AsyncId._ + | async { | val x = 1 | val opt = Some("") | await(0) diff --git a/src/test/scala/scala/async/run/match0/Match0.scala b/src/test/scala/scala/async/run/match0/Match0.scala index 79a4e35..7624838 100644 --- a/src/test/scala/scala/async/run/match0/Match0.scala +++ b/src/test/scala/scala/async/run/match0/Match0.scala @@ -83,24 +83,23 @@ class MatchSpec { result mustBe (2) } -// TODO 2.10.1 -// @Test def `support await referring to pattern matching vals`() { -// import AsyncId.{async, await} -// val result = async { -// val x = 1 -// val opt = Some("") -// await(0) -// val o @ Some(y) = opt -// -// { -// val o @ Some(y) = Some(".") -// } -// -// await(0) -// await((o, y.isEmpty)) -// } -// result mustBe ((Some(""), true)) -// } + @Test def `support await referring to pattern matching vals`() { + import AsyncId.{async, await} + val result = async { + val x = 1 + val opt = Some("") + await(0) + val o @ Some(y) = opt + + { + val o @ Some(y) = Some(".") + } + + await(0) + await((o, y.isEmpty)) + } + result mustBe ((Some(""), true)) + } @Test def `await in scrutinee`() { import AsyncId.{async, await} -- cgit v1.2.3