summaryrefslogtreecommitdiff
path: root/scalajslib/src/mill/scalajslib/ScalaJSWorkerApi.scala
diff options
context:
space:
mode:
authorLi Haoyi <haoyi.sg@gmail.com>2018-08-22 21:21:15 +0800
committerLi Haoyi <haoyi.sg@gmail.com>2018-08-22 21:21:15 +0800
commite22b860877591b25ca1a62eb341450011b8342a7 (patch)
tree02b154a891541d328e2e0d1f448f58cc2e59986d /scalajslib/src/mill/scalajslib/ScalaJSWorkerApi.scala
parent21026c2c858a58681fdeb1a194629ce693730890 (diff)
downloadmill-e22b860877591b25ca1a62eb341450011b8342a7.tar.gz
mill-e22b860877591b25ca1a62eb341450011b8342a7.tar.bz2
mill-e22b860877591b25ca1a62eb341450011b8342a7.zip
standardize naming of ScalaWorker/Api/Impl
Diffstat (limited to 'scalajslib/src/mill/scalajslib/ScalaJSWorkerApi.scala')
-rw-r--r--scalajslib/src/mill/scalajslib/ScalaJSWorkerApi.scala100
1 files changed, 100 insertions, 0 deletions
diff --git a/scalajslib/src/mill/scalajslib/ScalaJSWorkerApi.scala b/scalajslib/src/mill/scalajslib/ScalaJSWorkerApi.scala
new file mode 100644
index 00000000..e8239e8f
--- /dev/null
+++ b/scalajslib/src/mill/scalajslib/ScalaJSWorkerApi.scala
@@ -0,0 +1,100 @@
+package mill.scalajslib
+
+import java.io.File
+import java.net.URLClassLoader
+
+import ammonite.ops.Path
+import mill.define.Discover
+import mill.eval.Result
+import mill.util.Ctx
+import mill.{Agg, T}
+
+sealed trait OptimizeMode
+
+object FastOpt extends OptimizeMode
+object FullOpt extends OptimizeMode
+
+sealed trait ModuleKind
+object ModuleKind{
+ object NoModule extends ModuleKind
+ object CommonJSModule extends ModuleKind
+}
+
+class ScalaJSWorker {
+ private var scalaInstanceCache = Option.empty[(Long, ScalaJSWorkerApi)]
+
+ private def bridge(toolsClasspath: Agg[Path])
+ (implicit ctx: Ctx.Home) = {
+ val classloaderSig =
+ toolsClasspath.map(p => p.toString().hashCode + p.mtime.toMillis).sum
+ scalaInstanceCache match {
+ case Some((sig, bridge)) if sig == classloaderSig => bridge
+ case _ =>
+ val cl = mill.util.ClassLoader.create(
+ toolsClasspath.map(_.toIO.toURI.toURL).toVector,
+ getClass.getClassLoader
+ )
+ val bridge = cl
+ .loadClass("mill.scalajslib.bridge.ScalaJSBridge")
+ .getDeclaredConstructor()
+ .newInstance()
+ .asInstanceOf[ScalaJSWorkerApi]
+ scalaInstanceCache = Some((classloaderSig, bridge))
+ bridge
+ }
+ }
+
+ def link(toolsClasspath: Agg[Path],
+ sources: Agg[Path],
+ libraries: Agg[Path],
+ dest: File,
+ main: Option[String],
+ fullOpt: Boolean,
+ moduleKind: ModuleKind)
+ (implicit ctx: Ctx.Home): Result[Path] = {
+ bridge(toolsClasspath).link(
+ sources.items.map(_.toIO).toArray,
+ libraries.items.map(_.toIO).toArray,
+ dest,
+ main.orNull,
+ fullOpt,
+ moduleKind
+ ).map(Path(_))
+ }
+
+ def run(toolsClasspath: Agg[Path], config: NodeJSConfig, linkedFile: File)
+ (implicit ctx: Ctx.Home): Unit = {
+ bridge(toolsClasspath).run(config, linkedFile)
+ }
+
+ def getFramework(toolsClasspath: Agg[Path],
+ config: NodeJSConfig,
+ frameworkName: String,
+ linkedFile: File)
+ (implicit ctx: Ctx.Home): (() => Unit, sbt.testing.Framework) = {
+ bridge(toolsClasspath).getFramework(config, frameworkName, linkedFile)
+ }
+
+}
+
+trait ScalaJSWorkerApi {
+ def link(sources: Array[File],
+ libraries: Array[File],
+ dest: File,
+ main: String,
+ fullOpt: Boolean,
+ moduleKind: ModuleKind): Result[File]
+
+ def run(config: NodeJSConfig, linkedFile: File): Unit
+
+ def getFramework(config: NodeJSConfig,
+ frameworkName: String,
+ linkedFile: File): (() => Unit, sbt.testing.Framework)
+
+}
+
+object ScalaJSWorkerApi extends mill.define.ExternalModule {
+
+ def scalaJSBridge = T.worker { new ScalaJSWorker() }
+ lazy val millDiscover = Discover[this.type]
+}