diff --git a/main-settings/src/main/scala/sbt/Def.scala b/main-settings/src/main/scala/sbt/Def.scala index 78691f56d..14226cdc2 100644 --- a/main-settings/src/main/scala/sbt/Def.scala +++ b/main-settings/src/main/scala/sbt/Def.scala @@ -232,7 +232,7 @@ object Def extends Init[Scope] with TaskMacroExtra with InitializeImplicits: inline def task[A1](inline a1: A1): Def.Initialize[Task[A1]] = ${ TaskMacro.taskMacroImpl[A1]('a1) } - inline def taskDyn[A1](a1: Def.Initialize[Task[A1]]): Def.Initialize[Task[A1]] = + inline def taskDyn[A1](inline a1: Def.Initialize[Task[A1]]): Def.Initialize[Task[A1]] = ${ TaskMacro.taskDynMacroImpl[A1]('a1) } inline def setting[A1](inline a: A1): Def.Initialize[A1] = ${ settingMacroImpl[A1]('a) } diff --git a/main-settings/src/test/scala/sbt/std/UsageTest.scala b/main-settings/src/test/scala/sbt/std/UsageTest.scala index 9a27cb9f6..b8abbc296 100644 --- a/main-settings/src/test/scala/sbt/std/UsageTest.scala +++ b/main-settings/src/test/scala/sbt/std/UsageTest.scala @@ -87,6 +87,12 @@ object Assign { mk.value + tk.value + mk.value + tk.value + mk.value + tk.value + mk.value + tk.value + mk.value + tk.value + mk.value + tk.value } + val dyn: Def.Initialize[Task[Int]] = Def.taskDyn { + val a = ak.value + if a < 1 then Def.task { 1 } + else Def.task { 0 } + } + import DefaultParsers._ val p = Def.setting { name.value ~> Space ~> ID } val is = Seq( diff --git a/main/src/main/scala/sbt/Defaults.scala b/main/src/main/scala/sbt/Defaults.scala index 23a0c363f..7151df63c 100644 --- a/main/src/main/scala/sbt/Defaults.scala +++ b/main/src/main/scala/sbt/Defaults.scala @@ -1099,34 +1099,39 @@ object Defaults extends BuildCommon { } def scalaInstanceTask: Initialize[Task[ScalaInstance]] = - (Def.task { (Keys.scalaHome.value, appConfiguration.value, scalaVersion.value) }).flatMapTask { - case (Some(h), _, _) => scalaInstanceFromHome(h) - case (_, app, version) => - val scalaProvider = app.provider.scalaProvider - if version == scalaProvider.version then - // use the same class loader as the Scala classes used by sbt - Def.task { - val allJars = scalaProvider.jars - val libraryJars = allJars - .filter { jar => - (jar.getName == "scala-library.jar") || (jar.getName.startsWith("scala3-library_3")) - } - (allJars.filter { jar => - jar.getName == "scala-compiler.jar" || jar.getName.startsWith("scala3-compiler_3") - }) match { - case Array(compilerJar) if libraryJars.nonEmpty => - makeScalaInstance( - version, - libraryJars, - allJars, - Seq.empty, - state.value, - scalaInstanceTopLoader.value - ) - case _ => ScalaInstance(version, scalaProvider) + Def.taskDyn { + val sh = Keys.scalaHome.value + val app = appConfiguration.value + val sv = scalaVersion.value + sh match + case Some(h) => scalaInstanceFromHome(h) + case _ => + val scalaProvider = app.provider.scalaProvider + if sv == scalaProvider.version then + // use the same class loader as the Scala classes used by sbt + Def.task { + val allJars = scalaProvider.jars + val libraryJars = allJars + .filter { jar => + (jar.getName == "scala-library.jar") || (jar.getName.startsWith( + "scala3-library_3" + )) + } + (allJars.filter { jar => + jar.getName == "scala-compiler.jar" || jar.getName.startsWith("scala3-compiler_3") + }) match + case Array(compilerJar) if libraryJars.nonEmpty => + makeScalaInstance( + sv, + libraryJars, + allJars.toSeq, + Seq.empty, + state.value, + scalaInstanceTopLoader.value + ) + case _ => ScalaInstance(sv, scalaProvider) } - } - else scalaInstanceFromUpdate + else scalaInstanceFromUpdate } // Returns the ScalaInstance only if it was not constructed via `update`