summaryrefslogtreecommitdiff
path: root/src/main/scala/forge/Evaluator.scala
diff options
context:
space:
mode:
authorLi Haoyi <haoyi.sg@gmail.com>2017-10-22 09:37:50 -0700
committerLi Haoyi <haoyi.sg@gmail.com>2017-10-22 09:37:50 -0700
commitd5b903d44cbd29f838db3ea475d1efa101ad810f (patch)
tree3cb29f86f7be07ab2aaf3cf74fc66e41e9d3ed94 /src/main/scala/forge/Evaluator.scala
parent06afaf6d3cf65cc7b42fa5f31aa6c48421626b6e (diff)
downloadmill-d5b903d44cbd29f838db3ea475d1efa101ad810f.tar.gz
mill-d5b903d44cbd29f838db3ea475d1efa101ad810f.tar.bz2
mill-d5b903d44cbd29f838db3ea475d1efa101ad810f.zip
rename hbt -> forge
Diffstat (limited to 'src/main/scala/forge/Evaluator.scala')
-rw-r--r--src/main/scala/forge/Evaluator.scala78
1 files changed, 78 insertions, 0 deletions
diff --git a/src/main/scala/forge/Evaluator.scala b/src/main/scala/forge/Evaluator.scala
new file mode 100644
index 00000000..137943f7
--- /dev/null
+++ b/src/main/scala/forge/Evaluator.scala
@@ -0,0 +1,78 @@
+package forge
+
+import java.nio.{file => jnio}
+
+import sourcecode.Enclosing
+
+import scala.collection.mutable
+
+class Evaluator(workspacePath: jnio.Path,
+ enclosingBase: DefCtx){
+
+ /**
+ * Takes the given targets, finds
+ */
+ def prepareTransitiveTargets(targets: Seq[Target[_]]) = {
+
+ val targetIndices = targets.zipWithIndex.toMap
+
+ val transitiveTargetSet = mutable.Set.empty[Target[_]]
+ def rec(t: Target[_]): Unit = {
+ if (transitiveTargetSet.contains(t)) () // do nothing
+ else {
+ transitiveTargetSet.add(t)
+ t.inputs.foreach(rec)
+ }
+ }
+
+ targets.foreach(rec)
+ val transitiveTargets = transitiveTargetSet.toVector
+ val numberedEdges =
+ for(i <- transitiveTargets.indices)
+ yield targets(i).inputs.map(targetIndices)
+
+ val sortedClusters = Tarjans(numberedEdges)
+ val nonTrivialClusters = sortedClusters.filter(_.length > 1)
+ assert(nonTrivialClusters.isEmpty, nonTrivialClusters)
+ (transitiveTargets, sortedClusters.flatten)
+ }
+
+ def apply[T](t: Target[T])
+ (implicit enclosing: Enclosing): T = {
+ jnio.Files.createDirectories(workspacePath)
+
+ val (transitiveTargets, sortedTargetIndices) = prepareTransitiveTargets(Seq(t))
+ val results = mutable.Map.empty[Target[_], Any]
+ for (index <- sortedTargetIndices){
+
+ val target = transitiveTargets(index)
+ val inputResults = target.inputs.map(results)
+
+ for(enclosing <- target.defCtx.staticEnclosing){
+ val targetDestPath = workspacePath.resolve(
+ jnio.Paths.get(enclosing.stripSuffix(enclosingBase.staticEnclosing.getOrElse("")))
+ )
+ deleteRec(targetDestPath)
+ }
+
+
+
+
+
+ results(target) = target.evaluate(
+ new Args(inputResults.toIndexedSeq, targetDestPath)
+ )
+ }
+ results(t).asInstanceOf[T]
+ }
+ def deleteRec(path: jnio.Path) = {
+ if (jnio.Files.exists(path)){
+ import collection.JavaConverters._
+ jnio.Files.walk(path).iterator()
+ .asScala
+ .toArray
+ .reverseIterator
+ .map(jnio.Files.deleteIfExists)
+ }
+ }
+}