From b98c4f8984bfb983e07e285fb0189888aed54e64 Mon Sep 17 00:00:00 2001 From: eugene yokota Date: Thu, 23 Apr 2026 00:30:32 -0400 Subject: [PATCH] [2.x] fix: Fixes managedScalaInstance false support (#9121) **Problem** When managedScalaInstance is set to false, we stopped creating ScalaInstance, but the documentation says the user can pull in their own dependencies. **Solution** Attempt to construct a ScalaInstance from update report even when managedScalaInstance is set to false. --- main/src/main/scala/sbt/Defaults.scala | 3 +-- .../main/scala/sbt/internal/Compiler.scala | 14 ++++++++------ .../sbt-test/project/scala-instance/A.scala | 5 +++++ .../sbt-test/project/scala-instance/build.sbt | 19 +++++++++++++++++++ .../src/sbt-test/project/scala-instance/test | 3 +++ 5 files changed, 36 insertions(+), 8 deletions(-) create mode 100644 sbt-app/src/sbt-test/project/scala-instance/A.scala create mode 100644 sbt-app/src/sbt-test/project/scala-instance/build.sbt create mode 100644 sbt-app/src/sbt-test/project/scala-instance/test diff --git a/main/src/main/scala/sbt/Defaults.scala b/main/src/main/scala/sbt/Defaults.scala index ff7268019..2f2c1b643 100644 --- a/main/src/main/scala/sbt/Defaults.scala +++ b/main/src/main/scala/sbt/Defaults.scala @@ -769,9 +769,8 @@ object Defaults extends BuildCommon with DefExtra { scalaCompilerBridgeBin := Def .ifS(Def.task { val sv = scalaVersion.value - val managed = managedScalaInstance.value val hasSbtBridge = ScalaArtifacts.isScala3(sv) || ScalaArtifacts.hasScala2SbtBridge(sv) - hasSbtBridge && managed + hasSbtBridge })(Compiler.compilerBridgeFromUpdate)(Def.task(Vector.empty)) .value, scalaCompilerBridgeJars := (Def.taskDyn { diff --git a/main/src/main/scala/sbt/internal/Compiler.scala b/main/src/main/scala/sbt/internal/Compiler.scala index a7e2d860c..e3fe39b52 100644 --- a/main/src/main/scala/sbt/internal/Compiler.scala +++ b/main/src/main/scala/sbt/internal/Compiler.scala @@ -64,12 +64,14 @@ object Compiler: val sh = Keys.scalaHome.value val app = Keys.appConfiguration.value val managed = Keys.managedScalaInstance.value - sh match - case Some(h) => scalaInstanceConfigFromHome(h) - case _ => - val scalaProvider = app.provider.scalaProvider - if !managed then emptyScalaInstanceConfig - else scalaInstanceConfigFromUpdate(extraToolConf) + val configs = Keys.ivyConfigurations.value + (sh, extraToolConf) match + case (Some(h), _) => scalaInstanceConfigFromHome(h) + case _ if !managed => + val extra = extraToolConf.getOrElse(Configurations.ScalaTool) + if configs.contains(extra) then scalaInstanceConfigFromUpdate(extraToolConf) + else emptyScalaInstanceConfig + case _ => scalaInstanceConfigFromUpdate(extraToolConf) } /** diff --git a/sbt-app/src/sbt-test/project/scala-instance/A.scala b/sbt-app/src/sbt-test/project/scala-instance/A.scala new file mode 100644 index 000000000..35cd702de --- /dev/null +++ b/sbt-app/src/sbt-test/project/scala-instance/A.scala @@ -0,0 +1,5 @@ +package example + +class A { + val x = 1 +} diff --git a/sbt-app/src/sbt-test/project/scala-instance/build.sbt b/sbt-app/src/sbt-test/project/scala-instance/build.sbt new file mode 100644 index 000000000..2eff52a1f --- /dev/null +++ b/sbt-app/src/sbt-test/project/scala-instance/build.sbt @@ -0,0 +1,19 @@ +import Configurations.{ ScalaTool, ScalaDocTool, ZincTool } + +@transient +lazy val check = taskKey[Unit]("") +lazy val scala213 = "2.13.16" +scalaVersion := scala213 +autoScalaLibrary := false +managedScalaInstance := false +ivyConfigurations ++= List(ScalaTool, ScalaDocTool, ZincTool) +libraryDependencies ++= Seq( + "org.scala-lang" % "scala-library" % scala213, + "org.scala-lang" % "scala-compiler" % scala213 % ScalaTool, + "org.scala-lang" % "scala-compiler" % scala213 % ScalaDocTool, + "org.scala-lang" % "scala2-sbt-bridge" % scala213 % ZincTool, +) +check := { + val si = scalaInstance.value + assert(si.version == scala213, s"'${si.version}' was not '$scala213'") +} diff --git a/sbt-app/src/sbt-test/project/scala-instance/test b/sbt-app/src/sbt-test/project/scala-instance/test new file mode 100644 index 000000000..58d9fc878 --- /dev/null +++ b/sbt-app/src/sbt-test/project/scala-instance/test @@ -0,0 +1,3 @@ +> compile +> doc +> check