diff options
author | Li Haoyi <haoyi.sg@gmail.com> | 2017-10-22 09:37:50 -0700 |
---|---|---|
committer | Li Haoyi <haoyi.sg@gmail.com> | 2017-10-22 09:37:50 -0700 |
commit | d5b903d44cbd29f838db3ea475d1efa101ad810f (patch) | |
tree | 3cb29f86f7be07ab2aaf3cf74fc66e41e9d3ed94 | |
parent | 06afaf6d3cf65cc7b42fa5f31aa6c48421626b6e (diff) | |
download | mill-d5b903d44cbd29f838db3ea475d1efa101ad810f.tar.gz mill-d5b903d44cbd29f838db3ea475d1efa101ad810f.tar.bz2 mill-d5b903d44cbd29f838db3ea475d1efa101ad810f.zip |
rename hbt -> forge
-rw-r--r-- | build.sbt | 6 | ||||
-rw-r--r-- | src/main/scala/forge/Args.scala (renamed from src/main/scala/hbt/Args.scala) | 2 | ||||
-rw-r--r-- | src/main/scala/forge/DefCtx.scala (renamed from src/main/scala/hbt/DefCtx.scala) | 2 | ||||
-rw-r--r-- | src/main/scala/forge/Evaluator.scala | 78 | ||||
-rw-r--r-- | src/main/scala/forge/Implicits.scala (renamed from src/main/scala/hbt/Implicits.scala) | 2 | ||||
-rw-r--r-- | src/main/scala/forge/ReadWrite.scala (renamed from src/main/scala/hbt/ReadWrite.scala) | 2 | ||||
-rw-r--r-- | src/main/scala/forge/Target.scala (renamed from src/main/scala/hbt/Target.scala) | 2 | ||||
-rw-r--r-- | src/main/scala/forge/Tarjans.scala (renamed from src/main/scala/hbt/Tarjans.scala) | 2 | ||||
-rw-r--r-- | src/main/scala/forge/Util.scala (renamed from src/main/scala/hbt/Util.scala) | 2 | ||||
-rw-r--r-- | src/main/scala/hbt/Evaluator.scala | 64 | ||||
-rw-r--r-- | src/test/scala/forge/ForgeTests.scala | 45 | ||||
-rw-r--r-- | src/test/scala/forge/Main.scala (renamed from src/test/scala/hbt/Main.scala) | 2 | ||||
-rw-r--r-- | src/test/scala/forge/StaticContextTests.scala (renamed from src/test/scala/hbt/StaticContextTests.scala) | 2 | ||||
-rw-r--r-- | src/test/scala/forge/TarjanTests.scala (renamed from src/test/scala/hbt/TarjanTests.scala) | 2 | ||||
-rw-r--r-- | src/test/scala/hbt/HbtTests.scala | 17 |
15 files changed, 136 insertions, 94 deletions
@@ -1,6 +1,6 @@ scalaVersion := "2.12.3" -name := "hbt" +name := "forge" organization := "com.lihaoyi" @@ -32,7 +32,7 @@ sourceGenerators in Compile += Def.task { """ } val output = s""" - package hbt + package forge trait SequencerGen[Sequencer[_, _, _]] extends LowestPriSequencer[Sequencer]{ protected[this] def Sequencer0[A, B, C](f: (A, B) => C): Sequencer[A, B, C] ${tuples.mkString("\n")} @@ -44,4 +44,4 @@ sourceGenerators in Compile += Def.task { """.stripMargin IO.write(file, output) Seq(file) -}
\ No newline at end of file +} diff --git a/src/main/scala/hbt/Args.scala b/src/main/scala/forge/Args.scala index c87ec96b..c7cc455c 100644 --- a/src/main/scala/hbt/Args.scala +++ b/src/main/scala/forge/Args.scala @@ -1,4 +1,4 @@ -package hbt +package forge import java.nio.{file => jnio} diff --git a/src/main/scala/hbt/DefCtx.scala b/src/main/scala/forge/DefCtx.scala index 1be06cd4..57f2e71e 100644 --- a/src/main/scala/hbt/DefCtx.scala +++ b/src/main/scala/forge/DefCtx.scala @@ -1,4 +1,4 @@ -package hbt +package forge import scala.language.experimental.macros 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) + } + } +} diff --git a/src/main/scala/hbt/Implicits.scala b/src/main/scala/forge/Implicits.scala index b9b12905..3295ce38 100644 --- a/src/main/scala/hbt/Implicits.scala +++ b/src/main/scala/forge/Implicits.scala @@ -1,4 +1,4 @@ -package hbt +package forge import scala.collection.mutable diff --git a/src/main/scala/hbt/ReadWrite.scala b/src/main/scala/forge/ReadWrite.scala index 962c0ea4..ee74f35f 100644 --- a/src/main/scala/hbt/ReadWrite.scala +++ b/src/main/scala/forge/ReadWrite.scala @@ -1,4 +1,4 @@ -package hbt +package forge import java.nio.{file => jnio} trait ReadWrite[T] { diff --git a/src/main/scala/hbt/Target.scala b/src/main/scala/forge/Target.scala index c5d5433b..80ff98c4 100644 --- a/src/main/scala/hbt/Target.scala +++ b/src/main/scala/forge/Target.scala @@ -1,4 +1,4 @@ -package hbt +package forge import java.nio.{file => jnio} diff --git a/src/main/scala/hbt/Tarjans.scala b/src/main/scala/forge/Tarjans.scala index dc95b02f..78dea34a 100644 --- a/src/main/scala/hbt/Tarjans.scala +++ b/src/main/scala/forge/Tarjans.scala @@ -1,4 +1,4 @@ -package hbt +package forge import collection.mutable // Adapted from diff --git a/src/main/scala/hbt/Util.scala b/src/main/scala/forge/Util.scala index e1c6c4cf..89a3eafe 100644 --- a/src/main/scala/hbt/Util.scala +++ b/src/main/scala/forge/Util.scala @@ -1,4 +1,4 @@ -package hbt +package forge import java.io.FileOutputStream import java.nio.{file => jnio} diff --git a/src/main/scala/hbt/Evaluator.scala b/src/main/scala/hbt/Evaluator.scala deleted file mode 100644 index 2931662a..00000000 --- a/src/main/scala/hbt/Evaluator.scala +++ /dev/null @@ -1,64 +0,0 @@ -package hbt - -import java.nio.{file => jnio} - -import sourcecode.Enclosing - -import scala.collection.mutable - -object Evaluator{ - - - def apply[T](t: Target[T], - workspacePath: jnio.Path) - (implicit enclosing: Enclosing): T = { - jnio.Files.createDirectories(workspacePath) - val targetPaths = mutable.Map.empty[Target[_], List[String]] - def rec(t: Target[_], path: List[String]): Unit = { - if (targetPaths.contains(t)) () // do nothing - else { - val currentPath = t.defCtx.staticEnclosing match{ - case None => path.reverse - case Some(s) => s.stripPrefix(enclosing.value).drop(1).split('.').toList - } - - targetPaths(t) = currentPath - t.inputs.zipWithIndex.foreach{case (c, i) => rec(c, i.toString :: currentPath)} - } - } - rec(t, Nil) - val targets = targetPaths.keys.toIndexedSeq - val targetIndices = targets.zipWithIndex.toMap - - val numberedEdges = - for(i <- targets.indices) - yield targets(i).inputs.map(targetIndices) - - val sortedClusters = Tarjans(numberedEdges) - val nonTrivialClusters = sortedClusters.filter(_.length > 1) - assert(nonTrivialClusters.isEmpty, nonTrivialClusters) - - val results = mutable.Map.empty[Target[_], Any] - for (cluster <- sortedClusters){ - val Seq(singletonIndex) = cluster - val target = targets(singletonIndex) - val inputResults = target.inputs.map(results) - val targetDestPath = workspacePath.resolve( - jnio.Paths.get(targetPaths(target).mkString("/")) - ) - import collection.JavaConverters._ - if (jnio.Files.exists(targetDestPath)){ - jnio.Files.walk(targetDestPath).iterator() - .asScala - .toArray - .reverseIterator - .map(jnio.Files.deleteIfExists) - } - - results(target) = target.evaluate( - new Args(inputResults.toIndexedSeq, targetDestPath) - ) - } - results(t).asInstanceOf[T] - } -} diff --git a/src/test/scala/forge/ForgeTests.scala b/src/test/scala/forge/ForgeTests.scala new file mode 100644 index 00000000..91e20f45 --- /dev/null +++ b/src/test/scala/forge/ForgeTests.scala @@ -0,0 +1,45 @@ +package forge + +import utest._ +import Target.noop + +object ForgeTests extends TestSuite{ + object Singleton { + val single = noop() + } + object Pair { + val up = noop() + val down = noop(up) + } + object Diamond{ + val up = noop() + val left = noop(up) + val right = noop(up) + val down = noop(left, right) + } + object AnonymousDiamond{ + val up = noop() + val down = noop(noop(up), noop(up)) + } + val tests = Tests{ + 'singleton - { +// Evaluator.labelTargets(Singleton.single) + } + 'pair - { +// Evaluator.labelTargets(Pair.up, Pair.down) + } + 'diamond - { +// Evaluator.labelTargets( +// Diamond.up, Diamond.left, Diamond.right, Diamond.down +// ) + } +// 'full - { +// val sourceRoot = Target.path(jnio.Paths.get("src/test/resources/example/src")) +// val resourceRoot = Target.path(jnio.Paths.get("src/test/resources/example/resources")) +// val allSources = list(sourceRoot) +// val classFiles = compileAll(allSources) +// val jar = jarUp(resourceRoot, classFiles) +// Evaluator.apply(jar, jnio.Paths.get("target/workspace")) +// } + } +} diff --git a/src/test/scala/hbt/Main.scala b/src/test/scala/forge/Main.scala index 427f1c41..745a9029 100644 --- a/src/test/scala/hbt/Main.scala +++ b/src/test/scala/forge/Main.scala @@ -1,4 +1,4 @@ -package hbt +package forge object Main{ def main(args: Array[String]): Unit = { diff --git a/src/test/scala/hbt/StaticContextTests.scala b/src/test/scala/forge/StaticContextTests.scala index c7fcdcd7..0e764fef 100644 --- a/src/test/scala/hbt/StaticContextTests.scala +++ b/src/test/scala/forge/StaticContextTests.scala @@ -1,4 +1,4 @@ -package hbt +package forge import DefCtx.StaticContext import utest._ class Helper{ diff --git a/src/test/scala/hbt/TarjanTests.scala b/src/test/scala/forge/TarjanTests.scala index 48314cf4..5b118368 100644 --- a/src/test/scala/hbt/TarjanTests.scala +++ b/src/test/scala/forge/TarjanTests.scala @@ -1,4 +1,4 @@ -package hbt +package forge import utest._ object TarjanTests extends TestSuite{ def check(input: Seq[Seq[Int]], expected: Seq[Seq[Int]]) = { diff --git a/src/test/scala/hbt/HbtTests.scala b/src/test/scala/hbt/HbtTests.scala deleted file mode 100644 index 0c10be58..00000000 --- a/src/test/scala/hbt/HbtTests.scala +++ /dev/null @@ -1,17 +0,0 @@ -package hbt - -import hbt.Util.{compileAll, jarUp, list} -import utest._ -import java.nio.{file => jnio} -object HbtTests extends TestSuite{ - val tests = Tests{ - 'simple - { - val sourceRoot = Target.path(jnio.Paths.get("src/test/resources/example/src")) - val resourceRoot = Target.path(jnio.Paths.get("src/test/resources/example/resources")) - val allSources = list(sourceRoot) - val classFiles = compileAll(allSources) - val jar = jarUp(resourceRoot, classFiles) - Evaluator.apply(jar, jnio.Paths.get("target/workspace")) - } - } -} |