From 3c640211903bcfff4d39f475d14014c7bdb39b0a Mon Sep 17 00:00:00 2001 From: kenji yoshida <6b656e6a69@gmail.com> Date: Mon, 6 Apr 2026 03:28:47 +0900 Subject: [PATCH 1/2] [2.0.x] Scala 3.8.3 (#8997) --- build.sbt | 2 +- contributing-docs/05_scripted_tests.md | 4 ++-- contributing-docs/06_manual_tests.md | 2 +- launcher-package/citest/build.sbt | 2 +- launcher-package/citest2/build.sbt | 2 +- .../src/test/scala/lmcoursier/LockFileSpec.scala | 6 +++--- main/src/main/scala/sbt/PluginCross.scala | 2 +- project/Dependencies.scala | 2 +- sbt-app/src/sbt-test/cache/cached-compile/build.sbt | 2 +- sbt-app/src/sbt-test/cache/cached-test/build.sbt | 2 +- .../ivyless-publish-http/build.sbt | 2 +- .../ivyless-publish-local/build.sbt | 2 +- .../ivyless-publish-maven-http/build.sbt | 2 +- .../ivyless-publish-maven/build.sbt | 2 +- .../dependency-management/ivyless-publish/build.sbt | 2 +- .../dependency-management/stdlib-3.8/build.sbt | 4 ++-- sbt-app/src/sbt-test/nio/clean-symlinks/build.sbt | 2 +- sbt-app/src/sbt-test/nio/clean-symlinks/test | 4 ++-- .../sbt-test/plugins/auto-plugins-minimal/build.sbt | 2 +- sbt-app/src/sbt-test/plugins/pgp/build.sbt | 2 +- sbt-app/src/sbt-test/plugins/plugin-cross/build.sbt | 2 +- .../src/sbt-test/plugins/sbt-native-packager/build.sbt | 4 ++-- .../plugins/sbt-native-packager/project/plugins.sbt | 2 +- .../src/sbt-test/project-load/lazy-val-name/build.sbt | 2 +- sbt-app/src/sbt-test/project-load/werror/build.sbt | 2 +- .../src/sbt-test/project-load/werror/changes/build.sbt | 2 +- sbt-app/src/sbt-test/project-matrix/full/build.sbt | 2 +- sbt-app/src/sbt-test/project-matrix/full/test | 4 ++-- sbt-app/src/sbt-test/project/Class.forName/build.sbt | 2 +- sbt-app/src/sbt-test/project/nested-macro/build.sbt | 2 +- sbt-app/src/sbt-test/project/no-delegate/build.sbt | 2 +- sbt-app/src/sbt-test/project/remove/build.sbt | 10 +++++----- .../src/sbt-test/project/settings-delegate/build.sbt | 2 +- .../src/sbt-test/tests/fork-main-resources/build.sbt | 2 +- sbt-app/src/sbt-test/tests/fork-raw/build.sbt | 2 +- sbt-app/src/sbt-test/tests/fork2/build.sbt | 2 +- .../sbt-test/tests/incremental-object-deps/build.sbt | 2 +- sbt-app/src/sbt-test/tests/munit/build.sbt | 2 +- sbt-app/src/sbt-test/tests/t543/build.sbt | 2 +- server-test/src/server-test/channel-cursor/build.sbt | 2 +- server-test/src/server-test/client/build.sbt | 2 +- 41 files changed, 52 insertions(+), 52 deletions(-) diff --git a/build.sbt b/build.sbt index 941ab527a..064652ad8 100644 --- a/build.sbt +++ b/build.sbt @@ -992,7 +992,7 @@ lazy val sbtwProj = (project in file("sbtw")) commonSettings, name := "sbtw", description := "Windows drop-in launcher for sbt (replaces sbt.bat)", - scalaVersion := "3.8.2", + scalaVersion := "3.8.3", crossPaths := false, Compile / mainClass := Some("sbtw.Main"), libraryDependencies += "com.github.scopt" %% "scopt" % "4.1.0", diff --git a/contributing-docs/05_scripted_tests.md b/contributing-docs/05_scripted_tests.md index 29055b1f3..1d6d12b43 100644 --- a/contributing-docs/05_scripted_tests.md +++ b/contributing-docs/05_scripted_tests.md @@ -28,7 +28,7 @@ Create an initial build in `something`. Like a real build using sbt. I'm sure yo ```scala name := "foo" -scalaVersion := "3.8.2" +scalaVersion := "3.8.3" ``` I also have `Hello.scala`: @@ -107,7 +107,7 @@ import scala.sys.process.Process lazy val check = taskKey[Unit]("check") name := "foo" -scalaVersion := "3.8.2" +scalaVersion := "3.8.3" check := { val pkg = (Compile / packageBin).value val conv = fileConverter.value diff --git a/contributing-docs/06_manual_tests.md b/contributing-docs/06_manual_tests.md index d06015977..99a586ec1 100644 --- a/contributing-docs/06_manual_tests.md +++ b/contributing-docs/06_manual_tests.md @@ -22,7 +22,7 @@ $ sbt --server ### Clearing out boot and local cache -sbt consists of lots of JAR files. When running sbt locally, these JAR artifacts are cached in the `boot` directory under `$HOME/.sbt/boot/scala-3.8.2/org.scala-sbt/sbt/2.0.0-RC9-bin-SNAPSHOT` directory (The Scala version and sbt version part changes). +sbt consists of lots of JAR files. When running sbt locally, these JAR artifacts are cached in the `boot` directory under `$HOME/.sbt/boot/scala-3.8.3/org.scala-sbt/sbt/2.0.0-RC9-bin-SNAPSHOT` directory (The Scala version and sbt version part changes). In order to see a change you've made to sbt's source code, this cache MUST be cleared. To clear this out, from the sbt shell in your application run: diff --git a/launcher-package/citest/build.sbt b/launcher-package/citest/build.sbt index ac1981213..db7cfff7d 100644 --- a/launcher-package/citest/build.sbt +++ b/launcher-package/citest/build.sbt @@ -3,7 +3,7 @@ lazy val check2 = taskKey[Unit]("") lazy val root = (project in file(".")) .settings( - scalaVersion := "3.8.2", + scalaVersion := "3.8.3", name := "Hello", libraryDependencies += "com.eed3si9n.verify" %% "verify" % "1.0.0" % Test, testFrameworks += new TestFramework("verify.runner.Framework"), diff --git a/launcher-package/citest2/build.sbt b/launcher-package/citest2/build.sbt index 9b8bfeb05..e71bb07cc 100644 --- a/launcher-package/citest2/build.sbt +++ b/launcher-package/citest2/build.sbt @@ -1,5 +1,5 @@ lazy val root = (project in file(".")) .settings( - scalaVersion := "3.8.2", + scalaVersion := "3.8.3", name := "Hello", ) diff --git a/lm-coursier/src/test/scala/lmcoursier/LockFileSpec.scala b/lm-coursier/src/test/scala/lmcoursier/LockFileSpec.scala index 774f87855..ffd5bad9f 100644 --- a/lm-coursier/src/test/scala/lmcoursier/LockFileSpec.scala +++ b/lm-coursier/src/test/scala/lmcoursier/LockFileSpec.scala @@ -38,7 +38,7 @@ class LockFileSpec extends AnyFunSuite { ), metadata = LockFileMetadata( sbtVersion = "2.0.0", - scalaVersion = Some("3.8.2") + scalaVersion = Some("3.8.3") ) ) @@ -59,7 +59,7 @@ class LockFileSpec extends AnyFunSuite { assert(readData.configurations.head.dependencies.head.organization == "org.scala-lang") assert(readData.configurations.head.dependencies.head.version == "2.13.16") assert(readData.metadata.sbtVersion == "2.0.0") - assert(readData.metadata.scalaVersion == Some("3.8.2")) + assert(readData.metadata.scalaVersion == Some("3.8.3")) } } @@ -111,7 +111,7 @@ class LockFileSpec extends AnyFunSuite { configurations = Vector.empty, metadata = LockFileMetadata( sbtVersion = "2.0.0", - scalaVersion = Some("3.8.2") + scalaVersion = Some("3.8.3") ) ) diff --git a/main/src/main/scala/sbt/PluginCross.scala b/main/src/main/scala/sbt/PluginCross.scala index 71ee214f7..cf8c62887 100644 --- a/main/src/main/scala/sbt/PluginCross.scala +++ b/main/src/main/scala/sbt/PluginCross.scala @@ -102,7 +102,7 @@ private[sbt] object PluginCross { case VersionNumber(Seq(0, 12, _*), _, _) => "2.9.2" case VersionNumber(Seq(0, 13, _*), _, _) => "2.10.7" case VersionNumber(Seq(1, 0, _*), _, _) => "2.12.21" - case VersionNumber(Seq(2, _*), _, _) => "3.8.2" + case VersionNumber(Seq(2, _*), _, _) => "3.8.3" case _ => sys.error(s"Unsupported sbt binary version: $sv") } } diff --git a/project/Dependencies.scala b/project/Dependencies.scala index 86d6d3c49..1cf7f7960 100644 --- a/project/Dependencies.scala +++ b/project/Dependencies.scala @@ -4,7 +4,7 @@ import Keys.* object Dependencies { // WARNING: Please Scala update versions in PluginCross.scala too val scala213 = "2.13.16" - val scala3 = "3.8.2" + val scala3 = "3.8.3" val scala212 = "2.12.21" val checkPluginCross = settingKey[Unit]("Make sure scalaVersion match up") val baseScalaVersion = scala3 diff --git a/sbt-app/src/sbt-test/cache/cached-compile/build.sbt b/sbt-app/src/sbt-test/cache/cached-compile/build.sbt index 91b83d50c..ecfd9eb5b 100644 --- a/sbt-app/src/sbt-test/cache/cached-compile/build.sbt +++ b/sbt-app/src/sbt-test/cache/cached-compile/build.sbt @@ -5,7 +5,7 @@ lazy val checkMiss = inputKey[Unit]("") Global / localCacheDirectory := baseDirectory.value / "diskcache" -scalaVersion := "3.8.2" +scalaVersion := "3.8.3" checkMiss := { val expected: Int = (Space ~> NatBasic).parsed val s = streams.value diff --git a/sbt-app/src/sbt-test/cache/cached-test/build.sbt b/sbt-app/src/sbt-test/cache/cached-test/build.sbt index e68617a62..497d46d69 100644 --- a/sbt-app/src/sbt-test/cache/cached-test/build.sbt +++ b/sbt-app/src/sbt-test/cache/cached-test/build.sbt @@ -5,7 +5,7 @@ lazy val verify = "com.eed3si9n.verify" %% "verify" % "1.0.0" Global / localCacheDirectory := baseDirectory.value / "diskcache" -scalaVersion := "3.8.2" +scalaVersion := "3.8.3" libraryDependencies += verify % Test testFrameworks += new TestFramework("verify.runner.Framework") diff --git a/sbt-app/src/sbt-test/dependency-management/ivyless-publish-http/build.sbt b/sbt-app/src/sbt-test/dependency-management/ivyless-publish-http/build.sbt index c16ef949f..e216944fe 100644 --- a/sbt-app/src/sbt-test/dependency-management/ivyless-publish-http/build.sbt +++ b/sbt-app/src/sbt-test/dependency-management/ivyless-publish-http/build.sbt @@ -3,7 +3,7 @@ ThisBuild / csrCacheDirectory := (ThisBuild / baseDirectory).value / "coursier-c name := "lib1" organization := "com.example" version := "0.1.0-SNAPSHOT" -scalaVersion := "3.8.2" +scalaVersion := "3.8.3" val publishRepoBase = settingKey[File]("Base directory for publish repo (HTTP server writes here)") publishRepoBase := baseDirectory.value / "repo" diff --git a/sbt-app/src/sbt-test/dependency-management/ivyless-publish-local/build.sbt b/sbt-app/src/sbt-test/dependency-management/ivyless-publish-local/build.sbt index ca4dff458..fe670d2f8 100644 --- a/sbt-app/src/sbt-test/dependency-management/ivyless-publish-local/build.sbt +++ b/sbt-app/src/sbt-test/dependency-management/ivyless-publish-local/build.sbt @@ -3,7 +3,7 @@ ThisBuild / csrCacheDirectory := (ThisBuild / baseDirectory).value / "coursier-c name := "lib1" organization := "com.example" version := "0.1.0-SNAPSHOT" -scalaVersion := "3.8.2" +scalaVersion := "3.8.3" // Use a fixed path for local ivy repo to avoid sbt 2.x output sharding val ivyLocalBase = settingKey[File]("Local Ivy repository base") diff --git a/sbt-app/src/sbt-test/dependency-management/ivyless-publish-maven-http/build.sbt b/sbt-app/src/sbt-test/dependency-management/ivyless-publish-maven-http/build.sbt index 8e543e3aa..b9763fb39 100644 --- a/sbt-app/src/sbt-test/dependency-management/ivyless-publish-maven-http/build.sbt +++ b/sbt-app/src/sbt-test/dependency-management/ivyless-publish-maven-http/build.sbt @@ -1,7 +1,7 @@ ThisBuild / csrCacheDirectory := (ThisBuild / baseDirectory).value / "coursier-cache" ThisBuild / organization := "com.example" ThisBuild / version := "0.1.0-SNAPSHOT" -ThisBuild / scalaVersion := "3.8.2" +ThisBuild / scalaVersion := "3.8.3" val publishRepoBase = settingKey[File]("Base directory for Maven publish repo (HTTP server writes here)") ThisBuild / publishRepoBase := (ThisBuild / baseDirectory).value / "repo" diff --git a/sbt-app/src/sbt-test/dependency-management/ivyless-publish-maven/build.sbt b/sbt-app/src/sbt-test/dependency-management/ivyless-publish-maven/build.sbt index 732de2138..03566e157 100644 --- a/sbt-app/src/sbt-test/dependency-management/ivyless-publish-maven/build.sbt +++ b/sbt-app/src/sbt-test/dependency-management/ivyless-publish-maven/build.sbt @@ -3,7 +3,7 @@ ThisBuild / csrCacheDirectory := (ThisBuild / baseDirectory).value / "coursier-c name := "lib1" organization := "com.example" version := "0.1.0-SNAPSHOT" -scalaVersion := "3.8.2" +scalaVersion := "3.8.3" publishMavenStyle := true val publishRepoBase = settingKey[File]("Base directory for Maven publish repo") diff --git a/sbt-app/src/sbt-test/dependency-management/ivyless-publish/build.sbt b/sbt-app/src/sbt-test/dependency-management/ivyless-publish/build.sbt index 8bcb522d7..483b47282 100644 --- a/sbt-app/src/sbt-test/dependency-management/ivyless-publish/build.sbt +++ b/sbt-app/src/sbt-test/dependency-management/ivyless-publish/build.sbt @@ -3,7 +3,7 @@ ThisBuild / csrCacheDirectory := (ThisBuild / baseDirectory).value / "coursier-c name := "lib1" organization := "com.example" version := "0.1.0-SNAPSHOT" -scalaVersion := "3.8.2" +scalaVersion := "3.8.3" // Publish to a file repo (tests ivyless publish without HTTP server) val publishRepoBase = settingKey[File]("Base directory for publish repo") diff --git a/sbt-app/src/sbt-test/dependency-management/stdlib-3.8/build.sbt b/sbt-app/src/sbt-test/dependency-management/stdlib-3.8/build.sbt index 3fc1fa0fd..491ca3d5a 100644 --- a/sbt-app/src/sbt-test/dependency-management/stdlib-3.8/build.sbt +++ b/sbt-app/src/sbt-test/dependency-management/stdlib-3.8/build.sbt @@ -1,9 +1,9 @@ lazy val a = project .settings( - scalaVersion := "3.8.2" + scalaVersion := "3.8.3" ) -// (b / update) sbt.librarymanagement.ResolveException: Error downloading org.scala-lang:scala-reflect:3.8.2 +// (b / update) sbt.librarymanagement.ResolveException: Error downloading org.scala-lang:scala-reflect:3.8.3 lazy val b = project .dependsOn(a) .settings( diff --git a/sbt-app/src/sbt-test/nio/clean-symlinks/build.sbt b/sbt-app/src/sbt-test/nio/clean-symlinks/build.sbt index b69492ba7..3b5cd245e 100644 --- a/sbt-app/src/sbt-test/nio/clean-symlinks/build.sbt +++ b/sbt-app/src/sbt-test/nio/clean-symlinks/build.sbt @@ -2,7 +2,7 @@ import java.nio.file.Files name := "clean-symlinks-test" -scalaVersion := "3.8.2" +scalaVersion := "3.8.3" TaskKey[Unit]("createSymlinkedDirectory") := { IO.createDirectory(target.value) diff --git a/sbt-app/src/sbt-test/nio/clean-symlinks/test b/sbt-app/src/sbt-test/nio/clean-symlinks/test index fd353b2d2..51fa24df1 100644 --- a/sbt-app/src/sbt-test/nio/clean-symlinks/test +++ b/sbt-app/src/sbt-test/nio/clean-symlinks/test @@ -1,9 +1,9 @@ > createSymlinkedDirectory -$ exists target/out/jvm/scala-3.8.2/clean-symlinks-test/foo/bar +$ exists target/out/jvm/scala-3.8.3/clean-symlinks-test/foo/bar $ exists foo/bar > clean -$ absent target/out/jvm/scala-3.8.2/clean-symlinks-test/foo +$ absent target/out/jvm/scala-3.8.3/clean-symlinks-test/foo $ exists foo/bar diff --git a/sbt-app/src/sbt-test/plugins/auto-plugins-minimal/build.sbt b/sbt-app/src/sbt-test/plugins/auto-plugins-minimal/build.sbt index 494f5417f..69074af7c 100644 --- a/sbt-app/src/sbt-test/plugins/auto-plugins-minimal/build.sbt +++ b/sbt-app/src/sbt-test/plugins/auto-plugins-minimal/build.sbt @@ -1,4 +1,4 @@ -scalaVersion := "3.8.2" +scalaVersion := "3.8.3" organization := "com.example" diff --git a/sbt-app/src/sbt-test/plugins/pgp/build.sbt b/sbt-app/src/sbt-test/plugins/pgp/build.sbt index f63dc09ca..fa9609bc6 100644 --- a/sbt-app/src/sbt-test/plugins/pgp/build.sbt +++ b/sbt-app/src/sbt-test/plugins/pgp/build.sbt @@ -1,2 +1,2 @@ -scalaVersion := "3.8.2" +scalaVersion := "3.8.3" publishLocal := {} diff --git a/sbt-app/src/sbt-test/plugins/plugin-cross/build.sbt b/sbt-app/src/sbt-test/plugins/plugin-cross/build.sbt index 398a2d1c1..bb7f00d89 100644 --- a/sbt-app/src/sbt-test/plugins/plugin-cross/build.sbt +++ b/sbt-app/src/sbt-test/plugins/plugin-cross/build.sbt @@ -19,4 +19,4 @@ lazy val plugin = (projectMatrix in file("plugin")) case _ => "2.0.0-RC3" }, ) - .jvmPlatform(scalaVersions = Seq("3.8.2", "2.12.21")) + .jvmPlatform(scalaVersions = Seq("3.8.3", "2.12.21")) diff --git a/sbt-app/src/sbt-test/plugins/sbt-native-packager/build.sbt b/sbt-app/src/sbt-test/plugins/sbt-native-packager/build.sbt index 3d99bcf14..efc5013d1 100644 --- a/sbt-app/src/sbt-test/plugins/sbt-native-packager/build.sbt +++ b/sbt-app/src/sbt-test/plugins/sbt-native-packager/build.sbt @@ -1,4 +1,4 @@ -ThisBuild / scalaVersion := "3.8.2" +ThisBuild / scalaVersion := "3.8.3" name := "hello" enablePlugins(JavaAppPackaging) @@ -6,7 +6,7 @@ enablePlugins(JavaAppPackaging) lazy val check = taskKey[Unit]("") check := { - val cmd = "target/out/jvm/scala-3.8.2/hello/universal/stage/bin/hello" + val cmd = "target/out/jvm/scala-3.8.3/hello/universal/stage/bin/hello" val cmd0 = if (sys.props("os.name").toLowerCase(java.util.Locale.ROOT).contains("windows")) cmd + ".bat" diff --git a/sbt-app/src/sbt-test/plugins/sbt-native-packager/project/plugins.sbt b/sbt-app/src/sbt-test/plugins/sbt-native-packager/project/plugins.sbt index 4ddd3014c..a044a43ee 100644 --- a/sbt-app/src/sbt-test/plugins/sbt-native-packager/project/plugins.sbt +++ b/sbt-app/src/sbt-test/plugins/sbt-native-packager/project/plugins.sbt @@ -1,4 +1,4 @@ ThisBuild / libraryDependencySchemes += "org.scala-lang.modules" %% "scala-xml" % VersionScheme.Always // addSbtPlugin("com.typesafe.sbt" % "sbt-native-packager" % "1.3.20") -libraryDependencies += Defaults.sbtPluginExtra("com.github.sbt" % "sbt-native-packager" % "1.11.4", "2", "3.8.2") +libraryDependencies += Defaults.sbtPluginExtra("com.github.sbt" % "sbt-native-packager" % "1.11.4", "2", "3.8.3") diff --git a/sbt-app/src/sbt-test/project-load/lazy-val-name/build.sbt b/sbt-app/src/sbt-test/project-load/lazy-val-name/build.sbt index 76cf18d6b..c484c64c8 100644 --- a/sbt-app/src/sbt-test/project-load/lazy-val-name/build.sbt +++ b/sbt-app/src/sbt-test/project-load/lazy-val-name/build.sbt @@ -1,6 +1,6 @@ lazy val `a + b` = "2.13.18" -// https://github.com/scala/scala3/blob/3.8.2/library/src/scala/reflect/NameTransformer.scala#L47-L64 +// https://github.com/scala/scala3/blob/3.8.3/library/src/scala/reflect/NameTransformer.scala#L47-L64 lazy val ~=<>!#%^&|*/+-:\\?@ = "my-name" scalaVersion := `a + b` diff --git a/sbt-app/src/sbt-test/project-load/werror/build.sbt b/sbt-app/src/sbt-test/project-load/werror/build.sbt index 2c65d81e3..091230f32 100644 --- a/sbt-app/src/sbt-test/project-load/werror/build.sbt +++ b/sbt-app/src/sbt-test/project-load/werror/build.sbt @@ -1,4 +1,4 @@ -scalaVersion := "3.8.2" +scalaVersion := "3.8.3" @deprecated def foo = true diff --git a/sbt-app/src/sbt-test/project-load/werror/changes/build.sbt b/sbt-app/src/sbt-test/project-load/werror/changes/build.sbt index 3a8e0f3ac..443839160 100644 --- a/sbt-app/src/sbt-test/project-load/werror/changes/build.sbt +++ b/sbt-app/src/sbt-test/project-load/werror/changes/build.sbt @@ -1,4 +1,4 @@ -scalaVersion := "3.8.2" +scalaVersion := "3.8.3" @deprecated def foo = true diff --git a/sbt-app/src/sbt-test/project-matrix/full/build.sbt b/sbt-app/src/sbt-test/project-matrix/full/build.sbt index 9abee4af3..5c610e346 100644 --- a/sbt-app/src/sbt-test/project-matrix/full/build.sbt +++ b/sbt-app/src/sbt-test/project-matrix/full/build.sbt @@ -1,5 +1,5 @@ lazy val scala3_LTS = "3.3.5" -lazy val scala3_current = "3.8.2" +lazy val scala3_current = "3.8.3" lazy val check = taskKey[Unit]("") organization := "com.example" diff --git a/sbt-app/src/sbt-test/project-matrix/full/test b/sbt-app/src/sbt-test/project-matrix/full/test index 791f14c73..6be1d54a0 100644 --- a/sbt-app/src/sbt-test/project-matrix/full/test +++ b/sbt-app/src/sbt-test/project-matrix/full/test @@ -1,4 +1,4 @@ > packageBin $ exists target/**/app_3.3.5-0.1.0-SNAPSHOT.jar -$ exists target/**/app_3.8.2-0.1.0-SNAPSHOT.jar -> core3_8_2/check +$ exists target/**/app_3.8.3-0.1.0-SNAPSHOT.jar +> core3_8_3/check diff --git a/sbt-app/src/sbt-test/project/Class.forName/build.sbt b/sbt-app/src/sbt-test/project/Class.forName/build.sbt index df172c5a2..768c1f6c5 100644 --- a/sbt-app/src/sbt-test/project/Class.forName/build.sbt +++ b/sbt-app/src/sbt-test/project/Class.forName/build.sbt @@ -1,4 +1,4 @@ -scalaVersion := "3.8.2" +scalaVersion := "3.8.3" crossPaths := false name := "definition-lib-forname-test" version := "1.0" diff --git a/sbt-app/src/sbt-test/project/nested-macro/build.sbt b/sbt-app/src/sbt-test/project/nested-macro/build.sbt index 4e50090cd..50df53547 100644 --- a/sbt-app/src/sbt-test/project/nested-macro/build.sbt +++ b/sbt-app/src/sbt-test/project/nested-macro/build.sbt @@ -1,6 +1,6 @@ lazy val a1 = settingKey[Boolean]("") -scalaVersion := "3.8.2" +scalaVersion := "3.8.3" a1 := true Compile / sourceGenerators += { diff --git a/sbt-app/src/sbt-test/project/no-delegate/build.sbt b/sbt-app/src/sbt-test/project/no-delegate/build.sbt index 37c578417..26462895c 100644 --- a/sbt-app/src/sbt-test/project/no-delegate/build.sbt +++ b/sbt-app/src/sbt-test/project/no-delegate/build.sbt @@ -1 +1 @@ -scalaVersion := "3.8.2" +scalaVersion := "3.8.3" diff --git a/sbt-app/src/sbt-test/project/remove/build.sbt b/sbt-app/src/sbt-test/project/remove/build.sbt index caf33b7d7..80f0ae435 100644 --- a/sbt-app/src/sbt-test/project/remove/build.sbt +++ b/sbt-app/src/sbt-test/project/remove/build.sbt @@ -11,7 +11,7 @@ lazy val intsSetting2 = Def.setting { Seq(1, 2, 3) } -scalaVersion := "3.8.2" +scalaVersion := "3.8.3" intsTask := Seq(1, 2, 3, 4, 5, 6, 7) intsTask -= 3 @@ -30,10 +30,10 @@ intsSetting -= intSetting2.value intsSetting --= intsSetting2.value intsFromScalaV := Seq(1, 2, 3, 4, 5, 6, 7) -intsFromScalaV -= { if scalaVersion.value == "3.8.2" then 3 else 5 } -intsFromScalaV --= { if scalaVersion.value == "3.8.2" then Seq(1, 2) else Seq(4) } -intsFromScalaV -= { if scalaVersion.value == "3.8.2" then Option(6) else None } -intsFromScalaV --= { if scalaVersion.value == "3.8.2" then Option(7) else None } +intsFromScalaV -= { if scalaVersion.value == "3.8.3" then 3 else 5 } +intsFromScalaV --= { if scalaVersion.value == "3.8.3" then Seq(1, 2) else Seq(4) } +intsFromScalaV -= { if scalaVersion.value == "3.8.3" then Option(6) else None } +intsFromScalaV --= { if scalaVersion.value == "3.8.3" then Option(7) else None } intsSetSetting := Set(1, 2, 3, 4, 5, 6, 7) intsSetSetting -= 3 diff --git a/sbt-app/src/sbt-test/project/settings-delegate/build.sbt b/sbt-app/src/sbt-test/project/settings-delegate/build.sbt index 37c578417..26462895c 100644 --- a/sbt-app/src/sbt-test/project/settings-delegate/build.sbt +++ b/sbt-app/src/sbt-test/project/settings-delegate/build.sbt @@ -1 +1 @@ -scalaVersion := "3.8.2" +scalaVersion := "3.8.3" diff --git a/sbt-app/src/sbt-test/tests/fork-main-resources/build.sbt b/sbt-app/src/sbt-test/tests/fork-main-resources/build.sbt index 21fc50e1b..ee5a70376 100644 --- a/sbt-app/src/sbt-test/tests/fork-main-resources/build.sbt +++ b/sbt-app/src/sbt-test/tests/fork-main-resources/build.sbt @@ -1,6 +1,6 @@ val scalatest = "org.scalatest" %% "scalatest" % "3.2.19" -scalaVersion := "3.8.2" +scalaVersion := "3.8.3" Test / fork := true libraryDependencies += scalatest % Test diff --git a/sbt-app/src/sbt-test/tests/fork-raw/build.sbt b/sbt-app/src/sbt-test/tests/fork-raw/build.sbt index 7fd48e96c..84e642245 100644 --- a/sbt-app/src/sbt-test/tests/fork-raw/build.sbt +++ b/sbt-app/src/sbt-test/tests/fork-raw/build.sbt @@ -1,6 +1,6 @@ val munit = "org.scalameta" %% "munit" % "1.0.4" -scalaVersion := "3.8.2" +scalaVersion := "3.8.3" libraryDependencies += munit % Test Test / fork := true diff --git a/sbt-app/src/sbt-test/tests/fork2/build.sbt b/sbt-app/src/sbt-test/tests/fork2/build.sbt index e4b187af6..7a0fc6589 100644 --- a/sbt-app/src/sbt-test/tests/fork2/build.sbt +++ b/sbt-app/src/sbt-test/tests/fork2/build.sbt @@ -1,5 +1,5 @@ val scalatest = "org.scalatest" %% "scalatest" % "3.2.19" -scalaVersion := "3.8.2" +scalaVersion := "3.8.3" fork := true libraryDependencies += scalatest % Test diff --git a/sbt-app/src/sbt-test/tests/incremental-object-deps/build.sbt b/sbt-app/src/sbt-test/tests/incremental-object-deps/build.sbt index 711293b1d..bc5c7b183 100644 --- a/sbt-app/src/sbt-test/tests/incremental-object-deps/build.sbt +++ b/sbt-app/src/sbt-test/tests/incremental-object-deps/build.sbt @@ -1,3 +1,3 @@ -scalaVersion := "3.8.2" +scalaVersion := "3.8.3" libraryDependencies += "com.eed3si9n.verify" %% "verify" % "1.0.0" % Test testFrameworks += new TestFramework("verify.runner.Framework") diff --git a/sbt-app/src/sbt-test/tests/munit/build.sbt b/sbt-app/src/sbt-test/tests/munit/build.sbt index 4de5cd4df..0b92adb55 100644 --- a/sbt-app/src/sbt-test/tests/munit/build.sbt +++ b/sbt-app/src/sbt-test/tests/munit/build.sbt @@ -1,5 +1,5 @@ val munit = "org.scalameta" %% "munit" % "1.0.4" -scalaVersion := "3.8.2" +scalaVersion := "3.8.3" lazy val root = rootProject .settings( diff --git a/sbt-app/src/sbt-test/tests/t543/build.sbt b/sbt-app/src/sbt-test/tests/t543/build.sbt index d759474fe..2a6120849 100644 --- a/sbt-app/src/sbt-test/tests/t543/build.sbt +++ b/sbt-app/src/sbt-test/tests/t543/build.sbt @@ -6,7 +6,7 @@ val marker = new File("marker") val check = TaskKey[Unit]("check", "Check correct error has been returned.") val scalatest = "org.scalatest" %% "scalatest" % "3.2.19" -ThisBuild / scalaVersion := "3.8.2" +ThisBuild / scalaVersion := "3.8.3" lazy val root = (project in file(".")). settings( diff --git a/server-test/src/server-test/channel-cursor/build.sbt b/server-test/src/server-test/channel-cursor/build.sbt index 56ac05125..1a1552d2e 100644 --- a/server-test/src/server-test/channel-cursor/build.sbt +++ b/server-test/src/server-test/channel-cursor/build.sbt @@ -1,4 +1,4 @@ -scalaVersion := "3.8.2" +scalaVersion := "3.8.3" val printCurrentProject = taskKey[Unit]("Prints current project name") diff --git a/server-test/src/server-test/client/build.sbt b/server-test/src/server-test/client/build.sbt index 8a1a07a43..b26c7209d 100644 --- a/server-test/src/server-test/client/build.sbt +++ b/server-test/src/server-test/client/build.sbt @@ -1,4 +1,4 @@ -scalaVersion := "3.8.2" +scalaVersion := "3.8.3" TaskKey[Unit]("willSucceed") := println("success") From c92ac232c0cd5c9fcee0ce84a62db601db1a1874 Mon Sep 17 00:00:00 2001 From: Eugene Yokota Date: Sun, 17 May 2026 00:27:08 -0400 Subject: [PATCH 2/2] Additional parens --- .../scala/sbt/internal/parser/SbtParser.scala | 2 +- .../internal/parser/SbtParserErrorSpec.scala | 2 +- .../src/test/scala/ShellScriptUtil.scala | 4 ++-- .../src/main/scala/sbt/ForkTests.scala | 2 +- .../scala/sbt/internal/WorkerExchange.scala | 2 +- .../AbstractTaskExecuteProgress.scala | 2 +- .../scala/sbt/internal/CommandExchange.scala | 2 +- .../main/scala/sbt/internal/Continuous.scala | 2 +- .../DefaultBackgroundJobService.scala | 2 +- .../scala/sbt/internal/TaskProgress.scala | 2 +- .../sbt/internal/server/Definition.scala | 2 +- .../sbt/internal/server/NetworkChannel.scala | 2 +- main/src/main/scala/sbt/nio/Settings.scala | 2 +- .../scala/sbt/scriptedtest/SbtHandler.scala | 2 +- .../scala/testpkg/ChannelCursorTest.scala | 2 +- .../src/test/scala/testpkg/TestServer.scala | 24 +++++++++---------- tasks-standard/src/test/scala/Test.scala | 4 +++- .../scala/sbt/internal/util/Settings.scala | 14 ++++++----- 18 files changed, 39 insertions(+), 35 deletions(-) diff --git a/buildfile/src/main/scala/sbt/internal/parser/SbtParser.scala b/buildfile/src/main/scala/sbt/internal/parser/SbtParser.scala index bd7f9fbf3..63fe498b0 100644 --- a/buildfile/src/main/scala/sbt/internal/parser/SbtParser.scala +++ b/buildfile/src/main/scala/sbt/internal/parser/SbtParser.scala @@ -258,7 +258,7 @@ private[sbt] case class SbtParser( |$code |}""".stripMargin val fileName = path.id - val reporterId = s"$fileName-${Random.nextInt}" + val reporterId = s"$fileName-${Random.nextInt()}" val sourceFile = SourceFile( VirtualFile(reporterId, wrapCode.getBytes(StandardCharsets.UTF_8)), scala.io.Codec.UTF8 diff --git a/buildfile/src/test/scala/sbt/internal/parser/SbtParserErrorSpec.scala b/buildfile/src/test/scala/sbt/internal/parser/SbtParserErrorSpec.scala index 827260e8a..e8cc39b05 100644 --- a/buildfile/src/test/scala/sbt/internal/parser/SbtParserErrorSpec.scala +++ b/buildfile/src/test/scala/sbt/internal/parser/SbtParserErrorSpec.scala @@ -29,7 +29,7 @@ object SbtParserErrorSpec extends AbstractSpec { print(s"Processing ${file.getFileName}: ") val vf = converter.toVirtualFile(file) - val buildSbt = Source.fromFile(file.toUri).getLines.toSeq + val buildSbt = Source.fromFile(file.toUri).getLines().toSeq val message = interceptMessageException(SbtParser(vf, buildSbt)) println(message) assert(message.contains(file.getFileName.toString)) diff --git a/launcher-package/integration-test/src/test/scala/ShellScriptUtil.scala b/launcher-package/integration-test/src/test/scala/ShellScriptUtil.scala index 918b00b7e..0f8e9d74f 100644 --- a/launcher-package/integration-test/src/test/scala/ShellScriptUtil.scala +++ b/launcher-package/integration-test/src/test/scala/ShellScriptUtil.scala @@ -172,9 +172,9 @@ trait ShellScriptUtil extends BasicTestSuite { BasicIO.processFully(processLine) ) ) - if p.exitValue != 0 then + if p.exitValue() != 0 then lines.foreach(l => Console.err.println(l)) - sys.error(s"process exit with ${p.exitValue}") + sys.error(s"process exit with ${p.exitValue()}") f(lines.toList) () finally diff --git a/main-actions/src/main/scala/sbt/ForkTests.scala b/main-actions/src/main/scala/sbt/ForkTests.scala index a1380792a..b18ff55f4 100755 --- a/main-actions/src/main/scala/sbt/ForkTests.scala +++ b/main-actions/src/main/scala/sbt/ForkTests.scala @@ -197,7 +197,7 @@ private class React( case NonFatal(_) => () override def notifyExit(p: Process): Unit = - if !process.isAlive && !promise.isCompleted then + if !process.isAlive() && !promise.isCompleted then val exitCode = process.exitValue() if exitCode != 0 then promise.failure(new RuntimeException(s"Forked test process exited with code $exitCode")) diff --git a/main-actions/src/main/scala/sbt/internal/WorkerExchange.scala b/main-actions/src/main/scala/sbt/internal/WorkerExchange.scala index 1ec62913e..c17b949f6 100644 --- a/main-actions/src/main/scala/sbt/internal/WorkerExchange.scala +++ b/main-actions/src/main/scala/sbt/internal/WorkerExchange.scala @@ -110,7 +110,7 @@ class WorkerProxy( input.close() serverSocket.foreach(_.close()) def blockForExitCode(): Int = - if !process.isAlive then process.exitValue() + if !process.isAlive() then process.exitValue() else Fork.blockForExitCode(process) /** print a line into stdin of the worker process. */ diff --git a/main/src/main/scala/sbt/internal/AbstractTaskExecuteProgress.scala b/main/src/main/scala/sbt/internal/AbstractTaskExecuteProgress.scala index 00163a4b6..284c9f273 100644 --- a/main/src/main/scala/sbt/internal/AbstractTaskExecuteProgress.scala +++ b/main/src/main/scala/sbt/internal/AbstractTaskExecuteProgress.scala @@ -68,7 +68,7 @@ private[sbt] abstract class AbstractTaskExecuteProgress( timings.forEach { (task, timing) => if (timing.isActive) result += task -> (now - timing.startNanos).nanos } - result.result + result.result() } override def afterRegistered( diff --git a/main/src/main/scala/sbt/internal/CommandExchange.scala b/main/src/main/scala/sbt/internal/CommandExchange.scala index f8e441522..c1877a944 100644 --- a/main/src/main/scala/sbt/internal/CommandExchange.scala +++ b/main/src/main/scala/sbt/internal/CommandExchange.scala @@ -100,7 +100,7 @@ private[sbt] final class CommandExchange { Option(deadline match { case Some(d: Deadline) => commandQueue.poll(d.timeLeft.toMillis + 1, TimeUnit.MILLISECONDS) match { - case null if idleDeadline.fold(false)(_.isOverdue) => + case null if idleDeadline.fold(false)(_.isOverdue()) => state.foreach { s => s.get(BasicKeys.serverIdleTimeout) match { case Some(Some(d)) => s.log.info(s"sbt idle timeout of $d expired") diff --git a/main/src/main/scala/sbt/internal/Continuous.scala b/main/src/main/scala/sbt/internal/Continuous.scala index e9573a12a..96ac9de35 100644 --- a/main/src/main/scala/sbt/internal/Continuous.scala +++ b/main/src/main/scala/sbt/internal/Continuous.scala @@ -501,7 +501,7 @@ private[sbt] object Continuous { * increase in latency. */ @tailrec def aggregate(res: Seq[Event]): Seq[Event] = - if (limit.isOverdue) res + if (limit.isOverdue()) res else { monitor.poll(antiEntropyPollPeriod) match { case s if s.nonEmpty => aggregate(res ++ s) diff --git a/main/src/main/scala/sbt/internal/DefaultBackgroundJobService.scala b/main/src/main/scala/sbt/internal/DefaultBackgroundJobService.scala index 188be4e24..45cb3038d 100644 --- a/main/src/main/scala/sbt/internal/DefaultBackgroundJobService.scala +++ b/main/src/main/scala/sbt/internal/DefaultBackgroundJobService.scala @@ -194,7 +194,7 @@ private[sbt] abstract class AbstractBackgroundJobService extends BackgroundJobSe override final def close(): Unit = shutdown() override def shutdown(): Unit = { val deadline = 10.seconds.fromNow - while (jobSet.nonEmpty && !deadline.isOverdue) { + while (jobSet.nonEmpty && !deadline.isOverdue()) { jobSet.headOption.foreach { case handle: ThreadJobHandle @unchecked => if (handle.job.isRunning()) { handle.job.shutdown() diff --git a/main/src/main/scala/sbt/internal/TaskProgress.scala b/main/src/main/scala/sbt/internal/TaskProgress.scala index e7d0ba8df..60999dd74 100644 --- a/main/src/main/scala/sbt/internal/TaskProgress.scala +++ b/main/src/main/scala/sbt/internal/TaskProgress.scala @@ -86,7 +86,7 @@ private[sbt] class TaskProgress( private def doReport(): Unit = { val runnable: Runnable = () => { - if (nextReport.get.isOverdue) { + if (nextReport.get.isOverdue()) { report() } } diff --git a/main/src/main/scala/sbt/internal/server/Definition.scala b/main/src/main/scala/sbt/internal/server/Definition.scala index fd770d9a9..0521d580b 100644 --- a/main/src/main/scala/sbt/internal/server/Definition.scala +++ b/main/src/main/scala/sbt/internal/server/Definition.scala @@ -219,7 +219,7 @@ private[sbt] object Definition { } private[sbt] def getAnalyses: Future[Seq[Analysis]] = { - val result = Promise[Seq[Analysis]] + val result = Promise[Seq[Analysis]]() new Thread("sbt-get-analysis-thread") { setDaemon(true) diff --git a/main/src/main/scala/sbt/internal/server/NetworkChannel.scala b/main/src/main/scala/sbt/internal/server/NetworkChannel.scala index c97a2c255..6a37d351e 100644 --- a/main/src/main/scala/sbt/internal/server/NetworkChannel.scala +++ b/main/src/main/scala/sbt/internal/server/NetworkChannel.scala @@ -765,7 +765,7 @@ final class NetworkChannel( private def empty = TerminalPropertiesResponse(0, 0, false, false, false, false) def getProperties(block: Boolean): Unit = { if (alive.get) { - if (!pending.get && Option(lastUpdate.get).fold(true)(d => (d + 1.second).isOverdue)) { + if (!pending.get && Option(lastUpdate.get).fold(true)(d => (d + 1.second).isOverdue())) { pending.set(true) val queue = VirtualTerminal.sendTerminalPropertiesQuery(term.name, jsonRpcRequest) val update: Runnable = () => { diff --git a/main/src/main/scala/sbt/nio/Settings.scala b/main/src/main/scala/sbt/nio/Settings.scala index 7ca7bbd12..e08b9787a 100644 --- a/main/src/main/scala/sbt/nio/Settings.scala +++ b/main/src/main/scala/sbt/nio/Settings.scala @@ -245,7 +245,7 @@ private[sbt] object Settings { val created = createdBuilder.result() val modified = modifiedBuilder.result() if (created.isEmpty && deleted.isEmpty && modified.isEmpty) { - FileChanges.unmodified(unmodifiedBuilder.result) + FileChanges.unmodified(unmodifiedBuilder.result()) } else { FileChanges(created, deleted, modified, unmodified) } diff --git a/scripted-sbt/src/main/scala/sbt/scriptedtest/SbtHandler.scala b/scripted-sbt/src/main/scala/sbt/scriptedtest/SbtHandler.scala index d8c145399..0a55cd8fd 100644 --- a/scripted-sbt/src/main/scala/sbt/scriptedtest/SbtHandler.scala +++ b/scripted-sbt/src/main/scala/sbt/scriptedtest/SbtHandler.scala @@ -67,7 +67,7 @@ final class SbtHandler(remoteSbtCreator: RemoteSbtCreator) extends StatementHand } catch { case _: IOException => process.destroy() } finally { - if (process.isAlive) process.destroy() + if (process.isAlive()) process.destroy() RunningProcesses.remove(process) } } diff --git a/server-test/src/test/scala/testpkg/ChannelCursorTest.scala b/server-test/src/test/scala/testpkg/ChannelCursorTest.scala index 6656d80f8..07c67956b 100644 --- a/server-test/src/test/scala/testpkg/ChannelCursorTest.scala +++ b/server-test/src/test/scala/testpkg/ChannelCursorTest.scala @@ -78,7 +78,7 @@ class ChannelCursorTest extends AbstractServerTest { @tailrec def impl(): Boolean = lines.poll(deadline.timeLeft.toMillis, TimeUnit.MILLISECONDS) match { case null => false - case s => if (!f(s) && !deadline.isOverdue) impl() else !deadline.isOverdue() + case s => if (!f(s) && !deadline.isOverdue()) impl() else !deadline.isOverdue() } impl() } diff --git a/server-test/src/test/scala/testpkg/TestServer.scala b/server-test/src/test/scala/testpkg/TestServer.scala index fec7c578b..0235f73ed 100644 --- a/server-test/src/test/scala/testpkg/TestServer.scala +++ b/server-test/src/test/scala/testpkg/TestServer.scala @@ -192,15 +192,15 @@ case class TestServer( hostLog(s"wait $duration until the server is ready to respond") val deadline = duration.fromNow var nextLog = 10.seconds.fromNow - while (portfileIsEmpty() && !deadline.isOverdue && process.isAlive) { - if (nextLog.isOverdue) { + while (portfileIsEmpty() && !deadline.isOverdue() && process.isAlive()) { + if (nextLog.isOverdue()) { hostLog("waiting for the server...") nextLog = 10.seconds.fromNow } Thread.sleep(10) // Don't spam the portfile } - if (deadline.isOverdue) sys.error(s"Timeout. $portfile is not found.") - if (!process.isAlive) sys.error(s"Server unexpectedly terminated.") + if (deadline.isOverdue()) sys.error(s"Timeout. $portfile is not found.") + if (!process.isAlive()) sys.error(s"Server unexpectedly terminated.") } waitForPortfile(1.minute) @@ -254,18 +254,18 @@ case class TestServer( """{ "jsonrpc": "2.0", "id": 9, "method": "sbt/exec", "params": { "commandLine": "shutdown" } }""" ) val deadline = 5.seconds.fromNow - while (!deadline.isOverdue && process.isAlive) { + while (!deadline.isOverdue() && process.isAlive()) { Thread.sleep(10) } // We gave the server a chance to exit but it didn't within a reasonable time frame. - if (deadline.isOverdue && process.isAlive) { + if (deadline.isOverdue() && process.isAlive()) { process.destroy() val newDeadline = 10.seconds.fromNow - while (!newDeadline.isOverdue && process.isAlive) { + while (!newDeadline.isOverdue() && process.isAlive()) { Thread.sleep(10) } } - if (process.isAlive) throw new IllegalStateException(s"process $process failed to exit") + if (process.isAlive()) throw new IllegalStateException(s"process $process failed to exit") } finally { readThread.interrupt() /* @@ -309,7 +309,7 @@ case class TestServer( @tailrec def impl(): Boolean = lines.poll(deadline.timeLeft.toMillis, TimeUnit.MILLISECONDS) match { case null => false - case s => if (!f(s) && !deadline.isOverdue) impl() else !deadline.isOverdue() + case s => if (!f(s) && !deadline.isOverdue()) impl() else !deadline.isOverdue() } impl() } @@ -336,7 +336,7 @@ case class TestServer( case Success(value) => value case Failure(exception) => - if (deadline.isOverdue) { + if (deadline.isOverdue()) { val ex = new TimeoutException() ex.initCause(exception) throw ex @@ -357,8 +357,8 @@ case class TestServer( case s => val s1 = s val correctId = s1.contains("\"id\":\"" + id + "\"") - if (!correctId && !deadline.isOverdue) impl() - else if (deadline.isOverdue) + if (!correctId && !deadline.isOverdue()) impl() + else if (deadline.isOverdue()) throw new TimeoutException() else s } diff --git a/tasks-standard/src/test/scala/Test.scala b/tasks-standard/src/test/scala/Test.scala index b4f2fffca..7f916bcb8 100644 --- a/tasks-standard/src/test/scala/Test.scala +++ b/tasks-standard/src/test/scala/Test.scala @@ -45,7 +45,9 @@ object Test extends std.TaskExtra: lazy val d3 = t3(a, b, c).flatMapR(f3) def d4(i: Int): Task[Int] = nop flatMap { _ => - val x = math.random; if (x < 0.01) task(i); else d4(i + 1) + val x = math.random() + if (x < 0.01) task(i) + else d4(i + 1) } def go(): Unit = { diff --git a/util-collection/src/main/scala/sbt/internal/util/Settings.scala b/util-collection/src/main/scala/sbt/internal/util/Settings.scala index e75031531..3205b157c 100644 --- a/util-collection/src/main/scala/sbt/internal/util/Settings.scala +++ b/util-collection/src/main/scala/sbt/internal/util/Settings.scala @@ -66,17 +66,19 @@ trait Init: def values: Iterable[Any] = data.values def get[A](key: ScopedKey[A]): Option[A] = - delegates(key).flatMap(data.get).nextOption.asInstanceOf[Option[A]] + delegates(key).flatMap(data.get).nextOption().asInstanceOf[Option[A]] def definingKey[A](key: ScopedKey[A]): Option[ScopedKey[A]] = delegates(key).find(data.contains) def getKeyValue[A](key: ScopedKey[A]): Option[(ScopedKey[A], A)] = - delegates(key).flatMap { k => - data.get(k) match - case None => None - case Some(v) => Some(k -> v.asInstanceOf[A]) - }.nextOption + delegates(key) + .flatMap { k => + data.get(k) match + case None => None + case Some(v) => Some(k -> v.asInstanceOf[A]) + } + .nextOption() def getDirect[A](key: ScopedKey[A]): Option[A] = data.get(key).asInstanceOf[Option[A]]