diff options
author | Li Haoyi <haoyi.sg@gmail.com> | 2018-08-22 20:38:13 +0800 |
---|---|---|
committer | Li Haoyi <haoyi.sg@gmail.com> | 2018-08-22 20:38:13 +0800 |
commit | 7a15fea2f542d90fe6e4fc5cddf9b94f45b049c0 (patch) | |
tree | 73ccf3b5819e7e9bf981569c537861023365622e /scalajslib/worker | |
parent | 807e470fe3cb359993c8e37f79da2530138748d4 (diff) | |
download | mill-7a15fea2f542d90fe6e4fc5cddf9b94f45b049c0.tar.gz mill-7a15fea2f542d90fe6e4fc5cddf9b94f45b049c0.tar.bz2 mill-7a15fea2f542d90fe6e4fc5cddf9b94f45b049c0.zip |
Tidying up:
- Combine `main/` and `core/`
- Rename `jsbridges/`/`scalanativebridges/` -> `worker/` for consistency with other terminology
Diffstat (limited to 'scalajslib/worker')
-rw-r--r-- | scalajslib/worker/0.6/src/mill/scalajslib/bridge/ScalaJSBridge.scala | 87 | ||||
-rw-r--r-- | scalajslib/worker/1.0/src/mill/scalajslib/bridge/ScalaJSBridge.scala | 85 |
2 files changed, 172 insertions, 0 deletions
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)) + } +} |