From 9e2cc5157911b12eb71dd3c9d7eb90ce6ddb4a60 Mon Sep 17 00:00:00 2001 From: eugene yokota Date: Thu, 23 Apr 2026 03:19:20 -0400 Subject: [PATCH] [2.0.x] fix: Fixes managedScalaInstance false support (#9121) (#9124) **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 +-- .../src/main/scala/sbt/internal/Compiler.scala | 14 ++++++++------ .../sbt-test/project/scala-instance/A.scala | 5 +++++ .../sbt-test/project/scala-instance/build.sbt | 18 ++++++++++++++++++ .../src/sbt-test/project/scala-instance/test | 3 +++ 5 files changed, 35 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 dacf1ffe0..1f6f9890d 100644 --- a/main/src/main/scala/sbt/Defaults.scala +++ b/main/src/main/scala/sbt/Defaults.scala @@ -771,9 +771,8 @@ object Defaults extends BuildCommon { scalaCompilerBridgeBin := Def .ifS(Def.task { val sv = scalaVersion.value - val managed = managedScalaInstance.value val hasSbtBridge = ScalaArtifacts.isScala3(sv) || ZincLmUtil.hasScala2SbtBridge(sv) - hasSbtBridge && managed + hasSbtBridge })(Def.cachedTask { // Use scalaDynVersion to resolve dynamic versions (e.g., "3-latest.candidate" -> "3.8.1-RC1") val sv = scalaDynVersion.value diff --git a/main/src/main/scala/sbt/internal/Compiler.scala b/main/src/main/scala/sbt/internal/Compiler.scala index 54d803432..53c3e08c2 100644 --- a/main/src/main/scala/sbt/internal/Compiler.scala +++ b/main/src/main/scala/sbt/internal/Compiler.scala @@ -62,12 +62,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..cc4dd3aa7 --- /dev/null +++ b/sbt-app/src/sbt-test/project/scala-instance/build.sbt @@ -0,0 +1,18 @@ +import Configurations.{ ScalaTool, ScalaDocTool } + +@transient +lazy val check = taskKey[Unit]("") +lazy val scala213 = "2.13.16" +scalaVersion := scala213 +autoScalaLibrary := false +managedScalaInstance := false +ivyConfigurations ++= List(ScalaTool, ScalaDocTool) +libraryDependencies ++= Seq( + "org.scala-lang" % "scala-library" % scala213, + "org.scala-lang" % "scala-compiler" % scala213 % ScalaTool, + "org.scala-lang" % "scala-compiler" % scala213 % ScalaDocTool, +) +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