Skip to content

Commit

Permalink
Extracted spi package and refactored use of BspUri
Browse files Browse the repository at this point in the history
  • Loading branch information
lefou committed Feb 8, 2024
1 parent e66e443 commit 2691ad4
Show file tree
Hide file tree
Showing 12 changed files with 134 additions and 114 deletions.
5 changes: 2 additions & 3 deletions bsp/src/mill/bsp/BSP.scala
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,7 @@ import mill.define.{Command, Discover, ExternalModule, Task}
import mill.main.BuildInfo
import mill.eval.Evaluator
import mill.util.Util.millProjectModule
import mill.scalalib.{BoundDep, CoursierModule, Dep, Lib}
import mill.scalalib.bsp.BspModule
import mill.scalalib.{BoundDep, CoursierModule, Dep, JavaModule, Lib}
import mill.scalalib.internal.JavaModuleUtils

object BSP extends ExternalModule with CoursierModule {
Expand All @@ -22,7 +21,7 @@ object BSP extends ExternalModule with CoursierModule {
private def bspExtensions: T[(Seq[String], Seq[Dep])] = T.input {
// As this is a runtime value which can change, we need to be in an input target
val modules = JavaModuleUtils.transitiveModules(evaluator().rootModule)
.collect { case m: BspModule => m }
.collect { case m: JavaModule => m }
val extensions = modules.flatMap(m => m.bspExtensions).distinct
val classes = extensions.map(_.className).distinct
T.log.debug(s"BSP extensions: ${BspUtil.pretty(extensions)}")
Expand Down
2 changes: 1 addition & 1 deletion bsp/src/mill/bsp/BspServerConfig.scala
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package mill.bsp
import mill.api.PathRef

case class BspServerConfig(
services: Seq[String],
extensions: Seq[String],
classpath: Seq[PathRef]
)

Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
package mill.bsp.worker
package mill.bsp.spi

import ch.epfl.scala.bsp4j.BuildTargetIdentifier
import mill.define.Task
import mill.eval.Evaluator
import mill.scalalib.bsp.BspModule
import mill.scalalib.bsp.{BspModule, BspUri}

import java.util.concurrent.CompletableFuture
import scala.reflect.ClassTag
Expand All @@ -30,9 +29,9 @@ trait MillBuildServerBase {

def completableTasks[T, V, W: ClassTag](
hint: String,
targetIds: State => Seq[BuildTargetIdentifier],
targetIds: State => Seq[BspUri],
tasks: BspModule => Task[W]
)(f: (Evaluator, State, BuildTargetIdentifier, BspModule, W) => T)(agg: java.util.List[T] => V)
)(f: (Evaluator, State, BspUri, BspModule, W) => T)(agg: java.util.List[T] => V)
: CompletableFuture[V]

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -1,25 +1,26 @@
package mill.bsp.worker
package mill.bsp.spi

import ch.epfl.scala.bsp4j.BuildTargetIdentifier
import mill.scalalib.bsp.BspModule
import mill.scalalib.internal.JavaModuleUtils
import mill.define.Module
import mill.eval.Evaluator
import mill.scalalib.bsp.{BspModule, BspUri}
import mill.scalalib.internal.JavaModuleUtils

class State private[bsp] (evaluators: Seq[Evaluator], debug: String => Unit) {

private class State(evaluators: Seq[Evaluator], debug: String => Unit) {
lazy val bspModulesById: Map[BuildTargetIdentifier, (BspModule, Evaluator)] = {
/** Mapping of BSP target identifier to the Mill module and evaluator. */
lazy val bspModulesById: Map[BspUri, (BspModule, Evaluator)] = {
val modules: Seq[(Module, Seq[Module], Evaluator)] = evaluators
.map(ev => (ev.rootModule, JavaModuleUtils.transitiveModules(ev.rootModule), ev))

val map = modules
.flatMap { case (rootModule, otherModules, eval) =>
(Seq(rootModule) ++ otherModules).collect {
case m: BspModule =>
val uri = Utils.sanitizeUri(
val uri = BspUri(
rootModule.millSourcePath / m.millModuleSegments.parts
)

(new BuildTargetIdentifier(uri), (m, eval))
(uri, (m, eval))
}
}
.toMap
Expand All @@ -28,8 +29,10 @@ private class State(evaluators: Seq[Evaluator], debug: String => Unit) {
map
}

/** All root modules (at different meta-levels) of the project. */
lazy val rootModules: Seq[mill.define.BaseModule] = evaluators.map(_.rootModule)

lazy val bspIdByModule: Map[BspModule, BuildTargetIdentifier] =
/** Mapping of Mill Modules to BSP target identifiers. */
lazy val bspIdByModule: Map[BspModule, BspUri] =
bspModulesById.view.mapValues(_._1).map(_.swap).toMap
}
2 changes: 1 addition & 1 deletion bsp/worker/src/mill/bsp/worker/BspWorkerImpl.scala
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ private class BspWorkerImpl() extends BspWorker {
)

val extensions: Seq[(String, MillBspExtension)] =
config.services.map(s => s -> loadExtension(s, Seq(millServer)))
config.extensions.map(s => s -> loadExtension(s, Seq(millServer)))

logStream.println(s"Loaded extensions: ${BspUtil.pretty(extensions)}")

Expand Down
Loading

0 comments on commit 2691ad4

Please sign in to comment.