From 7a15fea2f542d90fe6e4fc5cddf9b94f45b049c0 Mon Sep 17 00:00:00 2001 From: Li Haoyi Date: Wed, 22 Aug 2018 20:38:13 +0800 Subject: Tidying up: - Combine `main/` and `core/` - Rename `jsbridges/`/`scalanativebridges/` -> `worker/` for consistency with other terminology --- .../src/mill/scalajslib/bridge/ScalaJSBridge.scala | 87 ++++++++++++++++++++++ .../src/mill/scalajslib/bridge/ScalaJSBridge.scala | 85 +++++++++++++++++++++ 2 files changed, 172 insertions(+) create mode 100644 scalajslib/worker/0.6/src/mill/scalajslib/bridge/ScalaJSBridge.scala create mode 100644 scalajslib/worker/1.0/src/mill/scalajslib/bridge/ScalaJSBridge.scala (limited to 'scalajslib/worker') diff --git a/scalajslib/worker/0.6/src/mill/scalajslib/bridge/ScalaJSBridge.scala b/scalajslib/worker/0.6/src/mill/scalajslib/bridge/ScalaJSBridge.scala new file mode 100644 index 00000000..6f14db19 --- /dev/null +++ b/scalajslib/worker/0.6/src/mill/scalajslib/bridge/ScalaJSBridge.scala @@ -0,0 +1,87 @@ +package mill +package scalajslib +package bridge + +import java.io.File + +import mill.eval.Result +import org.scalajs.core.tools.io.IRFileCache.IRContainer +import org.scalajs.core.tools.io._ +import org.scalajs.core.tools.jsdep.ResolvedJSDependency +import org.scalajs.core.tools.linker.{ModuleInitializer, StandardLinker, Semantics, ModuleKind => ScalaJSModuleKind} +import org.scalajs.core.tools.logging.ScalaConsoleLogger +import org.scalajs.jsenv._ +import org.scalajs.jsenv.nodejs._ +import org.scalajs.testadapter.TestAdapter + +class ScalaJSBridge extends mill.scalajslib.ScalaJSBridge { + def link(sources: Array[File], + libraries: Array[File], + dest: File, + main: String, + fullOpt: Boolean, + moduleKind: ModuleKind) = { + val semantics = fullOpt match { + case true => Semantics.Defaults.optimized + case false => Semantics.Defaults + } + val scalaJSModuleKind = moduleKind match { + case ModuleKind.NoModule => ScalaJSModuleKind.NoModule + case ModuleKind.CommonJSModule => ScalaJSModuleKind.CommonJSModule + } + val config = StandardLinker.Config() + .withOptimizer(fullOpt) + .withClosureCompilerIfAvailable(fullOpt) + .withSemantics(semantics) + .withModuleKind(scalaJSModuleKind) + val linker = StandardLinker(config) + val sourceSJSIRs = sources.map(new FileVirtualScalaJSIRFile(_)) + val jars = libraries.map(jar => IRContainer.Jar(new FileVirtualBinaryFile(jar) with VirtualJarFile)) + val jarSJSIRs = jars.flatMap(_.jar.sjsirFiles) + val destFile = AtomicWritableFileVirtualJSFile(dest) + val logger = new ScalaConsoleLogger + val initializer = Option(main).map { cls => ModuleInitializer.mainMethodWithArgs(cls, "main") } + try { + linker.link(sourceSJSIRs ++ jarSJSIRs, initializer.toSeq, destFile, logger) + Result.Success(dest) + }catch {case e: org.scalajs.core.tools.linker.LinkingException => + Result.Failure(e.getMessage) + } + } + + def run(config: NodeJSConfig, linkedFile: File): Unit = { + nodeJSEnv(config) + .jsRunner(FileVirtualJSFile(linkedFile)) + .run(new ScalaConsoleLogger, ConsoleJSConsole) + } + + def getFramework(config: NodeJSConfig, + frameworkName: String, + linkedFile: File): (() => Unit, sbt.testing.Framework) = { + val env = nodeJSEnv(config).loadLibs( + Seq(ResolvedJSDependency.minimal(new FileVirtualJSFile(linkedFile))) + ) + + val tconfig = TestAdapter.Config().withLogger(new ScalaConsoleLogger) + val adapter = + new TestAdapter(env, tconfig) + + ( + () => adapter.close(), + adapter + .loadFrameworks(List(List(frameworkName))) + .flatten + .headOption + .getOrElse(throw new RuntimeException("Failed to get framework")) + ) + } + + def nodeJSEnv(config: NodeJSConfig): NodeJSEnv = { + new NodeJSEnv( + NodeJSEnv.Config() + .withExecutable(config.executable) + .withArgs(config.args) + .withEnv(config.env) + .withSourceMap(config.sourceMap)) + } +} diff --git a/scalajslib/worker/1.0/src/mill/scalajslib/bridge/ScalaJSBridge.scala b/scalajslib/worker/1.0/src/mill/scalajslib/bridge/ScalaJSBridge.scala new file mode 100644 index 00000000..534d45bf --- /dev/null +++ b/scalajslib/worker/1.0/src/mill/scalajslib/bridge/ScalaJSBridge.scala @@ -0,0 +1,85 @@ +package mill +package scalajslib +package bridge + +import java.io.File + +import mill.eval.Result +import org.scalajs.core.tools.io._ +import org.scalajs.core.tools.linker.{ModuleInitializer, Semantics, StandardLinker, ModuleKind => ScalaJSModuleKind} +import org.scalajs.core.tools.logging.ScalaConsoleLogger +import org.scalajs.jsenv.ConsoleJSConsole +import org.scalajs.jsenv.nodejs._ +import org.scalajs.testadapter.TestAdapter + +class ScalaJSBridge extends mill.scalajslib.ScalaJSBridge { + def link(sources: Array[File], + libraries: Array[File], + dest: File, + main: String, + fullOpt: Boolean, + moduleKind: ModuleKind) = { + val semantics = fullOpt match { + case true => Semantics.Defaults.optimized + case false => Semantics.Defaults + } + val scalaJSModuleKind = moduleKind match { + case ModuleKind.NoModule => ScalaJSModuleKind.NoModule + case ModuleKind.CommonJSModule => ScalaJSModuleKind.CommonJSModule + } + val config = StandardLinker.Config() + .withOptimizer(fullOpt) + .withClosureCompilerIfAvailable(fullOpt) + .withSemantics(semantics) + .withModuleKind(scalaJSModuleKind) + val linker = StandardLinker(config) + val cache = new IRFileCache().newCache + val sourceIRs = sources.map(FileVirtualScalaJSIRFile) + val irContainers = FileScalaJSIRContainer.fromClasspath(libraries) + val libraryIRs = cache.cached(irContainers) + val destFile = AtomicWritableFileVirtualJSFile(dest) + val logger = new ScalaConsoleLogger + val initializer = Option(main).map { cls => ModuleInitializer.mainMethodWithArgs(cls, "main") } + + try { + linker.link(sourceIRs ++ libraryIRs, initializer.toSeq, destFile, logger) + Result.Success(dest) + }catch {case e: org.scalajs.core.tools.linker.LinkingException => + Result.Failure(e.getMessage) + } + } + + def run(config: NodeJSConfig, linkedFile: File): Unit = { + nodeJSEnv(config) + .jsRunner(Seq(FileVirtualJSFile(linkedFile))) + .run(new ScalaConsoleLogger, ConsoleJSConsole) + } + + def getFramework(config: NodeJSConfig, + frameworkName: String, + linkedFile: File): (() => Unit, sbt.testing.Framework) = { + val env = nodeJSEnv(config) + val tconfig = TestAdapter.Config().withLogger(new ScalaConsoleLogger) + + val adapter = + new TestAdapter(env, Seq(FileVirtualJSFile(linkedFile)), tconfig) + + ( + () => adapter.close(), + adapter + .loadFrameworks(List(List(frameworkName))) + .flatten + .headOption + .getOrElse(throw new RuntimeException("Failed to get framework")) + ) + } + + def nodeJSEnv(config: NodeJSConfig): NodeJSEnv = { + new NodeJSEnv( + NodeJSEnv.Config() + .withExecutable(config.executable) + .withArgs(config.args) + .withEnv(config.env) + .withSourceMap(config.sourceMap)) + } +} -- cgit v1.2.3