summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLi Haoyi <haoyi.sg@gmail.com>2018-02-17 11:53:48 -0800
committerLi Haoyi <haoyi.sg@gmail.com>2018-02-17 11:53:48 -0800
commit865045540bd80bebb1655005abf32bc089c33895 (patch)
tree694178964ec1f8f8af821f854655865cd9cd8612
parent92edcae5094e52783f825021e4172a6b072300e0 (diff)
parent4cae6ff8a1111bb6c4bc6a44e67bd0affdbb9792 (diff)
downloadmill-865045540bd80bebb1655005abf32bc089c33895.tar.gz
mill-865045540bd80bebb1655005abf32bc089c33895.tar.bz2
mill-865045540bd80bebb1655005abf32bc089c33895.zip
Merge branch '130'
-rw-r--r--scalalib/src/mill/scalalib/ScalaModule.scala14
-rw-r--r--scalalib/src/mill/scalalib/ScalaWorkerApi.scala2
-rw-r--r--scalalib/test/src/mill/scalalib/HelloWorldTests.scala31
-rw-r--r--scalaworker/src/mill/scalaworker/ScalaWorker.scala16
4 files changed, 58 insertions, 5 deletions
diff --git a/scalalib/src/mill/scalalib/ScalaModule.scala b/scalalib/src/mill/scalalib/ScalaModule.scala
index 390672c6..05c34249 100644
--- a/scalalib/src/mill/scalalib/ScalaModule.scala
+++ b/scalalib/src/mill/scalalib/ScalaModule.scala
@@ -23,7 +23,19 @@ trait ScalaModule extends mill.Module with TaskModule { outer =>
override def moduleDeps = Seq(outer)
}
def scalaVersion: T[String]
- def mainClass: T[Option[String]] = None
+
+ def mainClass: T[Option[String]] = T{
+ discoverMainClasses() match {
+ case Seq(main) => Some(main)
+ case _ => None
+ }
+ }
+
+ def discoverMainClasses: T[Seq[String]] = T{
+ Task.traverse(transitiveModuleDeps){ module => T.task {
+ mill.scalalib.ScalaWorkerApi.scalaWorker().discoverMainClasses(module.compile())
+ }}().flatten.distinct
+ }
def ivyDeps = T{ Agg.empty[Dep] }
def compileIvyDeps = T{ Agg.empty[Dep] }
diff --git a/scalalib/src/mill/scalalib/ScalaWorkerApi.scala b/scalalib/src/mill/scalalib/ScalaWorkerApi.scala
index 03cd7d9d..ec2489af 100644
--- a/scalalib/src/mill/scalalib/ScalaWorkerApi.scala
+++ b/scalalib/src/mill/scalalib/ScalaWorkerApi.scala
@@ -62,4 +62,6 @@ trait ScalaWorkerApi {
testClassfilePath: Agg[Path],
args: Seq[String])
(implicit ctx: mill.util.Ctx.Log): (String, Seq[Result])
+
+ def discoverMainClasses(compilationResult: CompilationResult)(implicit ctx: mill.util.Ctx): Seq[String]
}
diff --git a/scalalib/test/src/mill/scalalib/HelloWorldTests.scala b/scalalib/test/src/mill/scalalib/HelloWorldTests.scala
index 1d39f180..945bec27 100644
--- a/scalalib/test/src/mill/scalalib/HelloWorldTests.scala
+++ b/scalalib/test/src/mill/scalalib/HelloWorldTests.scala
@@ -33,6 +33,15 @@ object HelloWorldTests extends TestSuite {
class HelloWorldCross(val crossScalaVersion: String) extends CrossScalaModule
}
+ object HelloWorldDefaultMain extends HelloBase {
+ object core extends HelloWorldModule
+ }
+
+ object HelloWorldWithoutMain extends HelloBase {
+ object core extends HelloWorldModule{
+ def mainClass = None
+ }
+ }
object HelloWorldWithMain extends HelloBase {
object core extends HelloWorldModule{
@@ -291,8 +300,8 @@ object HelloWorldTests extends TestSuite {
read(runResult) == "hello rockjam, your age is: 25"
)
}
- 'notRunWithoutMainClass - workspaceTest(HelloWorld){eval =>
- val Left(Result.Exception(err, _)) = eval.apply(HelloWorld.core.run())
+ 'notRunWithoutMainClass - workspaceTest(HelloWorldWithoutMain){eval =>
+ val Left(Result.Exception(err, _)) = eval.apply(HelloWorldWithoutMain.core.run())
assert(
err.isInstanceOf[RuntimeException]
@@ -314,8 +323,22 @@ object HelloWorldTests extends TestSuite {
read(runResult) == "hello rockjam, your age is: 25"
)
}
- 'notRunWithoutMainClass - workspaceTest(HelloWorld){eval =>
- val Left(Result.Exception(err, _)) = eval.apply(HelloWorld.core.runLocal())
+ 'runWithDefaultMain - workspaceTest(HelloWorldDefaultMain){eval =>
+ val runResult = eval.outPath / 'core / 'run / 'dest / "hello-mill"
+ val Right((_, evalCount)) = eval.apply(
+ HelloWorldDefaultMain.core.runLocal(runResult.toString)
+ )
+
+ assert(evalCount > 0)
+
+
+ assert(
+ exists(runResult),
+ read(runResult) == "hello rockjam, your age is: 25"
+ )
+ }
+ 'notRunWithoutMainClass - workspaceTest(HelloWorldWithoutMain){eval =>
+ val Left(Result.Exception(err, _)) = eval.apply(HelloWorldWithoutMain.core.runLocal())
assert(
err.isInstanceOf[RuntimeException]
diff --git a/scalaworker/src/mill/scalaworker/ScalaWorker.scala b/scalaworker/src/mill/scalaworker/ScalaWorker.scala
index 5b5808cb..7929d7c0 100644
--- a/scalaworker/src/mill/scalaworker/ScalaWorker.scala
+++ b/scalaworker/src/mill/scalaworker/ScalaWorker.scala
@@ -99,6 +99,22 @@ class ScalaWorker(ctx0: mill.util.Ctx,
compiledDest
}
+
+
+ def discoverMainClasses(compilationResult: CompilationResult)(implicit ctx: mill.util.Ctx): Seq[String] = {
+ def toScala[A](o: Optional[A]): Option[A] = if (o.isPresent) Some(o.get) else None
+
+ toScala(FileAnalysisStore.binary(compilationResult.analysisFile.toIO).get())
+ .map(_.getAnalysis)
+ .flatMap{
+ case analysis: Analysis =>
+ Some(analysis.infos.allInfos.values.map(_.getMainClasses).flatten.toSeq.sorted)
+ case _ =>
+ None
+ }
+ .getOrElse(Seq.empty[String])
+ }
+
def compileScala(scalaVersion: String,
sources: Agg[Path],
compileBridgeSources: Agg[Path],