diff --git a/bsp/src/mill/bsp/MillBuildServer.scala b/bsp/src/mill/bsp/MillBuildServer.scala index d077e92b0bc..c900022347e 100644 --- a/bsp/src/mill/bsp/MillBuildServer.scala +++ b/bsp/src/mill/bsp/MillBuildServer.scala @@ -133,12 +133,9 @@ class MillBuildServer(evaluator: Evaluator, bspVersion: String, serverVersion: S val items = dependencySourcesParams.getTargets.asScala .foldLeft(Seq.empty[DependencySourcesItem]) { (items, targetId) => - val all = if (targetId == millBuildTargetId) { - Try(getClass.getClassLoader.asInstanceOf[SpecialClassLoader]).fold( - _ => Seq.empty, - _.allJars.filter(url => isSourceJar(url) && exists(Path(url.getFile))).map(_.toURI.toString) - ) - } else { + val all = if (targetId == millBuildTargetId) + getMillBuildClasspath(evaluator, source = true) + else { val module = getModule(targetId, modules) val sources = evaluateInformativeTask( evaluator, @@ -375,10 +372,7 @@ class MillBuildServer(evaluator: Evaluator, bspVersion: String, serverVersion: S .foldLeft(Seq.empty[ScalacOptionsItem]) { (items, targetId) => val newItem = if (targetId == millBuildTargetId) { - val classpath = Try(getClass.getClassLoader.asInstanceOf[SpecialClassLoader]).fold( - _ => Seq.empty, - _.allJars.filter(url => !isSourceJar(url) && exists(Path(url.getFile))).map(_.toURI.toString) - ) + val classpath = getMillBuildClasspath(evaluator, source = false) Some(new ScalacOptionsItem( targetId, Seq.empty.asJava, diff --git a/bsp/src/mill/bsp/ModuleUtils.scala b/bsp/src/mill/bsp/ModuleUtils.scala index bb9162b6cf2..b846e83dc66 100644 --- a/bsp/src/mill/bsp/ModuleUtils.scala +++ b/bsp/src/mill/bsp/ModuleUtils.scala @@ -1,7 +1,9 @@ package mill.bsp +import ammonite.runtime.SpecialClassLoader import ch.epfl.scala.bsp4j._ import java.net.URL +import java.net.URLClassLoader import mill._ import mill.api.Result.Success import mill.api.{PathRef, Strict} @@ -13,7 +15,9 @@ import mill.scalalib.api.Util import mill.scalalib.{JavaModule, ScalaModule, TestModule} import mill.scalanativelib._ import mill.util.Ctx +import os.{Path, exists} import scala.collection.JavaConverters._ +import scala.util.Try /** * Utilities for translating the mill build into @@ -101,6 +105,17 @@ object ModuleUtils { target } + def getMillBuildClasspath(evaluator: Evaluator, source: Boolean): Seq[String] = { + val all = Try(evaluator.rootModule.getClass.getClassLoader.asInstanceOf[SpecialClassLoader]).fold( + _ => Seq.empty, + _.allJars + ) + val filtered = + if (source) all.filter(url => isSourceJar(url)) + else all.filter(url => !isSourceJar(url)) + filtered.filter(url => exists(Path(url.getFile))).map(_.toURI.toString) + } + /** * Compute the BuildTarget associated with the given mill * JavaModule, which is any module present in the working