From 082c9857d9c9b3ea9d492f412801b0414b22c1d0 Mon Sep 17 00:00:00 2001 From: Joan Goyeau Date: Mon, 5 Oct 2020 01:15:08 -0700 Subject: [PATCH] Make BSP 1st class citizen --- .../mill/contrib => bsp/src/mill}/BSP.scala | 36 +++++++------------ bsp/src/mill/bsp/BspConfigJson.scala | 17 +++++++++ .../src/mill}/bsp/BspLoggedReporter.scala | 2 +- .../src/mill}/bsp/BspTestReporter.scala | 2 +- .../src/mill}/bsp/MillBspLogger.scala | 2 +- .../src/mill}/bsp/MillBuildServer.scala | 6 ++-- .../src/mill}/bsp/ModuleUtils.scala | 2 +- .../src/mill}/bsp/TaskParameters.scala | 4 +-- .../contrib => bsp/src/mill}/bsp/Utils.scala | 4 +-- .../resources/gen-idea-hello-world/build.sc | 0 .../test/src/BspInstallTests.scala | 4 +-- build.sc | 23 ++++++------ docs/pages/1 - Intro to Mill.md | 11 ++++-- docs/pages/9 - Contrib Modules.md | 19 ++-------- 14 files changed, 64 insertions(+), 68 deletions(-) rename {contrib/bsp/src/mill/contrib => bsp/src/mill}/BSP.scala (83%) create mode 100644 bsp/src/mill/bsp/BspConfigJson.scala rename {contrib/bsp/src/mill/contrib => bsp/src/mill}/bsp/BspLoggedReporter.scala (99%) rename {contrib/bsp/src/mill/contrib => bsp/src/mill}/bsp/BspTestReporter.scala (99%) rename {contrib/bsp/src/mill/contrib => bsp/src/mill}/bsp/MillBspLogger.scala (98%) rename {contrib/bsp/src/mill/contrib => bsp/src/mill}/bsp/MillBuildServer.scala (99%) rename {contrib/bsp/src/mill/contrib => bsp/src/mill}/bsp/ModuleUtils.scala (99%) rename {contrib/bsp/src/mill/contrib => bsp/src/mill}/bsp/TaskParameters.scala (99%) rename {contrib/bsp/src/mill/contrib => bsp/src/mill}/bsp/Utils.scala (98%) rename {contrib/bsp => bsp}/test/resources/gen-idea-hello-world/build.sc (100%) rename {contrib/bsp => bsp}/test/src/BspInstallTests.scala (87%) diff --git a/contrib/bsp/src/mill/contrib/BSP.scala b/bsp/src/mill/BSP.scala similarity index 83% rename from contrib/bsp/src/mill/contrib/BSP.scala rename to bsp/src/mill/BSP.scala index b06a6888b79..6137529de59 100644 --- a/contrib/bsp/src/mill/contrib/BSP.scala +++ b/bsp/src/mill/BSP.scala @@ -1,37 +1,21 @@ -package mill.contrib +package mill +import ch.epfl.scala.bsp4j.BuildClient import java.io.PrintWriter import java.nio.file.FileAlreadyExistsException import java.util.concurrent.Executors -import ch.epfl.scala.bsp4j._ -import mill._ -import mill.contrib.bsp.MillBuildServer +import mill.bsp.{BspConfigJson, MillBuildServer} import mill.define.{Command, Discover, ExternalModule} import mill.eval.Evaluator import mill.modules.Util import org.eclipse.lsp4j.jsonrpc.Launcher -import upickle.default._ -import scala.collection.JavaConverters._ import scala.concurrent.CancellationException -import scala.util.Try - -case class BspConfigJson( - name: String, - argv: Seq[String], - millVersion: String, - bspVersion: String, - languages: Seq[String] -) extends BspConnectionDetails(name, argv.asJava, millVersion, bspVersion, languages.asJava) - -object BspConfigJson { - implicit val rw: ReadWriter[BspConfigJson] = macroRW -} +import upickle.default.write object BSP extends ExternalModule { - implicit def millScoptEvaluatorReads[T] = new mill.main.EvaluatorScopt[T]() - lazy val millDiscover: Discover[BSP.this.type] = Discover[this.type] + lazy val millDiscover: Discover[this.type] = Discover[this.type] val bspProtocolVersion = "2.0.0" val languages = Seq("scala", "java") @@ -73,7 +57,8 @@ object BSP extends ExternalModule { def createBspConnectionJson(): String = { val millPath = sys.props .get("java.class.path") - .getOrElse(throw new IllegalStateException("System property java.class.path not set")) + .getOrElse(throw new IllegalStateException( + "System property java.class.path not set")) write( BspConfigJson( @@ -81,7 +66,7 @@ object BSP extends ExternalModule { Seq( "sh", "-c", - s"env ${sys.env.map { case (k, v) => s""""$k=$v"""" }.toSeq.mkString(" ")} $millPath -i mill.contrib.BSP/start" + s"env ${sys.env.map { case (k, v) => s""""$k=$v"""" }.toSeq.mkString(" ")} $millPath -i mill.bsp/start" ), Util.millProperty("MILL_VERSION").getOrElse(BuildInfo.millVersion), bspProtocolVersion, @@ -113,7 +98,10 @@ object BSP extends ExternalModule { ev.env, false ) - val millServer = new MillBuildServer(evaluator, bspProtocolVersion, BuildInfo.millVersion) + val millServer = new MillBuildServer( + evaluator, + bspProtocolVersion, + BuildInfo.millVersion) val executor = Executors.newCachedThreadPool() val stdin = System.in diff --git a/bsp/src/mill/bsp/BspConfigJson.scala b/bsp/src/mill/bsp/BspConfigJson.scala new file mode 100644 index 00000000000..e517f9c30e5 --- /dev/null +++ b/bsp/src/mill/bsp/BspConfigJson.scala @@ -0,0 +1,17 @@ +package mill.bsp + +import ch.epfl.scala.bsp4j.BspConnectionDetails +import scala.jdk.CollectionConverters._ +import upickle.default._ + +case class BspConfigJson( + name: String, + argv: Seq[String], + millVersion: String, + bspVersion: String, + languages: Seq[String] +) extends BspConnectionDetails(name, argv.asJava, millVersion, bspVersion, languages.asJava) + +object BspConfigJson { + implicit val rw: ReadWriter[BspConfigJson] = macroRW +} diff --git a/contrib/bsp/src/mill/contrib/bsp/BspLoggedReporter.scala b/bsp/src/mill/bsp/BspLoggedReporter.scala similarity index 99% rename from contrib/bsp/src/mill/contrib/bsp/BspLoggedReporter.scala rename to bsp/src/mill/bsp/BspLoggedReporter.scala index d1b9a66bf15..fdbce205c15 100644 --- a/contrib/bsp/src/mill/contrib/bsp/BspLoggedReporter.scala +++ b/bsp/src/mill/bsp/BspLoggedReporter.scala @@ -1,4 +1,4 @@ -package mill.contrib.bsp +package mill.bsp import java.io.File import java.util.concurrent.ConcurrentHashMap diff --git a/contrib/bsp/src/mill/contrib/bsp/BspTestReporter.scala b/bsp/src/mill/bsp/BspTestReporter.scala similarity index 99% rename from contrib/bsp/src/mill/contrib/bsp/BspTestReporter.scala rename to bsp/src/mill/bsp/BspTestReporter.scala index b49c0b7c8c6..c83c1375e0f 100644 --- a/contrib/bsp/src/mill/contrib/bsp/BspTestReporter.scala +++ b/bsp/src/mill/bsp/BspTestReporter.scala @@ -1,4 +1,4 @@ -package mill.contrib.bsp +package mill.bsp import java.io.{PrintWriter, StringWriter} diff --git a/contrib/bsp/src/mill/contrib/bsp/MillBspLogger.scala b/bsp/src/mill/bsp/MillBspLogger.scala similarity index 98% rename from contrib/bsp/src/mill/contrib/bsp/MillBspLogger.scala rename to bsp/src/mill/bsp/MillBspLogger.scala index b881cc530b9..7bb15a7938b 100644 --- a/contrib/bsp/src/mill/contrib/bsp/MillBspLogger.scala +++ b/bsp/src/mill/bsp/MillBspLogger.scala @@ -1,4 +1,4 @@ -package mill.contrib.bsp +package mill.bsp import ch.epfl.scala.bsp4j._ import mill.api.Logger diff --git a/contrib/bsp/src/mill/contrib/bsp/MillBuildServer.scala b/bsp/src/mill/bsp/MillBuildServer.scala similarity index 99% rename from contrib/bsp/src/mill/contrib/bsp/MillBuildServer.scala rename to bsp/src/mill/bsp/MillBuildServer.scala index 7e91c832818..d077e92b0bc 100644 --- a/contrib/bsp/src/mill/contrib/bsp/MillBuildServer.scala +++ b/bsp/src/mill/bsp/MillBuildServer.scala @@ -1,4 +1,4 @@ -package mill.contrib.bsp +package mill.bsp import ammonite.runtime.SpecialClassLoader import ch.epfl.scala.bsp4j._ @@ -6,8 +6,8 @@ import com.google.gson.JsonObject import java.util.concurrent.CompletableFuture import mill._ import mill.api.{DummyTestReporter, Result, Strict} -import mill.contrib.bsp.ModuleUtils._ -import mill.contrib.bsp.Utils._ +import mill.bsp.ModuleUtils._ +import mill.bsp.Utils._ import mill.define.Segment.Label import mill.define.{Discover, ExternalModule} import mill.eval.Evaluator diff --git a/contrib/bsp/src/mill/contrib/bsp/ModuleUtils.scala b/bsp/src/mill/bsp/ModuleUtils.scala similarity index 99% rename from contrib/bsp/src/mill/contrib/bsp/ModuleUtils.scala rename to bsp/src/mill/bsp/ModuleUtils.scala index c554cf98f8e..bb9162b6cf2 100644 --- a/contrib/bsp/src/mill/contrib/bsp/ModuleUtils.scala +++ b/bsp/src/mill/bsp/ModuleUtils.scala @@ -1,4 +1,4 @@ -package mill.contrib.bsp +package mill.bsp import ch.epfl.scala.bsp4j._ import java.net.URL diff --git a/contrib/bsp/src/mill/contrib/bsp/TaskParameters.scala b/bsp/src/mill/bsp/TaskParameters.scala similarity index 99% rename from contrib/bsp/src/mill/contrib/bsp/TaskParameters.scala rename to bsp/src/mill/bsp/TaskParameters.scala index b4720722d4b..cd5b13ab196 100644 --- a/contrib/bsp/src/mill/contrib/bsp/TaskParameters.scala +++ b/bsp/src/mill/bsp/TaskParameters.scala @@ -1,4 +1,4 @@ -package mill.contrib.bsp +package mill.bsp import ch.epfl.scala.bsp4j.{BuildTargetIdentifier, CompileParams, RunParams, TestParams} @@ -124,4 +124,4 @@ object TaskParameters { def fromTestParams(testParams: TestParams): Parameters = { TParams(testParams) } -} \ No newline at end of file +} diff --git a/contrib/bsp/src/mill/contrib/bsp/Utils.scala b/bsp/src/mill/bsp/Utils.scala similarity index 98% rename from contrib/bsp/src/mill/contrib/bsp/Utils.scala rename to bsp/src/mill/bsp/Utils.scala index ffa4c206cde..700d27402e0 100644 --- a/contrib/bsp/src/mill/contrib/bsp/Utils.scala +++ b/bsp/src/mill/bsp/Utils.scala @@ -1,10 +1,10 @@ -package mill.contrib.bsp +package mill.bsp import ch.epfl.scala.bsp4j._ import mill._ import mill.api.Result.{Skipped, Success} import mill.api.{BuildProblemReporter, Result} -import mill.contrib.bsp.ModuleUtils._ +import mill.bsp.ModuleUtils._ import mill.eval.Evaluator import mill.modules.Jvm import mill.scalalib.Lib.discoverTests diff --git a/contrib/bsp/test/resources/gen-idea-hello-world/build.sc b/bsp/test/resources/gen-idea-hello-world/build.sc similarity index 100% rename from contrib/bsp/test/resources/gen-idea-hello-world/build.sc rename to bsp/test/resources/gen-idea-hello-world/build.sc diff --git a/contrib/bsp/test/src/BspInstallTests.scala b/bsp/test/src/BspInstallTests.scala similarity index 87% rename from contrib/bsp/test/src/BspInstallTests.scala rename to bsp/test/src/BspInstallTests.scala index b56c69324c2..63fa7c3ec5f 100644 --- a/contrib/bsp/test/src/BspInstallTests.scala +++ b/bsp/test/src/BspInstallTests.scala @@ -1,4 +1,4 @@ -package mill.contrib.bsp +package mill.bsp import mill.util.ScriptTestSuite import os._ @@ -11,7 +11,7 @@ object BspInstallTests extends ScriptTestSuite(false) { def tests: Tests = Tests { "BSP install" - { val workspacePath = initWorkspace() - eval("mill.contrib.BSP/install") + eval("mill.bsp/install") assert(exists(workspacePath / ".bsp" /"mill.json")) } diff --git a/build.sc b/build.sc index f3b74228f75..4083679b564 100755 --- a/build.sc +++ b/build.sc @@ -69,8 +69,7 @@ object Deps { def scalaReflect(scalaVersion: String) = ivy"org.scala-lang:scala-reflect:${scalaVersion}" def scalacScoveragePlugin = ivy"org.scoverage::scalac-scoverage-plugin:1.4.1" val sourcecode = ivy"com.lihaoyi::sourcecode:0.2.1" - val ujsonCirce = ivy"com.lihaoyi::ujson-circe:1.2.0" - val upickle = ivy"com.lihaoyi::upickle:1.2.0" + val upickle = ivy"com.lihaoyi::upickle:1.2.1" val utest = ivy"com.lihaoyi::utest:0.7.4" val zinc = ivy"org.scala-sbt::zinc:1.4.0-M1" val bsp = ivy"ch.epfl.scala:bsp4j:2.0.0-M4" @@ -480,16 +479,6 @@ object contrib extends MillModule { def testArgs = T(scalanativelib.testArgs()) } - object bsp extends MillModule { - - override def compileModuleDeps = Seq(scalalib, scalajslib, main, scalanativelib) - def ivyDeps = Agg( - Deps.bsp, - Deps.ujsonCirce, - Deps.sbtTestInterface - ) - } - object artifactory extends MillModule { override def compileModuleDeps = Seq(scalalib) } @@ -548,6 +537,14 @@ object scalanativelib extends MillModule { } } +object bsp extends MillModule { + override def compileModuleDeps = Seq(scalalib, scalajslib, scalanativelib) + def ivyDeps = Agg( + Deps.bsp, + Deps.sbtTestInterface + ) +} + def testRepos = T{ Seq( "MILL_ACYCLIC_REPO" -> @@ -677,7 +674,7 @@ def launcherScript(shellJvmArgs: Seq[String], } object dev extends MillModule{ - def moduleDeps = Seq(scalalib, scalajslib, scalanativelib) + def moduleDeps = Seq(scalalib, scalajslib, scalanativelib, bsp) def forkArgs = diff --git a/docs/pages/1 - Intro to Mill.md b/docs/pages/1 - Intro to Mill.md index 7e42375df2a..21f316b5dce 100644 --- a/docs/pages/1 - Intro to Mill.md +++ b/docs/pages/1 - Intro to Mill.md @@ -701,9 +701,16 @@ mill mill.scalalib.Dependency/showUpdates mill mill.scalalib.Dependency/showUpdates --allowPreRelease true # also show pre-release versions ``` -## IntelliJ Support +## IDE Support -Mill supports IntelliJ by default. Use `mill mill.scalalib.GenIdea/idea` to +Mill supports any IDE that is compatible with [BSP](https://build-server-protocol.github.io/), such as IntelliJ. +Use `mill mill.BSP/install` to generate the BSP project config for your build. + +It also enables Intellij to provide navigation & code-completion features within your build file itself. + +## IntelliJ Support (legacy) + +Mill supports IntelliJ configuration generation. Use `mill mill.scalalib.GenIdea/idea` to generate an IntelliJ project config for your build. This also configures IntelliJ to allow easy navigate & code-completion within diff --git a/docs/pages/9 - Contrib Modules.md b/docs/pages/9 - Contrib Modules.md index 80fea16e8c9..dbb487c94b2 100644 --- a/docs/pages/9 - Contrib Modules.md +++ b/docs/pages/9 - Contrib Modules.md @@ -175,24 +175,11 @@ object project extends BuildInfo { ## BSP - Build Server Protocol -The contrib.bsp module was created in order to integrate the Mill build tool -with IntelliJ IDEA via the Build Server Protocol (BSP). It implements most of -the server side functionality described in BSP, and can therefore connect to a -BSP client, including the one behind IntelliJ IDEA. This allows a lot of mill -tasks to be executed from the IDE. - -### Importing an existing mill project in IntelliJ via BSP - -1) Add the following import statement in the `build.sc` of your project: - -```scala -import $ivy.`com.lihaoyi::mill-contrib-bsp:$MILL_VERSION` -``` - -2) Run the following command in the working directory of your project: +The contrib.bsp module is now included in mill by default and will eventually replace GenIdea. +Run the following command in the working directory of your project to generate the BSP config: ``` -mill mill.contrib.BSP/install +mill mill.BSP/install ``` ### Known Issues: