Skip to content

Commit 9ec3a4c

Browse files
committed
Make BSP 1st class citizen
1 parent 375f4e8 commit 9ec3a4c

14 files changed

+64
-68
lines changed

contrib/bsp/src/mill/contrib/BSP.scala renamed to bsp/src/mill/BSP.scala

+12-24
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,21 @@
1-
package mill.contrib
1+
package mill
22

3+
import ch.epfl.scala.bsp4j.BuildClient
34
import java.io.PrintWriter
45
import java.nio.file.FileAlreadyExistsException
56
import java.util.concurrent.Executors
6-
import ch.epfl.scala.bsp4j._
7-
import mill._
8-
import mill.contrib.bsp.MillBuildServer
7+
import mill.bsp.{BspConfigJson, MillBuildServer}
98
import mill.define.{Command, Discover, ExternalModule}
109
import mill.eval.Evaluator
1110
import mill.modules.Util
1211
import org.eclipse.lsp4j.jsonrpc.Launcher
13-
import upickle.default._
14-
import scala.collection.JavaConverters._
1512
import scala.concurrent.CancellationException
16-
import scala.util.Try
17-
18-
case class BspConfigJson(
19-
name: String,
20-
argv: Seq[String],
21-
millVersion: String,
22-
bspVersion: String,
23-
languages: Seq[String]
24-
) extends BspConnectionDetails(name, argv.asJava, millVersion, bspVersion, languages.asJava)
25-
26-
object BspConfigJson {
27-
implicit val rw: ReadWriter[BspConfigJson] = macroRW
28-
}
13+
import upickle.default.write
2914

3015
object BSP extends ExternalModule {
31-
3216
implicit def millScoptEvaluatorReads[T] = new mill.main.EvaluatorScopt[T]()
3317

34-
lazy val millDiscover: Discover[BSP.this.type] = Discover[this.type]
18+
lazy val millDiscover: Discover[this.type] = Discover[this.type]
3519
val bspProtocolVersion = "2.0.0"
3620
val languages = Seq("scala", "java")
3721

@@ -73,15 +57,16 @@ object BSP extends ExternalModule {
7357
def createBspConnectionJson(): String = {
7458
val millPath = sys.props
7559
.get("java.class.path")
76-
.getOrElse(throw new IllegalStateException("System property java.class.path not set"))
60+
.getOrElse(throw new IllegalStateException(
61+
"System property java.class.path not set"))
7762

7863
write(
7964
BspConfigJson(
8065
"mill-bsp",
8166
Seq(
8267
"sh",
8368
"-c",
84-
s"env ${sys.env.map { case (k, v) => s""""$k=$v"""" }.toSeq.mkString(" ")} $millPath -i mill.contrib.BSP/start"
69+
s"env ${sys.env.map { case (k, v) => s""""$k=$v"""" }.toSeq.mkString(" ")} $millPath -i mill.bsp/start"
8570
),
8671
Util.millProperty("MILL_VERSION").getOrElse(BuildInfo.millVersion),
8772
bspProtocolVersion,
@@ -113,7 +98,10 @@ object BSP extends ExternalModule {
11398
ev.env,
11499
false
115100
)
116-
val millServer = new MillBuildServer(evaluator, bspProtocolVersion, BuildInfo.millVersion)
101+
val millServer = new MillBuildServer(
102+
evaluator,
103+
bspProtocolVersion,
104+
BuildInfo.millVersion)
117105
val executor = Executors.newCachedThreadPool()
118106

119107
val stdin = System.in

bsp/src/mill/bsp/BspConfigJson.scala

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package mill.bsp
2+
3+
import ch.epfl.scala.bsp4j.BspConnectionDetails
4+
import scala.jdk.CollectionConverters._
5+
import upickle.default._
6+
7+
case class BspConfigJson(
8+
name: String,
9+
argv: Seq[String],
10+
millVersion: String,
11+
bspVersion: String,
12+
languages: Seq[String]
13+
) extends BspConnectionDetails(name, argv.asJava, millVersion, bspVersion, languages.asJava)
14+
15+
object BspConfigJson {
16+
implicit val rw: ReadWriter[BspConfigJson] = macroRW
17+
}

contrib/bsp/src/mill/contrib/bsp/BspLoggedReporter.scala renamed to bsp/src/mill/bsp/BspLoggedReporter.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package mill.contrib.bsp
1+
package mill.bsp
22

33
import java.io.File
44
import java.util.concurrent.ConcurrentHashMap

contrib/bsp/src/mill/contrib/bsp/BspTestReporter.scala renamed to bsp/src/mill/bsp/BspTestReporter.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package mill.contrib.bsp
1+
package mill.bsp
22

33
import java.io.{PrintWriter, StringWriter}
44

contrib/bsp/src/mill/contrib/bsp/MillBspLogger.scala renamed to bsp/src/mill/bsp/MillBspLogger.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package mill.contrib.bsp
1+
package mill.bsp
22

33
import ch.epfl.scala.bsp4j._
44
import mill.api.Logger

contrib/bsp/src/mill/contrib/bsp/MillBuildServer.scala renamed to bsp/src/mill/bsp/MillBuildServer.scala

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
1-
package mill.contrib.bsp
1+
package mill.bsp
22

33
import ammonite.runtime.SpecialClassLoader
44
import ch.epfl.scala.bsp4j._
55
import com.google.gson.JsonObject
66
import java.util.concurrent.CompletableFuture
77
import mill._
88
import mill.api.{DummyTestReporter, Result, Strict}
9-
import mill.contrib.bsp.ModuleUtils._
10-
import mill.contrib.bsp.Utils._
9+
import mill.bsp.ModuleUtils._
10+
import mill.bsp.Utils._
1111
import mill.define.Segment.Label
1212
import mill.define.{Discover, ExternalModule}
1313
import mill.eval.Evaluator

contrib/bsp/src/mill/contrib/bsp/ModuleUtils.scala renamed to bsp/src/mill/bsp/ModuleUtils.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package mill.contrib.bsp
1+
package mill.bsp
22

33
import ch.epfl.scala.bsp4j._
44
import java.net.URL

contrib/bsp/src/mill/contrib/bsp/TaskParameters.scala renamed to bsp/src/mill/bsp/TaskParameters.scala

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package mill.contrib.bsp
1+
package mill.bsp
22

33
import ch.epfl.scala.bsp4j.{BuildTargetIdentifier, CompileParams, RunParams, TestParams}
44

@@ -124,4 +124,4 @@ object TaskParameters {
124124
def fromTestParams(testParams: TestParams): Parameters = {
125125
TParams(testParams)
126126
}
127-
}
127+
}

contrib/bsp/src/mill/contrib/bsp/Utils.scala renamed to bsp/src/mill/bsp/Utils.scala

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
package mill.contrib.bsp
1+
package mill.bsp
22

33
import ch.epfl.scala.bsp4j._
44
import mill._
55
import mill.api.Result.{Skipped, Success}
66
import mill.api.{BuildProblemReporter, Result}
7-
import mill.contrib.bsp.ModuleUtils._
7+
import mill.bsp.ModuleUtils._
88
import mill.eval.Evaluator
99
import mill.modules.Jvm
1010
import mill.scalalib.Lib.discoverTests

contrib/bsp/test/src/BspInstallTests.scala renamed to bsp/test/src/BspInstallTests.scala

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package mill.contrib.bsp
1+
package mill.bsp
22

33
import mill.util.ScriptTestSuite
44
import os._
@@ -11,7 +11,7 @@ object BspInstallTests extends ScriptTestSuite(false) {
1111
def tests: Tests = Tests {
1212
"BSP install" - {
1313
val workspacePath = initWorkspace()
14-
eval("mill.contrib.BSP/install")
14+
eval("mill.bsp/install")
1515

1616
assert(exists(workspacePath / ".bsp" /"mill.json"))
1717
}

build.sc

+10-13
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,7 @@ object Deps {
6969
def scalaReflect(scalaVersion: String) = ivy"org.scala-lang:scala-reflect:${scalaVersion}"
7070
def scalacScoveragePlugin = ivy"org.scoverage::scalac-scoverage-plugin:1.4.1"
7171
val sourcecode = ivy"com.lihaoyi::sourcecode:0.2.1"
72-
val ujsonCirce = ivy"com.lihaoyi::ujson-circe:1.2.0"
73-
val upickle = ivy"com.lihaoyi::upickle:1.2.0"
72+
val upickle = ivy"com.lihaoyi::upickle:1.2.1"
7473
val utest = ivy"com.lihaoyi::utest:0.7.4"
7574
val zinc = ivy"org.scala-sbt::zinc:1.4.0-M1"
7675
val bsp = ivy"ch.epfl.scala:bsp4j:2.0.0-M4"
@@ -480,16 +479,6 @@ object contrib extends MillModule {
480479
def testArgs = T(scalanativelib.testArgs())
481480
}
482481

483-
object bsp extends MillModule {
484-
485-
override def compileModuleDeps = Seq(scalalib, scalajslib, main, scalanativelib)
486-
def ivyDeps = Agg(
487-
Deps.bsp,
488-
Deps.ujsonCirce,
489-
Deps.sbtTestInterface
490-
)
491-
}
492-
493482
object artifactory extends MillModule {
494483
override def compileModuleDeps = Seq(scalalib)
495484
}
@@ -548,6 +537,14 @@ object scalanativelib extends MillModule {
548537
}
549538
}
550539

540+
object bsp extends MillModule {
541+
override def compileModuleDeps = Seq(scalalib, scalajslib, scalanativelib)
542+
def ivyDeps = Agg(
543+
Deps.bsp,
544+
Deps.sbtTestInterface
545+
)
546+
}
547+
551548
def testRepos = T{
552549
Seq(
553550
"MILL_ACYCLIC_REPO" ->
@@ -677,7 +674,7 @@ def launcherScript(shellJvmArgs: Seq[String],
677674
}
678675

679676
object dev extends MillModule{
680-
def moduleDeps = Seq(scalalib, scalajslib, scalanativelib)
677+
def moduleDeps = Seq(scalalib, scalajslib, scalanativelib, bsp)
681678

682679

683680
def forkArgs =

docs/pages/1 - Intro to Mill.md

+9-2
Original file line numberDiff line numberDiff line change
@@ -701,9 +701,16 @@ mill mill.scalalib.Dependency/showUpdates
701701
mill mill.scalalib.Dependency/showUpdates --allowPreRelease true # also show pre-release versions
702702
```
703703

704-
## IntelliJ Support
704+
## IDE Support
705705

706-
Mill supports IntelliJ by default. Use `mill mill.scalalib.GenIdea/idea` to
706+
Mill supports any IDE that is compatible with [BSP](https://build-server-protocol.github.io/), sush as IntelliJ, VSCode
707+
or Emacs. Use `mill mill.BSP/install` to generate the BSP project config for your build.
708+
709+
This also configures your IDE to allow easy navigate & code-completion within your build file itself.
710+
711+
## IntelliJ Support (legacy)
712+
713+
Mill supports IntelliJ configuration generation. Use `mill mill.scalalib.GenIdea/idea` to
707714
generate an IntelliJ project config for your build.
708715

709716
This also configures IntelliJ to allow easy navigate & code-completion within

docs/pages/9 - Contrib Modules.md

+3-16
Original file line numberDiff line numberDiff line change
@@ -175,24 +175,11 @@ object project extends BuildInfo {
175175

176176
## BSP - Build Server Protocol
177177

178-
The contrib.bsp module was created in order to integrate the Mill build tool
179-
with IntelliJ IDEA via the Build Server Protocol (BSP). It implements most of
180-
the server side functionality described in BSP, and can therefore connect to a
181-
BSP client, including the one behind IntelliJ IDEA. This allows a lot of mill
182-
tasks to be executed from the IDE.
183-
184-
### Importing an existing mill project in IntelliJ via BSP
185-
186-
1) Add the following import statement in the `build.sc` of your project:
187-
188-
```scala
189-
import $ivy.`com.lihaoyi::mill-contrib-bsp:$MILL_VERSION`
190-
```
191-
192-
2) Run the following command in the working directory of your project:
178+
The contrib.bsp module is now included in mill by default and will eventually replace GenIdea.
193179

180+
Run the following command in the working directory of your project to generate the BSP config:
194181
```
195-
mill mill.contrib.BSP/install
182+
mill mill.BSP/install
196183
```
197184

198185
### Known Issues:

0 commit comments

Comments
 (0)