diff options
Diffstat (limited to 'src/main/scala')
16 files changed, 119 insertions, 99 deletions
diff --git a/src/main/scala/scala/async/AsyncBase.scala b/src/main/scala/scala/async/AsyncBase.scala new file mode 100644 index 0000000..ff04a57 --- /dev/null +++ b/src/main/scala/scala/async/AsyncBase.scala @@ -0,0 +1,23 @@ +/* + * Copyright (C) 2012 Typesafe Inc. <http://www.typesafe.com> + */ + +package scala.async + +import scala.language.experimental.macros +import scala.reflect.macros.Context +import scala.concurrent.{Future, ExecutionContext} +import scala.async.internal.{AsyncBase, ScalaConcurrentFutureSystem} + +object Async extends AsyncBase { + type FS = ScalaConcurrentFutureSystem.type + val futureSystem: FS = ScalaConcurrentFutureSystem + + def async[T](body: T)(implicit execContext: ExecutionContext): Future[T] = macro asyncImpl[T] + + override def asyncImpl[T: c.WeakTypeTag](c: Context) + (body: c.Expr[T]) + (execContext: c.Expr[futureSystem.ExecContext]): c.Expr[Future[T]] = { + super.asyncImpl[T](c)(body)(execContext) + } +} diff --git a/src/main/scala/scala/async/StateMachine.scala b/src/main/scala/scala/async/StateMachine.scala new file mode 100644 index 0000000..823df71 --- /dev/null +++ b/src/main/scala/scala/async/StateMachine.scala @@ -0,0 +1,12 @@ +/* + * Copyright (C) 2012 Typesafe Inc. <http://www.typesafe.com> + */ + +package scala.async + +/** Internal class used by the `async` macro; should not be manually extended by client code */ +abstract class StateMachine[Result, EC] extends (scala.util.Try[Any] => Unit) with (() => Unit) { + def result: Result + + def execContext: EC +} diff --git a/src/main/scala/scala/async/continuations/AsyncBaseWithCPSFallback.scala b/src/main/scala/scala/async/continuations/AsyncBaseWithCPSFallback.scala index 7abc6e8..2902558 100644 --- a/src/main/scala/scala/async/continuations/AsyncBaseWithCPSFallback.scala +++ b/src/main/scala/scala/async/continuations/AsyncBaseWithCPSFallback.scala @@ -9,8 +9,9 @@ import scala.language.experimental.macros import scala.reflect.macros.Context import scala.util.continuations._ +import scala.async.internal.{AsyncMacro, AsyncUtils} -trait AsyncBaseWithCPSFallback extends AsyncBase { +trait AsyncBaseWithCPSFallback extends internal.AsyncBase { /* Fall-back for `await` using CPS plugin. * diff --git a/src/main/scala/scala/async/continuations/ScalaConcurrentCPSFallback.scala b/src/main/scala/scala/async/continuations/ScalaConcurrentCPSFallback.scala index 018ad05..f864ad6 100644 --- a/src/main/scala/scala/async/continuations/ScalaConcurrentCPSFallback.scala +++ b/src/main/scala/scala/async/continuations/ScalaConcurrentCPSFallback.scala @@ -7,6 +7,7 @@ package continuations import scala.util.continuations._ import scala.concurrent.{Future, Promise, ExecutionContext} +import scala.async.internal.ScalaConcurrentFutureSystem trait ScalaConcurrentCPSFallback { self: AsyncBaseWithCPSFallback => diff --git a/src/main/scala/scala/async/AnfTransform.scala b/src/main/scala/scala/async/internal/AnfTransform.scala index 14263da..80f8161 100644 --- a/src/main/scala/scala/async/AnfTransform.scala +++ b/src/main/scala/scala/async/internal/AnfTransform.scala @@ -3,9 +3,10 @@ * Copyright (C) 2012 Typesafe Inc. <http://www.typesafe.com> */ -package scala.async +package scala.async.internal import scala.tools.nsc.Global +import scala.Predef._ private[async] trait AnfTransform { self: AsyncMacro => diff --git a/src/main/scala/scala/async/AsyncAnalysis.scala b/src/main/scala/scala/async/internal/AsyncAnalysis.scala index 424318e..62842c9 100644 --- a/src/main/scala/scala/async/AsyncAnalysis.scala +++ b/src/main/scala/scala/async/internal/AsyncAnalysis.scala @@ -2,7 +2,7 @@ * Copyright (C) 2012 Typesafe Inc. <http://www.typesafe.com> */ -package scala.async +package scala.async.internal import scala.reflect.macros.Context import scala.collection.mutable diff --git a/src/main/scala/scala/async/Async.scala b/src/main/scala/scala/async/internal/AsyncBase.scala index 5f577cf..2f7e38d 100644 --- a/src/main/scala/scala/async/Async.scala +++ b/src/main/scala/scala/async/internal/AsyncBase.scala @@ -2,39 +2,10 @@ * Copyright (C) 2012 Typesafe Inc. <http://www.typesafe.com> */ -package scala.async +package scala.async.internal -import scala.language.experimental.macros -import scala.reflect.macros.Context import scala.reflect.internal.annotations.compileTimeOnly -import scala.tools.nsc.Global -import language.reflectiveCalls -import scala.concurrent.ExecutionContext - -object Async extends AsyncBase { - - import scala.concurrent.Future - - lazy val futureSystem = ScalaConcurrentFutureSystem - type FS = ScalaConcurrentFutureSystem.type - - def async[T](body: T)(implicit execContext: ExecutionContext): Future[T] = macro asyncImpl[T] - - override def asyncImpl[T: c.WeakTypeTag](c: Context) - (body: c.Expr[T]) - (execContext: c.Expr[futureSystem.ExecContext]): c.Expr[Future[T]] = { - super.asyncImpl[T](c)(body)(execContext) - } -} - -object AsyncId extends AsyncBase { - lazy val futureSystem = IdentityFutureSystem - type FS = IdentityFutureSystem.type - - def async[T](body: T) = macro asyncIdImpl[T] - - def asyncIdImpl[T: c.WeakTypeTag](c: Context)(body: c.Expr[T]): c.Expr[T] = asyncImpl[T](c)(body)(c.literalUnit) -} +import scala.reflect.macros.Context /** * A base class for the `async` macro. Subclasses must provide: @@ -85,10 +56,3 @@ abstract class AsyncBase { c.Expr[futureSystem.Fut[T]](code.asInstanceOf[Tree]) } } - -/** Internal class used by the `async` macro; should not be manually extended by client code */ -abstract class StateMachine[Result, EC] extends (scala.util.Try[Any] => Unit) with (() => Unit) { - def result: Result - - def execContext: EC -} diff --git a/src/main/scala/scala/async/internal/AsyncId.scala b/src/main/scala/scala/async/internal/AsyncId.scala new file mode 100644 index 0000000..394f587 --- /dev/null +++ b/src/main/scala/scala/async/internal/AsyncId.scala @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2012 Typesafe Inc. <http://www.typesafe.com> + */ + +package scala.async.internal + +import language.experimental.macros +import scala.reflect.macros.Context +import scala.reflect.internal.SymbolTable + +object AsyncId extends AsyncBase { + lazy val futureSystem = IdentityFutureSystem + type FS = IdentityFutureSystem.type + + def async[T](body: T) = macro asyncIdImpl[T] + + def asyncIdImpl[T: c.WeakTypeTag](c: Context)(body: c.Expr[T]): c.Expr[T] = asyncImpl[T](c)(body)(c.literalUnit) +} + +/** + * A trivial implementation of [[FutureSystem]] that performs computations + * on the current thread. Useful for testing. + */ +object IdentityFutureSystem extends FutureSystem { + + class Prom[A](var a: A) + + type Fut[A] = A + type ExecContext = Unit + + def mkOps(c: SymbolTable): Ops {val universe: c.type} = new Ops { + val universe: c.type = c + + import universe._ + + def execContext: Expr[ExecContext] = Expr[Unit](Literal(Constant(()))) + + def promType[A: WeakTypeTag]: Type = weakTypeOf[Prom[A]] + def execContextType: Type = weakTypeOf[Unit] + + def createProm[A: WeakTypeTag]: Expr[Prom[A]] = reify { + new Prom(null.asInstanceOf[A]) + } + + def promiseToFuture[A: WeakTypeTag](prom: Expr[Prom[A]]) = reify { + prom.splice.a + } + + def future[A: WeakTypeTag](t: Expr[A])(execContext: Expr[ExecContext]) = t + + def onComplete[A, U](future: Expr[Fut[A]], fun: Expr[scala.util.Try[A] => U], + execContext: Expr[ExecContext]): Expr[Unit] = reify { + fun.splice.apply(util.Success(future.splice)) + Expr[Unit](Literal(Constant(()))).splice + } + + def completeProm[A](prom: Expr[Prom[A]], value: Expr[scala.util.Try[A]]): Expr[Unit] = reify { + prom.splice.a = value.splice.get + Expr[Unit](Literal(Constant(()))).splice + } + + def castTo[A: WeakTypeTag](future: Expr[Fut[Any]]): Expr[Fut[A]] = ??? + } +} diff --git a/src/main/scala/scala/async/AsyncMacro.scala b/src/main/scala/scala/async/internal/AsyncMacro.scala index 8827351..6b7d031 100644 --- a/src/main/scala/scala/async/AsyncMacro.scala +++ b/src/main/scala/scala/async/internal/AsyncMacro.scala @@ -1,4 +1,4 @@ -package scala.async +package scala.async.internal import scala.tools.nsc.Global import scala.tools.nsc.transform.TypingTransformers diff --git a/src/main/scala/scala/async/AsyncTransform.scala b/src/main/scala/scala/async/internal/AsyncTransform.scala index 129f88e..bdc8664 100644 --- a/src/main/scala/scala/async/AsyncTransform.scala +++ b/src/main/scala/scala/async/internal/AsyncTransform.scala @@ -1,4 +1,4 @@ -package scala.async +package scala.async.internal trait AsyncTransform { self: AsyncMacro => diff --git a/src/main/scala/scala/async/AsyncUtils.scala b/src/main/scala/scala/async/internal/AsyncUtils.scala index 1ade5f0..8700bd6 100644 --- a/src/main/scala/scala/async/AsyncUtils.scala +++ b/src/main/scala/scala/async/internal/AsyncUtils.scala @@ -1,7 +1,7 @@ /* * Copyright (C) 2012 Typesafe Inc. <http://www.typesafe.com> */ -package scala.async +package scala.async.internal object AsyncUtils { diff --git a/src/main/scala/scala/async/ExprBuilder.scala b/src/main/scala/scala/async/internal/ExprBuilder.scala index a3837d3..1ce30e6 100644 --- a/src/main/scala/scala/async/ExprBuilder.scala +++ b/src/main/scala/scala/async/internal/ExprBuilder.scala @@ -1,7 +1,7 @@ /* * Copyright (C) 2012 Typesafe Inc. <http://www.typesafe.com> */ -package scala.async +package scala.async.internal import scala.reflect.macros.Context import scala.collection.mutable.ListBuffer @@ -9,6 +9,7 @@ import collection.mutable import language.existentials import scala.reflect.api.Universe import scala.reflect.api +import scala.Some trait ExprBuilder { builder: AsyncMacro => diff --git a/src/main/scala/scala/async/FutureSystem.scala b/src/main/scala/scala/async/internal/FutureSystem.scala index 0c04296..101b7bf 100644 --- a/src/main/scala/scala/async/FutureSystem.scala +++ b/src/main/scala/scala/async/internal/FutureSystem.scala @@ -1,7 +1,7 @@ /* * Copyright (C) 2012 Typesafe Inc. <http://www.typesafe.com> */ -package scala.async +package scala.async.internal import scala.language.higherKinds @@ -15,7 +15,7 @@ import scala.reflect.internal.SymbolTable * customize the code generation. * * The API mirrors that of `scala.concurrent.Future`, see the instance - * [[scala.async.ScalaConcurrentFutureSystem]] for an example of how + * [[ScalaConcurrentFutureSystem]] for an example of how * to implement this. */ trait FutureSystem { @@ -61,7 +61,6 @@ trait FutureSystem { def mkOps(c: SymbolTable): Ops { val universe: c.type } } - object ScalaConcurrentFutureSystem extends FutureSystem { import scala.concurrent._ @@ -105,49 +104,3 @@ object ScalaConcurrentFutureSystem extends FutureSystem { } } } - -/** - * A trivial implementation of [[scala.async.FutureSystem]] that performs computations - * on the current thread. Useful for testing. - */ -object IdentityFutureSystem extends FutureSystem { - - class Prom[A](var a: A) - - type Fut[A] = A - type ExecContext = Unit - - def mkOps(c: SymbolTable): Ops {val universe: c.type} = new Ops { - val universe: c.type = c - - import universe._ - - def execContext: Expr[ExecContext] = Expr[Unit](Literal(Constant(()))) - - def promType[A: WeakTypeTag]: Type = weakTypeOf[Prom[A]] - def execContextType: Type = weakTypeOf[Unit] - - def createProm[A: WeakTypeTag]: Expr[Prom[A]] = reify { - new Prom(null.asInstanceOf[A]) - } - - def promiseToFuture[A: WeakTypeTag](prom: Expr[Prom[A]]) = reify { - prom.splice.a - } - - def future[A: WeakTypeTag](t: Expr[A])(execContext: Expr[ExecContext]) = t - - def onComplete[A, U](future: Expr[Fut[A]], fun: Expr[scala.util.Try[A] => U], - execContext: Expr[ExecContext]): Expr[Unit] = reify { - fun.splice.apply(util.Success(future.splice)) - Expr[Unit](Literal(Constant(()))).splice - } - - def completeProm[A](prom: Expr[Prom[A]], value: Expr[scala.util.Try[A]]): Expr[Unit] = reify { - prom.splice.a = value.splice.get - Expr[Unit](Literal(Constant(()))).splice - } - - def castTo[A: WeakTypeTag](future: Expr[Fut[Any]]): Expr[Fut[A]] = ??? - } -} diff --git a/src/main/scala/scala/async/Lifter.scala b/src/main/scala/scala/async/internal/Lifter.scala index 52ce47d..f49dcbb 100644 --- a/src/main/scala/scala/async/Lifter.scala +++ b/src/main/scala/scala/async/internal/Lifter.scala @@ -1,4 +1,4 @@ -package scala.async +package scala.async.internal trait Lifter { self: AsyncMacro => diff --git a/src/main/scala/scala/async/StateAssigner.scala b/src/main/scala/scala/async/internal/StateAssigner.scala index bc60a6d..cdde7a4 100644 --- a/src/main/scala/scala/async/StateAssigner.scala +++ b/src/main/scala/scala/async/internal/StateAssigner.scala @@ -2,7 +2,7 @@ * Copyright (C) 2012 Typesafe Inc. <http://www.typesafe.com> */ -package scala.async +package scala.async.internal private[async] final class StateAssigner { private var current = -1 @@ -11,4 +11,4 @@ private[async] final class StateAssigner { current += 1 current } -}
\ No newline at end of file +} diff --git a/src/main/scala/scala/async/TransformUtils.scala b/src/main/scala/scala/async/internal/TransformUtils.scala index d69d03a..2582c91 100644 --- a/src/main/scala/scala/async/TransformUtils.scala +++ b/src/main/scala/scala/async/internal/TransformUtils.scala @@ -1,7 +1,7 @@ /* * Copyright (C) 2012 Typesafe Inc. <http://www.typesafe.com> */ -package scala.async +package scala.async.internal import scala.reflect.macros.Context import reflect.ClassTag @@ -89,7 +89,7 @@ private[async] trait TransformUtils { val Try_isFailure = TryClass.typeSignature.member(newTermName("isFailure")).ensuring(_ != NoSymbol) val TryAnyType = appliedType(TryClass.toType, List(definitions.AnyTpe)) val NonFatalClass = rootMirror.staticModule("scala.util.control.NonFatal") - val AsyncClass = rootMirror.staticClass("scala.async.AsyncBase") + val AsyncClass = rootMirror.staticClass("scala.async.internal.AsyncBase") val Async_await = AsyncClass.typeSignature.member(newTermName("await")).ensuring(_ != NoSymbol) } |