diff options
author | Li Haoyi <haoyi.sg@gmail.com> | 2017-10-27 09:07:58 -0700 |
---|---|---|
committer | Li Haoyi <haoyi.sg@gmail.com> | 2017-10-27 09:07:58 -0700 |
commit | b1a682a400922506a2bb7e42e0597625a8cbca16 (patch) | |
tree | f03a0bd85747848689f056a0897492c2d2d75239 /src/main/scala | |
parent | f53db8482c86f30c917d16b6312ad4804b37f2df (diff) | |
download | mill-b1a682a400922506a2bb7e42e0597625a8cbca16.tar.gz mill-b1a682a400922506a2bb7e42e0597625a8cbca16.tar.bz2 mill-b1a682a400922506a2bb7e42e0597625a8cbca16.zip |
Got grouped evaluation working
Diffstat (limited to 'src/main/scala')
-rw-r--r-- | src/main/scala/forge/Evaluator.scala | 19 | ||||
-rw-r--r-- | src/main/scala/forge/Target.scala | 10 |
2 files changed, 14 insertions, 15 deletions
diff --git a/src/main/scala/forge/Evaluator.scala b/src/main/scala/forge/Evaluator.scala index ecbf4260..32a3c9d0 100644 --- a/src/main/scala/forge/Evaluator.scala +++ b/src/main/scala/forge/Evaluator.scala @@ -50,12 +50,13 @@ class Evaluator(workspacePath: jnio.Path, val targetDestPath = workspacePath.resolve( jnio.Paths.get(enclosingStr.stripSuffix(enclosingBase.label)) ) + val anyDirty = group.exists(_.dirty) deleteRec(targetDestPath) val inputsHash = inputResults.hashCode - (primeTerminal.dirty, resultCache.get(primeTerminal.defCtx.label)) match{ - case (Some(dirtyCheck), Some((hash, terminalResults))) - if hash == inputsHash && !dirtyCheck() => + resultCache.get(primeTerminal.defCtx.label) match{ + case Some((hash, terminalResults)) + if hash == inputsHash && !anyDirty => for((terminal, res) <- terminals.items.zip(terminalResults)){ newResults(terminal) = primeTerminal.formatter.reads(Json.parse(res)).get @@ -64,14 +65,16 @@ class Evaluator(workspacePath: jnio.Path, case _ => val terminalResults = mutable.Buffer.empty[String] for(target <- group.items){ - newEvaluated.append(target) - if (target.defCtx.anonId.isDefined && target.dirty.isEmpty) { - val res = target.evaluate(new Args(inputResults, targetDestPath)) + val targetInputValues = target.inputs.toVector.map(x => + newResults.getOrElse(x, results(x)) + ) + if (target.defCtx.anonId.isDefined) { + val res = target.evaluate(new Args(targetInputValues, targetDestPath)) newResults(target) = res }else{ val (res, serialized) = target.evaluateAndWrite( - new Args(inputResults, targetDestPath) + new Args(targetInputValues, targetDestPath) ) if (!internalInputSet(target)){ terminalResults.append(serialized) @@ -117,7 +120,7 @@ object Evaluator{ val targetGroup = grouping.lookupValue(target) for(upstream <- target.inputs){ grouping.lookupValueOpt(upstream) match{ - case None if upstream.dirty.isEmpty && upstream.defCtx.anonId.nonEmpty => + case None if upstream.defCtx.anonId.nonEmpty => grouping.add(targetGroup, upstream) case Some(upstreamGroup) if upstreamGroup == targetGroup => val upstreamTargets = grouping.removeAll(upstreamGroup) diff --git a/src/main/scala/forge/Target.scala b/src/main/scala/forge/Target.scala index adf2cb99..6f434030 100644 --- a/src/main/scala/forge/Target.scala +++ b/src/main/scala/forge/Target.scala @@ -21,12 +21,8 @@ abstract class Target[T](implicit formatter: Format[T]) extends Target.Ops[T]{ /** * Even if this target's inputs did not change, does it need to re-evaluate * anyway? - * - * - None means it never needs to re-evaluate unless its inputs do - * - Some(f) contains a function that returns whether or not it should re-evaluate, - * e.g. if the files this target represents on disk changed */ - val dirty: Option[() => Boolean] = Some(() => false) + def dirty: Boolean = false } @@ -67,9 +63,9 @@ object Target{ var lastCounter = counter def evaluate(args: Args) = { lastCounter = counter - counter + args.args.map(_.asInstanceOf[Int]).sum + counter + args.args.map(_.asInstanceOf[Int]).sum } - override val dirty = if (pure) None else Some(() => lastCounter != counter) + override def dirty = lastCounter != counter } def traverse[T: Format](source: Seq[Target[T]])(implicit defCtx: DefCtx) = { new Traverse[T](source, defCtx) |