summaryrefslogtreecommitdiff
path: root/scalajslib/worker
diff options
context:
space:
mode:
authorLi Haoyi <haoyi.sg@gmail.com>2018-08-22 20:38:13 +0800
committerLi Haoyi <haoyi.sg@gmail.com>2018-08-22 20:38:13 +0800
commit7a15fea2f542d90fe6e4fc5cddf9b94f45b049c0 (patch)
tree73ccf3b5819e7e9bf981569c537861023365622e /scalajslib/worker
parent807e470fe3cb359993c8e37f79da2530138748d4 (diff)
downloadmill-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.scala87
-rw-r--r--scalajslib/worker/1.0/src/mill/scalajslib/bridge/ScalaJSBridge.scala85
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))
+ }
+}