summaryrefslogtreecommitdiff
path: root/core/src/main/scala/mill/define/Task.scala
diff options
context:
space:
mode:
authorLi Haoyi <haoyi.sg@gmail.com>2017-11-18 05:37:11 -0800
committerLi Haoyi <haoyi.sg@gmail.com>2017-11-18 05:51:12 -0800
commit933a3df121e49cff240b5e29d9dab763562c44ef (patch)
tree5e84cfb714c3e2e19e7651ead4068af6b3df9c54 /core/src/main/scala/mill/define/Task.scala
parent7b9c6526965d997d5a7d2cb38a206b9c4af105c8 (diff)
downloadmill-933a3df121e49cff240b5e29d9dab763562c44ef.tar.gz
mill-933a3df121e49cff240b5e29d9dab763562c44ef.tar.bz2
mill-933a3df121e49cff240b5e29d9dab763562c44ef.zip
Implement `T.persistent{}` targets, which have their dest directory persist between runs so the task implementation can use it as a cache
Diffstat (limited to 'core/src/main/scala/mill/define/Task.scala')
-rw-r--r--core/src/main/scala/mill/define/Task.scala34
1 files changed, 30 insertions, 4 deletions
diff --git a/core/src/main/scala/mill/define/Task.scala b/core/src/main/scala/mill/define/Task.scala
index 0e2591c6..70f93d35 100644
--- a/core/src/main/scala/mill/define/Task.scala
+++ b/core/src/main/scala/mill/define/Task.scala
@@ -24,6 +24,8 @@ abstract class Task[+T] extends Task.Ops[T] with Applyable[T]{
* anyway?
*/
def sideHash: Int = 0
+
+ def flushDest: Boolean = true
}
trait Target[+T] extends Task[T]
@@ -31,7 +33,7 @@ object Target extends Applicative.Applyer[Task, Task, Args]{
implicit def apply[T](t: T): Target[T] = macro targetImpl[T]
- def apply[T](t: Task[T]): Target[T] = macro Cacher.impl0[Task, T]
+ def apply[T](t: Task[T]): Target[T] = macro targetTaskImpl[T]
def command[T](t: T): Command[T] = macro commandImpl[T]
@@ -42,6 +44,16 @@ object Target extends Applicative.Applyer[Task, Task, Args]{
def task[T](t: T): Task[T] = macro Applicative.impl[Task, T, Args]
def task[T](t: Task[T]): Task[T] = t
+ def persistent[T](t: T): Target[T] = macro persistentImpl[T]
+ def persistentImpl[T: c.WeakTypeTag](c: Context)(t: c.Expr[T]): c.Expr[Persistent[T]] = {
+ import c.universe._
+
+ c.Expr[Persistent[T]](
+ mill.define.Cacher.wrapCached(c)(
+ q"new ${weakTypeOf[Persistent[T]]}(${Applicative.impl[Task, T, Args](c)(t).tree})"
+ )
+ )
+ }
def commandImpl[T: c.WeakTypeTag](c: Context)(t: c.Expr[T]): c.Expr[Command[T]] = {
import c.universe._
@@ -50,10 +62,19 @@ object Target extends Applicative.Applyer[Task, Task, Args]{
)
}
+ def targetTaskImpl[T: c.WeakTypeTag](c: Context)(t: c.Expr[Task[T]]): c.Expr[Target[T]] = {
+ import c.universe._
+ c.Expr[Target[T]](
+ mill.define.Cacher.wrapCached(c)(
+ q"new ${weakTypeOf[TargetImpl[T]]}($t, _root_.sourcecode.Enclosing())"
+ )
+ )
+ }
def targetImpl[T: c.WeakTypeTag](c: Context)(t: c.Expr[T]): c.Expr[Target[T]] = {
+ import c.universe._
c.Expr[Target[T]](
mill.define.Cacher.wrapCached(c)(
- Applicative.impl[Task, T, Args](c)(t).tree
+ q"new ${weakTypeOf[TargetImpl[T]]}(${Applicative.impl[Task, T, Args](c)(t).tree}, _root_.sourcecode.Enclosing())"
)
)
}
@@ -93,6 +114,11 @@ class Command[+T](t: Task[T]) extends Task[T] {
val inputs = Seq(t)
def evaluate(args: Args) = args[T](0)
}
+class Persistent[+T](t: Task[T]) extends Target[T] {
+ val inputs = Seq(t)
+ def evaluate(args: Args) = args[T](0)
+ override def flushDest = false
+}
object Source{
implicit def apply(p: ammonite.ops.Path) = new Source(p)
}
@@ -107,8 +133,8 @@ object Task {
- trait Module extends mill.define.Cacher[Task, Target]{
- def wrapCached[T](t: Task[T], enclosing: String): Target[T] = new TargetImpl(t, enclosing)
+ trait Module extends mill.define.Cacher[Target]{
+ def wrapCached[T](t: Target[T], enclosing: String): Target[T] = t
}
class Task0[T](t: T) extends Task[T]{
lazy val t0 = t