From 7e8d847b29c733b43ae150d5a199f0a71ee02bf3 Mon Sep 17 00:00:00 2001 From: Li Haoyi Date: Sun, 31 Dec 2017 01:13:59 -0800 Subject: Split out generic `T.input` tasks from the `T.source` helpers, allowing `T.source` to behave as before but `T.input` can be used for other things. Fixes https://github.com/lihaoyi/mill/issues/77 --- core/src/main/scala/mill/define/Task.scala | 61 +++++++++++++++++----- core/src/main/scala/mill/main/RunScript.scala | 2 +- .../test/scala/mill/eval/JavaCompileJarTests.scala | 8 +-- core/src/test/scala/mill/util/TestEvaluator.scala | 4 +- 4 files changed, 55 insertions(+), 20 deletions(-) (limited to 'core/src') diff --git a/core/src/main/scala/mill/define/Task.scala b/core/src/main/scala/mill/define/Task.scala index 39ecb896..b29f173b 100644 --- a/core/src/main/scala/mill/define/Task.scala +++ b/core/src/main/scala/mill/define/Task.scala @@ -148,27 +148,62 @@ object Target extends TargetGenerated with Applicative.Applyer[Task, Task, Resul cl: Caller[mill.define.Task.Module], o: Overrides): Command[T] = macro commandImpl[T] - def source[T](value: Result[T]) - (implicit r: R[T], + def source(value: Result[ammonite.ops.Path]) + (implicit r: R[PathRef], + w: W[PathRef], + e: sourcecode.Enclosing, + n: sourcecode.Name, + cl: Caller[mill.define.Task.Module], + o: Overrides): Input[PathRef] = macro sourceImpl + + def sourceImpl(c: Context) + (value: c.Expr[Result[ammonite.ops.Path]]) + (r: c.Expr[R[PathRef]], + w: c.Expr[W[PathRef]], + e: c.Expr[sourcecode.Enclosing], + n: c.Expr[sourcecode.Name], + cl: c.Expr[Caller[mill.define.Task.Module]], + o: c.Expr[Overrides]): c.Expr[Input[PathRef]] = { + import c.universe._ + val wrapped: c.Expr[Result[PathRef]] = reify(value.splice match{ + case Result.Success(p) => Result.Success(PathRef(p)) + case x: Result.Failing => x + }) + mill.moduledefs.Cacher.impl0[Input[PathRef]](c)( + reify( + new Input[PathRef]( + Applicative.impl0[Task, PathRef, Ctx](c)(wrapped.tree).splice, + e.splice.value, + cl.splice.value, + n.splice.value, + upickle.default.ReadWriter(w.splice.write, r.splice.read), + o.splice.value + ) + ) + ) + } + + def input[T](value: Result[T]) + (implicit r: R[T], w: W[T], e: sourcecode.Enclosing, n: sourcecode.Name, cl: Caller[mill.define.Task.Module], - o: Overrides): Source[T] = macro sourceImpl[T] + o: Overrides): Input[T] = macro inputImpl[T] - def sourceImpl[T: c.WeakTypeTag](c: Context) + def inputImpl[T: c.WeakTypeTag](c: Context) (value: c.Expr[T]) (r: c.Expr[R[T]], w: c.Expr[W[T]], e: c.Expr[sourcecode.Enclosing], n: c.Expr[sourcecode.Name], cl: c.Expr[Caller[mill.define.Task.Module]], - o: c.Expr[Overrides]): c.Expr[Source[T]] = { + o: c.Expr[Overrides]): c.Expr[Input[T]] = { import c.universe._ - mill.moduledefs.Cacher.impl0[Source[T]](c)( + mill.moduledefs.Cacher.impl0[Input[T]](c)( reify( - new Source[T]( + new Input[T]( Applicative.impl[Task, T, Ctx](c)(value).splice, e.splice.value, cl.splice.value, @@ -294,12 +329,12 @@ class Persistent[+T](t: Task[T], override def flushDest = false override def asPersistent = Some(this) } -class Source[T](t: Task[T], - val enclosing: String, - val owner: Task.Module, - val name: String, - val readWrite: RW[_], - val overrides: Int) extends Target[T]{ +class Input[T](t: Task[T], + val enclosing: String, + val owner: Task.Module, + val name: String, + val readWrite: RW[_], + val overrides: Int) extends Target[T]{ val inputs = Seq(t) def evaluate(args: Ctx) = args[T](0) override def sideHash = util.Random.nextInt() diff --git a/core/src/main/scala/mill/main/RunScript.scala b/core/src/main/scala/mill/main/RunScript.scala index dc7b74d6..1fac419b 100644 --- a/core/src/main/scala/mill/main/RunScript.scala +++ b/core/src/main/scala/mill/main/RunScript.scala @@ -114,7 +114,7 @@ object RunScript{ val watched = evaluated.results .iterator .collect { - case (t: define.Source[_], Result.Success(p: PathRef)) => p + case (t: define.Input[_], Result.Success(p: PathRef)) => p } .toSeq diff --git a/core/src/test/scala/mill/eval/JavaCompileJarTests.scala b/core/src/test/scala/mill/eval/JavaCompileJarTests.scala index 667aaa22..95ad6669 100644 --- a/core/src/test/scala/mill/eval/JavaCompileJarTests.scala +++ b/core/src/test/scala/mill/eval/JavaCompileJarTests.scala @@ -2,7 +2,7 @@ package mill.eval import ammonite.ops.ImplicitWd._ import ammonite.ops._ -import mill.define.{Source, Target, Task} +import mill.define.{Input, Target, Task} import mill.discover.Discovered import mill.modules.Jvm import mill.util.Ctx.DestCtx @@ -36,8 +36,8 @@ object JavaCompileJarTests extends TestSuite{ // | // v // resourceRoot ----> jar - def sourceRoot = T.source{ PathRef(sourceRootPath) } - def resourceRoot = T.source{ PathRef(resourceRootPath) } + def sourceRoot = T.source{ sourceRootPath } + def resourceRoot = T.source{ resourceRootPath } def allSources = T{ ls.rec(sourceRoot().path).map(PathRef(_)) } def classFiles = T{ compileAll(allSources()) } def jar = T{ Jvm.createJar(Seq(resourceRoot().path, classFiles().path)) } @@ -74,7 +74,7 @@ object JavaCompileJarTests extends TestSuite{ .evaluated .flatMap(_.asTarget) .filter(mapping.targets.contains) - .filter(!_.isInstanceOf[Source[_]]) + .filter(!_.isInstanceOf[Input[_]]) assert(evaluated == expected) } diff --git a/core/src/test/scala/mill/util/TestEvaluator.scala b/core/src/test/scala/mill/util/TestEvaluator.scala index 6ae90167..646ca418 100644 --- a/core/src/test/scala/mill/util/TestEvaluator.scala +++ b/core/src/test/scala/mill/util/TestEvaluator.scala @@ -1,7 +1,7 @@ package mill.util import ammonite.ops.Path -import mill.define.{Source, Target, Task} +import mill.define.{Input, Target, Task} import mill.discover.{Discovered, Mirror} import mill.eval.{Evaluator, Result} @@ -18,7 +18,7 @@ class TestEvaluator(mapping: Discovered.Mapping[_], Tuple2( evaluated.rawValues.head.asInstanceOf[Result.Success[T]].value, evaluated.evaluated.collect { - case t: Target[_] if mapping.targets.contains(t) && !t.isInstanceOf[Source[_]] => t + case t: Target[_] if mapping.targets.contains(t) && !t.isInstanceOf[Input[_]] => t case t: mill.define.Command[_] => t }.size )) -- cgit v1.2.3