diff options
author | Jason Zaugg <jzaugg@gmail.com> | 2013-04-11 14:22:50 -0700 |
---|---|---|
committer | Jason Zaugg <jzaugg@gmail.com> | 2013-04-11 14:22:50 -0700 |
commit | 1a8b72a0d1ee16ddcff637df57c2b22e2976b853 (patch) | |
tree | 08300178cf70a6aea7c6b39fbab308ba1088a944 /src | |
parent | b87b924ea82262c825a037d40d49ce4d61aa214a (diff) | |
parent | e0b32253af62a1bc0ce68ccd7b9a8bc8cf54e3d0 (diff) | |
download | scala-async-1a8b72a0d1ee16ddcff637df57c2b22e2976b853.tar.gz scala-async-1a8b72a0d1ee16ddcff637df57c2b22e2976b853.tar.bz2 scala-async-1a8b72a0d1ee16ddcff637df57c2b22e2976b853.zip |
Merge pull request #7 from retronym/topic/scala-2.10.1
Scala 2.10.1 compatibility
Diffstat (limited to 'src')
-rw-r--r-- | src/main/scala/scala/async/AnfTransform.scala | 5 | ||||
-rw-r--r-- | src/main/scala/scala/async/Async.scala | 2 | ||||
-rw-r--r-- | src/main/scala/scala/async/AsyncAnalysis.scala | 2 | ||||
-rw-r--r-- | src/main/scala/scala/async/ExprBuilder.scala | 12 | ||||
-rw-r--r-- | src/main/scala/scala/async/TransformUtils.scala | 17 | ||||
-rw-r--r-- | src/test/scala/scala/async/TreeInterrogation.scala | 17 | ||||
-rw-r--r-- | src/test/scala/scala/async/run/nesteddef/NestedDef.scala | 4 |
7 files changed, 41 insertions, 18 deletions
diff --git a/src/main/scala/scala/async/AnfTransform.scala b/src/main/scala/scala/async/AnfTransform.scala index afcf6bd..c5fbfd7 100644 --- a/src/main/scala/scala/async/AnfTransform.scala +++ b/src/main/scala/scala/async/AnfTransform.scala @@ -88,6 +88,11 @@ private[async] final case class AnfTransform[C <: Context](c: C) { if (renamed(tree.symbol)) { treeCopy.Select(tree, transform(fun), tree.symbol.name) } else super.transform(tree) + case tt: TypeTree => + val tt1 = tt.asInstanceOf[symtab.TypeTree] + val orig = tt1.original + if (orig != null) tt1.setOriginal(transform(orig.asInstanceOf[Tree]).asInstanceOf[symtab.Tree]) + super.transform(tt) case _ => super.transform(tree) } } diff --git a/src/main/scala/scala/async/Async.scala b/src/main/scala/scala/async/Async.scala index 12fe428..8323ac5 100644 --- a/src/main/scala/scala/async/Async.scala +++ b/src/main/scala/scala/async/Async.scala @@ -152,7 +152,7 @@ abstract class AsyncBase { else { Block(List[Tree]( stateMachine, - ValDef(NoMods, name.stateMachine, stateMachineType, New(Ident(name.stateMachineT), Nil)), + ValDef(NoMods, name.stateMachine, stateMachineType, Apply(Select(New(Ident(name.stateMachineT)), nme.CONSTRUCTOR), Nil)), futureSystemOps.spawn(Apply(selectStateMachine(name.apply), Nil)) ), futureSystemOps.promiseToFuture(c.Expr[futureSystem.Prom[T]](selectStateMachine(name.result))).tree) diff --git a/src/main/scala/scala/async/AsyncAnalysis.scala b/src/main/scala/scala/async/AsyncAnalysis.scala index 9184960..4f55f1b 100644 --- a/src/main/scala/scala/async/AsyncAnalysis.scala +++ b/src/main/scala/scala/async/AsyncAnalysis.scala @@ -159,7 +159,7 @@ private[async] final case class AsyncAnalysis[C <: Context](c: C, asyncBase: Asy nextChunk() case vd: ValDef => super.traverse(tree) - valDefChunkId += (vd.symbol ->(vd, chunkId)) + valDefChunkId += (vd.symbol -> (vd -> chunkId)) val isPatternBinder = vd.name.toString.contains(name.bindSuffix) if (isAwait(vd.rhs) || isPatternBinder) valDefsToLift += vd case as: Assign => diff --git a/src/main/scala/scala/async/ExprBuilder.scala b/src/main/scala/scala/async/ExprBuilder.scala index 180e7b9..ca46a83 100644 --- a/src/main/scala/scala/async/ExprBuilder.scala +++ b/src/main/scala/scala/async/ExprBuilder.scala @@ -33,7 +33,7 @@ private[async] final case class ExprBuilder[C <: Context, FS <: FutureSystem](c: final def body: c.Tree = stats match { case stat :: Nil => stat - case _ => Block(stats: _*) + case init :+ last => Block(init, last) } } @@ -94,8 +94,8 @@ private[async] final case class ExprBuilder[C <: Context, FS <: FutureSystem](c: c.Expr[scala.util.Try[T]]( TypeApply(Select(Ident(name.tr), newTermName("asInstanceOf")), List(TypeTree(weakTypeOf[scala.util.Try[T]]))))).tree, - Block(List(tryGetTree, mkStateTree(nextState), mkResumeApply): _*) - ) + Block(List(tryGetTree, mkStateTree(nextState)), mkResumeApply) + ) Some(mkHandlerCase(state, List(ifIsFailureTree))) } @@ -146,7 +146,7 @@ private[async] final case class ExprBuilder[C <: Context, FS <: FutureSystem](c: // 1. build changed if-else tree // 2. insert that tree at the end of the current state val cond = renameReset(condTree) - def mkBranch(state: Int) = Block(mkStateTree(state), mkResumeApply) + def mkBranch(state: Int) = Block(mkStateTree(state) :: Nil, mkResumeApply) this += If(cond, mkBranch(thenState), mkBranch(elseState)) new AsyncStateWithoutAwait(stats.toList, state) } @@ -177,7 +177,7 @@ private[async] final case class ExprBuilder[C <: Context, FS <: FutureSystem](c: } def resultWithLabel(startLabelState: Int): AsyncState = { - this += Block(mkStateTree(startLabelState), mkResumeApply) + this += Block(mkStateTree(startLabelState) :: Nil, mkResumeApply) new AsyncStateWithoutAwait(stats.toList, state) } @@ -387,7 +387,7 @@ private[async] final case class ExprBuilder[C <: Context, FS <: FutureSystem](c: Assign(Ident(name.state), c.literal(nextState).tree) private def mkHandlerCase(num: Int, rhs: List[c.Tree]): CaseDef = - mkHandlerCase(num, Block(rhs: _*)) + mkHandlerCase(num, Block(rhs, c.literalUnit.tree)) private def mkHandlerCase(num: Int, rhs: c.Tree): CaseDef = CaseDef(c.literal(num).tree, EmptyTree, rhs) diff --git a/src/main/scala/scala/async/TransformUtils.scala b/src/main/scala/scala/async/TransformUtils.scala index db82ed6..38c33a4 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) } } @@ -267,18 +274,26 @@ private[async] final case class TransformUtils[C <: Context](c: C) { private object RestorePatternMatchingFunctions extends Transformer { import language.existentials + val DefaultCaseName: TermName = "defaultCase$" override def transform(tree: Tree): Tree = { val SYNTHETIC = (1 << 21).toLong.asInstanceOf[FlagSet] def isSynthetic(cd: ClassDef) = cd.mods hasFlag SYNTHETIC + /** Is this pattern node a synthetic catch-all case, added during PartialFuction synthesis before we know + * whether the user provided cases are exhaustive. */ + def isSyntheticDefaultCase(cdef: CaseDef) = cdef match { + case CaseDef(Bind(DefaultCaseName, _), EmptyTree, _) => true + case _ => false + } tree match { case Block( (cd@ClassDef(_, _, _, Template(_, _, body))) :: Nil, Apply(Select(New(a), nme.CONSTRUCTOR), Nil)) if isSynthetic(cd) => val restored = (body collectFirst { case DefDef(_, /*name.apply | */ name.applyOrElse, _, _, _, Match(_, cases)) => - val transformedCases = super.transformStats(cases, currentOwner).asInstanceOf[List[CaseDef]] + val nonSyntheticCases = cases.takeWhile(cdef => !isSyntheticDefaultCase(cdef)) + val transformedCases = super.transformStats(nonSyntheticCases, currentOwner).asInstanceOf[List[CaseDef]] Match(EmptyTree, transformedCases) }).getOrElse(c.abort(tree.pos, s"Internal Error: Unable to find original pattern matching cases in: $body")) restored diff --git a/src/test/scala/scala/async/TreeInterrogation.scala b/src/test/scala/scala/async/TreeInterrogation.scala index 93cfdf5..4d611e5 100644 --- a/src/test/scala/scala/async/TreeInterrogation.scala +++ b/src/test/scala/scala/async/TreeInterrogation.scala @@ -69,16 +69,19 @@ 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( - """ import scala.async.AsyncId.{async, await} + """ import scala.async.AsyncId._ | async { - | await(1) - | val neg1 = -1 - | val a = await(1) - | val f = { case x => ({case x => neg1 * x}: PartialFunction[Int, Int])(x + a) }: PartialFunction[Int, Int] - | await(f(2)) + | val x = 1 + | val opt = Some("") + | await(0) + | val o @ Some(y) = opt + | + | { + | val o @ Some(y) = Some(".") + | } | } - | () | """.stripMargin) println(tree) val tree1 = tb.typeCheck(tree.duplicate) diff --git a/src/test/scala/scala/async/run/nesteddef/NestedDef.scala b/src/test/scala/scala/async/run/nesteddef/NestedDef.scala index 2baef0d..ee0a78e 100644 --- a/src/test/scala/scala/async/run/nesteddef/NestedDef.scala +++ b/src/test/scala/scala/async/run/nesteddef/NestedDef.scala @@ -20,7 +20,7 @@ class NestedDef { def foo(z: Any) = (a.toDouble, bar(x).toDouble, z) foo(await(2)) } - result mustBe (0d, 44d, 2) + result mustBe ((0d, 44d, 2)) } @@ -35,6 +35,6 @@ class NestedDef { val foo = (z: Any) => (a.toDouble, bar(x).toDouble, z) foo(await(2)) } - result mustBe (0d, 44d, 2) + result mustBe ((0d, 44d, 2)) } } |