summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLi Haoyi <haoyi.sg@gmail.com>2018-03-03 07:11:13 -0800
committerLi Haoyi <haoyi.sg@gmail.com>2018-03-03 07:11:20 -0800
commit9f6151f438d7661590c09be13af0f2df8bf5e701 (patch)
treea161cd56641c4b05f96907636f1147a6c6be150a
parent2bc394a02ec18aadaa34c95805e94dab46aae465 (diff)
downloadmill-9f6151f438d7661590c09be13af0f2df8bf5e701.tar.gz
mill-9f6151f438d7661590c09be13af0f2df8bf5e701.tar.bz2
mill-9f6151f438d7661590c09be13af0f2df8bf5e701.zip
make mainClass discovery work in ScalaJSModule#run
Also disable ScalaJSModule#runMain, since the official Scala.js-SBT plugin does not support it and it requires an expensive re-linking every time it is run.
-rw-r--r--scalajslib/jsbridges/0.6/src/mill/scalajslib/bridge/ScalaJSBridge.scala2
-rw-r--r--scalajslib/src/mill/scalajslib/ScalaJSModule.scala41
-rw-r--r--scalajslib/test/src/mill/scalajslib/HelloJSWorldTests.scala25
-rw-r--r--scalalib/src/mill/scalalib/ScalaModule.scala41
4 files changed, 42 insertions, 67 deletions
diff --git a/scalajslib/jsbridges/0.6/src/mill/scalajslib/bridge/ScalaJSBridge.scala b/scalajslib/jsbridges/0.6/src/mill/scalajslib/bridge/ScalaJSBridge.scala
index 604df3f7..86abbd14 100644
--- a/scalajslib/jsbridges/0.6/src/mill/scalajslib/bridge/ScalaJSBridge.scala
+++ b/scalajslib/jsbridges/0.6/src/mill/scalajslib/bridge/ScalaJSBridge.scala
@@ -37,7 +37,7 @@ class ScalaJSBridge extends mill.scalajslib.ScalaJSBridge {
val env = new NodeJSEnv().loadLibs(
Seq(ResolvedJSDependency.minimal(new FileVirtualJSFile(linkedFile)))
)
- val jsConsole = ConsoleJSConsole
+
val config = TestAdapter.Config().withLogger(new ScalaConsoleLogger)
val adapter =
new TestAdapter(env, config)
diff --git a/scalajslib/src/mill/scalajslib/ScalaJSModule.scala b/scalajslib/src/mill/scalajslib/ScalaJSModule.scala
index b3cc28a4..5a3b6526 100644
--- a/scalajslib/src/mill/scalajslib/ScalaJSModule.scala
+++ b/scalajslib/src/mill/scalajslib/ScalaJSModule.scala
@@ -4,7 +4,7 @@ package scalajslib
import ammonite.ops.{Path, exists, ls, mkdir, rm}
import coursier.Cache
import coursier.maven.MavenRepository
-import mill.eval.PathRef
+import mill.eval.{PathRef, Result}
import mill.eval.Result.Success
import mill.scalalib.Lib.resolveDependencies
import mill.scalalib.{CompilationResult, Dep, DepSyntax, TestModule}
@@ -71,7 +71,7 @@ trait ScalaJSModule extends scalalib.ScalaModule { outer =>
ScalaJSBridge.scalaJSBridge(),
toolsClasspath(),
runClasspath(),
- mainClass(),
+ finalMainClassOpt().toOption,
FastOpt
)
}
@@ -81,39 +81,32 @@ trait ScalaJSModule extends scalalib.ScalaModule { outer =>
ScalaJSBridge.scalaJSBridge(),
toolsClasspath(),
runClasspath(),
- mainClass(),
+ finalMainClassOpt().toOption,
FullOpt
)
}
- override def runLocal(args: String*) = T.command { run(args:_*) }
+ override def runLocal(args: String*) = T.command { run(args:_*) }
override def run(args: String*) = T.command {
- if(mainClass().isEmpty) {
- throw new RuntimeException("No mainClass provided!")
+ finalMainClassOpt() match{
+ case Left(err) => Result.Failure(err)
+ case Right(_) =>
+ ScalaJSBridge.scalaJSBridge().run(
+ toolsClasspath().map(_.path),
+ fastOpt().path.toIO
+ )
+ Result.Success(())
}
- ScalaJSBridge.scalaJSBridge().run(
- toolsClasspath().map(_.path),
- fastOpt().path.toIO
- )
}
- override def runMainLocal(mainClass: String, args: String*) = T.command { runMain(mainClass, args:_*) }
-
- override def runMain(mainClass: String, args: String*) = T.command {
- val linkedFile = link(
- ScalaJSBridge.scalaJSBridge(),
- toolsClasspath(),
- runClasspath(),
- Some(mainClass),
- FastOpt
- )
+ override def runMainLocal(mainClass: String, args: String*) = T.command[Unit] {
+ mill.eval.Result.Failure("runMain is not supported in Scala.js")
+ }
- ScalaJSBridge.scalaJSBridge().run(
- toolsClasspath().map(_.path),
- linkedFile.path.toIO
- )
+ override def runMain(mainClass: String, args: String*) = T.command[Unit] {
+ mill.eval.Result.Failure("runMain is not supported in Scala.js")
}
def link(worker: ScalaJSWorker,
diff --git a/scalajslib/test/src/mill/scalajslib/HelloJSWorldTests.scala b/scalajslib/test/src/mill/scalajslib/HelloJSWorldTests.scala
index 23db8cf6..2429a189 100644
--- a/scalajslib/test/src/mill/scalajslib/HelloJSWorldTests.scala
+++ b/scalajslib/test/src/mill/scalajslib/HelloJSWorldTests.scala
@@ -204,11 +204,8 @@ object HelloJSWorldTests extends TestSuite {
// 'scalaTest_2124_100M2 - checkScalaTest("2.12.4", "1.0.0-M2")
}
- def checkRun(scalaVersion: String, scalaJSVersion: String, mainClass: Option[String] = None): Unit = {
- val task = mainClass match {
- case Some(main) => HelloJSWorld.helloJsWorld(scalaVersion, scalaJSVersion).runMain(main)
- case None => HelloJSWorld.helloJsWorld(scalaVersion, scalaJSVersion).run()
- }
+ def checkRun(scalaVersion: String, scalaJSVersion: String): Unit = {
+ val task = HelloJSWorld.helloJsWorld(scalaVersion, scalaJSVersion).run()
val Right((_, evalCount)) = helloWorldEvaluator(task)
@@ -224,24 +221,6 @@ object HelloJSWorldTests extends TestSuite {
)
}
- 'runMain - {
- val mainClass = Some("Main")
- 'run_2118_0622 - checkRun("2.11.8", "0.6.22", mainClass)
- 'run_2124_0622 - checkRun("2.12.4", "0.6.22", mainClass)
- 'run_2118_100M2 - checkRun("2.11.8", "1.0.0-M2", mainClass)
- 'run_2124_100M2 - checkRun("2.12.4", "1.0.0-M2", mainClass)
-
- 'wrongMain - {
- val wrongMainClass = "Foo"
- val task = HelloJSWorld.helloJsWorld("2.12.4", "0.6.22").runMain(wrongMainClass)
-
- val Left(Result.Exception(ex, _)) = helloWorldEvaluator(task)
-
- assert(
- ex.isInstanceOf[Exception]
- )
- }
- }
'run - {
'run_2118_0622 - checkRun("2.11.8", "0.6.22")
'run_2124_0622 - checkRun("2.12.4", "0.6.22")
diff --git a/scalalib/src/mill/scalalib/ScalaModule.scala b/scalalib/src/mill/scalalib/ScalaModule.scala
index cc2d1e84..c7dbc322 100644
--- a/scalalib/src/mill/scalalib/ScalaModule.scala
+++ b/scalalib/src/mill/scalalib/ScalaModule.scala
@@ -29,22 +29,29 @@ trait ScalaModule extends mill.Module with TaskModule { outer =>
def scalaWorker: ScalaWorkerModule = mill.scalalib.ScalaWorkerModule
- def finalMainClass: T[String] = T{
- mainClass() match {
- case Some(main) => Result.Success(main)
+ def finalMainClassOpt: T[Either[String, String]] = T{
+ mainClass() match{
+ case Some(m) => Right(m)
case None =>
- scalaWorker.worker().discoverMainClasses(compile()) match {
- case Seq() => Result.Failure("No main class specified or found")
- case Seq(main) => Result.Success(main)
+ scalaWorker.worker().discoverMainClasses(compile())match {
+ case Seq() => Left("No main class specified or found")
+ case Seq(main) => Right(main)
case mains =>
- Result.Failure(
+ Left(
s"Multiple main classes found (${mains.mkString(",")}) " +
- "please explicitly specify which one to use by overriding mainClass"
+ "please explicitly specify which one to use by overriding mainClass"
)
}
}
}
+ def finalMainClass: T[String] = T{
+ finalMainClassOpt() match {
+ case Right(main) => Result.Success(main)
+ case Left(msg) => Result.Failure(msg)
+ }
+ }
+
def ivyDeps = T{ Agg.empty[Dep] }
def compileIvyDeps = T{ Agg.empty[Dep] }
def scalacPluginIvyDeps = T{ Agg.empty[Dep] }
@@ -215,17 +222,13 @@ trait ScalaModule extends mill.Module with TaskModule { outer =>
def forkEnv = T{ sys.env.toMap }
def launcher = T{
- mainClass() match {
- case None => Result.Failure("Need to specify a main class for launcher")
- case Some(cls) =>
- Result.Success(
- Jvm.createLauncher(
- cls,
- runClasspath().map(_.path),
- forkArgs()
- )
- )
- }
+ Result.Success(
+ Jvm.createLauncher(
+ finalMainClass(),
+ runClasspath().map(_.path),
+ forkArgs()
+ )
+ )
}
def runLocal(args: String*) = T.command {