From 9ba4cb69331386dfde9bac69dc2d5b22401face3 Mon Sep 17 00:00:00 2001 From: Li Haoyi Date: Wed, 12 Dec 2018 16:56:02 -0800 Subject: collapse boilerplate folder structure within src/ folders (#505) * collapse boilerplate folder structure within src/ folders * . --- scalajslib/src/ScalaJSWorkerApi.scala | 72 +++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 scalajslib/src/ScalaJSWorkerApi.scala (limited to 'scalajslib/src/ScalaJSWorkerApi.scala') diff --git a/scalajslib/src/ScalaJSWorkerApi.scala b/scalajslib/src/ScalaJSWorkerApi.scala new file mode 100644 index 00000000..bcaeb2d3 --- /dev/null +++ b/scalajslib/src/ScalaJSWorkerApi.scala @@ -0,0 +1,72 @@ +package mill.scalajslib + +import java.io.File +import java.net.URLClassLoader + +import mill.define.Discover +import mill.api.Result +import mill.api.Ctx +import mill.{Agg, T} +import mill.scalajslib.api._ +class ScalaJSWorker { + private var scalaInstanceCache = Option.empty[(Long, ScalaJSWorkerApi)] + + private def bridge(toolsClasspath: Agg[os.Path]) + (implicit ctx: Ctx.Home) = { + val classloaderSig = + toolsClasspath.map(p => p.toString().hashCode + os.mtime(p)).sum + scalaInstanceCache match { + case Some((sig, bridge)) if sig == classloaderSig => bridge + case _ => + val cl = mill.api.ClassLoader.create( + toolsClasspath.map(_.toIO.toURI.toURL).toVector, + getClass.getClassLoader + ) + val bridge = cl + .loadClass("mill.scalajslib.worker.ScalaJSWorkerImpl") + .getDeclaredConstructor() + .newInstance() + .asInstanceOf[ScalaJSWorkerApi] + scalaInstanceCache = Some((classloaderSig, bridge)) + bridge + } + } + + def link(toolsClasspath: Agg[os.Path], + sources: Agg[os.Path], + libraries: Agg[os.Path], + dest: File, + main: Option[String], + fullOpt: Boolean, + moduleKind: ModuleKind) + (implicit ctx: Ctx.Home): Result[os.Path] = { + bridge(toolsClasspath).link( + sources.items.map(_.toIO).toArray, + libraries.items.map(_.toIO).toArray, + dest, + main.orNull, + fullOpt, + moduleKind + ).map(os.Path(_)) + } + + def run(toolsClasspath: Agg[os.Path], config: NodeJSConfig, linkedFile: File) + (implicit ctx: Ctx.Home): Unit = { + bridge(toolsClasspath).run(config, linkedFile) + } + + def getFramework(toolsClasspath: Agg[os.Path], + config: NodeJSConfig, + frameworkName: String, + linkedFile: File) + (implicit ctx: Ctx.Home): (() => Unit, sbt.testing.Framework) = { + bridge(toolsClasspath).getFramework(config, frameworkName, linkedFile) + } + +} + +object ScalaJSWorkerApi extends mill.define.ExternalModule { + + def scalaJSWorker = T.worker { new ScalaJSWorker() } + lazy val millDiscover = Discover[this.type] +} -- cgit v1.2.3