From 4181484c6a3674788e1a57f4d4d1fe28ffabbce3 Mon Sep 17 00:00:00 2001 From: Roman Timushev Date: Mon, 25 Dec 2017 03:21:10 +0100 Subject: Allow Target creation from Result[T] (#79) --- core/src/main/scala/mill/define/Task.scala | 11 ++++++++++- core/src/test/scala/mill/define/CacherTests.scala | 7 +++++++ 2 files changed, 17 insertions(+), 1 deletion(-) (limited to 'core') diff --git a/core/src/main/scala/mill/define/Task.scala b/core/src/main/scala/mill/define/Task.scala index 17392725..71a98fa7 100644 --- a/core/src/main/scala/mill/define/Task.scala +++ b/core/src/main/scala/mill/define/Task.scala @@ -40,7 +40,7 @@ object Target extends Applicative.Applyer[Task, Task, Result, Ctx]{ implicit def apply[T](t: T): Target[T] = macro targetImpl[T] - implicit def apply[T](t: Result[T]): Target[T] = macro targetImpl[T] + implicit def apply[T](t: Result[T]): Target[T] = macro targetResultImpl[T] def apply[T](t: Task[T]): Target[T] = macro targetTaskImpl[T] @@ -88,6 +88,15 @@ object Target extends Applicative.Applyer[Task, Task, Result, Ctx]{ ) } + def targetResultImpl[T: c.WeakTypeTag](c: Context)(t: c.Expr[Result[T]]): c.Expr[Target[T]] = { + import c.universe._ + c.Expr[Target[T]]( + mill.plugin.Cacher.wrapCached(c)( + q"new ${weakTypeOf[TargetImpl[T]]}(${Applicative.impl0[Task, T, Ctx](c)(t.tree).tree}, _root_.sourcecode.Enclosing())" + ) + ) + } + def underlying[A](v: Task[A]) = v def mapCtx[A, B](t: Task[A])(f: (A, Ctx) => Result[B]) = t.mapDest(f) def zip() = new Task.Task0(()) diff --git a/core/src/test/scala/mill/define/CacherTests.scala b/core/src/test/scala/mill/define/CacherTests.scala index 4e647f82..fe8e1b89 100644 --- a/core/src/test/scala/mill/define/CacherTests.scala +++ b/core/src/test/scala/mill/define/CacherTests.scala @@ -4,6 +4,7 @@ import mill.discover.Discovered import mill.eval.Evaluator import mill.util.{DummyLogger, OSet} import mill.T +import mill.eval.Result.Success import utest._ import utest.framework.TestPath @@ -11,6 +12,7 @@ object CacherTests extends TestSuite{ object Base extends Base trait Base extends Task.Module{ def value = T{ 1 } + def result = T{ Success(1) } } object Middle extends Middle trait Middle extends Base{ @@ -36,6 +38,11 @@ object CacherTests extends TestSuite{ eval(Discovered.mapping(Base), Base.value) == 1 ) + 'resultDefIsCached - assert( + Base.result eq Base.result, + eval(Discovered.mapping(Base), Base.result) == 1 + ) + val middleMapping = Discovered.mapping(Middle) 'overridingDefIsAlsoCached - assert( -- cgit v1.2.3