From 782d4c8bed1bf2da2e28becbec3d168d1c11d1fa Mon Sep 17 00:00:00 2001 From: Philipp Haller Date: Fri, 26 Apr 2013 18:11:59 +0200 Subject: Refactor TryBasedFutureSystem --- src/main/scala/scala/async/FutureSystem.scala | 51 ++++++++++----------------- 1 file changed, 19 insertions(+), 32 deletions(-) diff --git a/src/main/scala/scala/async/FutureSystem.scala b/src/main/scala/scala/async/FutureSystem.scala index 7e14c44..8230a0e 100644 --- a/src/main/scala/scala/async/FutureSystem.scala +++ b/src/main/scala/scala/async/FutureSystem.scala @@ -78,6 +78,21 @@ trait TryBasedFutureSystem extends FutureSystem { trait OpsWithTry extends Ops { import c.universe._ + protected def completePromWithTry[A: WeakTypeTag](prom: Expr[Prom[A]], value: Expr[scala.util.Try[A]]): Expr[Unit] + + def completeProm[A: WeakTypeTag](prom: Expr[Prom[A]], value: Expr[A]): Expr[Unit] = + completePromWithTry(prom, reify(scala.util.Success(value.splice))) + + def completePromWithExceptionTopLevel[A: WeakTypeTag](prom: Expr[Prom[A]], exception: Expr[Throwable]): Expr[Unit] = + completePromWithTry(prom, reify(scala.util.Failure(exception.splice))) + + def completePromWithFailedResult[A: WeakTypeTag](prom: Expr[Prom[A]], resultName: TermName): Expr[Unit] = { + val result = c.Expr[scala.util.Try[A]]( + TypeApply(Select(Ident(resultName), newTermName("asInstanceOf")), + List(TypeTree(weakTypeOf[scala.util.Try[A]])))) + completePromWithTry(prom, result) + } + /** `methodSym( (_: Foo).bar(null: A, null: B)` will return the symbol of `bar`, after overload resolution. */ private def methodSym(apply: c.Expr[Any]): Symbol = { val tree2: Tree = c.typeCheck(apply.tree) @@ -136,26 +151,11 @@ object ScalaConcurrentFutureSystem extends TryBasedFutureSystem { future.splice.onComplete(fun.splice)(execContext.splice) } - def completeProm[A: WeakTypeTag](prom: Expr[Prom[A]], value: Expr[A]): Expr[Unit] = reify { - prom.splice.success(value.splice) - c.literalUnit.splice - } - - def completePromWithExceptionTopLevel[A: WeakTypeTag](prom: Expr[Prom[A]], exception: Expr[Throwable]): Expr[Unit] = reify { - prom.splice.failure(exception.splice) + protected def completePromWithTry[A: WeakTypeTag](prom: Expr[Prom[A]], value: Expr[scala.util.Try[A]]): Expr[Unit] = reify { + prom.splice.complete(value.splice) c.literalUnit.splice } - def completePromWithFailedResult[A: WeakTypeTag](prom: Expr[Prom[A]], resultName: TermName): Expr[Unit] = { - val result = c.Expr[scala.util.Try[A]]( - TypeApply(Select(Ident(resultName), newTermName("asInstanceOf")), - List(TypeTree(weakTypeOf[scala.util.Try[A]])))) - reify { - prom.splice.complete(result.splice) - c.literalUnit.splice - } - } - def castTo[A: WeakTypeTag](future: Expr[Fut[Any]]): Expr[Fut[A]] = reify { future.splice.asInstanceOf[Fut[A]] } @@ -199,24 +199,11 @@ object IdentityFutureSystem extends TryBasedFutureSystem { c.literalUnit.splice } - def completeProm[A: WeakTypeTag](prom: Expr[Prom[A]], value: Expr[A]): Expr[Unit] = reify { - prom.splice.a = value.splice + protected def completePromWithTry[A: WeakTypeTag](prom: Expr[Prom[A]], value: Expr[scala.util.Try[A]]): Expr[Unit] = reify { + prom.splice.a = value.splice.get c.literalUnit.splice } - def completePromWithExceptionTopLevel[A: WeakTypeTag](prom: Expr[Prom[A]], exception: Expr[Throwable]): Expr[Unit] = reify { - throw exception.splice - } - - def completePromWithFailedResult[A: WeakTypeTag](prom: Expr[Prom[A]], resultName: TermName): Expr[Unit] = { - val result = c.Expr[scala.util.Try[A]]( - TypeApply(Select(Ident(resultName), newTermName("asInstanceOf")), - List(TypeTree(weakTypeOf[scala.util.Try[A]])))) - reify { - throw result.splice.asInstanceOf[scala.util.Failure[A]].exception - } - } - def castTo[A: WeakTypeTag](future: Expr[Fut[Any]]): Expr[Fut[A]] = ??? } } -- cgit v1.2.3