From 74400b55dc71c7a12c13c5334d75ce2d419d5b68 Mon Sep 17 00:00:00 2001 From: Li Haoyi Date: Sun, 2 Apr 2023 14:33:12 +0800 Subject: [PATCH 01/16] main tests pass --- .../src/mill/bsp/worker/MillBuildServer.scala | 2 +- build.sc | 76 +++++++++---------- main/api/src/mill/api/Ctx.scala | 4 +- main/core/src/mill/define/Applicative.scala | 4 +- main/core/src/mill/define/Router.scala | 2 +- main/core/src/mill/define/Task.scala | 50 ++++++------ main/core/src/mill/eval/Evaluator.scala | 14 ++-- main/core/src/mill/eval/EvaluatorPaths.scala | 4 +- .../mill/eval/EvaluatorPathsResolver.scala | 4 +- .../mill/main/graphviz/GraphvizTools.scala | 8 +- main/src/mill/main/MainModule.scala | 16 ++-- main/src/mill/main/Resolve.scala | 2 +- main/src/mill/main/ResolveMetadata.scala | 2 +- main/src/mill/main/ResolveSegments.scala | 9 +-- main/src/mill/main/ResolveTasks.scala | 12 +-- main/src/mill/main/RunScript.scala | 2 +- main/src/mill/main/TokenReaders.scala | 4 +- .../src/mill/define/ApplicativeTests.scala | 2 +- main/test/src/mill/define/DiscoverTests.scala | 2 +- main/test/src/mill/define/GraphTests.scala | 6 +- .../src/mill/define/MacroErrorTests.scala | 30 ++++---- main/test/src/mill/eval/EvaluationTests.scala | 10 +-- .../src/mill/eval/JavaCompileJarTests.scala | 4 +- main/test/src/mill/eval/TaskTests.scala | 4 +- main/test/src/mill/main/MainTests.scala | 6 +- main/test/src/mill/util/TestEvaluator.scala | 2 +- main/test/src/mill/util/TestUtil.scala | 2 +- .../src/mill/testkit/MillTestkit.scala | 6 +- .../mill/scalajslib/HelloJSWorldTests.scala | 2 +- .../src/mill/scalalib/HelloWorldTests.scala | 18 ++--- .../HelloNativeWorldTests.scala | 2 +- 31 files changed, 153 insertions(+), 158 deletions(-) diff --git a/bsp/worker/src/mill/bsp/worker/MillBuildServer.scala b/bsp/worker/src/mill/bsp/worker/MillBuildServer.scala index feb21f05edc..e63fe23fb1b 100644 --- a/bsp/worker/src/mill/bsp/worker/MillBuildServer.scala +++ b/bsp/worker/src/mill/bsp/worker/MillBuildServer.scala @@ -665,7 +665,7 @@ class MillBuildServer( logger = new MillBspLogger(client, cleanTask.hashCode, evaluator.baseLogger) ) if (cleanResult.failing.keyCount > 0) ( - msg + s" Target ${compileTargetName} could not be cleaned. See message from mill: \n" + + msg + s" CachedTarget ${compileTargetName} could not be cleaned. See message from mill: \n" + (cleanResult.results(cleanTask) match { case fail: Result.Failure[Any] => fail.msg + "\n" case _ => "could not retrieve message" diff --git a/build.sc b/build.sc index 1e0e27a948f..fcaa023bf79 100644 --- a/build.sc +++ b/build.sc @@ -689,44 +689,44 @@ object contrib extends MillModule { override def testModuleDeps: Seq[JavaModule] = super.testModuleDeps ++ Seq(scalalib) } - object playlib extends MillModule { - override def moduleDeps = Seq(twirllib, playlib.api) - override def compileModuleDeps = Seq(scalalib) - - override def testArgs = T { - val mapping = Map( - "MILL_CONTRIB_PLAYLIB_ROUTECOMPILER_WORKER_2_6" -> worker("2.6").assembly().path, - "MILL_CONTRIB_PLAYLIB_ROUTECOMPILER_WORKER_2_7" -> worker("2.7").assembly().path, - "MILL_CONTRIB_PLAYLIB_ROUTECOMPILER_WORKER_2_8" -> worker("2.8").assembly().path, - "TEST_PLAY_VERSION_2_6" -> Deps.Play_2_6.playVersion, - "TEST_PLAY_VERSION_2_7" -> Deps.Play_2_7.playVersion, - "TEST_PLAY_VERSION_2_8" -> Deps.Play_2_8.playVersion - ) - - scalalib.worker.testArgs() ++ - scalalib.backgroundwrapper.testArgs() ++ - (for ((k, v) <- mapping.to(Seq)) yield s"-D$k=$v") - } - override def testModuleDeps: Seq[JavaModule] = super.testModuleDeps ++ Seq(scalalib) - - object api extends MillPublishModule - - object worker extends Cross[WorkerModule](Deps.play.keys.toSeq: _*) - class WorkerModule(playBinary: String) extends MillInternalModule { - override def sources = T.sources { - // We want to avoid duplicating code as long as the Play APIs allow. - // But if newer Play versions introduce incompatibilities, - // just remove the shared source dir for that worker and implement directly. - Seq(PathRef(millSourcePath / os.up / "src-shared")) ++ super.sources() - } - override def scalaVersion = Deps.play(playBinary).scalaVersion - override def moduleDeps = Seq(playlib.api) - override def ivyDeps = Agg( - Deps.osLib, - Deps.play(playBinary).routesCompiler - ) - } - } +// object playlib extends MillModule { +// override def moduleDeps = Seq(twirllib, playlib.api) +// override def compileModuleDeps = Seq(scalalib) +// +// override def testArgs = T { +// val mapping = Map( +// "MILL_CONTRIB_PLAYLIB_ROUTECOMPILER_WORKER_2_6" -> worker("2.6").assembly().path, +// "MILL_CONTRIB_PLAYLIB_ROUTECOMPILER_WORKER_2_7" -> worker("2.7").assembly().path, +// "MILL_CONTRIB_PLAYLIB_ROUTECOMPILER_WORKER_2_8" -> worker("2.8").assembly().path, +// "TEST_PLAY_VERSION_2_6" -> Deps.Play_2_6.playVersion, +// "TEST_PLAY_VERSION_2_7" -> Deps.Play_2_7.playVersion, +// "TEST_PLAY_VERSION_2_8" -> Deps.Play_2_8.playVersion +// ) +// +// scalalib.worker.testArgs() ++ +// scalalib.backgroundwrapper.testArgs() ++ +// (for ((k, v) <- mapping.to(Seq)) yield s"-D$k=$v") +// } +// override def testModuleDeps: Seq[JavaModule] = super.testModuleDeps ++ Seq(scalalib) +// +// object api extends MillPublishModule +// +// object worker extends Cross[WorkerModule](Deps.play.keys.toSeq: _*) +// class WorkerModule(playBinary: String) extends MillInternalModule { +// override def sources = T.sources { +// // We want to avoid duplicating code as long as the Play APIs allow. +// // But if newer Play versions introduce incompatibilities, +// // just remove the shared source dir for that worker and implement directly. +// Seq(PathRef(millSourcePath / os.up / "src-shared")) ++ super.sources() +// } +// override def scalaVersion = Deps.play(playBinary).scalaVersion +// override def moduleDeps = Seq(playlib.api) +// override def ivyDeps = Agg( +// Deps.osLib, +// Deps.play(playBinary).routesCompiler +// ) +// } +// } object scalapblib extends MillModule { override def compileModuleDeps = Seq(scalalib) diff --git a/main/api/src/mill/api/Ctx.scala b/main/api/src/mill/api/Ctx.scala index b78e017e265..d78cd5f76f9 100644 --- a/main/api/src/mill/api/Ctx.scala +++ b/main/api/src/mill/api/Ctx.scala @@ -5,10 +5,10 @@ import scala.language.implicitConversions import os.Path /** - * Provides access to various resources in the context of a currently execution Target. + * Provides access to various resources in the context of a currently execution CachedTarget. */ object Ctx { - @compileTimeOnly("Target.ctx() / T.ctx() / T.* APIs can only be used with a T{...} block") + @compileTimeOnly("CachedTarget.ctx() / T.ctx() / T.* APIs can only be used with a T{...} block") @ImplicitStub implicit def taskCtx: Ctx = ??? diff --git a/main/core/src/mill/define/Applicative.scala b/main/core/src/mill/define/Applicative.scala index ff212a7a30e..6c50b1663c3 100644 --- a/main/core/src/mill/define/Applicative.scala +++ b/main/core/src/mill/define/Applicative.scala @@ -18,7 +18,7 @@ object Applicative { def apply[T](t: M[T]): T } object ApplyHandler { - @compileTimeOnly("Target#apply() can only be used with a T{...} block") + @compileTimeOnly("CachedTarget#apply() can only be used with a T{...} block") implicit def defaultApplyHandler[M[+_]]: ApplyHandler[M] = ??? } trait Applyable[M[+_], +T] { @@ -64,7 +64,7 @@ object Applicative { val banned0 = banned.next() c.abort( banned0.pos, - "Target#apply() call cannot use `" + banned0.symbol + "` defined within the T{...} block" + "CachedTarget#apply() call cannot use `" + banned0.symbol + "` defined within the T{...} block" ) } val tempName = c.freshName(TermName("tmp")) diff --git a/main/core/src/mill/define/Router.scala b/main/core/src/mill/define/Router.scala index fff732ea88d..c0f2f7d7349 100644 --- a/main/core/src/mill/define/Router.scala +++ b/main/core/src/mill/define/Router.scala @@ -62,7 +62,7 @@ class Router(val ctx: blackbox.Context) extends mainargs.Macros(ctx) { (weakTypeOf[mill.define.Sources], 0, "`T.sources`"), (weakTypeOf[mill.define.Input[_]], 0, "`T.input`"), (weakTypeOf[mill.define.Persistent[_]], 0, "`T.persistent`"), - (weakTypeOf[mill.define.Target[_]], 0, "`T{...}`"), + (weakTypeOf[mill.define.CachedTarget[_]], 0, "`T{...}`"), (weakTypeOf[mill.define.Command[_]], 1, "`T.command`") ) diff --git a/main/core/src/mill/define/Task.scala b/main/core/src/mill/define/Task.scala index d2c4eaeec62..0b40bf92894 100644 --- a/main/core/src/mill/define/Task.scala +++ b/main/core/src/mill/define/Task.scala @@ -12,12 +12,12 @@ import scala.reflect.macros.blackbox.Context * single output of type [[T]]. * * Generally not instantiated manually, but instead constructed via the - * [[Target.apply]] & similar macros. + * [[CachedTarget.apply]] & similar macros. */ abstract class Task[+T] extends Task.Ops[T] with Applyable[Task, T] { /** - * What other Targets does this Target depend on? + * What other Targets does this CachedTarget depend on? */ val inputs: Seq[Task[_]] @@ -34,25 +34,25 @@ abstract class Task[+T] extends Task.Ops[T] with Applyable[Task, T] { def flushDest: Boolean = true - def asTarget: Option[Target[T]] = None + def asTarget: Option[CachedTarget[T]] = None def asCommand: Option[Command[T]] = None def asWorker: Option[Worker[T]] = None def self: Task[T] = this } -trait NamedTask[+T] extends Task[T] { +trait Target[+T] extends Task[T] { def ctx: mill.define.Ctx def label: String = ctx.segment match { case Segment.Label(v) => v case Segment.Cross(_) => throw new IllegalArgumentException( - "NamedTask only support a ctx with a Label segment, but found a Cross." + "Target only support a ctx with a Label segment, but found a Cross." ) } override def toString = ctx.segments.render def isPrivate: Option[Boolean] = None } -trait Target[+T] extends NamedTask[T] { - override def asTarget: Option[Target[T]] = Some(this) +trait CachedTarget[+T] extends Target[T] { + override def asTarget: Option[CachedTarget[T]] = Some(this) def readWrite: RW[_] } @@ -73,16 +73,16 @@ object Target extends Applicative.Applyer[Task, Task, Result, mill.api.Ctx] { def targetImpl[T: c.WeakTypeTag](c: Context)(t: c.Expr[T])( rw: c.Expr[RW[T]], ctx: c.Expr[mill.define.Ctx] - ): c.Expr[Target[T]] = { + ): c.Expr[CachedTarget[T]] = { import c.universe._ val taskIsPrivate = isPrivateTargetOption(c) val lhs = Applicative.impl0[Task, T, mill.api.Ctx](c)(reify(Result.Success(t.splice)).tree) - mill.moduledefs.Cacher.impl0[TargetImpl[T]](c)( + mill.moduledefs.Cacher.impl0[CachedTarget[T]](c)( reify( - new TargetImpl[T]( + new CachedTargetImpl[T]( lhs.splice, ctx.splice, rw.splice, @@ -104,14 +104,14 @@ object Target extends Applicative.Applyer[Task, Task, Result, mill.api.Ctx] { def targetResultImpl[T: c.WeakTypeTag](c: Context)(t: c.Expr[Result[T]])( rw: c.Expr[RW[T]], ctx: c.Expr[mill.define.Ctx] - ): c.Expr[Target[T]] = { + ): c.Expr[CachedTarget[T]] = { import c.universe._ val taskIsPrivate = isPrivateTargetOption(c) - mill.moduledefs.Cacher.impl0[Target[T]](c)( + mill.moduledefs.Cacher.impl0[CachedTarget[T]](c)( reify( - new TargetImpl[T]( + new CachedTargetImpl[T]( Applicative.impl0[Task, T, mill.api.Ctx](c)(t.tree).splice, ctx.splice, rw.splice, @@ -127,14 +127,14 @@ object Target extends Applicative.Applyer[Task, Task, Result, mill.api.Ctx] { def targetTaskImpl[T: c.WeakTypeTag](c: Context)(t: c.Expr[Task[T]])( rw: c.Expr[RW[T]], ctx: c.Expr[mill.define.Ctx] - ): c.Expr[Target[T]] = { + ): c.Expr[CachedTarget[T]] = { import c.universe._ val taskIsPrivate = isPrivateTargetOption(c) - mill.moduledefs.Cacher.impl0[Target[T]](c)( + mill.moduledefs.Cacher.impl0[CachedTarget[T]](c)( reify( - new TargetImpl[T]( + new CachedTargetImpl[T]( t.splice, ctx.splice, rw.splice, @@ -375,23 +375,23 @@ object Target extends Applicative.Applyer[Task, Task, Result, mill.api.Ctx] { } } -abstract class NamedTaskImpl[+T]( +abstract class TargetImpl[+T]( ctx0: mill.define.Ctx, t: Task[T], override val isPrivate: Option[Boolean] -) extends NamedTask[T] { +) extends Target[T] { def evaluate(args: mill.api.Ctx) = args[T](0) val ctx = ctx0.withSegments(segments = ctx0.segments ++ Seq(ctx0.segment)) val inputs = Seq(t) } -class TargetImpl[+T]( +class CachedTargetImpl[+T]( t: Task[T], ctx0: mill.define.Ctx, override val readWrite: RW[_], isPrivate: Option[Boolean] -) extends NamedTaskImpl[T](ctx0, t, isPrivate) - with Target[T] {} +) extends TargetImpl[T](ctx0, t, isPrivate) + with CachedTarget[T] {} class Command[+T]( t: Task[T], @@ -399,12 +399,12 @@ class Command[+T]( val writer: W[_], val cls: Class[_], isPrivate: Option[Boolean] -) extends NamedTaskImpl[T](ctx0, t, isPrivate) { +) extends TargetImpl[T](ctx0, t, isPrivate) { override def asCommand = Some(this) } class Worker[+T](t: Task[T], ctx0: mill.define.Ctx, isPrivate: Option[Boolean]) - extends NamedTaskImpl[T](ctx0, t, isPrivate) { + extends TargetImpl[T](ctx0, t, isPrivate) { override def flushDest = false override def asWorker = Some(this) } @@ -414,7 +414,7 @@ class Persistent[+T]( ctx0: mill.define.Ctx, readWrite: RW[_], isPrivate: Option[Boolean] -) extends TargetImpl[T](t, ctx0, readWrite, isPrivate) { +) extends CachedTargetImpl[T](t, ctx0, readWrite, isPrivate) { override def flushDest = false } @@ -424,7 +424,7 @@ class Input[T]( ctx0: mill.define.Ctx, val writer: upickle.default.Writer[_], isPrivate: Option[Boolean] -) extends NamedTaskImpl[T](ctx0, t, isPrivate) { +) extends TargetImpl[T](ctx0, t, isPrivate) { override def sideHash = util.Random.nextInt() } diff --git a/main/core/src/mill/eval/Evaluator.scala b/main/core/src/mill/eval/Evaluator.scala index bfc0404321a..f86c50d269e 100644 --- a/main/core/src/mill/eval/Evaluator.scala +++ b/main/core/src/mill/eval/Evaluator.scala @@ -23,15 +23,15 @@ import scala.jdk.CollectionConverters._ import scala.reflect.ClassTag import scala.util.control.NonFatal -case class Labelled[T](task: NamedTask[T], segments: Segments) { +case class Labelled[T](task: Target[T], segments: Segments) { def format: Option[default.ReadWriter[T]] = task match { - case t: Target[T] => Some(t.readWrite.asInstanceOf[upickle.default.ReadWriter[T]]) + case t: CachedTarget[T] => Some(t.readWrite.asInstanceOf[upickle.default.ReadWriter[T]]) case _ => None } def writer: Option[default.Writer[T]] = task match { case t: mill.define.Command[T] => Some(t.writer.asInstanceOf[upickle.default.Writer[T]]) case t: mill.define.Input[T] => Some(t.writer.asInstanceOf[upickle.default.Writer[T]]) - case t: Target[T] => Some(t.readWrite.asInstanceOf[upickle.default.ReadWriter[T]]) + case t: CachedTarget[T] => Some(t.readWrite.asInstanceOf[upickle.default.ReadWriter[T]]) case _ => None } } @@ -329,7 +329,7 @@ class Evaluator private (_home: os.Path, val scriptsHash = { val scripts = new Loose.Agg.Mutable[os.Path]() group.iterator.flatMap(t => Iterator(t) ++ t.inputs).foreach { - case namedTask: NamedTask[_] => scripts.append(os.Path(namedTask.ctx.fileName)) + case namedTask: Target[_] => scripts.append(os.Path(namedTask.ctx.fileName)) case _ => } @@ -821,10 +821,10 @@ object Evaluator { val seen = collection.mutable.Set.empty[Segments] val overridden = collection.mutable.Set.empty[Task[_]] topoSorted.values.reverse.iterator.foreach { - case x: NamedTask[_] if x.isPrivate == Some(true) => + case x: Target[_] if x.isPrivate == Some(true) => // we always need to store them in the super-path overridden.add(x) - case x: NamedTask[_] => + case x: Target[_] => if (!seen.contains(x.ctx.segments)) seen.add(x.ctx.segments) else overridden.add(x) case _ => // donothing @@ -832,7 +832,7 @@ object Evaluator { val sortedGroups = Graph.groupAroundImportantTargets(topoSorted) { // important: all named tasks and those explicitly requested - case t: NamedTask[Any] => + case t: Target[Any] => val segments = t.ctx.segments Right( Labelled( diff --git a/main/core/src/mill/eval/EvaluatorPaths.scala b/main/core/src/mill/eval/EvaluatorPaths.scala index b1516a10453..d8392485815 100644 --- a/main/core/src/mill/eval/EvaluatorPaths.scala +++ b/main/core/src/mill/eval/EvaluatorPaths.scala @@ -1,7 +1,7 @@ package mill.eval import mill.api.internal -import mill.define.{NamedTask, Segment, Segments} +import mill.define.{Target, Segment, Segments} case class EvaluatorPaths private (dest: os.Path, meta: os.Path, log: os.Path) { private def copy(dest: os.Path = dest, meta: os.Path = meta, log: os.Path = log): EvaluatorPaths = @@ -37,6 +37,6 @@ object EvaluatorPaths { } def resolveDestPaths( workspacePath: os.Path, - task: NamedTask[_] + task: Target[_] ): EvaluatorPaths = resolveDestPaths(workspacePath, task.ctx.segments, task.ctx.foreign) } diff --git a/main/core/src/mill/eval/EvaluatorPathsResolver.scala b/main/core/src/mill/eval/EvaluatorPathsResolver.scala index f7d0ad31907..1843c311a03 100644 --- a/main/core/src/mill/eval/EvaluatorPathsResolver.scala +++ b/main/core/src/mill/eval/EvaluatorPathsResolver.scala @@ -1,9 +1,9 @@ package mill.eval -import mill.define.{NamedTask, Segments} +import mill.define.{Target, Segments} trait EvaluatorPathsResolver { - def resolveDest(task: NamedTask[_]): EvaluatorPaths = + def resolveDest(task: Target[_]): EvaluatorPaths = resolveDest(task.ctx.segments, task.ctx.foreign) def resolveDest(segments: Segments, foreignSegments: Option[Segments] = None): EvaluatorPaths } diff --git a/main/graphviz/src/mill/main/graphviz/GraphvizTools.scala b/main/graphviz/src/mill/main/graphviz/GraphvizTools.scala index 007b0c6bc48..f830f3d8f66 100644 --- a/main/graphviz/src/mill/main/graphviz/GraphvizTools.scala +++ b/main/graphviz/src/mill/main/graphviz/GraphvizTools.scala @@ -1,14 +1,14 @@ package mill.main.graphviz import guru.nidi.graphviz.attribute.Style -import mill.define.{Graph, NamedTask} +import mill.define.{Graph, Target} import org.jgrapht.graph.{DefaultEdge, SimpleDirectedGraph} object GraphvizTools { - def apply(targets: Seq[NamedTask[Any]], rs: Seq[NamedTask[Any]], dest: os.Path) = { + def apply(targets: Seq[Target[Any]], rs: Seq[Target[Any]], dest: os.Path) = { val transitive = Graph.transitiveTargets(rs.distinct) val topoSorted = Graph.topoSorted(transitive) val goalSet = rs.toSet val sortedGroups = Graph.groupAroundImportantTargets(topoSorted) { - case x: NamedTask[Any] if goalSet.contains(x) => x + case x: Target[Any] if goalSet.contains(x) => x } import guru.nidi.graphviz.engine.{Format, Graphviz} import guru.nidi.graphviz.model.Factory._ @@ -19,7 +19,7 @@ object GraphvizTools { k, for { v <- vs.items - dest <- v.inputs.collect { case v: NamedTask[Any] => v } + dest <- v.inputs.collect { case v: Target[Any] => v } if goalSet.contains(dest) } yield dest ) diff --git a/main/src/mill/main/MainModule.scala b/main/src/mill/main/MainModule.scala index cd1c0712797..2e441dc15e0 100644 --- a/main/src/mill/main/MainModule.scala +++ b/main/src/mill/main/MainModule.scala @@ -5,7 +5,7 @@ import mainargs.TokensReader import java.util.concurrent.LinkedBlockingQueue import mill.{BuildInfo, T} import mill.api.{Ctx, PathRef, Result, internal} -import mill.define.{Command, NamedTask, Segments, SelectMode, Target, Task} +import mill.define.{Command, Target, Segments, SelectMode, CachedTarget, Task} import mill.eval.{Evaluator, EvaluatorPaths} import mill.util.{PrintLogger, Watched} import pprint.{Renderer, Tree, Truncated} @@ -20,7 +20,7 @@ object MainModule { evaluator: Evaluator, targets: Seq[String], selectMode: SelectMode - )(f: List[NamedTask[Any]] => T): Result[T] = { + )(f: List[Target[Any]] => T): Result[T] = { RunScript.resolveTasks(mill.main.ResolveTasks, evaluator, targets, selectMode) match { case Left(err) => Result.Failure(err) case Right(tasks) => Result.Success(f(tasks)) @@ -155,7 +155,7 @@ trait MainModule extends mill.Module { Result.Failure(s"No path found between $src and $dest") case Some(list) => val labels = list - .collect { case n: NamedTask[_] => n.ctx.segments.render } + .collect { case n: Target[_] => n.ctx.segments.render } labels.foreach(mill.T.log.outputStream.println(_)) @@ -174,13 +174,13 @@ trait MainModule extends mill.Module { resolveParents ) } - def pprintTask(t: NamedTask[_], evaluator: Evaluator): Tree.Lazy = { + def pprintTask(t: Target[_], evaluator: Evaluator): Tree.Lazy = { val seen = mutable.Set.empty[Task[_]] def rec(t: Task[_]): Seq[Segments] = { if (seen(t)) Nil // do nothing else t match { - case t: Target[_] if evaluator.rootModule.millInternal.targets.contains(t) => + case t: CachedTarget[_] if evaluator.rootModule.millInternal.targets.contains(t) => Seq(t.ctx.segments) case _ => seen.add(t) @@ -399,11 +399,11 @@ trait MainModule extends mill.Module { targets: Seq[String], ctx: Ctx, vizWorker: VizWorker, - planTasks: Option[List[NamedTask[_]]] = None + planTasks: Option[List[Target[_]]] = None ): Result[Seq[PathRef]] = { def callVisualizeModule( - rs: List[NamedTask[Any]], - allRs: List[NamedTask[Any]] + rs: List[Target[Any]], + allRs: List[Target[Any]] ): Result[Seq[PathRef]] = { val (in, out) = vizWorker in.put((rs, allRs, ctx.dest)) diff --git a/main/src/mill/main/Resolve.scala b/main/src/mill/main/Resolve.scala index 940f0eba62a..5cbe181b2c6 100644 --- a/main/src/mill/main/Resolve.scala +++ b/main/src/mill/main/Resolve.scala @@ -244,7 +244,7 @@ abstract class Resolve[R: ClassTag] { } ).map( _.distinctBy { - case t: NamedTask[_] => t.ctx.segments + case t: Target[_] => t.ctx.segments case t => t } ) diff --git a/main/src/mill/main/ResolveMetadata.scala b/main/src/mill/main/ResolveMetadata.scala index 43fa1fded21..b72521844f2 100644 --- a/main/src/mill/main/ResolveMetadata.scala +++ b/main/src/mill/main/ResolveMetadata.scala @@ -8,7 +8,7 @@ object ResolveMetadata extends Resolve[String] { val targets = obj .millInternal - .reflectAll[NamedTask[_]] + .reflectAll[Target[_]] .map(_.toString) val commands = for { diff --git a/main/src/mill/main/ResolveSegments.scala b/main/src/mill/main/ResolveSegments.scala index 7418ee67576..0a26cc03711 100644 --- a/main/src/mill/main/ResolveSegments.scala +++ b/main/src/mill/main/ResolveSegments.scala @@ -43,25 +43,20 @@ object ResolveSegments extends Resolve[Segments] { discover: Discover[_], rest: Seq[String] ): Either[String, Seq[Segments]] = { + val target = obj .millInternal .reflectSingle[Target[_]](last) .map(t => Right(t.ctx.segments)) - val command = - Resolve - .invokeCommand(obj, last, discover.asInstanceOf[Discover[Module]], rest) - .headOption - .map(_.map(_.ctx.segments)) - val module = obj.millInternal .reflectNestedObjects[Module] .find(_.millOuterCtx.segment == Segment.Label(last)) .map(m => Right(m.millModuleSegments)) - command orElse target orElse module match { + target orElse module match { case None => Resolve.errorMsgLabel( singleModuleMeta(obj, discover, obj.millModuleSegments.value.isEmpty), diff --git a/main/src/mill/main/ResolveTasks.scala b/main/src/mill/main/ResolveTasks.scala index 28b4a2e88ca..6b4d3e1896a 100644 --- a/main/src/mill/main/ResolveTasks.scala +++ b/main/src/mill/main/ResolveTasks.scala @@ -3,14 +3,14 @@ package mill.main import mill.define._ import mill.main.ResolveMetadata.singleModuleMeta -object ResolveTasks extends Resolve[NamedTask[Any]] { +object ResolveTasks extends Resolve[Target[Any]] { def endResolveCross( obj: Module, last: List[String], discover: Discover[_], rest: Seq[String] - ): Either[String, Seq[NamedTask[Any]]] = { + ): Either[String, Seq[Target[Any]]] = { obj match { case _: Cross[Module] => Resolve.runDefault(obj, Segment.Cross(last), discover, rest).flatten.headOption match { @@ -34,20 +34,20 @@ object ResolveTasks extends Resolve[NamedTask[Any]] { last: String, discover: Discover[_], rest: Seq[String] - ): Either[String, Seq[NamedTask[Any]]] = last match { + ): Either[String, Seq[Target[Any]]] = last match { case "__" => Right( obj.millInternal.modules .filter(_ != obj) - .flatMap(m => m.millInternal.reflectAll[NamedTask[_]]) + .flatMap(m => m.millInternal.reflectAll[Target[_]]) ) - case "_" => Right(obj.millInternal.reflectAll[NamedTask[_]]) + case "_" => Right(obj.millInternal.reflectAll[Target[_]]) case _ => val target = obj .millInternal - .reflectSingle[NamedTask[_]](last) + .reflectSingle[Target[_]](last) .map(Right(_)) val command = Resolve.invokeCommand( diff --git a/main/src/mill/main/RunScript.scala b/main/src/mill/main/RunScript.scala index 457591c1664..d366d12203a 100644 --- a/main/src/mill/main/RunScript.scala +++ b/main/src/mill/main/RunScript.scala @@ -181,7 +181,7 @@ object RunScript { case 0 => val nameAndJson = for (t <- targets.toSeq) yield { t match { - case t: mill.define.NamedTask[_] => + case t: mill.define.Target[_] => val jsonFile = EvaluatorPaths.resolveDestPaths(evaluator.outPath, t).meta val metadata = upickle.default.read[Evaluator.Cached](ujson.read(jsonFile.toIO)) Some(t.toString, metadata.value) diff --git a/main/src/mill/main/TokenReaders.scala b/main/src/mill/main/TokenReaders.scala index 42c4eff001d..1ef796f183d 100644 --- a/main/src/mill/main/TokenReaders.scala +++ b/main/src/mill/main/TokenReaders.scala @@ -4,7 +4,7 @@ import mainargs.TokensReader import mill.eval.Evaluator import mill.define.{SelectMode, Target, Task} -case class Tasks[T](value: Seq[mill.define.NamedTask[T]]) +case class Tasks[T](value: Seq[mill.define.Target[T]]) object Tasks { class TokenReader[T]() @@ -16,7 +16,7 @@ object Tasks { Evaluator.currentEvaluator.get, s, SelectMode.Single - ).map(x => Tasks(x.asInstanceOf[Seq[mill.define.NamedTask[T]]])), + ).map(x => Tasks(x.asInstanceOf[Seq[mill.define.Target[T]]])), alwaysRepeatable = false, allowEmpty = false ) diff --git a/main/test/src/mill/define/ApplicativeTests.scala b/main/test/src/mill/define/ApplicativeTests.scala index 1eede908af2..46e03036f06 100644 --- a/main/test/src/mill/define/ApplicativeTests.scala +++ b/main/test/src/mill/define/ApplicativeTests.scala @@ -27,7 +27,7 @@ object ApplicativeTests extends TestSuite { value } } - @compileTimeOnly("Target.ctx() can only be used with a T{...} block") + @compileTimeOnly("CachedTarget.ctx() can only be used with a T{...} block") @ImplicitStub implicit def taskCtx: String = ??? diff --git a/main/test/src/mill/define/DiscoverTests.scala b/main/test/src/mill/define/DiscoverTests.scala index a08281c2db7..128d0dffd26 100644 --- a/main/test/src/mill/define/DiscoverTests.scala +++ b/main/test/src/mill/define/DiscoverTests.scala @@ -7,7 +7,7 @@ object DiscoverTests extends TestSuite { val testGraphs = new TestGraphs val tests = Tests { def check[T <: Module](m: T)(targets: (T => Target[_])*) = { - val discovered = m.millInternal.targets + val discovered = m.millInternal.targets.filter(_.asCommand.isEmpty) val expected = targets.map(_(m)).toSet assert(discovered == expected) } diff --git a/main/test/src/mill/define/GraphTests.scala b/main/test/src/mill/define/GraphTests.scala index 449fffefd55..f4e931fbe83 100644 --- a/main/test/src/mill/define/GraphTests.scala +++ b/main/test/src/mill/define/GraphTests.scala @@ -79,7 +79,7 @@ object GraphTests extends TestSuite { val important = important0.map(_(base)) val grouped = Graph.groupAroundImportantTargets(topoSorted) { - case t: Target[_] if important.contains(t) => t + case t: CachedTarget[_] if important.contains(t) => t: Target[_] } val flattened = Agg.from(grouped.values().flatMap(_.items)) @@ -88,7 +88,7 @@ object GraphTests extends TestSuite { val grouping = grouped.lookupKey(terminal) assert( grouping.size == expectedSize, - grouping.flatMap(_.asTarget: Option[Target[_]]).filter(important.contains) == Agg( + grouping.flatMap(_.asTarget: Option[CachedTarget[_]]).filter(important.contains) == Agg( terminal ) ) @@ -168,7 +168,7 @@ object GraphTests extends TestSuite { Graph.transitiveTargets(Agg.from(goals)) ) val grouped = Graph.groupAroundImportantTargets(topoSorted) { - case t: NamedTask[Any] => t + case t: Target[Any] => t case t if goals.contains(t) => t } grouped.keyCount diff --git a/main/test/src/mill/define/MacroErrorTests.scala b/main/test/src/mill/define/MacroErrorTests.scala index e620ef2823f..cdda22b6881 100644 --- a/main/test/src/mill/define/MacroErrorTests.scala +++ b/main/test/src/mill/define/MacroErrorTests.scala @@ -28,18 +28,18 @@ object MacroErrorTests extends TestSuite { e.pos.contains("def w = ") ) } - "target" - { - val e = compileError(""" - object foo extends mill.util.TestUtil.BaseModule{ - def x() = T{1} - } - mill.define.Discover[foo.type] - """) - assert( - e.msg.contains("`T{...}` definitions must have 0 parameter lists"), - e.pos.contains("def x() = ") - ) - } +// "target" - { +// val e = compileError(""" +// object foo extends mill.util.TestUtil.BaseModule{ +// def x() = T{1} +// } +// mill.define.Discover[foo.type] +// """) +// assert( +// e.msg.contains("`T{...}` definitions must have 0 parameter lists"), +// e.pos.contains("def x() = ") +// ) +// } "input" - { val e = compileError(""" object foo extends mill.util.TestUtil.BaseModule{ @@ -79,7 +79,7 @@ object MacroErrorTests extends TestSuite { } "badTmacro" - { // Make sure we can reference values from outside the T{...} block as part - // of our `Target#apply()` calls, but we cannot reference any values that + // of our `CachedTarget#apply()` calls, but we cannot reference any values that // come from inside the T{...} block "pos" - { val e = compileError(""" @@ -99,7 +99,7 @@ object MacroErrorTests extends TestSuite { "neg" - { val expectedMsg = - "Target#apply() call cannot use `value n` defined within the T{...} block" + "CachedTarget#apply() call cannot use `value n` defined within the T{...} block" val err = compileError("""new Module{ def a = T{ 1 } val arr = Array(a) @@ -115,7 +115,7 @@ object MacroErrorTests extends TestSuite { "neg2" - { val expectedMsg = - "Target#apply() call cannot use `value x` defined within the T{...} block" + "CachedTarget#apply() call cannot use `value x` defined within the T{...} block" val err = compileError("""new Module{ def a = T{ 1 } val arr = Array(a) diff --git a/main/test/src/mill/eval/EvaluationTests.scala b/main/test/src/mill/eval/EvaluationTests.scala index 36098a27fd8..36600fc90f5 100644 --- a/main/test/src/mill/eval/EvaluationTests.scala +++ b/main/test/src/mill/eval/EvaluationTests.scala @@ -1,7 +1,7 @@ package mill.eval import mill.util.TestUtil.{Test, test} -import mill.define.{Discover, Graph, Target, Task} +import mill.define.{Discover, Graph, CachedTarget, Task} import mill.{Module, T} import mill.util.{DummyLogger, TestEvaluator, TestGraphs, TestUtil} import mill.api.Strict.Agg @@ -181,14 +181,14 @@ class EvaluationTests(threadCount: Option[Int]) extends TestSuite { import separateGroups._ val checker = new Checker(separateGroups) val evaled1 = checker.evaluator.evaluate(Agg(right, left)) - val filtered1 = evaled1.evaluated.filter(_.isInstanceOf[Target[_]]) + val filtered1 = evaled1.evaluated.filter(_.isInstanceOf[CachedTarget[_]]) assert(filtered1.toSeq.sortBy(_.toString) == Seq(change, left, right).sortBy(_.toString)) val evaled2 = checker.evaluator.evaluate(Agg(right, left)) - val filtered2 = evaled2.evaluated.filter(_.isInstanceOf[Target[_]]) + val filtered2 = evaled2.evaluated.filter(_.isInstanceOf[CachedTarget[_]]) assert(filtered2 == Agg()) change.counter += 1 val evaled3 = checker.evaluator.evaluate(Agg(right, left)) - val filtered3 = evaled3.evaluated.filter(_.isInstanceOf[Target[_]]) + val filtered3 = evaled3.evaluated.filter(_.isInstanceOf[CachedTarget[_]]) assert(filtered3 == Agg(change, right)) } @@ -337,7 +337,7 @@ class EvaluationTests(threadCount: Option[Int]) extends TestSuite { // But if `up` changes, the entire block of downstream tasks needs to // recompute together, including `middle` which doesn't depend on `up`, // because tasks have no cached value that can be used. `right`, which - // is a cached Target, does not recompute + // is a cached CachedTarget, does not recompute up.inputs(0).asInstanceOf[Test].counter += 1 check(down, expValue = 10102, expEvaled = Agg(up, down), extraEvaled = 4) assert(leftCount == 2, middleCount == 2, rightCount == 1) diff --git a/main/test/src/mill/eval/JavaCompileJarTests.scala b/main/test/src/mill/eval/JavaCompileJarTests.scala index 9839929413a..a617f5d36c8 100644 --- a/main/test/src/mill/eval/JavaCompileJarTests.scala +++ b/main/test/src/mill/eval/JavaCompileJarTests.scala @@ -1,6 +1,6 @@ package mill.eval -import mill.define.{Discover, Input, Target, Task} +import mill.define.{Discover, Input, CachedTarget, Task} import mill.modules.Jvm import mill.api.Ctx.Dest import mill.{Module, T} @@ -87,7 +87,7 @@ object JavaCompileJarTests extends TestSuite { // exactly the same so no re-jarring. append(sourceRootPath / "Foo.java", " ") // Note that `sourceRoot` and `resourceRoot` never turn up in the `expected` - // list, because they are `Source`s not `Target`s + // list, because they are `Source`s not `CachedTarget`s check(targets = Agg(jar), expected = Agg( /*sourceRoot, */ allSources, classFiles)) // Appending a new class changes the classfiles, which forces us to diff --git a/main/test/src/mill/eval/TaskTests.scala b/main/test/src/mill/eval/TaskTests.scala index 4b687d07cd6..bc7f0fbfe31 100644 --- a/main/test/src/mill/eval/TaskTests.scala +++ b/main/test/src/mill/eval/TaskTests.scala @@ -97,14 +97,14 @@ trait TaskTests extends TestSuite { "inputs" - withEnv { (build, check) => // Inputs always re-evaluate, including forcing downstream cached Targets - // to re-evaluate, but normal Tasks behind a Target run once then are cached + // to re-evaluate, but normal Tasks behind a CachedTarget run once then are cached check.apply(build.taskInput) ==> Right((1, 1)) check.apply(build.taskInput) ==> Right((2, 1)) check.apply(build.taskInput) ==> Right((3, 1)) } "noInputs" - withEnv { (build, check) => // Inputs always re-evaluate, including forcing downstream cached Targets - // to re-evaluate, but normal Tasks behind a Target run once then are cached + // to re-evaluate, but normal Tasks behind a CachedTarget run once then are cached check.apply(build.taskNoInput) ==> Right((1, 1)) check.apply(build.taskNoInput) ==> Right((1, 0)) check.apply(build.taskNoInput) ==> Right((1, 0)) diff --git a/main/test/src/mill/main/MainTests.scala b/main/test/src/mill/main/MainTests.scala index 2fdf22ec688..0516104887f 100644 --- a/main/test/src/mill/main/MainTests.scala +++ b/main/test/src/mill/main/MainTests.scala @@ -1,18 +1,18 @@ package mill.main -import mill.define.{NamedTask, Segment, SelectMode} +import mill.define.{Target, Segment, SelectMode} import mill.util.TestGraphs._ import utest._ object MainTests extends TestSuite { def check[T <: mill.define.BaseModule](module: T)( selectorString: String, - expected0: Either[String, Seq[T => NamedTask[_]]] + expected0: Either[String, Seq[T => Target[_]]] ) = checkSeq(module)(Seq(selectorString), expected0) def checkSeq[T <: mill.define.BaseModule](module: T)( selectorStrings: Seq[String], - expected0: Either[String, Seq[T => NamedTask[_]]] + expected0: Either[String, Seq[T => Target[_]]] ) = { val expected = expected0.map(_.map(_(module))) diff --git a/main/test/src/mill/util/TestEvaluator.scala b/main/test/src/mill/util/TestEvaluator.scala index ef3b315c8b1..37253576408 100644 --- a/main/test/src/mill/util/TestEvaluator.scala +++ b/main/test/src/mill/util/TestEvaluator.scala @@ -2,7 +2,7 @@ package mill.util import mill.testkit.MillTestKit import java.io.{InputStream, PrintStream} -import mill.define.{Input, Target, Task} +import mill.define.{Input, CachedTarget, Task} import mill.api.Result.OuterStack import mill.eval.Evaluator import mill.api.Strict.Agg diff --git a/main/test/src/mill/util/TestUtil.scala b/main/test/src/mill/util/TestUtil.scala index 9c4f921e605..e56b7e460fc 100644 --- a/main/test/src/mill/util/TestUtil.scala +++ b/main/test/src/mill/util/TestUtil.scala @@ -45,7 +45,7 @@ object TestUtil extends MillTestKit { */ class TestTarget(inputs: Seq[Task[Int]], val pure: Boolean)(implicit ctx0: mill.define.Ctx) extends Test(inputs) - with Target[Int] { + with CachedTarget[Int] { val ctx = ctx0.withSegments(ctx0.segments ++ Seq(ctx0.segment)) val readWrite = upickle.default.readwriter[Int] diff --git a/main/testkit/src/mill/testkit/MillTestkit.scala b/main/testkit/src/mill/testkit/MillTestkit.scala index 2fbe434b2a4..ec7c9a82b21 100644 --- a/main/testkit/src/mill/testkit/MillTestkit.scala +++ b/main/testkit/src/mill/testkit/MillTestkit.scala @@ -5,7 +5,7 @@ import mill.api.Result import mill.api.Result.OuterStack import mill.api.Strict.Agg import java.io.{InputStream, PrintStream} -import mill.define.{Input, Target, Task} +import mill.define.{Input, CachedTarget, Task} import mill.eval.Evaluator import language.experimental.macros import mill.api.{DummyInputStream, Result} @@ -115,7 +115,7 @@ trait MillTestKit { Tuple2( evaluated.rawValues.head.asInstanceOf[Result.Success[T]].value, evaluated.evaluated.collect { - case t: Target[_] + case t: CachedTarget[_] if module.millInternal.targets.contains(t) && !t.isInstanceOf[Input[_]] && !t.ctx.external => t @@ -131,7 +131,7 @@ trait MillTestKit { } } - def fail(target: Target[_], expectedFailCount: Int, expectedRawValues: Seq[Result[_]]): Unit = { + def fail(target: CachedTarget[_], expectedFailCount: Int, expectedRawValues: Seq[Result[_]]): Unit = { val res = evaluator.evaluate(Agg(target)) diff --git a/scalajslib/test/src/mill/scalajslib/HelloJSWorldTests.scala b/scalajslib/test/src/mill/scalajslib/HelloJSWorldTests.scala index 3f797a7b867..92b90f80e0d 100644 --- a/scalajslib/test/src/mill/scalajslib/HelloJSWorldTests.scala +++ b/scalajslib/test/src/mill/scalajslib/HelloJSWorldTests.scala @@ -199,7 +199,7 @@ object HelloJSWorldTests extends TestSuite { } } - def runTests(testTask: define.NamedTask[(String, Seq[TestRunner.Result])]) + def runTests(testTask: define.Target[(String, Seq[TestRunner.Result])]) : Map[String, Map[String, TestRunner.Result]] = { val Left(Result.Failure(_, Some(res))) = helloWorldEvaluator(testTask) diff --git a/scalalib/test/src/mill/scalalib/HelloWorldTests.scala b/scalalib/test/src/mill/scalalib/HelloWorldTests.scala index c37bfb4cb8d..fcbb19db54a 100644 --- a/scalalib/test/src/mill/scalalib/HelloWorldTests.scala +++ b/scalalib/test/src/mill/scalalib/HelloWorldTests.scala @@ -7,7 +7,7 @@ import scala.util.{Properties, Using} import scala.xml.NodeSeq import mill._ import mill.api.Result -import mill.define.{Input, NamedTask, Target} +import mill.define.{Input, Target} import mill.eval.{Evaluator, EvaluatorPaths} import mill.modules.Assembly import mill.scalalib.publish.{VersionControl, _} @@ -1225,13 +1225,13 @@ object HelloWorldTests extends TestSuite { // we reconstruct faulty behavior val Right((result, _)) = eval.apply(t) assert( - result.path.last == (t.asInstanceOf[NamedTask[_]].label + ".dest"), + result.path.last == (t.asInstanceOf[Target[_]].label + ".dest"), os.exists(result.path) ) os.remove.all(result.path) val Right((result2, _)) = eval.apply(t) assert( - result2.path.last == (t.asInstanceOf[NamedTask[_]].label + ".dest"), + result2.path.last == (t.asInstanceOf[Target[_]].label + ".dest"), // as the result was cached but not checked, this path is missing os.exists(result2.path) == flip ) @@ -1244,13 +1244,13 @@ object HelloWorldTests extends TestSuite { // we reconstruct faulty behavior val Right((result, _)) = eval.apply(t) assert( - result.map(_.path.last) == Seq(t.asInstanceOf[NamedTask[_]].label + ".dest"), + result.map(_.path.last) == Seq(t.asInstanceOf[Target[_]].label + ".dest"), result.forall(p => os.exists(p.path)) ) result.foreach(p => os.remove.all(p.path)) val Right((result2, _)) = eval.apply(t) assert( - result2.map(_.path.last) == Seq(t.asInstanceOf[NamedTask[_]].label + ".dest"), + result2.map(_.path.last) == Seq(t.asInstanceOf[Target[_]].label + ".dest"), // as the result was cached but not checked, this path is missing result2.forall(p => os.exists(p.path) == flip) ) @@ -1263,13 +1263,13 @@ object HelloWorldTests extends TestSuite { // we reconstruct faulty behavior val Right((result, _)) = eval.apply(t) assert( - result.map(_.path.last) == Agg(t.asInstanceOf[NamedTask[_]].label + ".dest"), + result.map(_.path.last) == Agg(t.asInstanceOf[Target[_]].label + ".dest"), result.forall(p => os.exists(p.path)) ) result.foreach(p => os.remove.all(p.path)) val Right((result2, _)) = eval.apply(t) assert( - result2.map(_.path.last) == Agg(t.asInstanceOf[NamedTask[_]].label + ".dest"), + result2.map(_.path.last) == Agg(t.asInstanceOf[Target[_]].label + ".dest"), // as the result was cached but not checked, this path is missing result2.forall(p => os.exists(p.path) == flip) ) @@ -1283,13 +1283,13 @@ object HelloWorldTests extends TestSuite { // we reconstruct faulty behavior val Right((result, _)) = eval.apply(t) assert( - result._1.path.last == (t.asInstanceOf[NamedTask[_]].label + ".dest"), + result._1.path.last == (t.asInstanceOf[Target[_]].label + ".dest"), os.exists(result._1.path) ) os.remove.all(result._1.path) val Right((result2, _)) = eval.apply(t) assert( - result2._1.path.last == (t.asInstanceOf[NamedTask[_]].label + ".dest"), + result2._1.path.last == (t.asInstanceOf[Target[_]].label + ".dest"), // as the result was cached but not checked, this path is missing os.exists(result2._1.path) == flip ) diff --git a/scalanativelib/test/src/mill/scalanativelib/HelloNativeWorldTests.scala b/scalanativelib/test/src/mill/scalanativelib/HelloNativeWorldTests.scala index 480ddecdfc4..1d399df8c8a 100644 --- a/scalanativelib/test/src/mill/scalanativelib/HelloNativeWorldTests.scala +++ b/scalanativelib/test/src/mill/scalanativelib/HelloNativeWorldTests.scala @@ -154,7 +154,7 @@ object HelloNativeWorldTests extends TestSuite { ) } - def runTests(testTask: define.NamedTask[(String, Seq[TestRunner.Result])]) + def runTests(testTask: define.Target[(String, Seq[TestRunner.Result])]) : Map[String, Map[String, TestRunner.Result]] = { val Left(Result.Failure(_, Some(res))) = helloWorldEvaluator(testTask) From 7849a7f801faeaf73bb7b3dd5d81bb397a35e1e8 Mon Sep 17 00:00:00 2001 From: Li Haoyi Date: Sun, 2 Apr 2023 14:54:12 +0800 Subject: [PATCH 02/16] fix --- main/src/mill/main/ResolveSegments.scala | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/main/src/mill/main/ResolveSegments.scala b/main/src/mill/main/ResolveSegments.scala index 0a26cc03711..b258f9a66ae 100644 --- a/main/src/mill/main/ResolveSegments.scala +++ b/main/src/mill/main/ResolveSegments.scala @@ -50,13 +50,19 @@ object ResolveSegments extends Resolve[Segments] { .reflectSingle[Target[_]](last) .map(t => Right(t.ctx.segments)) + val command = + Resolve + .invokeCommand(obj, last, discover.asInstanceOf[Discover[Module]], rest) + .headOption + .map(_.map(_.ctx.segments)) + val module = obj.millInternal .reflectNestedObjects[Module] .find(_.millOuterCtx.segment == Segment.Label(last)) .map(m => Right(m.millModuleSegments)) - target orElse module match { + command orElse target orElse module match { case None => Resolve.errorMsgLabel( singleModuleMeta(obj, discover, obj.millModuleSegments.value.isEmpty), From 3da2dcb0b8fc0f82cfce3009611fc5070145e148 Mon Sep 17 00:00:00 2001 From: Li Haoyi Date: Sun, 2 Apr 2023 16:39:34 +0800 Subject: [PATCH 03/16] . --- main/core/src/mill/define/Task.scala | 24 ++++----- .../src/mill/define/MacroErrorTests.scala | 48 ++++++++--------- main/test/src/mill/eval/TaskTests.scala | 52 ++++++++++++++++++- 3 files changed, 87 insertions(+), 37 deletions(-) diff --git a/main/core/src/mill/define/Task.scala b/main/core/src/mill/define/Task.scala index 0b40bf92894..635b1061520 100644 --- a/main/core/src/mill/define/Task.scala +++ b/main/core/src/mill/define/Task.scala @@ -144,10 +144,10 @@ object Target extends Applicative.Applyer[Task, Task, Result, mill.api.Ctx] { ) } - def sources(values: Result[os.Path]*)(implicit ctx: mill.define.Ctx): Sources = macro sourcesImpl1 + def sources(values: Result[os.Path]*)(implicit ctx: mill.define.Ctx): Target[Seq[PathRef]] = macro sourcesImpl1 def sourcesImpl1(c: Context)(values: c.Expr[Result[os.Path]]*)(ctx: c.Expr[mill.define.Ctx]) - : c.Expr[Sources] = { + : c.Expr[Target[Seq[PathRef]]] = { import c.universe._ val wrapped = for (value <- values.toList) @@ -168,11 +168,11 @@ object Target extends Applicative.Applyer[Task, Task, Result, mill.api.Ctx] { ) } - def sources(values: Result[Seq[PathRef]])(implicit ctx: mill.define.Ctx): Sources = + def sources(values: Result[Seq[PathRef]])(implicit ctx: mill.define.Ctx): Target[Seq[PathRef]] = macro sourcesImpl2 def sourcesImpl2(c: Context)(values: c.Expr[Result[Seq[PathRef]]])(ctx: c.Expr[mill.define.Ctx]) - : c.Expr[Sources] = { + : c.Expr[Target[Seq[PathRef]]] = { import c.universe._ val taskIsPrivate = isPrivateTargetOption(c) @@ -187,10 +187,10 @@ object Target extends Applicative.Applyer[Task, Task, Result, mill.api.Ctx] { ) ) } - def source(value: Result[os.Path])(implicit ctx: mill.define.Ctx): Source = macro sourceImpl1 + def source(value: Result[os.Path])(implicit ctx: mill.define.Ctx): Target[PathRef] = macro sourceImpl1 def sourceImpl1(c: Context)(value: c.Expr[Result[os.Path]])(ctx: c.Expr[mill.define.Ctx]) - : c.Expr[Source] = { + : c.Expr[Target[PathRef]] = { import c.universe._ val wrapped = @@ -200,7 +200,7 @@ object Target extends Applicative.Applyer[Task, Task, Result, mill.api.Ctx] { val taskIsPrivate = isPrivateTargetOption(c) - mill.moduledefs.Cacher.impl0[Source](c)( + mill.moduledefs.Cacher.impl0[Target[PathRef]](c)( reify( new Source( wrapped.splice, @@ -211,15 +211,15 @@ object Target extends Applicative.Applyer[Task, Task, Result, mill.api.Ctx] { ) } - def source(value: Result[PathRef])(implicit ctx: mill.define.Ctx): Source = macro sourceImpl2 + def source(value: Result[PathRef])(implicit ctx: mill.define.Ctx): Target[PathRef] = macro sourceImpl2 def sourceImpl2(c: Context)(value: c.Expr[Result[PathRef]])(ctx: c.Expr[mill.define.Ctx]) - : c.Expr[Source] = { + : c.Expr[Target[PathRef]] = { import c.universe._ val taskIsPrivate = isPrivateTargetOption(c) - mill.moduledefs.Cacher.impl0[Source](c)( + mill.moduledefs.Cacher.impl0[Target[PathRef]](c)( reify( new Source( Applicative.impl0[Task, PathRef, mill.api.Ctx](c)(value.tree).splice, @@ -232,13 +232,13 @@ object Target extends Applicative.Applyer[Task, Task, Result, mill.api.Ctx] { def input[T](value: Result[T])(implicit w: upickle.default.Writer[T], ctx: mill.define.Ctx - ): Input[T] = + ): Target[T] = macro inputImpl[T] def inputImpl[T: c.WeakTypeTag](c: Context)(value: c.Expr[T])( w: c.Expr[upickle.default.Writer[T]], ctx: c.Expr[mill.define.Ctx] - ): c.Expr[Input[T]] = { + ): c.Expr[Target[T]] = { import c.universe._ val taskIsPrivate = isPrivateTargetOption(c) diff --git a/main/test/src/mill/define/MacroErrorTests.scala b/main/test/src/mill/define/MacroErrorTests.scala index cdda22b6881..f02cd693c13 100644 --- a/main/test/src/mill/define/MacroErrorTests.scala +++ b/main/test/src/mill/define/MacroErrorTests.scala @@ -40,30 +40,30 @@ object MacroErrorTests extends TestSuite { // e.pos.contains("def x() = ") // ) // } - "input" - { - val e = compileError(""" - object foo extends mill.util.TestUtil.BaseModule{ - def y() = T.input{1} - } - mill.define.Discover[foo.type] - """) - assert( - e.msg.contains("`T.input` definitions must have 0 parameter lists"), - e.pos.contains("def y() = ") - ) - } - "sources" - { - val e = compileError(""" - object foo extends mill.util.TestUtil.BaseModule{ - def z() = T.sources{os.pwd} - } - mill.define.Discover[foo.type] - """) - assert( - e.msg.contains("`T.sources` definitions must have 0 parameter lists"), - e.pos.contains("def z() = ") - ) - } +// "input" - { +// val e = compileError(""" +// object foo extends mill.util.TestUtil.BaseModule{ +// def y() = T.input{1} +// } +// mill.define.Discover[foo.type] +// """) +// assert( +// e.msg.contains("`T.input` definitions must have 0 parameter lists"), +// e.pos.contains("def y() = ") +// ) +// } +// "sources" - { +// val e = compileError(""" +// object foo extends mill.util.TestUtil.BaseModule{ +// def z() = T.sources{os.pwd} +// } +// mill.define.Discover[foo.type] +// """) +// assert( +// e.msg.contains("`T.sources` definitions must have 0 parameter lists"), +// e.pos.contains("def z() = ") +// ) +// } "persistent" - { val e = compileError(""" object foo extends mill.util.TestUtil.BaseModule{ diff --git a/main/test/src/mill/eval/TaskTests.scala b/main/test/src/mill/eval/TaskTests.scala index bc7f0fbfe31..c6c22e01d78 100644 --- a/main/test/src/mill/eval/TaskTests.scala +++ b/main/test/src/mill/eval/TaskTests.scala @@ -7,7 +7,25 @@ import mill.util.{TestEvaluator, TestUtil} import utest.framework.TestPath trait TaskTests extends TestSuite { - trait Build extends TestUtil.BaseModule { + trait SuperBuild extends TestUtil.BaseModule { + + var superBuildInputCount = 0 + + def superBuildInputOverrideWithConstant = T.input { + superBuildInputCount += 1 + superBuildInputCount + } + + def superBuildInputOverrideUsingSuper = T.input { + superBuildInputCount += 1 + superBuildInputCount + } + + def superBuildTargetOverrideWithInput = T { + 1234 + } + } + trait Build extends SuperBuild{ var count = 0 var changeOnceCount = 0 var workerCloseCount = 0 @@ -89,6 +107,17 @@ trait TaskTests extends TestSuite { val w = changeOnceWorker() w.apply(1) } + + override def superBuildInputOverrideWithConstant = T{ 123 } + override def superBuildInputOverrideUsingSuper = T{ + 123 + super.superBuildInputOverrideUsingSuper() + } + + var superBuildTargetOverrideWithInputCount = 0 + override def superBuildTargetOverrideWithInput = T.input { + superBuildTargetOverrideWithInputCount += 1 + superBuildTargetOverrideWithInputCount + } } def withEnv(f: (Build, TestEvaluator) => Unit)(implicit tp: TestPath): Unit @@ -192,6 +221,27 @@ trait TaskTests extends TestSuite { assert(wc.head != secondCached) } } + + + "overrideDifferentKind" - { + "inputWithTarget" - { + "notUsingSuper" - withEnv { (build, check) => + check.apply(build.superBuildInputOverrideWithConstant) ==> Right((123, 1)) + check.apply(build.superBuildInputOverrideWithConstant) ==> Right((123, 0)) + check.apply(build.superBuildInputOverrideWithConstant) ==> Right((123, 0)) + } + "usingSuper" - withEnv { (build, check) => + check.apply(build.superBuildInputOverrideUsingSuper) ==> Right((124, 1)) + check.apply(build.superBuildInputOverrideUsingSuper) ==> Right((125, 1)) + check.apply(build.superBuildInputOverrideUsingSuper) ==> Right((126, 1)) + } + } + "targetWithInput" - withEnv { (build, check) => + check.apply(build.superBuildTargetOverrideWithInput) ==> Right((1, 0)) + check.apply(build.superBuildTargetOverrideWithInput) ==> Right((2, 0)) + check.apply(build.superBuildTargetOverrideWithInput) ==> Right((3, 0)) + } + } } } From 88876c09e5f6072c472beb2809dd96be0b3db6c6 Mon Sep 17 00:00:00 2001 From: Li Haoyi Date: Sun, 2 Apr 2023 16:54:10 +0800 Subject: [PATCH 04/16] . --- main/core/src/mill/define/Router.scala | 6 +- main/core/src/mill/define/Task.scala | 58 +++++++++---------- main/core/src/mill/define/package.scala | 8 +++ main/core/src/mill/eval/Evaluator.scala | 2 +- main/src/mill/main/RunScript.scala | 4 +- main/test/src/mill/define/GraphTests.scala | 2 +- .../src/mill/define/MacroErrorTests.scala | 24 ++++---- 7 files changed, 56 insertions(+), 48 deletions(-) create mode 100644 main/core/src/mill/define/package.scala diff --git a/main/core/src/mill/define/Router.scala b/main/core/src/mill/define/Router.scala index c0f2f7d7349..537bfa42114 100644 --- a/main/core/src/mill/define/Router.scala +++ b/main/core/src/mill/define/Router.scala @@ -59,9 +59,9 @@ class Router(val ctx: blackbox.Context) extends mainargs.Macros(ctx) { overridesRoutes = { assertParamListCounts( methods, - (weakTypeOf[mill.define.Sources], 0, "`T.sources`"), - (weakTypeOf[mill.define.Input[_]], 0, "`T.input`"), - (weakTypeOf[mill.define.Persistent[_]], 0, "`T.persistent`"), + (weakTypeOf[mill.define.SourcesImpl], 0, "`T.sources`"), + (weakTypeOf[mill.define.InputImpl[_]], 0, "`T.input`"), + (weakTypeOf[mill.define.PersistentImpl[_]], 0, "`T.persistent`"), (weakTypeOf[mill.define.CachedTarget[_]], 0, "`T{...}`"), (weakTypeOf[mill.define.Command[_]], 1, "`T.command`") ) diff --git a/main/core/src/mill/define/Task.scala b/main/core/src/mill/define/Task.scala index 635b1061520..b26b72a716b 100644 --- a/main/core/src/mill/define/Task.scala +++ b/main/core/src/mill/define/Task.scala @@ -34,9 +34,9 @@ abstract class Task[+T] extends Task.Ops[T] with Applyable[Task, T] { def flushDest: Boolean = true - def asTarget: Option[CachedTarget[T]] = None + def asTarget: Option[Target[T]] = None def asCommand: Option[Command[T]] = None - def asWorker: Option[Worker[T]] = None + def asWorker: Option[Target[T]] = None def self: Task[T] = this } @@ -157,9 +157,9 @@ object Target extends Applicative.Applyer[Task, Task, Result, mill.api.Ctx] { val taskIsPrivate = isPrivateTargetOption(c) - mill.moduledefs.Cacher.impl0[Sources](c)( + mill.moduledefs.Cacher.impl0[SourcesImpl](c)( reify( - new Sources( + new SourcesImpl( Target.sequence(c.Expr[List[Task[PathRef]]](q"_root_.scala.List(..$wrapped)").splice), ctx.splice, taskIsPrivate.splice @@ -177,9 +177,9 @@ object Target extends Applicative.Applyer[Task, Task, Result, mill.api.Ctx] { val taskIsPrivate = isPrivateTargetOption(c) - mill.moduledefs.Cacher.impl0[Sources](c)( + mill.moduledefs.Cacher.impl0[SourcesImpl](c)( reify( - new Sources( + new SourcesImpl( Applicative.impl0[Task, Seq[PathRef], mill.api.Ctx](c)(values.tree).splice, ctx.splice, taskIsPrivate.splice @@ -202,7 +202,7 @@ object Target extends Applicative.Applyer[Task, Task, Result, mill.api.Ctx] { mill.moduledefs.Cacher.impl0[Target[PathRef]](c)( reify( - new Source( + new SourceImpl( wrapped.splice, ctx.splice, taskIsPrivate.splice @@ -221,7 +221,7 @@ object Target extends Applicative.Applyer[Task, Task, Result, mill.api.Ctx] { mill.moduledefs.Cacher.impl0[Target[PathRef]](c)( reify( - new Source( + new SourceImpl( Applicative.impl0[Task, PathRef, mill.api.Ctx](c)(value.tree).splice, ctx.splice, taskIsPrivate.splice @@ -243,9 +243,9 @@ object Target extends Applicative.Applyer[Task, Task, Result, mill.api.Ctx] { val taskIsPrivate = isPrivateTargetOption(c) - mill.moduledefs.Cacher.impl0[Input[T]](c)( + mill.moduledefs.Cacher.impl0[InputImpl[T]](c)( reify( - new Input[T]( + new InputImpl[T]( Applicative.impl[Task, T, mill.api.Ctx](c)(value).splice, ctx.splice, w.splice, @@ -307,31 +307,31 @@ object Target extends Applicative.Applyer[Task, Task, Result, mill.api.Ctx] { ) } - def worker[T](t: Task[T])(implicit ctx: mill.define.Ctx): Worker[T] = macro workerImpl1[T] + def worker[T](t: Task[T])(implicit ctx: mill.define.Ctx): Target[T] = macro workerImpl1[T] def workerImpl1[T: c.WeakTypeTag](c: Context)(t: c.Expr[Task[T]])(ctx: c.Expr[mill.define.Ctx]) - : c.Expr[Worker[T]] = { + : c.Expr[Target[T]] = { import c.universe._ val taskIsPrivate = isPrivateTargetOption(c) - mill.moduledefs.Cacher.impl0[Worker[T]](c)( + mill.moduledefs.Cacher.impl0[Target[T]](c)( reify( - new Worker[T](t.splice, ctx.splice, taskIsPrivate.splice) + new WorkerImpl[T](t.splice, ctx.splice, taskIsPrivate.splice) ) ) } - def worker[T](t: Result[T])(implicit ctx: mill.define.Ctx): Worker[T] = macro workerImpl2[T] + def worker[T](t: Result[T])(implicit ctx: mill.define.Ctx): Target[T] = macro workerImpl2[T] def workerImpl2[T: c.WeakTypeTag](c: Context)(t: c.Expr[T])(ctx: c.Expr[mill.define.Ctx]) - : c.Expr[Worker[T]] = { + : c.Expr[Target[T]] = { import c.universe._ val taskIsPrivate = isPrivateTargetOption(c) - mill.moduledefs.Cacher.impl0[Worker[T]](c)( + mill.moduledefs.Cacher.impl0[Target[T]](c)( reify( - new Worker[T]( + new WorkerImpl[T]( Applicative.impl[Task, T, mill.api.Ctx](c)(t).splice, ctx.splice, taskIsPrivate.splice @@ -342,20 +342,20 @@ object Target extends Applicative.Applyer[Task, Task, Result, mill.api.Ctx] { def task[T](t: Result[T]): Task[T] = macro Applicative.impl[Task, T, mill.api.Ctx] - def persistent[T](t: Result[T])(implicit rw: RW[T], ctx: mill.define.Ctx): Persistent[T] = + def persistent[T](t: Result[T])(implicit rw: RW[T], ctx: mill.define.Ctx): Target[T] = macro persistentImpl[T] def persistentImpl[T: c.WeakTypeTag](c: Context)(t: c.Expr[T])( rw: c.Expr[RW[T]], ctx: c.Expr[mill.define.Ctx] - ): c.Expr[Persistent[T]] = { + ): c.Expr[PersistentImpl[T]] = { import c.universe._ val taskIsPrivate = isPrivateTargetOption(c) - mill.moduledefs.Cacher.impl0[Persistent[T]](c)( + mill.moduledefs.Cacher.impl0[PersistentImpl[T]](c)( reify( - new Persistent[T]( + new PersistentImpl[T]( Applicative.impl[Task, T, mill.api.Ctx](c)(t).splice, ctx.splice, rw.splice, @@ -403,13 +403,13 @@ class Command[+T]( override def asCommand = Some(this) } -class Worker[+T](t: Task[T], ctx0: mill.define.Ctx, isPrivate: Option[Boolean]) +class WorkerImpl[+T](t: Task[T], ctx0: mill.define.Ctx, isPrivate: Option[Boolean]) extends TargetImpl[T](ctx0, t, isPrivate) { override def flushDest = false override def asWorker = Some(this) } -class Persistent[+T]( +class PersistentImpl[+T]( t: Task[T], ctx0: mill.define.Ctx, readWrite: RW[_], @@ -419,7 +419,7 @@ class Persistent[+T]( override def flushDest = false } -class Input[T]( +class InputImpl[T]( t: Task[T], ctx0: mill.define.Ctx, val writer: upickle.default.Writer[_], @@ -428,16 +428,16 @@ class Input[T]( override def sideHash = util.Random.nextInt() } -class Sources(t: Task[Seq[PathRef]], ctx0: mill.define.Ctx, isPrivate: Option[Boolean]) - extends Input[Seq[PathRef]]( +class SourcesImpl(t: Task[Seq[PathRef]], ctx0: mill.define.Ctx, isPrivate: Option[Boolean]) + extends InputImpl[Seq[PathRef]]( t, ctx0, upickle.default.SeqLikeWriter[Seq, PathRef], isPrivate ) -class Source(t: Task[PathRef], ctx0: mill.define.Ctx, isPrivate: Option[Boolean]) - extends Input[PathRef]( +class SourceImpl(t: Task[PathRef], ctx0: mill.define.Ctx, isPrivate: Option[Boolean]) + extends InputImpl[PathRef]( t, ctx0, PathRef.jsonFormatter, diff --git a/main/core/src/mill/define/package.scala b/main/core/src/mill/define/package.scala new file mode 100644 index 00000000000..6cb8c145dc9 --- /dev/null +++ b/main/core/src/mill/define/package.scala @@ -0,0 +1,8 @@ +package mill +package object define{ + type Source = define.Target[mill.api.PathRef] + type Sources = define.Target[Seq[mill.api.PathRef]] + type Input[T] = define.Target[T] + type Persistent[T] = define.Target[T] + type Worker[T] = define.Target[T] +} diff --git a/main/core/src/mill/eval/Evaluator.scala b/main/core/src/mill/eval/Evaluator.scala index f86c50d269e..af0619f93e1 100644 --- a/main/core/src/mill/eval/Evaluator.scala +++ b/main/core/src/mill/eval/Evaluator.scala @@ -30,7 +30,7 @@ case class Labelled[T](task: Target[T], segments: Segments) { } def writer: Option[default.Writer[T]] = task match { case t: mill.define.Command[T] => Some(t.writer.asInstanceOf[upickle.default.Writer[T]]) - case t: mill.define.Input[T] => Some(t.writer.asInstanceOf[upickle.default.Writer[T]]) + case t: mill.define.InputImpl[T] => Some(t.writer.asInstanceOf[upickle.default.Writer[T]]) case t: CachedTarget[T] => Some(t.readWrite.asInstanceOf[upickle.default.ReadWriter[T]]) case _ => None } diff --git a/main/src/mill/main/RunScript.scala b/main/src/mill/main/RunScript.scala index d366d12203a..e8e198fc8ff 100644 --- a/main/src/mill/main/RunScript.scala +++ b/main/src/mill/main/RunScript.scala @@ -169,8 +169,8 @@ object RunScript { val watched = evaluated.results .iterator .collect { - case (t: Sources, Result.Success(ps: Seq[PathRef])) => ps - case (t: Source, Result.Success(p: PathRef)) => Seq(p) + case (t: SourcesImpl, Result.Success(ps: Seq[PathRef])) => ps + case (t: SourceImpl, Result.Success(p: PathRef)) => Seq(p) } .flatten .toSeq diff --git a/main/test/src/mill/define/GraphTests.scala b/main/test/src/mill/define/GraphTests.scala index f4e931fbe83..bc02ed479c3 100644 --- a/main/test/src/mill/define/GraphTests.scala +++ b/main/test/src/mill/define/GraphTests.scala @@ -88,7 +88,7 @@ object GraphTests extends TestSuite { val grouping = grouped.lookupKey(terminal) assert( grouping.size == expectedSize, - grouping.flatMap(_.asTarget: Option[CachedTarget[_]]).filter(important.contains) == Agg( + grouping.flatMap(_.asTarget: Option[Target[_]]).filter(important.contains) == Agg( terminal ) ) diff --git a/main/test/src/mill/define/MacroErrorTests.scala b/main/test/src/mill/define/MacroErrorTests.scala index f02cd693c13..240fa5b5714 100644 --- a/main/test/src/mill/define/MacroErrorTests.scala +++ b/main/test/src/mill/define/MacroErrorTests.scala @@ -64,18 +64,18 @@ object MacroErrorTests extends TestSuite { // e.pos.contains("def z() = ") // ) // } - "persistent" - { - val e = compileError(""" - object foo extends mill.util.TestUtil.BaseModule{ - def a() = T.persistent{1} - } - mill.define.Discover[foo.type] - """) - assert( - e.msg.contains("`T.persistent` definitions must have 0 parameter lists"), - e.pos.contains("def a() = ") - ) - } +// "persistent" - { +// val e = compileError(""" +// object foo extends mill.util.TestUtil.BaseModule{ +// def a() = T.persistent{1} +// } +// mill.define.Discover[foo.type] +// """) +// assert( +// e.msg.contains("`T.persistent` definitions must have 0 parameter lists"), +// e.pos.contains("def a() = ") +// ) +// } } "badTmacro" - { // Make sure we can reference values from outside the T{...} block as part From 58269ae376ec92dbd191133a0d74fe34c5a4e708 Mon Sep 17 00:00:00 2001 From: Li Haoyi Date: Sun, 2 Apr 2023 16:58:21 +0800 Subject: [PATCH 05/16] . --- build.sc | 76 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 38 insertions(+), 38 deletions(-) diff --git a/build.sc b/build.sc index fcaa023bf79..1e0e27a948f 100644 --- a/build.sc +++ b/build.sc @@ -689,44 +689,44 @@ object contrib extends MillModule { override def testModuleDeps: Seq[JavaModule] = super.testModuleDeps ++ Seq(scalalib) } -// object playlib extends MillModule { -// override def moduleDeps = Seq(twirllib, playlib.api) -// override def compileModuleDeps = Seq(scalalib) -// -// override def testArgs = T { -// val mapping = Map( -// "MILL_CONTRIB_PLAYLIB_ROUTECOMPILER_WORKER_2_6" -> worker("2.6").assembly().path, -// "MILL_CONTRIB_PLAYLIB_ROUTECOMPILER_WORKER_2_7" -> worker("2.7").assembly().path, -// "MILL_CONTRIB_PLAYLIB_ROUTECOMPILER_WORKER_2_8" -> worker("2.8").assembly().path, -// "TEST_PLAY_VERSION_2_6" -> Deps.Play_2_6.playVersion, -// "TEST_PLAY_VERSION_2_7" -> Deps.Play_2_7.playVersion, -// "TEST_PLAY_VERSION_2_8" -> Deps.Play_2_8.playVersion -// ) -// -// scalalib.worker.testArgs() ++ -// scalalib.backgroundwrapper.testArgs() ++ -// (for ((k, v) <- mapping.to(Seq)) yield s"-D$k=$v") -// } -// override def testModuleDeps: Seq[JavaModule] = super.testModuleDeps ++ Seq(scalalib) -// -// object api extends MillPublishModule -// -// object worker extends Cross[WorkerModule](Deps.play.keys.toSeq: _*) -// class WorkerModule(playBinary: String) extends MillInternalModule { -// override def sources = T.sources { -// // We want to avoid duplicating code as long as the Play APIs allow. -// // But if newer Play versions introduce incompatibilities, -// // just remove the shared source dir for that worker and implement directly. -// Seq(PathRef(millSourcePath / os.up / "src-shared")) ++ super.sources() -// } -// override def scalaVersion = Deps.play(playBinary).scalaVersion -// override def moduleDeps = Seq(playlib.api) -// override def ivyDeps = Agg( -// Deps.osLib, -// Deps.play(playBinary).routesCompiler -// ) -// } -// } + object playlib extends MillModule { + override def moduleDeps = Seq(twirllib, playlib.api) + override def compileModuleDeps = Seq(scalalib) + + override def testArgs = T { + val mapping = Map( + "MILL_CONTRIB_PLAYLIB_ROUTECOMPILER_WORKER_2_6" -> worker("2.6").assembly().path, + "MILL_CONTRIB_PLAYLIB_ROUTECOMPILER_WORKER_2_7" -> worker("2.7").assembly().path, + "MILL_CONTRIB_PLAYLIB_ROUTECOMPILER_WORKER_2_8" -> worker("2.8").assembly().path, + "TEST_PLAY_VERSION_2_6" -> Deps.Play_2_6.playVersion, + "TEST_PLAY_VERSION_2_7" -> Deps.Play_2_7.playVersion, + "TEST_PLAY_VERSION_2_8" -> Deps.Play_2_8.playVersion + ) + + scalalib.worker.testArgs() ++ + scalalib.backgroundwrapper.testArgs() ++ + (for ((k, v) <- mapping.to(Seq)) yield s"-D$k=$v") + } + override def testModuleDeps: Seq[JavaModule] = super.testModuleDeps ++ Seq(scalalib) + + object api extends MillPublishModule + + object worker extends Cross[WorkerModule](Deps.play.keys.toSeq: _*) + class WorkerModule(playBinary: String) extends MillInternalModule { + override def sources = T.sources { + // We want to avoid duplicating code as long as the Play APIs allow. + // But if newer Play versions introduce incompatibilities, + // just remove the shared source dir for that worker and implement directly. + Seq(PathRef(millSourcePath / os.up / "src-shared")) ++ super.sources() + } + override def scalaVersion = Deps.play(playBinary).scalaVersion + override def moduleDeps = Seq(playlib.api) + override def ivyDeps = Agg( + Deps.osLib, + Deps.play(playBinary).routesCompiler + ) + } + } object scalapblib extends MillModule { override def compileModuleDeps = Seq(scalalib) From 21d2a6146e114d48a06caa462d8e17ccce46dd27 Mon Sep 17 00:00:00 2001 From: Li Haoyi Date: Sun, 2 Apr 2023 17:20:18 +0800 Subject: [PATCH 06/16] . --- .../src/mill/bsp/worker/MillBuildServer.scala | 2 +- main/api/src/mill/api/Ctx.scala | 4 +- main/core/src/mill/define/Applicative.scala | 4 +- main/core/src/mill/define/Router.scala | 2 +- main/core/src/mill/define/Task.scala | 38 +++++++++---------- main/core/src/mill/eval/Evaluator.scala | 4 +- main/src/mill/main/MainModule.scala | 4 +- .../src/mill/define/ApplicativeTests.scala | 2 +- main/test/src/mill/define/GraphTests.scala | 2 +- .../src/mill/define/MacroErrorTests.scala | 9 +++-- main/test/src/mill/eval/EvaluationTests.scala | 10 ++--- .../src/mill/eval/JavaCompileJarTests.scala | 4 +- main/test/src/mill/eval/TaskTests.scala | 4 +- main/test/src/mill/util/TestEvaluator.scala | 5 --- .../src/mill/testkit/MillTestkit.scala | 6 +-- 15 files changed, 49 insertions(+), 51 deletions(-) diff --git a/bsp/worker/src/mill/bsp/worker/MillBuildServer.scala b/bsp/worker/src/mill/bsp/worker/MillBuildServer.scala index e63fe23fb1b..feb21f05edc 100644 --- a/bsp/worker/src/mill/bsp/worker/MillBuildServer.scala +++ b/bsp/worker/src/mill/bsp/worker/MillBuildServer.scala @@ -665,7 +665,7 @@ class MillBuildServer( logger = new MillBspLogger(client, cleanTask.hashCode, evaluator.baseLogger) ) if (cleanResult.failing.keyCount > 0) ( - msg + s" CachedTarget ${compileTargetName} could not be cleaned. See message from mill: \n" + + msg + s" Target ${compileTargetName} could not be cleaned. See message from mill: \n" + (cleanResult.results(cleanTask) match { case fail: Result.Failure[Any] => fail.msg + "\n" case _ => "could not retrieve message" diff --git a/main/api/src/mill/api/Ctx.scala b/main/api/src/mill/api/Ctx.scala index d78cd5f76f9..b78e017e265 100644 --- a/main/api/src/mill/api/Ctx.scala +++ b/main/api/src/mill/api/Ctx.scala @@ -5,10 +5,10 @@ import scala.language.implicitConversions import os.Path /** - * Provides access to various resources in the context of a currently execution CachedTarget. + * Provides access to various resources in the context of a currently execution Target. */ object Ctx { - @compileTimeOnly("CachedTarget.ctx() / T.ctx() / T.* APIs can only be used with a T{...} block") + @compileTimeOnly("Target.ctx() / T.ctx() / T.* APIs can only be used with a T{...} block") @ImplicitStub implicit def taskCtx: Ctx = ??? diff --git a/main/core/src/mill/define/Applicative.scala b/main/core/src/mill/define/Applicative.scala index 6c50b1663c3..ff212a7a30e 100644 --- a/main/core/src/mill/define/Applicative.scala +++ b/main/core/src/mill/define/Applicative.scala @@ -18,7 +18,7 @@ object Applicative { def apply[T](t: M[T]): T } object ApplyHandler { - @compileTimeOnly("CachedTarget#apply() can only be used with a T{...} block") + @compileTimeOnly("Target#apply() can only be used with a T{...} block") implicit def defaultApplyHandler[M[+_]]: ApplyHandler[M] = ??? } trait Applyable[M[+_], +T] { @@ -64,7 +64,7 @@ object Applicative { val banned0 = banned.next() c.abort( banned0.pos, - "CachedTarget#apply() call cannot use `" + banned0.symbol + "` defined within the T{...} block" + "Target#apply() call cannot use `" + banned0.symbol + "` defined within the T{...} block" ) } val tempName = c.freshName(TermName("tmp")) diff --git a/main/core/src/mill/define/Router.scala b/main/core/src/mill/define/Router.scala index 537bfa42114..6f5e60285e0 100644 --- a/main/core/src/mill/define/Router.scala +++ b/main/core/src/mill/define/Router.scala @@ -62,7 +62,7 @@ class Router(val ctx: blackbox.Context) extends mainargs.Macros(ctx) { (weakTypeOf[mill.define.SourcesImpl], 0, "`T.sources`"), (weakTypeOf[mill.define.InputImpl[_]], 0, "`T.input`"), (weakTypeOf[mill.define.PersistentImpl[_]], 0, "`T.persistent`"), - (weakTypeOf[mill.define.CachedTarget[_]], 0, "`T{...}`"), + (weakTypeOf[mill.define.TargetImpl[_]], 0, "`T{...}`"), (weakTypeOf[mill.define.Command[_]], 1, "`T.command`") ) diff --git a/main/core/src/mill/define/Task.scala b/main/core/src/mill/define/Task.scala index b26b72a716b..b6b1ad84f85 100644 --- a/main/core/src/mill/define/Task.scala +++ b/main/core/src/mill/define/Task.scala @@ -12,12 +12,12 @@ import scala.reflect.macros.blackbox.Context * single output of type [[T]]. * * Generally not instantiated manually, but instead constructed via the - * [[CachedTarget.apply]] & similar macros. + * [[Target.apply]] & similar macros. */ abstract class Task[+T] extends Task.Ops[T] with Applyable[Task, T] { /** - * What other Targets does this CachedTarget depend on? + * What other Targets does this Target depend on? */ val inputs: Seq[Task[_]] @@ -52,7 +52,7 @@ trait Target[+T] extends Task[T] { def isPrivate: Option[Boolean] = None } trait CachedTarget[+T] extends Target[T] { - override def asTarget: Option[CachedTarget[T]] = Some(this) + override def asTarget: Option[Target[T]] = Some(this) def readWrite: RW[_] } @@ -73,16 +73,16 @@ object Target extends Applicative.Applyer[Task, Task, Result, mill.api.Ctx] { def targetImpl[T: c.WeakTypeTag](c: Context)(t: c.Expr[T])( rw: c.Expr[RW[T]], ctx: c.Expr[mill.define.Ctx] - ): c.Expr[CachedTarget[T]] = { + ): c.Expr[Target[T]] = { import c.universe._ val taskIsPrivate = isPrivateTargetOption(c) val lhs = Applicative.impl0[Task, T, mill.api.Ctx](c)(reify(Result.Success(t.splice)).tree) - mill.moduledefs.Cacher.impl0[CachedTarget[T]](c)( + mill.moduledefs.Cacher.impl0[Target[T]](c)( reify( - new CachedTargetImpl[T]( + new TargetImpl[T]( lhs.splice, ctx.splice, rw.splice, @@ -104,14 +104,14 @@ object Target extends Applicative.Applyer[Task, Task, Result, mill.api.Ctx] { def targetResultImpl[T: c.WeakTypeTag](c: Context)(t: c.Expr[Result[T]])( rw: c.Expr[RW[T]], ctx: c.Expr[mill.define.Ctx] - ): c.Expr[CachedTarget[T]] = { + ): c.Expr[Target[T]] = { import c.universe._ val taskIsPrivate = isPrivateTargetOption(c) - mill.moduledefs.Cacher.impl0[CachedTarget[T]](c)( + mill.moduledefs.Cacher.impl0[Target[T]](c)( reify( - new CachedTargetImpl[T]( + new TargetImpl[T]( Applicative.impl0[Task, T, mill.api.Ctx](c)(t.tree).splice, ctx.splice, rw.splice, @@ -127,14 +127,14 @@ object Target extends Applicative.Applyer[Task, Task, Result, mill.api.Ctx] { def targetTaskImpl[T: c.WeakTypeTag](c: Context)(t: c.Expr[Task[T]])( rw: c.Expr[RW[T]], ctx: c.Expr[mill.define.Ctx] - ): c.Expr[CachedTarget[T]] = { + ): c.Expr[Target[T]] = { import c.universe._ val taskIsPrivate = isPrivateTargetOption(c) - mill.moduledefs.Cacher.impl0[CachedTarget[T]](c)( + mill.moduledefs.Cacher.impl0[Target[T]](c)( reify( - new CachedTargetImpl[T]( + new TargetImpl[T]( t.splice, ctx.splice, rw.splice, @@ -375,7 +375,7 @@ object Target extends Applicative.Applyer[Task, Task, Result, mill.api.Ctx] { } } -abstract class TargetImpl[+T]( +abstract class TargetImplBase[+T]( ctx0: mill.define.Ctx, t: Task[T], override val isPrivate: Option[Boolean] @@ -385,12 +385,12 @@ abstract class TargetImpl[+T]( val inputs = Seq(t) } -class CachedTargetImpl[+T]( +class TargetImpl[+T]( t: Task[T], ctx0: mill.define.Ctx, override val readWrite: RW[_], isPrivate: Option[Boolean] -) extends TargetImpl[T](ctx0, t, isPrivate) +) extends TargetImplBase[T](ctx0, t, isPrivate) with CachedTarget[T] {} class Command[+T]( @@ -399,12 +399,12 @@ class Command[+T]( val writer: W[_], val cls: Class[_], isPrivate: Option[Boolean] -) extends TargetImpl[T](ctx0, t, isPrivate) { +) extends TargetImplBase[T](ctx0, t, isPrivate) { override def asCommand = Some(this) } class WorkerImpl[+T](t: Task[T], ctx0: mill.define.Ctx, isPrivate: Option[Boolean]) - extends TargetImpl[T](ctx0, t, isPrivate) { + extends TargetImplBase[T](ctx0, t, isPrivate) { override def flushDest = false override def asWorker = Some(this) } @@ -414,7 +414,7 @@ class PersistentImpl[+T]( ctx0: mill.define.Ctx, readWrite: RW[_], isPrivate: Option[Boolean] -) extends CachedTargetImpl[T](t, ctx0, readWrite, isPrivate) { +) extends TargetImpl[T](t, ctx0, readWrite, isPrivate) { override def flushDest = false } @@ -424,7 +424,7 @@ class InputImpl[T]( ctx0: mill.define.Ctx, val writer: upickle.default.Writer[_], isPrivate: Option[Boolean] -) extends TargetImpl[T](ctx0, t, isPrivate) { +) extends TargetImplBase[T](ctx0, t, isPrivate) { override def sideHash = util.Random.nextInt() } diff --git a/main/core/src/mill/eval/Evaluator.scala b/main/core/src/mill/eval/Evaluator.scala index af0619f93e1..c127faecb27 100644 --- a/main/core/src/mill/eval/Evaluator.scala +++ b/main/core/src/mill/eval/Evaluator.scala @@ -25,13 +25,13 @@ import scala.util.control.NonFatal case class Labelled[T](task: Target[T], segments: Segments) { def format: Option[default.ReadWriter[T]] = task match { - case t: CachedTarget[T] => Some(t.readWrite.asInstanceOf[upickle.default.ReadWriter[T]]) + case t: TargetImpl[T] => Some(t.readWrite.asInstanceOf[upickle.default.ReadWriter[T]]) case _ => None } def writer: Option[default.Writer[T]] = task match { case t: mill.define.Command[T] => Some(t.writer.asInstanceOf[upickle.default.Writer[T]]) case t: mill.define.InputImpl[T] => Some(t.writer.asInstanceOf[upickle.default.Writer[T]]) - case t: CachedTarget[T] => Some(t.readWrite.asInstanceOf[upickle.default.ReadWriter[T]]) + case t: TargetImpl[T] => Some(t.readWrite.asInstanceOf[upickle.default.ReadWriter[T]]) case _ => None } } diff --git a/main/src/mill/main/MainModule.scala b/main/src/mill/main/MainModule.scala index 2e441dc15e0..eef28cc3f2a 100644 --- a/main/src/mill/main/MainModule.scala +++ b/main/src/mill/main/MainModule.scala @@ -5,7 +5,7 @@ import mainargs.TokensReader import java.util.concurrent.LinkedBlockingQueue import mill.{BuildInfo, T} import mill.api.{Ctx, PathRef, Result, internal} -import mill.define.{Command, Target, Segments, SelectMode, CachedTarget, Task} +import mill.define.{Command, Segments, SelectMode, Target, TargetImpl, Task} import mill.eval.{Evaluator, EvaluatorPaths} import mill.util.{PrintLogger, Watched} import pprint.{Renderer, Tree, Truncated} @@ -180,7 +180,7 @@ trait MainModule extends mill.Module { def rec(t: Task[_]): Seq[Segments] = { if (seen(t)) Nil // do nothing else t match { - case t: CachedTarget[_] if evaluator.rootModule.millInternal.targets.contains(t) => + case t: TargetImpl[_] if evaluator.rootModule.millInternal.targets.contains(t) => Seq(t.ctx.segments) case _ => seen.add(t) diff --git a/main/test/src/mill/define/ApplicativeTests.scala b/main/test/src/mill/define/ApplicativeTests.scala index 46e03036f06..1eede908af2 100644 --- a/main/test/src/mill/define/ApplicativeTests.scala +++ b/main/test/src/mill/define/ApplicativeTests.scala @@ -27,7 +27,7 @@ object ApplicativeTests extends TestSuite { value } } - @compileTimeOnly("CachedTarget.ctx() can only be used with a T{...} block") + @compileTimeOnly("Target.ctx() can only be used with a T{...} block") @ImplicitStub implicit def taskCtx: String = ??? diff --git a/main/test/src/mill/define/GraphTests.scala b/main/test/src/mill/define/GraphTests.scala index bc02ed479c3..a298f5e4a0a 100644 --- a/main/test/src/mill/define/GraphTests.scala +++ b/main/test/src/mill/define/GraphTests.scala @@ -79,7 +79,7 @@ object GraphTests extends TestSuite { val important = important0.map(_(base)) val grouped = Graph.groupAroundImportantTargets(topoSorted) { - case t: CachedTarget[_] if important.contains(t) => t: Target[_] + case t: TargetImpl[_] if important.contains(t) => t: Target[_] } val flattened = Agg.from(grouped.values().flatMap(_.items)) diff --git a/main/test/src/mill/define/MacroErrorTests.scala b/main/test/src/mill/define/MacroErrorTests.scala index 240fa5b5714..4e16fac061e 100644 --- a/main/test/src/mill/define/MacroErrorTests.scala +++ b/main/test/src/mill/define/MacroErrorTests.scala @@ -28,6 +28,9 @@ object MacroErrorTests extends TestSuite { e.pos.contains("def w = ") ) } + + // WIP getting this error reporting working again + // "target" - { // val e = compileError(""" // object foo extends mill.util.TestUtil.BaseModule{ @@ -79,7 +82,7 @@ object MacroErrorTests extends TestSuite { } "badTmacro" - { // Make sure we can reference values from outside the T{...} block as part - // of our `CachedTarget#apply()` calls, but we cannot reference any values that + // of our `Target#apply()` calls, but we cannot reference any values that // come from inside the T{...} block "pos" - { val e = compileError(""" @@ -99,7 +102,7 @@ object MacroErrorTests extends TestSuite { "neg" - { val expectedMsg = - "CachedTarget#apply() call cannot use `value n` defined within the T{...} block" + "Target#apply() call cannot use `value n` defined within the T{...} block" val err = compileError("""new Module{ def a = T{ 1 } val arr = Array(a) @@ -115,7 +118,7 @@ object MacroErrorTests extends TestSuite { "neg2" - { val expectedMsg = - "CachedTarget#apply() call cannot use `value x` defined within the T{...} block" + "Target#apply() call cannot use `value x` defined within the T{...} block" val err = compileError("""new Module{ def a = T{ 1 } val arr = Array(a) diff --git a/main/test/src/mill/eval/EvaluationTests.scala b/main/test/src/mill/eval/EvaluationTests.scala index 36600fc90f5..de8c8d32f1c 100644 --- a/main/test/src/mill/eval/EvaluationTests.scala +++ b/main/test/src/mill/eval/EvaluationTests.scala @@ -1,7 +1,7 @@ package mill.eval import mill.util.TestUtil.{Test, test} -import mill.define.{Discover, Graph, CachedTarget, Task} +import mill.define.{Discover, Graph, TargetImpl, Task} import mill.{Module, T} import mill.util.{DummyLogger, TestEvaluator, TestGraphs, TestUtil} import mill.api.Strict.Agg @@ -181,14 +181,14 @@ class EvaluationTests(threadCount: Option[Int]) extends TestSuite { import separateGroups._ val checker = new Checker(separateGroups) val evaled1 = checker.evaluator.evaluate(Agg(right, left)) - val filtered1 = evaled1.evaluated.filter(_.isInstanceOf[CachedTarget[_]]) + val filtered1 = evaled1.evaluated.filter(_.isInstanceOf[TargetImpl[_]]) assert(filtered1.toSeq.sortBy(_.toString) == Seq(change, left, right).sortBy(_.toString)) val evaled2 = checker.evaluator.evaluate(Agg(right, left)) - val filtered2 = evaled2.evaluated.filter(_.isInstanceOf[CachedTarget[_]]) + val filtered2 = evaled2.evaluated.filter(_.isInstanceOf[TargetImpl[_]]) assert(filtered2 == Agg()) change.counter += 1 val evaled3 = checker.evaluator.evaluate(Agg(right, left)) - val filtered3 = evaled3.evaluated.filter(_.isInstanceOf[CachedTarget[_]]) + val filtered3 = evaled3.evaluated.filter(_.isInstanceOf[TargetImpl[_]]) assert(filtered3 == Agg(change, right)) } @@ -337,7 +337,7 @@ class EvaluationTests(threadCount: Option[Int]) extends TestSuite { // But if `up` changes, the entire block of downstream tasks needs to // recompute together, including `middle` which doesn't depend on `up`, // because tasks have no cached value that can be used. `right`, which - // is a cached CachedTarget, does not recompute + // is a cached Target, does not recompute up.inputs(0).asInstanceOf[Test].counter += 1 check(down, expValue = 10102, expEvaled = Agg(up, down), extraEvaled = 4) assert(leftCount == 2, middleCount == 2, rightCount == 1) diff --git a/main/test/src/mill/eval/JavaCompileJarTests.scala b/main/test/src/mill/eval/JavaCompileJarTests.scala index a617f5d36c8..9839929413a 100644 --- a/main/test/src/mill/eval/JavaCompileJarTests.scala +++ b/main/test/src/mill/eval/JavaCompileJarTests.scala @@ -1,6 +1,6 @@ package mill.eval -import mill.define.{Discover, Input, CachedTarget, Task} +import mill.define.{Discover, Input, Target, Task} import mill.modules.Jvm import mill.api.Ctx.Dest import mill.{Module, T} @@ -87,7 +87,7 @@ object JavaCompileJarTests extends TestSuite { // exactly the same so no re-jarring. append(sourceRootPath / "Foo.java", " ") // Note that `sourceRoot` and `resourceRoot` never turn up in the `expected` - // list, because they are `Source`s not `CachedTarget`s + // list, because they are `Source`s not `Target`s check(targets = Agg(jar), expected = Agg( /*sourceRoot, */ allSources, classFiles)) // Appending a new class changes the classfiles, which forces us to diff --git a/main/test/src/mill/eval/TaskTests.scala b/main/test/src/mill/eval/TaskTests.scala index c6c22e01d78..77a295f8d99 100644 --- a/main/test/src/mill/eval/TaskTests.scala +++ b/main/test/src/mill/eval/TaskTests.scala @@ -126,14 +126,14 @@ trait TaskTests extends TestSuite { "inputs" - withEnv { (build, check) => // Inputs always re-evaluate, including forcing downstream cached Targets - // to re-evaluate, but normal Tasks behind a CachedTarget run once then are cached + // to re-evaluate, but normal Tasks behind a Target run once then are cached check.apply(build.taskInput) ==> Right((1, 1)) check.apply(build.taskInput) ==> Right((2, 1)) check.apply(build.taskInput) ==> Right((3, 1)) } "noInputs" - withEnv { (build, check) => // Inputs always re-evaluate, including forcing downstream cached Targets - // to re-evaluate, but normal Tasks behind a CachedTarget run once then are cached + // to re-evaluate, but normal Tasks behind a Target run once then are cached check.apply(build.taskNoInput) ==> Right((1, 1)) check.apply(build.taskNoInput) ==> Right((1, 0)) check.apply(build.taskNoInput) ==> Right((1, 0)) diff --git a/main/test/src/mill/util/TestEvaluator.scala b/main/test/src/mill/util/TestEvaluator.scala index 37253576408..5da300dc515 100644 --- a/main/test/src/mill/util/TestEvaluator.scala +++ b/main/test/src/mill/util/TestEvaluator.scala @@ -1,12 +1,7 @@ package mill.util -import mill.testkit.MillTestKit import java.io.{InputStream, PrintStream} -import mill.define.{Input, CachedTarget, Task} -import mill.api.Result.OuterStack import mill.eval.Evaluator -import mill.api.Strict.Agg -import utest.assert import utest.framework.TestPath import language.experimental.macros diff --git a/main/testkit/src/mill/testkit/MillTestkit.scala b/main/testkit/src/mill/testkit/MillTestkit.scala index ec7c9a82b21..ad4e59eba82 100644 --- a/main/testkit/src/mill/testkit/MillTestkit.scala +++ b/main/testkit/src/mill/testkit/MillTestkit.scala @@ -5,7 +5,7 @@ import mill.api.Result import mill.api.Result.OuterStack import mill.api.Strict.Agg import java.io.{InputStream, PrintStream} -import mill.define.{Input, CachedTarget, Task} +import mill.define.{Input, Task} import mill.eval.Evaluator import language.experimental.macros import mill.api.{DummyInputStream, Result} @@ -115,7 +115,7 @@ trait MillTestKit { Tuple2( evaluated.rawValues.head.asInstanceOf[Result.Success[T]].value, evaluated.evaluated.collect { - case t: CachedTarget[_] + case t: TargetImpl[_] if module.millInternal.targets.contains(t) && !t.isInstanceOf[Input[_]] && !t.ctx.external => t @@ -131,7 +131,7 @@ trait MillTestKit { } } - def fail(target: CachedTarget[_], expectedFailCount: Int, expectedRawValues: Seq[Result[_]]): Unit = { + def fail(target: Target[_], expectedFailCount: Int, expectedRawValues: Seq[Result[_]]): Unit = { val res = evaluator.evaluate(Agg(target)) From 2014d5104790ebea17e9ed5c45938e53dd4e19d5 Mon Sep 17 00:00:00 2001 From: Li Haoyi Date: Sun, 2 Apr 2023 17:55:33 +0800 Subject: [PATCH 07/16] . --- main/core/src/mill/eval/Evaluator.scala | 6 +++--- main/src/mill/main/MainModule.scala | 4 ++-- main/src/mill/main/ResolveSegments.scala | 1 - main/test/src/mill/define/GraphTests.scala | 2 +- main/test/src/mill/eval/EvaluationTests.scala | 8 ++++---- main/test/src/mill/eval/JavaCompileJarTests.scala | 4 ++++ main/testkit/src/mill/testkit/MillTestkit.scala | 10 ++++++---- 7 files changed, 20 insertions(+), 15 deletions(-) diff --git a/main/core/src/mill/eval/Evaluator.scala b/main/core/src/mill/eval/Evaluator.scala index c127faecb27..6cc9130ff53 100644 --- a/main/core/src/mill/eval/Evaluator.scala +++ b/main/core/src/mill/eval/Evaluator.scala @@ -25,13 +25,13 @@ import scala.util.control.NonFatal case class Labelled[T](task: Target[T], segments: Segments) { def format: Option[default.ReadWriter[T]] = task match { - case t: TargetImpl[T] => Some(t.readWrite.asInstanceOf[upickle.default.ReadWriter[T]]) + case t: CachedTarget[T] => Some(t.readWrite.asInstanceOf[upickle.default.ReadWriter[T]]) case _ => None } def writer: Option[default.Writer[T]] = task match { case t: mill.define.Command[T] => Some(t.writer.asInstanceOf[upickle.default.Writer[T]]) case t: mill.define.InputImpl[T] => Some(t.writer.asInstanceOf[upickle.default.Writer[T]]) - case t: TargetImpl[T] => Some(t.readWrite.asInstanceOf[upickle.default.ReadWriter[T]]) + case t: CachedTarget[T] => Some(t.readWrite.asInstanceOf[upickle.default.ReadWriter[T]]) case _ => None } } @@ -615,7 +615,7 @@ class Evaluator private (_home: os.Path, newResults(task) = for (v <- res) yield { ( v, - if (task.isInstanceOf[Worker[_]]) inputsHash + if (task.isInstanceOf[WorkerImpl[_]]) inputsHash else v.## ) } diff --git a/main/src/mill/main/MainModule.scala b/main/src/mill/main/MainModule.scala index eef28cc3f2a..889df153fb6 100644 --- a/main/src/mill/main/MainModule.scala +++ b/main/src/mill/main/MainModule.scala @@ -5,7 +5,7 @@ import mainargs.TokensReader import java.util.concurrent.LinkedBlockingQueue import mill.{BuildInfo, T} import mill.api.{Ctx, PathRef, Result, internal} -import mill.define.{Command, Segments, SelectMode, Target, TargetImpl, Task} +import mill.define.{CachedTarget, Command, Segments, SelectMode, Target, TargetImpl, Task} import mill.eval.{Evaluator, EvaluatorPaths} import mill.util.{PrintLogger, Watched} import pprint.{Renderer, Tree, Truncated} @@ -180,7 +180,7 @@ trait MainModule extends mill.Module { def rec(t: Task[_]): Seq[Segments] = { if (seen(t)) Nil // do nothing else t match { - case t: TargetImpl[_] if evaluator.rootModule.millInternal.targets.contains(t) => + case t: CachedTarget[_] if evaluator.rootModule.millInternal.targets.contains(t) => Seq(t.ctx.segments) case _ => seen.add(t) diff --git a/main/src/mill/main/ResolveSegments.scala b/main/src/mill/main/ResolveSegments.scala index b258f9a66ae..7418ee67576 100644 --- a/main/src/mill/main/ResolveSegments.scala +++ b/main/src/mill/main/ResolveSegments.scala @@ -43,7 +43,6 @@ object ResolveSegments extends Resolve[Segments] { discover: Discover[_], rest: Seq[String] ): Either[String, Seq[Segments]] = { - val target = obj .millInternal diff --git a/main/test/src/mill/define/GraphTests.scala b/main/test/src/mill/define/GraphTests.scala index a298f5e4a0a..bc02ed479c3 100644 --- a/main/test/src/mill/define/GraphTests.scala +++ b/main/test/src/mill/define/GraphTests.scala @@ -79,7 +79,7 @@ object GraphTests extends TestSuite { val important = important0.map(_(base)) val grouped = Graph.groupAroundImportantTargets(topoSorted) { - case t: TargetImpl[_] if important.contains(t) => t: Target[_] + case t: CachedTarget[_] if important.contains(t) => t: Target[_] } val flattened = Agg.from(grouped.values().flatMap(_.items)) diff --git a/main/test/src/mill/eval/EvaluationTests.scala b/main/test/src/mill/eval/EvaluationTests.scala index de8c8d32f1c..de3cbe11e39 100644 --- a/main/test/src/mill/eval/EvaluationTests.scala +++ b/main/test/src/mill/eval/EvaluationTests.scala @@ -1,7 +1,7 @@ package mill.eval import mill.util.TestUtil.{Test, test} -import mill.define.{Discover, Graph, TargetImpl, Task} +import mill.define.{CachedTarget, Discover, Graph, TargetImpl, Task} import mill.{Module, T} import mill.util.{DummyLogger, TestEvaluator, TestGraphs, TestUtil} import mill.api.Strict.Agg @@ -181,14 +181,14 @@ class EvaluationTests(threadCount: Option[Int]) extends TestSuite { import separateGroups._ val checker = new Checker(separateGroups) val evaled1 = checker.evaluator.evaluate(Agg(right, left)) - val filtered1 = evaled1.evaluated.filter(_.isInstanceOf[TargetImpl[_]]) + val filtered1 = evaled1.evaluated.filter(_.isInstanceOf[CachedTarget[_]]) assert(filtered1.toSeq.sortBy(_.toString) == Seq(change, left, right).sortBy(_.toString)) val evaled2 = checker.evaluator.evaluate(Agg(right, left)) - val filtered2 = evaled2.evaluated.filter(_.isInstanceOf[TargetImpl[_]]) + val filtered2 = evaled2.evaluated.filter(_.isInstanceOf[CachedTarget[_]]) assert(filtered2 == Agg()) change.counter += 1 val evaled3 = checker.evaluator.evaluate(Agg(right, left)) - val filtered3 = evaled3.evaluated.filter(_.isInstanceOf[TargetImpl[_]]) + val filtered3 = evaled3.evaluated.filter(_.isInstanceOf[CachedTarget[_]]) assert(filtered3 == Agg(change, right)) } diff --git a/main/test/src/mill/eval/JavaCompileJarTests.scala b/main/test/src/mill/eval/JavaCompileJarTests.scala index 9839929413a..765474d0608 100644 --- a/main/test/src/mill/eval/JavaCompileJarTests.scala +++ b/main/test/src/mill/eval/JavaCompileJarTests.scala @@ -72,11 +72,15 @@ object JavaCompileJarTests extends TestSuite { def append(path: os.Path, txt: String) = os.write.append(path, txt) + println("=" * 150) + check( targets = Agg(jar), expected = Agg(allSources, classFiles, jar) ) + println("=" * 150) + // Re-running with no changes results in nothing being evaluated check(targets = Agg(jar), expected = Agg()) // Appending an empty string gets ignored due to file-content hashing diff --git a/main/testkit/src/mill/testkit/MillTestkit.scala b/main/testkit/src/mill/testkit/MillTestkit.scala index ad4e59eba82..b39bd4ff73e 100644 --- a/main/testkit/src/mill/testkit/MillTestkit.scala +++ b/main/testkit/src/mill/testkit/MillTestkit.scala @@ -115,9 +115,9 @@ trait MillTestKit { Tuple2( evaluated.rawValues.head.asInstanceOf[Result.Success[T]].value, evaluated.evaluated.collect { - case t: TargetImpl[_] + case t: CachedTarget[_] if module.millInternal.targets.contains(t) - && !t.isInstanceOf[Input[_]] + && !t.isInstanceOf[InputImpl[_]] && !t.ctx.external => t case t: mill.define.Command[_] => t }.size @@ -148,11 +148,13 @@ trait MillTestKit { } def check(targets: Agg[Task[_]], expected: Agg[Task[_]]): Unit = { - val evaluated = evaluator.evaluate(targets) + val targets2 = evaluator.evaluate(targets) .evaluated .flatMap(_.asTarget) + + val evaluated = targets2 .filter(module.millInternal.targets.contains) - .filter(!_.isInstanceOf[Input[_]]) + .filter(!_.isInstanceOf[InputImpl[_]]) assert( evaluated == expected, s"evaluated is not equal expected. evaluated=${evaluated}, expected=${expected}" From a1a3f48f2d40192eaa8e498adb7382ea5a221d4a Mon Sep 17 00:00:00 2001 From: Li Haoyi Date: Sun, 2 Apr 2023 20:41:09 +0800 Subject: [PATCH 08/16] . --- main/core/src/mill/define/Router.scala | 18 ++-- .../src/mill/define/MacroErrorTests.scala | 96 +++++++++---------- 2 files changed, 54 insertions(+), 60 deletions(-) diff --git a/main/core/src/mill/define/Router.scala b/main/core/src/mill/define/Router.scala index 6f5e60285e0..da9a22dfb95 100644 --- a/main/core/src/mill/define/Router.scala +++ b/main/core/src/mill/define/Router.scala @@ -39,17 +39,14 @@ class Router(val ctx: blackbox.Context) extends mainargs.Macros(ctx) { cases: (Type, Int, String)* ): Unit = { for (m <- methods.toList) { - for ((tt, n, label) <- cases) { - if ( - m.returnType <:< tt && - m.paramLists.length != n - ) { - c.abort( + cases + .find{case (tt, n, label) => m.returnType <:< tt} + .foreach{case (tt, n, label) => + if (m.paramLists.length != n) c.abort( m.pos, s"$label definitions must have $n parameter list" + (if (n == 1) "" else "s") ) } - } } } val mapping = for { @@ -59,11 +56,8 @@ class Router(val ctx: blackbox.Context) extends mainargs.Macros(ctx) { overridesRoutes = { assertParamListCounts( methods, - (weakTypeOf[mill.define.SourcesImpl], 0, "`T.sources`"), - (weakTypeOf[mill.define.InputImpl[_]], 0, "`T.input`"), - (weakTypeOf[mill.define.PersistentImpl[_]], 0, "`T.persistent`"), - (weakTypeOf[mill.define.TargetImpl[_]], 0, "`T{...}`"), - (weakTypeOf[mill.define.Command[_]], 1, "`T.command`") + (weakTypeOf[mill.define.Command[_]], 1, "`T.command`"), + (weakTypeOf[mill.define.Target[_]], 0, "Target"), ) for { diff --git a/main/test/src/mill/define/MacroErrorTests.scala b/main/test/src/mill/define/MacroErrorTests.scala index 4e16fac061e..9ec8e7fad5b 100644 --- a/main/test/src/mill/define/MacroErrorTests.scala +++ b/main/test/src/mill/define/MacroErrorTests.scala @@ -31,54 +31,54 @@ object MacroErrorTests extends TestSuite { // WIP getting this error reporting working again -// "target" - { -// val e = compileError(""" -// object foo extends mill.util.TestUtil.BaseModule{ -// def x() = T{1} -// } -// mill.define.Discover[foo.type] -// """) -// assert( -// e.msg.contains("`T{...}` definitions must have 0 parameter lists"), -// e.pos.contains("def x() = ") -// ) -// } -// "input" - { -// val e = compileError(""" -// object foo extends mill.util.TestUtil.BaseModule{ -// def y() = T.input{1} -// } -// mill.define.Discover[foo.type] -// """) -// assert( -// e.msg.contains("`T.input` definitions must have 0 parameter lists"), -// e.pos.contains("def y() = ") -// ) -// } -// "sources" - { -// val e = compileError(""" -// object foo extends mill.util.TestUtil.BaseModule{ -// def z() = T.sources{os.pwd} -// } -// mill.define.Discover[foo.type] -// """) -// assert( -// e.msg.contains("`T.sources` definitions must have 0 parameter lists"), -// e.pos.contains("def z() = ") -// ) -// } -// "persistent" - { -// val e = compileError(""" -// object foo extends mill.util.TestUtil.BaseModule{ -// def a() = T.persistent{1} -// } -// mill.define.Discover[foo.type] -// """) -// assert( -// e.msg.contains("`T.persistent` definitions must have 0 parameter lists"), -// e.pos.contains("def a() = ") -// ) -// } + "target" - { + val e = compileError(""" + object foo extends mill.util.TestUtil.BaseModule{ + def x() = T{1} + } + mill.define.Discover[foo.type] + """) + assert( + e.msg.contains("Target definitions must have 0 parameter lists"), + e.pos.contains("def x() = ") + ) + } + "input" - { + val e = compileError(""" + object foo extends mill.util.TestUtil.BaseModule{ + def y() = T.input{1} + } + mill.define.Discover[foo.type] + """) + assert( + e.msg.contains("Target definitions must have 0 parameter lists"), + e.pos.contains("def y() = ") + ) + } + "sources" - { + val e = compileError(""" + object foo extends mill.util.TestUtil.BaseModule{ + def z() = T.sources{os.pwd} + } + mill.define.Discover[foo.type] + """) + assert( + e.msg.contains("Target definitions must have 0 parameter lists"), + e.pos.contains("def z() = ") + ) + } + "persistent" - { + val e = compileError(""" + object foo extends mill.util.TestUtil.BaseModule{ + def a() = T.persistent{1} + } + mill.define.Discover[foo.type] + """) + assert( + e.msg.contains("Target definitions must have 0 parameter lists"), + e.pos.contains("def a() = ") + ) + } } "badTmacro" - { // Make sure we can reference values from outside the T{...} block as part From f05a2974b418d1f4b1dc7876a2d44909cd8f2137 Mon Sep 17 00:00:00 2001 From: Li Haoyi Date: Mon, 3 Apr 2023 10:20:19 +0800 Subject: [PATCH 09/16] kill CachedTarget --- main/core/src/mill/define/Task.scala | 11 ++++----- main/core/src/mill/eval/Evaluator.scala | 4 ++-- main/src/mill/main/MainModule.scala | 4 ++-- main/test/src/mill/define/GraphTests.scala | 2 +- main/test/src/mill/eval/EvaluationTests.scala | 8 +++---- main/test/src/mill/util/TestUtil.scala | 23 +++++++++++++++---- .../src/mill/testkit/MillTestkit.scala | 2 +- 7 files changed, 32 insertions(+), 22 deletions(-) diff --git a/main/core/src/mill/define/Task.scala b/main/core/src/mill/define/Task.scala index b6b1ad84f85..1ac3d369495 100644 --- a/main/core/src/mill/define/Task.scala +++ b/main/core/src/mill/define/Task.scala @@ -51,10 +51,6 @@ trait Target[+T] extends Task[T] { override def toString = ctx.segments.render def isPrivate: Option[Boolean] = None } -trait CachedTarget[+T] extends Target[T] { - override def asTarget: Option[Target[T]] = Some(this) - def readWrite: RW[_] -} object Target extends Applicative.Applyer[Task, Task, Result, mill.api.Ctx] { // convenience @@ -388,10 +384,11 @@ abstract class TargetImplBase[+T]( class TargetImpl[+T]( t: Task[T], ctx0: mill.define.Ctx, - override val readWrite: RW[_], + val readWrite: RW[_], isPrivate: Option[Boolean] -) extends TargetImplBase[T](ctx0, t, isPrivate) - with CachedTarget[T] {} +) extends TargetImplBase[T](ctx0, t, isPrivate) { + override def asTarget: Option[Target[T]] = Some(this) +} class Command[+T]( t: Task[T], diff --git a/main/core/src/mill/eval/Evaluator.scala b/main/core/src/mill/eval/Evaluator.scala index 6cc9130ff53..2d6a020af6a 100644 --- a/main/core/src/mill/eval/Evaluator.scala +++ b/main/core/src/mill/eval/Evaluator.scala @@ -25,13 +25,13 @@ import scala.util.control.NonFatal case class Labelled[T](task: Target[T], segments: Segments) { def format: Option[default.ReadWriter[T]] = task match { - case t: CachedTarget[T] => Some(t.readWrite.asInstanceOf[upickle.default.ReadWriter[T]]) + case t: TargetImpl[T] => Some(t.readWrite.asInstanceOf[upickle.default.ReadWriter[T]]) case _ => None } def writer: Option[default.Writer[T]] = task match { case t: mill.define.Command[T] => Some(t.writer.asInstanceOf[upickle.default.Writer[T]]) case t: mill.define.InputImpl[T] => Some(t.writer.asInstanceOf[upickle.default.Writer[T]]) - case t: CachedTarget[T] => Some(t.readWrite.asInstanceOf[upickle.default.ReadWriter[T]]) + case t: TargetImpl[T] => Some(t.readWrite.asInstanceOf[upickle.default.ReadWriter[T]]) case _ => None } } diff --git a/main/src/mill/main/MainModule.scala b/main/src/mill/main/MainModule.scala index 889df153fb6..eef28cc3f2a 100644 --- a/main/src/mill/main/MainModule.scala +++ b/main/src/mill/main/MainModule.scala @@ -5,7 +5,7 @@ import mainargs.TokensReader import java.util.concurrent.LinkedBlockingQueue import mill.{BuildInfo, T} import mill.api.{Ctx, PathRef, Result, internal} -import mill.define.{CachedTarget, Command, Segments, SelectMode, Target, TargetImpl, Task} +import mill.define.{Command, Segments, SelectMode, Target, TargetImpl, Task} import mill.eval.{Evaluator, EvaluatorPaths} import mill.util.{PrintLogger, Watched} import pprint.{Renderer, Tree, Truncated} @@ -180,7 +180,7 @@ trait MainModule extends mill.Module { def rec(t: Task[_]): Seq[Segments] = { if (seen(t)) Nil // do nothing else t match { - case t: CachedTarget[_] if evaluator.rootModule.millInternal.targets.contains(t) => + case t: TargetImpl[_] if evaluator.rootModule.millInternal.targets.contains(t) => Seq(t.ctx.segments) case _ => seen.add(t) diff --git a/main/test/src/mill/define/GraphTests.scala b/main/test/src/mill/define/GraphTests.scala index bc02ed479c3..a298f5e4a0a 100644 --- a/main/test/src/mill/define/GraphTests.scala +++ b/main/test/src/mill/define/GraphTests.scala @@ -79,7 +79,7 @@ object GraphTests extends TestSuite { val important = important0.map(_(base)) val grouped = Graph.groupAroundImportantTargets(topoSorted) { - case t: CachedTarget[_] if important.contains(t) => t: Target[_] + case t: TargetImpl[_] if important.contains(t) => t: Target[_] } val flattened = Agg.from(grouped.values().flatMap(_.items)) diff --git a/main/test/src/mill/eval/EvaluationTests.scala b/main/test/src/mill/eval/EvaluationTests.scala index de3cbe11e39..de8c8d32f1c 100644 --- a/main/test/src/mill/eval/EvaluationTests.scala +++ b/main/test/src/mill/eval/EvaluationTests.scala @@ -1,7 +1,7 @@ package mill.eval import mill.util.TestUtil.{Test, test} -import mill.define.{CachedTarget, Discover, Graph, TargetImpl, Task} +import mill.define.{Discover, Graph, TargetImpl, Task} import mill.{Module, T} import mill.util.{DummyLogger, TestEvaluator, TestGraphs, TestUtil} import mill.api.Strict.Agg @@ -181,14 +181,14 @@ class EvaluationTests(threadCount: Option[Int]) extends TestSuite { import separateGroups._ val checker = new Checker(separateGroups) val evaled1 = checker.evaluator.evaluate(Agg(right, left)) - val filtered1 = evaled1.evaluated.filter(_.isInstanceOf[CachedTarget[_]]) + val filtered1 = evaled1.evaluated.filter(_.isInstanceOf[TargetImpl[_]]) assert(filtered1.toSeq.sortBy(_.toString) == Seq(change, left, right).sortBy(_.toString)) val evaled2 = checker.evaluator.evaluate(Agg(right, left)) - val filtered2 = evaled2.evaluated.filter(_.isInstanceOf[CachedTarget[_]]) + val filtered2 = evaled2.evaluated.filter(_.isInstanceOf[TargetImpl[_]]) assert(filtered2 == Agg()) change.counter += 1 val evaled3 = checker.evaluator.evaluate(Agg(right, left)) - val filtered3 = evaled3.evaluated.filter(_.isInstanceOf[CachedTarget[_]]) + val filtered3 = evaled3.evaluated.filter(_.isInstanceOf[TargetImpl[_]]) assert(filtered3 == Agg(change, right)) } diff --git a/main/test/src/mill/util/TestUtil.scala b/main/test/src/mill/util/TestUtil.scala index e56b7e460fc..3dabf7aead8 100644 --- a/main/test/src/mill/util/TestUtil.scala +++ b/main/test/src/mill/util/TestUtil.scala @@ -43,13 +43,26 @@ object TestUtil extends MillTestKit { * controlled externally, so you can construct arbitrary dataflow graphs and * test how changes propagate. */ - class TestTarget(inputs: Seq[Task[Int]], val pure: Boolean)(implicit ctx0: mill.define.Ctx) - extends Test(inputs) - with CachedTarget[Int] { - val ctx = ctx0.withSegments(ctx0.segments ++ Seq(ctx0.segment)) - val readWrite = upickle.default.readwriter[Int] + class TestTarget(taskInputs: Seq[Task[Int]], val pure: Boolean)(implicit ctx0: mill.define.Ctx) + extends TargetImpl[Int]( + null, + ctx0, + upickle.default.readwriter[Int], + None + ){ + override def evaluate(args: mill.api.Ctx) = testTask.evaluate(args) + override val inputs = taskInputs + val testTask = new Test(taskInputs) + def counter_=(i: Int) = testTask.counter = i + def counter = testTask.counter + def failure_=(s: Option[String]) = testTask.failure = s + def failure = testTask.failure + def exception_=(s: Option[Throwable]) = testTask.exception = s + def exception = testTask.exception + override def sideHash = testTask.sideHash } + def checkTopological(targets: Agg[Task[_]]) = { val seen = mutable.Set.empty[Task[_]] for (t <- targets.indexed.reverseIterator) { diff --git a/main/testkit/src/mill/testkit/MillTestkit.scala b/main/testkit/src/mill/testkit/MillTestkit.scala index b39bd4ff73e..a930e816b66 100644 --- a/main/testkit/src/mill/testkit/MillTestkit.scala +++ b/main/testkit/src/mill/testkit/MillTestkit.scala @@ -115,7 +115,7 @@ trait MillTestKit { Tuple2( evaluated.rawValues.head.asInstanceOf[Result.Success[T]].value, evaluated.evaluated.collect { - case t: CachedTarget[_] + case t: TargetImpl[_] if module.millInternal.targets.contains(t) && !t.isInstanceOf[InputImpl[_]] && !t.ctx.external => t From 1a9686e1f7de0cde8dee167d49a9d0186d97b8be Mon Sep 17 00:00:00 2001 From: Li Haoyi Date: Mon, 3 Apr 2023 10:32:42 +0800 Subject: [PATCH 10/16] cleanup --- main/core/src/mill/define/Task.scala | 146 ++++++++---------- .../src/mill/testkit/MillTestkit.scala | 1 - 2 files changed, 67 insertions(+), 80 deletions(-) diff --git a/main/core/src/mill/define/Task.scala b/main/core/src/mill/define/Task.scala index 1ac3d369495..f7b2cc6c44a 100644 --- a/main/core/src/mill/define/Task.scala +++ b/main/core/src/mill/define/Task.scala @@ -40,8 +40,55 @@ abstract class Task[+T] extends Task.Ops[T] with Applyable[Task, T] { def self: Task[T] = this } -trait Target[+T] extends Task[T] { - def ctx: mill.define.Ctx +object Task { + + abstract class Ops[+T] { this: Task[T] => + def map[V](f: T => V) = new Task.Mapped(this, f) + + def filter(f: T => Boolean) = this + def withFilter(f: T => Boolean) = this + def zip[V](other: Task[V]) = new Task.Zipped(this, other) + + } + + class Sequence[+T](inputs0: Seq[Task[T]]) extends Task[Seq[T]] { + val inputs = inputs0 + def evaluate(args: mill.api.Ctx) = { + for (i <- 0 until args.length) + yield args(i).asInstanceOf[T] + } + } + class TraverseCtx[+T, V]( + inputs0: Seq[Task[T]], + f: (IndexedSeq[T], mill.api.Ctx) => Result[V] + ) extends Task[V] { + val inputs = inputs0 + def evaluate(args: mill.api.Ctx) = { + f( + for (i <- 0 until args.length) + yield args(i).asInstanceOf[T], + args + ) + } + } + class Mapped[+T, +V](source: Task[T], f: T => V) extends Task[V] { + def evaluate(args: mill.api.Ctx) = f(args(0)) + val inputs = List(source) + } + class Zipped[+T, +V](source1: Task[T], source2: Task[V]) extends Task[(T, V)] { + def evaluate(args: mill.api.Ctx) = (args(0), args(1)) + val inputs = List(source1, source2) + } +} + +/** + * Represents a task that can be referenced by its path segments. + */ +class Target[+T]( + t: Task[T], + ctx0: mill.define.Ctx, + val isPrivate: Option[Boolean] +) extends Task[T] { def label: String = ctx.segment match { case Segment.Label(v) => v case Segment.Cross(_) => throw new IllegalArgumentException( @@ -49,7 +96,11 @@ trait Target[+T] extends Task[T] { ) } override def toString = ctx.segments.render - def isPrivate: Option[Boolean] = None + + def evaluate(args: mill.api.Ctx) = args[T](0) + + val ctx = ctx0.withSegments(segments = ctx0.segments ++ Seq(ctx0.segment)) + val inputs = Seq(t) } object Target extends Applicative.Applyer[Task, Task, Result, mill.api.Ctx] { @@ -371,57 +422,46 @@ object Target extends Applicative.Applyer[Task, Task, Result, mill.api.Ctx] { } } -abstract class TargetImplBase[+T]( - ctx0: mill.define.Ctx, - t: Task[T], - override val isPrivate: Option[Boolean] -) extends Target[T] { - def evaluate(args: mill.api.Ctx) = args[T](0) - val ctx = ctx0.withSegments(segments = ctx0.segments ++ Seq(ctx0.segment)) - val inputs = Seq(t) -} - class TargetImpl[+T]( t: Task[T], ctx0: mill.define.Ctx, val readWrite: RW[_], isPrivate: Option[Boolean] -) extends TargetImplBase[T](ctx0, t, isPrivate) { +) extends Target[T](t, ctx0, isPrivate) { override def asTarget: Option[Target[T]] = Some(this) } +class PersistentImpl[+T]( + t: Task[T], + ctx0: mill.define.Ctx, + readWrite: RW[_], + isPrivate: Option[Boolean] +) extends TargetImpl[T](t, ctx0, readWrite, isPrivate) { + override def flushDest = false +} + class Command[+T]( t: Task[T], ctx0: mill.define.Ctx, val writer: W[_], val cls: Class[_], isPrivate: Option[Boolean] -) extends TargetImplBase[T](ctx0, t, isPrivate) { +) extends Target[T](t, ctx0, isPrivate) { override def asCommand = Some(this) } class WorkerImpl[+T](t: Task[T], ctx0: mill.define.Ctx, isPrivate: Option[Boolean]) - extends TargetImplBase[T](ctx0, t, isPrivate) { + extends Target[T](t, ctx0, isPrivate) { override def flushDest = false override def asWorker = Some(this) } -class PersistentImpl[+T]( - t: Task[T], - ctx0: mill.define.Ctx, - readWrite: RW[_], - isPrivate: Option[Boolean] -) extends TargetImpl[T](t, ctx0, readWrite, isPrivate) { - - override def flushDest = false -} - class InputImpl[T]( t: Task[T], ctx0: mill.define.Ctx, val writer: upickle.default.Writer[_], isPrivate: Option[Boolean] -) extends TargetImplBase[T](ctx0, t, isPrivate) { +) extends Target[T](t, ctx0, isPrivate) { override def sideHash = util.Random.nextInt() } @@ -440,55 +480,3 @@ class SourceImpl(t: Task[PathRef], ctx0: mill.define.Ctx, isPrivate: Option[Bool PathRef.jsonFormatter, isPrivate ) - -object Task { - - class Task0[T](t: T) extends Task[T] { - lazy val t0 = t - val inputs = Nil - def evaluate(args: mill.api.Ctx) = t0 - } - - abstract class Ops[+T] { this: Task[T] => - def map[V](f: T => V) = new Task.Mapped(this, f) - def mapDest[V](f: (T, mill.api.Ctx) => Result[V]) = new Task.MappedDest(this, f) - - def filter(f: T => Boolean) = this - def withFilter(f: T => Boolean) = this - def zip[V](other: Task[V]) = new Task.Zipped(this, other) - - } - - class Sequence[+T](inputs0: Seq[Task[T]]) extends Task[Seq[T]] { - val inputs = inputs0 - def evaluate(args: mill.api.Ctx) = { - for (i <- 0 until args.length) - yield args(i).asInstanceOf[T] - } - } - class TraverseCtx[+T, V]( - inputs0: Seq[Task[T]], - f: (IndexedSeq[T], mill.api.Ctx) => Result[V] - ) extends Task[V] { - val inputs = inputs0 - def evaluate(args: mill.api.Ctx) = { - f( - for (i <- 0 until args.length) - yield args(i).asInstanceOf[T], - args - ) - } - } - class Mapped[+T, +V](source: Task[T], f: T => V) extends Task[V] { - def evaluate(args: mill.api.Ctx) = f(args(0)) - val inputs = List(source) - } - class MappedDest[+T, +V](source: Task[T], f: (T, mill.api.Ctx) => Result[V]) extends Task[V] { - def evaluate(args: mill.api.Ctx) = f(args(0), args) - val inputs = List(source) - } - class Zipped[+T, +V](source1: Task[T], source2: Task[V]) extends Task[(T, V)] { - def evaluate(args: mill.api.Ctx) = (args(0), args(1)) - val inputs = List(source1, source2) - } -} diff --git a/main/testkit/src/mill/testkit/MillTestkit.scala b/main/testkit/src/mill/testkit/MillTestkit.scala index a930e816b66..290393eea25 100644 --- a/main/testkit/src/mill/testkit/MillTestkit.scala +++ b/main/testkit/src/mill/testkit/MillTestkit.scala @@ -117,7 +117,6 @@ trait MillTestKit { evaluated.evaluated.collect { case t: TargetImpl[_] if module.millInternal.targets.contains(t) - && !t.isInstanceOf[InputImpl[_]] && !t.ctx.external => t case t: mill.define.Command[_] => t }.size From 21ea3252f565aa67490676bfa898ab37fa63d9ca Mon Sep 17 00:00:00 2001 From: Li Haoyi Date: Mon, 3 Apr 2023 10:44:54 +0800 Subject: [PATCH 11/16] simplify Labelled --- main/core/src/mill/define/Task.scala | 63 +++++++++++++++---------- main/core/src/mill/eval/Evaluator.scala | 18 ++----- 2 files changed, 41 insertions(+), 40 deletions(-) diff --git a/main/core/src/mill/define/Task.scala b/main/core/src/mill/define/Task.scala index f7b2cc6c44a..70faa999633 100644 --- a/main/core/src/mill/define/Task.scala +++ b/main/core/src/mill/define/Task.scala @@ -84,11 +84,10 @@ object Task { /** * Represents a task that can be referenced by its path segments. */ -class Target[+T]( - t: Task[T], - ctx0: mill.define.Ctx, - val isPrivate: Option[Boolean] -) extends Task[T] { +trait Target[+T] extends Task[T] { + def t: Task[T] + def ctx0: mill.define.Ctx + def isPrivate: Option[Boolean] def label: String = ctx.segment match { case Segment.Label(v) => v case Segment.Cross(_) => throw new IllegalArgumentException( @@ -101,8 +100,13 @@ class Target[+T]( val ctx = ctx0.withSegments(segments = ctx0.segments ++ Seq(ctx0.segment)) val inputs = Seq(t) + + def readWriterOpt: Option[upickle.default.ReadWriter[_]] = None + + def writerOpt: Option[upickle.default.Writer[_]] = readWriterOpt.orElse(None) } + object Target extends Applicative.Applyer[Task, Task, Result, mill.api.Ctx] { // convenience def dest(implicit ctx: mill.api.Ctx.Dest): os.Path = ctx.dest @@ -423,60 +427,67 @@ object Target extends Applicative.Applyer[Task, Task, Result, mill.api.Ctx] { } class TargetImpl[+T]( - t: Task[T], - ctx0: mill.define.Ctx, - val readWrite: RW[_], - isPrivate: Option[Boolean] -) extends Target[T](t, ctx0, isPrivate) { + val t: Task[T], + val ctx0: mill.define.Ctx, + val readWriter: RW[_], + val isPrivate: Option[Boolean] +) extends Target[T]{ override def asTarget: Option[Target[T]] = Some(this) + override def readWriterOpt = Some(readWriter) } class PersistentImpl[+T]( t: Task[T], ctx0: mill.define.Ctx, - readWrite: RW[_], + readWriter: RW[_], isPrivate: Option[Boolean] -) extends TargetImpl[T](t, ctx0, readWrite, isPrivate) { +) extends TargetImpl[T](t, ctx0, readWriter, isPrivate) { override def flushDest = false } class Command[+T]( - t: Task[T], - ctx0: mill.define.Ctx, + val t: Task[T], + val ctx0: mill.define.Ctx, val writer: W[_], val cls: Class[_], - isPrivate: Option[Boolean] -) extends Target[T](t, ctx0, isPrivate) { + val isPrivate: Option[Boolean] +) extends Target[T] { override def asCommand = Some(this) + override def writerOpt = Some(writer) } -class WorkerImpl[+T](t: Task[T], ctx0: mill.define.Ctx, isPrivate: Option[Boolean]) - extends Target[T](t, ctx0, isPrivate) { +class WorkerImpl[+T](val t: Task[T], val ctx0: mill.define.Ctx, val isPrivate: Option[Boolean]) + extends Target[T]{ override def flushDest = false override def asWorker = Some(this) } class InputImpl[T]( - t: Task[T], - ctx0: mill.define.Ctx, + val t: Task[T], + val ctx0: mill.define.Ctx, val writer: upickle.default.Writer[_], - isPrivate: Option[Boolean] -) extends Target[T](t, ctx0, isPrivate) { + val isPrivate: Option[Boolean] +) extends Target[T] { override def sideHash = util.Random.nextInt() + override def writerOpt = Some(writer) } class SourcesImpl(t: Task[Seq[PathRef]], ctx0: mill.define.Ctx, isPrivate: Option[Boolean]) extends InputImpl[Seq[PathRef]]( t, ctx0, - upickle.default.SeqLikeWriter[Seq, PathRef], + upickle.default.readwriter[Seq[PathRef]], isPrivate - ) + ){ + override def readWriterOpt = Some(upickle.default.readwriter[Seq[PathRef]]) +} class SourceImpl(t: Task[PathRef], ctx0: mill.define.Ctx, isPrivate: Option[Boolean]) extends InputImpl[PathRef]( t, ctx0, - PathRef.jsonFormatter, + upickle.default.readwriter[PathRef], isPrivate - ) + ){ + override def readWriterOpt = Some(upickle.default.readwriter[PathRef]) +} diff --git a/main/core/src/mill/eval/Evaluator.scala b/main/core/src/mill/eval/Evaluator.scala index 2d6a020af6a..2bfd0e2e233 100644 --- a/main/core/src/mill/eval/Evaluator.scala +++ b/main/core/src/mill/eval/Evaluator.scala @@ -23,18 +23,7 @@ import scala.jdk.CollectionConverters._ import scala.reflect.ClassTag import scala.util.control.NonFatal -case class Labelled[T](task: Target[T], segments: Segments) { - def format: Option[default.ReadWriter[T]] = task match { - case t: TargetImpl[T] => Some(t.readWrite.asInstanceOf[upickle.default.ReadWriter[T]]) - case _ => None - } - def writer: Option[default.Writer[T]] = task match { - case t: mill.define.Command[T] => Some(t.writer.asInstanceOf[upickle.default.Writer[T]]) - case t: mill.define.InputImpl[T] => Some(t.writer.asInstanceOf[upickle.default.Writer[T]]) - case t: TargetImpl[T] => Some(t.readWrite.asInstanceOf[upickle.default.ReadWriter[T]]) - case _ => None - } -} +case class Labelled[T](task: Target[T], segments: Segments) /** * Evaluate tasks. @@ -380,7 +369,7 @@ class Evaluator private (_home: os.Path, case NonFatal(_) => None } if cached.inputsHash == inputsHash - reader <- labelledNamedTask.format + reader <- labelledNamedTask.task.readWriterOpt parsed <- try Some(upickle.default.read(cached.value)(reader)) catch { @@ -493,7 +482,8 @@ class Evaluator private (_home: os.Path, } case None => val terminalResult = labelledNamedTask - .writer + .task + .writerOpt .asInstanceOf[Option[upickle.default.Writer[Any]]] .map(w => upickle.default.writeJs(v)(w) -> v) From 905011bf81b57c8cea7045fce8b182f2244861f5 Mon Sep 17 00:00:00 2001 From: Li Haoyi Date: Mon, 3 Apr 2023 11:06:59 +0800 Subject: [PATCH 12/16] privatize --- main/core/src/mill/define/Discover.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main/core/src/mill/define/Discover.scala b/main/core/src/mill/define/Discover.scala index 5d221c0676d..c7cc67e4abd 100644 --- a/main/core/src/mill/define/Discover.scala +++ b/main/core/src/mill/define/Discover.scala @@ -29,7 +29,7 @@ object Discover { private def unapply[T](discover: Discover[T]) : Option[Map[Class[_], Seq[(Int, mainargs.MainData[_, _])]]] = Some(discover.value) - class Router(val ctx: blackbox.Context) extends mainargs.Macros(ctx) { + private class Router(val ctx: blackbox.Context) extends mainargs.Macros(ctx) { import c.universe._ def applyImpl[T: WeakTypeTag]: Expr[Discover[T]] = { From e8902a715681e73d3b205f90bee5f7e75a1e018e Mon Sep 17 00:00:00 2001 From: Li Haoyi Date: Mon, 3 Apr 2023 11:21:16 +0800 Subject: [PATCH 13/16] resurrect NamedTask --- main/core/src/mill/define/Task.scala | 27 ++++++++++--------- main/core/src/mill/define/package.scala | 1 - main/core/src/mill/eval/Evaluator.scala | 12 ++++----- main/core/src/mill/eval/EvaluatorPaths.scala | 4 +-- .../mill/eval/EvaluatorPathsResolver.scala | 4 +-- .../mill/main/graphviz/GraphvizTools.scala | 8 +++--- main/src/mill/main/MainModule.scala | 14 +++++----- main/src/mill/main/Resolve.scala | 2 +- main/src/mill/main/ResolveMetadata.scala | 2 +- main/src/mill/main/ResolveTasks.scala | 12 ++++----- main/src/mill/main/RunScript.scala | 2 +- main/src/mill/main/TokenReaders.scala | 4 +-- main/test/src/mill/define/GraphTests.scala | 2 +- .../src/mill/eval/JavaCompileJarTests.scala | 4 --- main/test/src/mill/main/MainTests.scala | 6 ++--- .../mill/scalajslib/HelloJSWorldTests.scala | 2 +- .../src/mill/scalalib/HelloWorldTests.scala | 18 ++++++------- .../HelloNativeWorldTests.scala | 2 +- 18 files changed, 61 insertions(+), 65 deletions(-) diff --git a/main/core/src/mill/define/Task.scala b/main/core/src/mill/define/Task.scala index 70faa999633..9abe5fcd247 100644 --- a/main/core/src/mill/define/Task.scala +++ b/main/core/src/mill/define/Task.scala @@ -36,7 +36,7 @@ abstract class Task[+T] extends Task.Ops[T] with Applyable[Task, T] { def asTarget: Option[Target[T]] = None def asCommand: Option[Command[T]] = None - def asWorker: Option[Target[T]] = None + def asWorker: Option[Worker[T]] = None def self: Task[T] = this } @@ -84,7 +84,7 @@ object Task { /** * Represents a task that can be referenced by its path segments. */ -trait Target[+T] extends Task[T] { +trait NamedTask[+T] extends Task[T] { def t: Task[T] def ctx0: mill.define.Ctx def isPrivate: Option[Boolean] @@ -106,6 +106,7 @@ trait Target[+T] extends Task[T] { def writerOpt: Option[upickle.default.Writer[_]] = readWriterOpt.orElse(None) } +trait Target[+T] extends NamedTask[T] object Target extends Applicative.Applyer[Task, Task, Result, mill.api.Ctx] { // convenience @@ -358,31 +359,31 @@ object Target extends Applicative.Applyer[Task, Task, Result, mill.api.Ctx] { ) } - def worker[T](t: Task[T])(implicit ctx: mill.define.Ctx): Target[T] = macro workerImpl1[T] + def worker[T](t: Task[T])(implicit ctx: mill.define.Ctx): Worker[T] = macro workerImpl1[T] def workerImpl1[T: c.WeakTypeTag](c: Context)(t: c.Expr[Task[T]])(ctx: c.Expr[mill.define.Ctx]) - : c.Expr[Target[T]] = { + : c.Expr[Worker[T]] = { import c.universe._ val taskIsPrivate = isPrivateTargetOption(c) - mill.moduledefs.Cacher.impl0[Target[T]](c)( + mill.moduledefs.Cacher.impl0[Worker[T]](c)( reify( - new WorkerImpl[T](t.splice, ctx.splice, taskIsPrivate.splice) + new Worker[T](t.splice, ctx.splice, taskIsPrivate.splice) ) ) } - def worker[T](t: Result[T])(implicit ctx: mill.define.Ctx): Target[T] = macro workerImpl2[T] + def worker[T](t: Result[T])(implicit ctx: mill.define.Ctx): Worker[T] = macro workerImpl2[T] def workerImpl2[T: c.WeakTypeTag](c: Context)(t: c.Expr[T])(ctx: c.Expr[mill.define.Ctx]) - : c.Expr[Target[T]] = { + : c.Expr[Worker[T]] = { import c.universe._ val taskIsPrivate = isPrivateTargetOption(c) - mill.moduledefs.Cacher.impl0[Target[T]](c)( + mill.moduledefs.Cacher.impl0[Worker[T]](c)( reify( - new WorkerImpl[T]( + new Worker[T]( Applicative.impl[Task, T, mill.api.Ctx](c)(t).splice, ctx.splice, taskIsPrivate.splice @@ -451,13 +452,13 @@ class Command[+T]( val writer: W[_], val cls: Class[_], val isPrivate: Option[Boolean] -) extends Target[T] { +) extends NamedTask[T] { override def asCommand = Some(this) override def writerOpt = Some(writer) } -class WorkerImpl[+T](val t: Task[T], val ctx0: mill.define.Ctx, val isPrivate: Option[Boolean]) - extends Target[T]{ +class Worker[+T](val t: Task[T], val ctx0: mill.define.Ctx, val isPrivate: Option[Boolean]) + extends NamedTask[T]{ override def flushDest = false override def asWorker = Some(this) } diff --git a/main/core/src/mill/define/package.scala b/main/core/src/mill/define/package.scala index 6cb8c145dc9..23f2fb6ad34 100644 --- a/main/core/src/mill/define/package.scala +++ b/main/core/src/mill/define/package.scala @@ -4,5 +4,4 @@ package object define{ type Sources = define.Target[Seq[mill.api.PathRef]] type Input[T] = define.Target[T] type Persistent[T] = define.Target[T] - type Worker[T] = define.Target[T] } diff --git a/main/core/src/mill/eval/Evaluator.scala b/main/core/src/mill/eval/Evaluator.scala index 2bfd0e2e233..0e12f30c015 100644 --- a/main/core/src/mill/eval/Evaluator.scala +++ b/main/core/src/mill/eval/Evaluator.scala @@ -23,7 +23,7 @@ import scala.jdk.CollectionConverters._ import scala.reflect.ClassTag import scala.util.control.NonFatal -case class Labelled[T](task: Target[T], segments: Segments) +case class Labelled[T](task: NamedTask[T], segments: Segments) /** * Evaluate tasks. @@ -318,7 +318,7 @@ class Evaluator private (_home: os.Path, val scriptsHash = { val scripts = new Loose.Agg.Mutable[os.Path]() group.iterator.flatMap(t => Iterator(t) ++ t.inputs).foreach { - case namedTask: Target[_] => scripts.append(os.Path(namedTask.ctx.fileName)) + case namedTask: NamedTask[_] => scripts.append(os.Path(namedTask.ctx.fileName)) case _ => } @@ -605,7 +605,7 @@ class Evaluator private (_home: os.Path, newResults(task) = for (v <- res) yield { ( v, - if (task.isInstanceOf[WorkerImpl[_]]) inputsHash + if (task.isInstanceOf[Worker[_]]) inputsHash else v.## ) } @@ -811,10 +811,10 @@ object Evaluator { val seen = collection.mutable.Set.empty[Segments] val overridden = collection.mutable.Set.empty[Task[_]] topoSorted.values.reverse.iterator.foreach { - case x: Target[_] if x.isPrivate == Some(true) => + case x: NamedTask[_] if x.isPrivate == Some(true) => // we always need to store them in the super-path overridden.add(x) - case x: Target[_] => + case x: NamedTask[_] => if (!seen.contains(x.ctx.segments)) seen.add(x.ctx.segments) else overridden.add(x) case _ => // donothing @@ -822,7 +822,7 @@ object Evaluator { val sortedGroups = Graph.groupAroundImportantTargets(topoSorted) { // important: all named tasks and those explicitly requested - case t: Target[Any] => + case t: NamedTask[Any] => val segments = t.ctx.segments Right( Labelled( diff --git a/main/core/src/mill/eval/EvaluatorPaths.scala b/main/core/src/mill/eval/EvaluatorPaths.scala index d8392485815..04f22cc6b8a 100644 --- a/main/core/src/mill/eval/EvaluatorPaths.scala +++ b/main/core/src/mill/eval/EvaluatorPaths.scala @@ -1,7 +1,7 @@ package mill.eval import mill.api.internal -import mill.define.{Target, Segment, Segments} +import mill.define.{NamedTask, Segment, Segments, Target} case class EvaluatorPaths private (dest: os.Path, meta: os.Path, log: os.Path) { private def copy(dest: os.Path = dest, meta: os.Path = meta, log: os.Path = log): EvaluatorPaths = @@ -37,6 +37,6 @@ object EvaluatorPaths { } def resolveDestPaths( workspacePath: os.Path, - task: Target[_] + task: NamedTask[_] ): EvaluatorPaths = resolveDestPaths(workspacePath, task.ctx.segments, task.ctx.foreign) } diff --git a/main/core/src/mill/eval/EvaluatorPathsResolver.scala b/main/core/src/mill/eval/EvaluatorPathsResolver.scala index 1843c311a03..f7d0ad31907 100644 --- a/main/core/src/mill/eval/EvaluatorPathsResolver.scala +++ b/main/core/src/mill/eval/EvaluatorPathsResolver.scala @@ -1,9 +1,9 @@ package mill.eval -import mill.define.{Target, Segments} +import mill.define.{NamedTask, Segments} trait EvaluatorPathsResolver { - def resolveDest(task: Target[_]): EvaluatorPaths = + def resolveDest(task: NamedTask[_]): EvaluatorPaths = resolveDest(task.ctx.segments, task.ctx.foreign) def resolveDest(segments: Segments, foreignSegments: Option[Segments] = None): EvaluatorPaths } diff --git a/main/graphviz/src/mill/main/graphviz/GraphvizTools.scala b/main/graphviz/src/mill/main/graphviz/GraphvizTools.scala index f830f3d8f66..007b0c6bc48 100644 --- a/main/graphviz/src/mill/main/graphviz/GraphvizTools.scala +++ b/main/graphviz/src/mill/main/graphviz/GraphvizTools.scala @@ -1,14 +1,14 @@ package mill.main.graphviz import guru.nidi.graphviz.attribute.Style -import mill.define.{Graph, Target} +import mill.define.{Graph, NamedTask} import org.jgrapht.graph.{DefaultEdge, SimpleDirectedGraph} object GraphvizTools { - def apply(targets: Seq[Target[Any]], rs: Seq[Target[Any]], dest: os.Path) = { + def apply(targets: Seq[NamedTask[Any]], rs: Seq[NamedTask[Any]], dest: os.Path) = { val transitive = Graph.transitiveTargets(rs.distinct) val topoSorted = Graph.topoSorted(transitive) val goalSet = rs.toSet val sortedGroups = Graph.groupAroundImportantTargets(topoSorted) { - case x: Target[Any] if goalSet.contains(x) => x + case x: NamedTask[Any] if goalSet.contains(x) => x } import guru.nidi.graphviz.engine.{Format, Graphviz} import guru.nidi.graphviz.model.Factory._ @@ -19,7 +19,7 @@ object GraphvizTools { k, for { v <- vs.items - dest <- v.inputs.collect { case v: Target[Any] => v } + dest <- v.inputs.collect { case v: NamedTask[Any] => v } if goalSet.contains(dest) } yield dest ) diff --git a/main/src/mill/main/MainModule.scala b/main/src/mill/main/MainModule.scala index eef28cc3f2a..d59caeb32b4 100644 --- a/main/src/mill/main/MainModule.scala +++ b/main/src/mill/main/MainModule.scala @@ -5,7 +5,7 @@ import mainargs.TokensReader import java.util.concurrent.LinkedBlockingQueue import mill.{BuildInfo, T} import mill.api.{Ctx, PathRef, Result, internal} -import mill.define.{Command, Segments, SelectMode, Target, TargetImpl, Task} +import mill.define.{Command, Segments, SelectMode, NamedTask, TargetImpl, Task} import mill.eval.{Evaluator, EvaluatorPaths} import mill.util.{PrintLogger, Watched} import pprint.{Renderer, Tree, Truncated} @@ -20,7 +20,7 @@ object MainModule { evaluator: Evaluator, targets: Seq[String], selectMode: SelectMode - )(f: List[Target[Any]] => T): Result[T] = { + )(f: List[NamedTask[Any]] => T): Result[T] = { RunScript.resolveTasks(mill.main.ResolveTasks, evaluator, targets, selectMode) match { case Left(err) => Result.Failure(err) case Right(tasks) => Result.Success(f(tasks)) @@ -155,7 +155,7 @@ trait MainModule extends mill.Module { Result.Failure(s"No path found between $src and $dest") case Some(list) => val labels = list - .collect { case n: Target[_] => n.ctx.segments.render } + .collect { case n: NamedTask[_] => n.ctx.segments.render } labels.foreach(mill.T.log.outputStream.println(_)) @@ -174,7 +174,7 @@ trait MainModule extends mill.Module { resolveParents ) } - def pprintTask(t: Target[_], evaluator: Evaluator): Tree.Lazy = { + def pprintTask(t: NamedTask[_], evaluator: Evaluator): Tree.Lazy = { val seen = mutable.Set.empty[Task[_]] def rec(t: Task[_]): Seq[Segments] = { @@ -399,11 +399,11 @@ trait MainModule extends mill.Module { targets: Seq[String], ctx: Ctx, vizWorker: VizWorker, - planTasks: Option[List[Target[_]]] = None + planTasks: Option[List[NamedTask[_]]] = None ): Result[Seq[PathRef]] = { def callVisualizeModule( - rs: List[Target[Any]], - allRs: List[Target[Any]] + rs: List[NamedTask[Any]], + allRs: List[NamedTask[Any]] ): Result[Seq[PathRef]] = { val (in, out) = vizWorker in.put((rs, allRs, ctx.dest)) diff --git a/main/src/mill/main/Resolve.scala b/main/src/mill/main/Resolve.scala index 5cbe181b2c6..940f0eba62a 100644 --- a/main/src/mill/main/Resolve.scala +++ b/main/src/mill/main/Resolve.scala @@ -244,7 +244,7 @@ abstract class Resolve[R: ClassTag] { } ).map( _.distinctBy { - case t: Target[_] => t.ctx.segments + case t: NamedTask[_] => t.ctx.segments case t => t } ) diff --git a/main/src/mill/main/ResolveMetadata.scala b/main/src/mill/main/ResolveMetadata.scala index b72521844f2..43fa1fded21 100644 --- a/main/src/mill/main/ResolveMetadata.scala +++ b/main/src/mill/main/ResolveMetadata.scala @@ -8,7 +8,7 @@ object ResolveMetadata extends Resolve[String] { val targets = obj .millInternal - .reflectAll[Target[_]] + .reflectAll[NamedTask[_]] .map(_.toString) val commands = for { diff --git a/main/src/mill/main/ResolveTasks.scala b/main/src/mill/main/ResolveTasks.scala index 6b4d3e1896a..28b4a2e88ca 100644 --- a/main/src/mill/main/ResolveTasks.scala +++ b/main/src/mill/main/ResolveTasks.scala @@ -3,14 +3,14 @@ package mill.main import mill.define._ import mill.main.ResolveMetadata.singleModuleMeta -object ResolveTasks extends Resolve[Target[Any]] { +object ResolveTasks extends Resolve[NamedTask[Any]] { def endResolveCross( obj: Module, last: List[String], discover: Discover[_], rest: Seq[String] - ): Either[String, Seq[Target[Any]]] = { + ): Either[String, Seq[NamedTask[Any]]] = { obj match { case _: Cross[Module] => Resolve.runDefault(obj, Segment.Cross(last), discover, rest).flatten.headOption match { @@ -34,20 +34,20 @@ object ResolveTasks extends Resolve[Target[Any]] { last: String, discover: Discover[_], rest: Seq[String] - ): Either[String, Seq[Target[Any]]] = last match { + ): Either[String, Seq[NamedTask[Any]]] = last match { case "__" => Right( obj.millInternal.modules .filter(_ != obj) - .flatMap(m => m.millInternal.reflectAll[Target[_]]) + .flatMap(m => m.millInternal.reflectAll[NamedTask[_]]) ) - case "_" => Right(obj.millInternal.reflectAll[Target[_]]) + case "_" => Right(obj.millInternal.reflectAll[NamedTask[_]]) case _ => val target = obj .millInternal - .reflectSingle[Target[_]](last) + .reflectSingle[NamedTask[_]](last) .map(Right(_)) val command = Resolve.invokeCommand( diff --git a/main/src/mill/main/RunScript.scala b/main/src/mill/main/RunScript.scala index e8e198fc8ff..07a12dd8f4f 100644 --- a/main/src/mill/main/RunScript.scala +++ b/main/src/mill/main/RunScript.scala @@ -181,7 +181,7 @@ object RunScript { case 0 => val nameAndJson = for (t <- targets.toSeq) yield { t match { - case t: mill.define.Target[_] => + case t: mill.define.NamedTask[_] => val jsonFile = EvaluatorPaths.resolveDestPaths(evaluator.outPath, t).meta val metadata = upickle.default.read[Evaluator.Cached](ujson.read(jsonFile.toIO)) Some(t.toString, metadata.value) diff --git a/main/src/mill/main/TokenReaders.scala b/main/src/mill/main/TokenReaders.scala index 1ef796f183d..42c4eff001d 100644 --- a/main/src/mill/main/TokenReaders.scala +++ b/main/src/mill/main/TokenReaders.scala @@ -4,7 +4,7 @@ import mainargs.TokensReader import mill.eval.Evaluator import mill.define.{SelectMode, Target, Task} -case class Tasks[T](value: Seq[mill.define.Target[T]]) +case class Tasks[T](value: Seq[mill.define.NamedTask[T]]) object Tasks { class TokenReader[T]() @@ -16,7 +16,7 @@ object Tasks { Evaluator.currentEvaluator.get, s, SelectMode.Single - ).map(x => Tasks(x.asInstanceOf[Seq[mill.define.Target[T]]])), + ).map(x => Tasks(x.asInstanceOf[Seq[mill.define.NamedTask[T]]])), alwaysRepeatable = false, allowEmpty = false ) diff --git a/main/test/src/mill/define/GraphTests.scala b/main/test/src/mill/define/GraphTests.scala index a298f5e4a0a..36c5230d4c1 100644 --- a/main/test/src/mill/define/GraphTests.scala +++ b/main/test/src/mill/define/GraphTests.scala @@ -168,7 +168,7 @@ object GraphTests extends TestSuite { Graph.transitiveTargets(Agg.from(goals)) ) val grouped = Graph.groupAroundImportantTargets(topoSorted) { - case t: Target[Any] => t + case t: NamedTask[Any] => t case t if goals.contains(t) => t } grouped.keyCount diff --git a/main/test/src/mill/eval/JavaCompileJarTests.scala b/main/test/src/mill/eval/JavaCompileJarTests.scala index 765474d0608..9839929413a 100644 --- a/main/test/src/mill/eval/JavaCompileJarTests.scala +++ b/main/test/src/mill/eval/JavaCompileJarTests.scala @@ -72,15 +72,11 @@ object JavaCompileJarTests extends TestSuite { def append(path: os.Path, txt: String) = os.write.append(path, txt) - println("=" * 150) - check( targets = Agg(jar), expected = Agg(allSources, classFiles, jar) ) - println("=" * 150) - // Re-running with no changes results in nothing being evaluated check(targets = Agg(jar), expected = Agg()) // Appending an empty string gets ignored due to file-content hashing diff --git a/main/test/src/mill/main/MainTests.scala b/main/test/src/mill/main/MainTests.scala index 0516104887f..2fdf22ec688 100644 --- a/main/test/src/mill/main/MainTests.scala +++ b/main/test/src/mill/main/MainTests.scala @@ -1,18 +1,18 @@ package mill.main -import mill.define.{Target, Segment, SelectMode} +import mill.define.{NamedTask, Segment, SelectMode} import mill.util.TestGraphs._ import utest._ object MainTests extends TestSuite { def check[T <: mill.define.BaseModule](module: T)( selectorString: String, - expected0: Either[String, Seq[T => Target[_]]] + expected0: Either[String, Seq[T => NamedTask[_]]] ) = checkSeq(module)(Seq(selectorString), expected0) def checkSeq[T <: mill.define.BaseModule](module: T)( selectorStrings: Seq[String], - expected0: Either[String, Seq[T => Target[_]]] + expected0: Either[String, Seq[T => NamedTask[_]]] ) = { val expected = expected0.map(_.map(_(module))) diff --git a/scalajslib/test/src/mill/scalajslib/HelloJSWorldTests.scala b/scalajslib/test/src/mill/scalajslib/HelloJSWorldTests.scala index 92b90f80e0d..3f797a7b867 100644 --- a/scalajslib/test/src/mill/scalajslib/HelloJSWorldTests.scala +++ b/scalajslib/test/src/mill/scalajslib/HelloJSWorldTests.scala @@ -199,7 +199,7 @@ object HelloJSWorldTests extends TestSuite { } } - def runTests(testTask: define.Target[(String, Seq[TestRunner.Result])]) + def runTests(testTask: define.NamedTask[(String, Seq[TestRunner.Result])]) : Map[String, Map[String, TestRunner.Result]] = { val Left(Result.Failure(_, Some(res))) = helloWorldEvaluator(testTask) diff --git a/scalalib/test/src/mill/scalalib/HelloWorldTests.scala b/scalalib/test/src/mill/scalalib/HelloWorldTests.scala index fcbb19db54a..c37bfb4cb8d 100644 --- a/scalalib/test/src/mill/scalalib/HelloWorldTests.scala +++ b/scalalib/test/src/mill/scalalib/HelloWorldTests.scala @@ -7,7 +7,7 @@ import scala.util.{Properties, Using} import scala.xml.NodeSeq import mill._ import mill.api.Result -import mill.define.{Input, Target} +import mill.define.{Input, NamedTask, Target} import mill.eval.{Evaluator, EvaluatorPaths} import mill.modules.Assembly import mill.scalalib.publish.{VersionControl, _} @@ -1225,13 +1225,13 @@ object HelloWorldTests extends TestSuite { // we reconstruct faulty behavior val Right((result, _)) = eval.apply(t) assert( - result.path.last == (t.asInstanceOf[Target[_]].label + ".dest"), + result.path.last == (t.asInstanceOf[NamedTask[_]].label + ".dest"), os.exists(result.path) ) os.remove.all(result.path) val Right((result2, _)) = eval.apply(t) assert( - result2.path.last == (t.asInstanceOf[Target[_]].label + ".dest"), + result2.path.last == (t.asInstanceOf[NamedTask[_]].label + ".dest"), // as the result was cached but not checked, this path is missing os.exists(result2.path) == flip ) @@ -1244,13 +1244,13 @@ object HelloWorldTests extends TestSuite { // we reconstruct faulty behavior val Right((result, _)) = eval.apply(t) assert( - result.map(_.path.last) == Seq(t.asInstanceOf[Target[_]].label + ".dest"), + result.map(_.path.last) == Seq(t.asInstanceOf[NamedTask[_]].label + ".dest"), result.forall(p => os.exists(p.path)) ) result.foreach(p => os.remove.all(p.path)) val Right((result2, _)) = eval.apply(t) assert( - result2.map(_.path.last) == Seq(t.asInstanceOf[Target[_]].label + ".dest"), + result2.map(_.path.last) == Seq(t.asInstanceOf[NamedTask[_]].label + ".dest"), // as the result was cached but not checked, this path is missing result2.forall(p => os.exists(p.path) == flip) ) @@ -1263,13 +1263,13 @@ object HelloWorldTests extends TestSuite { // we reconstruct faulty behavior val Right((result, _)) = eval.apply(t) assert( - result.map(_.path.last) == Agg(t.asInstanceOf[Target[_]].label + ".dest"), + result.map(_.path.last) == Agg(t.asInstanceOf[NamedTask[_]].label + ".dest"), result.forall(p => os.exists(p.path)) ) result.foreach(p => os.remove.all(p.path)) val Right((result2, _)) = eval.apply(t) assert( - result2.map(_.path.last) == Agg(t.asInstanceOf[Target[_]].label + ".dest"), + result2.map(_.path.last) == Agg(t.asInstanceOf[NamedTask[_]].label + ".dest"), // as the result was cached but not checked, this path is missing result2.forall(p => os.exists(p.path) == flip) ) @@ -1283,13 +1283,13 @@ object HelloWorldTests extends TestSuite { // we reconstruct faulty behavior val Right((result, _)) = eval.apply(t) assert( - result._1.path.last == (t.asInstanceOf[Target[_]].label + ".dest"), + result._1.path.last == (t.asInstanceOf[NamedTask[_]].label + ".dest"), os.exists(result._1.path) ) os.remove.all(result._1.path) val Right((result2, _)) = eval.apply(t) assert( - result2._1.path.last == (t.asInstanceOf[Target[_]].label + ".dest"), + result2._1.path.last == (t.asInstanceOf[NamedTask[_]].label + ".dest"), // as the result was cached but not checked, this path is missing os.exists(result2._1.path) == flip ) diff --git a/scalanativelib/test/src/mill/scalanativelib/HelloNativeWorldTests.scala b/scalanativelib/test/src/mill/scalanativelib/HelloNativeWorldTests.scala index 1d399df8c8a..480ddecdfc4 100644 --- a/scalanativelib/test/src/mill/scalanativelib/HelloNativeWorldTests.scala +++ b/scalanativelib/test/src/mill/scalanativelib/HelloNativeWorldTests.scala @@ -154,7 +154,7 @@ object HelloNativeWorldTests extends TestSuite { ) } - def runTests(testTask: define.Target[(String, Seq[TestRunner.Result])]) + def runTests(testTask: define.NamedTask[(String, Seq[TestRunner.Result])]) : Map[String, Map[String, TestRunner.Result]] = { val Left(Result.Failure(_, Some(res))) = helloWorldEvaluator(testTask) From 3fbb31595823f8a285f6228725335d96b4bdd778 Mon Sep 17 00:00:00 2001 From: Li Haoyi Date: Mon, 3 Apr 2023 11:21:43 +0800 Subject: [PATCH 14/16] . --- main/core/src/mill/define/Task.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main/core/src/mill/define/Task.scala b/main/core/src/mill/define/Task.scala index 9abe5fcd247..94e755a25db 100644 --- a/main/core/src/mill/define/Task.scala +++ b/main/core/src/mill/define/Task.scala @@ -91,7 +91,7 @@ trait NamedTask[+T] extends Task[T] { def label: String = ctx.segment match { case Segment.Label(v) => v case Segment.Cross(_) => throw new IllegalArgumentException( - "Target only support a ctx with a Label segment, but found a Cross." + "NamedTask only support a ctx with a Label segment, but found a Cross." ) } override def toString = ctx.segments.render From 33a87a63602e6f4095b05843156f6580e6dba129 Mon Sep 17 00:00:00 2001 From: Li Haoyi Date: Mon, 3 Apr 2023 11:23:34 +0800 Subject: [PATCH 15/16] . --- main/test/src/mill/define/DiscoverTests.scala | 2 +- main/test/src/mill/define/MacroErrorTests.scala | 2 -- main/testkit/src/mill/testkit/MillTestkit.scala | 6 +++--- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/main/test/src/mill/define/DiscoverTests.scala b/main/test/src/mill/define/DiscoverTests.scala index 128d0dffd26..a08281c2db7 100644 --- a/main/test/src/mill/define/DiscoverTests.scala +++ b/main/test/src/mill/define/DiscoverTests.scala @@ -7,7 +7,7 @@ object DiscoverTests extends TestSuite { val testGraphs = new TestGraphs val tests = Tests { def check[T <: Module](m: T)(targets: (T => Target[_])*) = { - val discovered = m.millInternal.targets.filter(_.asCommand.isEmpty) + val discovered = m.millInternal.targets val expected = targets.map(_(m)).toSet assert(discovered == expected) } diff --git a/main/test/src/mill/define/MacroErrorTests.scala b/main/test/src/mill/define/MacroErrorTests.scala index 9ec8e7fad5b..908e9853509 100644 --- a/main/test/src/mill/define/MacroErrorTests.scala +++ b/main/test/src/mill/define/MacroErrorTests.scala @@ -29,8 +29,6 @@ object MacroErrorTests extends TestSuite { ) } - // WIP getting this error reporting working again - "target" - { val e = compileError(""" object foo extends mill.util.TestUtil.BaseModule{ diff --git a/main/testkit/src/mill/testkit/MillTestkit.scala b/main/testkit/src/mill/testkit/MillTestkit.scala index 290393eea25..7f4a8274f32 100644 --- a/main/testkit/src/mill/testkit/MillTestkit.scala +++ b/main/testkit/src/mill/testkit/MillTestkit.scala @@ -147,11 +147,11 @@ trait MillTestKit { } def check(targets: Agg[Task[_]], expected: Agg[Task[_]]): Unit = { - val targets2 = evaluator.evaluate(targets) + + + val evaluated = evaluator.evaluate(targets) .evaluated .flatMap(_.asTarget) - - val evaluated = targets2 .filter(module.millInternal.targets.contains) .filter(!_.isInstanceOf[InputImpl[_]]) assert( From dcb7d9fb0b5ba48d6b35ac354008e7ef6b6602fa Mon Sep 17 00:00:00 2001 From: Li Haoyi Date: Mon, 3 Apr 2023 12:37:03 +0800 Subject: [PATCH 16/16] . --- example/web/4-webapp-scalajs/build.sc | 2 +- example/web/5-webapp-scalajs-shared/build.sc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/example/web/4-webapp-scalajs/build.sc b/example/web/4-webapp-scalajs/build.sc index 6f3d826a7fd..1d923ac2492 100644 --- a/example/web/4-webapp-scalajs/build.sc +++ b/example/web/4-webapp-scalajs/build.sc @@ -8,7 +8,7 @@ object app extends RootModule with ScalaModule{ ivy"com.lihaoyi::scalatags:0.12.0" ) - def resources = T.sources{ + def resources = T{ os.makeDir(T.dest / "webapp") val jsPath = client.fastLinkJS().dest.path // Move the main.js[.map] files into the proper filesystem position diff --git a/example/web/5-webapp-scalajs-shared/build.sc b/example/web/5-webapp-scalajs-shared/build.sc index a6ef830533f..581d4afb613 100644 --- a/example/web/5-webapp-scalajs-shared/build.sc +++ b/example/web/5-webapp-scalajs-shared/build.sc @@ -14,7 +14,7 @@ object app extends RootModule with AppScalaModule{ def ivyDeps = Agg(ivy"com.lihaoyi::cask:0.9.0") - def resources = T.sources{ + def resources = T{ os.makeDir(T.dest / "webapp") val jsPath = client.fastLinkJS().dest.path os.copy(jsPath / "main.js", T.dest / "webapp" / "main.js")