diff options
author | Li Haoyi <haoyi.sg@gmail.com> | 2018-08-22 21:21:15 +0800 |
---|---|---|
committer | Li Haoyi <haoyi.sg@gmail.com> | 2018-08-22 21:21:15 +0800 |
commit | e22b860877591b25ca1a62eb341450011b8342a7 (patch) | |
tree | 02b154a891541d328e2e0d1f448f58cc2e59986d /scalajslib/src/mill/scalajslib/ScalaJSWorkerApi.scala | |
parent | 21026c2c858a58681fdeb1a194629ce693730890 (diff) | |
download | mill-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.scala | 100 |
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] +} |