Skip to content

Commit

Permalink
Update Scala 3 LTS to 3.3.5 (#3466)
Browse files Browse the repository at this point in the history
* Update Scala 3 LTS to 3.3.5

* Downgrade Scala to 3.3.4 for Ammonite with LTS
  • Loading branch information
Gedochao authored Jan 29, 2025
1 parent 3fe039e commit e51e17a
Show file tree
Hide file tree
Showing 6 changed files with 111 additions and 95 deletions.
97 changes: 50 additions & 47 deletions build.sc
Original file line number Diff line number Diff line change
Expand Up @@ -504,6 +504,7 @@ trait Core extends ScalaCliCrossSbtModule
| def scala3NextRcVersion = "${Scala.scala3NextRc}"
| def scala3NextPrefix = "${Scala.scala3NextPrefix}"
| def scala3LtsPrefix = "${Scala.scala3LtsPrefix}"
| def scala3Lts = "${Scala.scala3Lts}"
|
| def workspaceDirName = "$workspaceDirName"
| def projectFileName = "$projectFileName"
Expand Down Expand Up @@ -833,12 +834,13 @@ trait Cli extends CrossSbtModule with ProtoBuildModule with CliLaunchers
|
|/** Build-time constants. Generated by mill. */
|object Constants {
| def pythonInterfaceOrg = "${Deps.pythonInterface.dep.module.organization.value}"
| def pythonInterfaceName = "${Deps.pythonInterface.dep.module.name.value}"
| def pythonInterfaceVersion = "${Deps.pythonInterface.dep.version}"
| def launcherTypeResourcePath = "${launcherTypeResourcePath.toString}"
| def defaultFilesResourcePath = "$defaultFilesResourcePath"
| def maxAmmoniteScala3Version = "${Scala.maxAmmoniteScala3Version}"
| def pythonInterfaceOrg = "${Deps.pythonInterface.dep.module.organization.value}"
| def pythonInterfaceName = "${Deps.pythonInterface.dep.module.name.value}"
| def pythonInterfaceVersion = "${Deps.pythonInterface.dep.version}"
| def launcherTypeResourcePath = "${launcherTypeResourcePath.toString}"
| def defaultFilesResourcePath = "$defaultFilesResourcePath"
| def maxAmmoniteScala3Version = "${Scala.maxAmmoniteScala3Version}"
| def maxAmmoniteScala3LtsVersion = "${Scala.maxAmmoniteScala3LtsVersion}"
|}
|""".stripMargin
if (!os.isFile(dest) || os.read(dest) != code)
Expand Down Expand Up @@ -1034,51 +1036,52 @@ trait CliIntegration extends SbtModule with ScalaCliPublishModule with HasTests
|
|/** Build-time constants. Generated by mill. */
|object Constants {
| def allJavaVersions = Seq(${Java.allJavaVersions.sorted.mkString(", ")})
| def bspVersion = "${Deps.bsp4j.dep.version}"
| def bloopMinimumJvmVersion = ${Java.minimumBloopJava}
| def minimumInternalJvmVersion = ${Java.minimumInternalJava}
| def defaultJvmVersion = ${Java.defaultJava}
| def scala212 = "${Scala.scala212}"
| def scala213 = "${Scala.scala213}"
| def scalaSnapshot213 = "${TestDeps.scalaSnapshot213}"
| def scala3LtsPrefix = "${Scala.scala3LtsPrefix}"
| def scala3Lts = "${Scala.scala3Lts}"
| def scala3NextPrefix = "${Scala.scala3NextPrefix}"
| def scala3NextRc = "${Scala.scala3NextRc}"
| def scala3NextRcAnnounced = "${Scala.scala3NextRcAnnounced}"
| def scala3Next = "${Scala.scala3Next}"
| def scala3NextAnnounced = "${Scala.scala3NextAnnounced}"
| def defaultScala = "${Scala.defaultUser}"
| def defaultScalafmtVersion = "${Deps.scalafmtCli.dep.version}"
| def maxAmmoniteScala212Version = "${Scala.maxAmmoniteScala212Version}"
| def maxAmmoniteScala213Version = "${Scala.maxAmmoniteScala213Version}"
| def maxAmmoniteScala3Version = "${Scala.maxAmmoniteScala3Version}"
| def scalaJsVersion = "${Scala.scalaJs}"
| def scalaJsCliVersion = "${Scala.scalaJsCli}"
| def scalaNativeVersion = "${Deps.Versions.scalaNative}"
| def scalaNativeVersion04 = "${Deps.Versions.scalaNative04}"
| def scalaNativeVersion05 = "${Deps.Versions.scalaNative05}"
| def allJavaVersions = Seq(${Java.allJavaVersions.sorted.mkString(", ")})
| def bspVersion = "${Deps.bsp4j.dep.version}"
| def bloopMinimumJvmVersion = ${Java.minimumBloopJava}
| def minimumInternalJvmVersion = ${Java.minimumInternalJava}
| def defaultJvmVersion = ${Java.defaultJava}
| def scala212 = "${Scala.scala212}"
| def scala213 = "${Scala.scala213}"
| def scalaSnapshot213 = "${TestDeps.scalaSnapshot213}"
| def scala3LtsPrefix = "${Scala.scala3LtsPrefix}"
| def scala3Lts = "${Scala.scala3Lts}"
| def scala3NextPrefix = "${Scala.scala3NextPrefix}"
| def scala3NextRc = "${Scala.scala3NextRc}"
| def scala3NextRcAnnounced = "${Scala.scala3NextRcAnnounced}"
| def scala3Next = "${Scala.scala3Next}"
| def scala3NextAnnounced = "${Scala.scala3NextAnnounced}"
| def defaultScala = "${Scala.defaultUser}"
| def defaultScalafmtVersion = "${Deps.scalafmtCli.dep.version}"
| def maxAmmoniteScala212Version = "${Scala.maxAmmoniteScala212Version}"
| def maxAmmoniteScala213Version = "${Scala.maxAmmoniteScala213Version}"
| def maxAmmoniteScala3Version = "${Scala.maxAmmoniteScala3Version}"
| def maxAmmoniteScala3LtsVersion = "${Scala.maxAmmoniteScala3LtsVersion}"
| def scalaJsVersion = "${Scala.scalaJs}"
| def scalaJsCliVersion = "${Scala.scalaJsCli}"
| def scalaNativeVersion = "${Deps.Versions.scalaNative}"
| def scalaNativeVersion04 = "${Deps.Versions.scalaNative04}"
| def scalaNativeVersion05 = "${Deps.Versions.scalaNative05}"
| def semanticDbJavacPluginVersion = "${Deps.semanticDbJavac.dep.version}"
| def ammoniteVersion = "${Deps.ammonite.dep.version}"
| def defaultGraalVMJavaVersion = "${deps.graalVmJavaVersion}"
| def defaultGraalVMVersion = "${deps.graalVmVersion}"
| def scalaPyVersion = "${Deps.scalaPy.dep.version}"
| def scalaPyMaxScalaNative = "${Deps.Versions.maxScalaNativeForScalaPy}"
| def bloopVersion = "${Deps.bloopRifle.dep.version}"
| def pprintVersion = "${TestDeps.pprint.dep.version}"
| def munitVersion = "${TestDeps.munit.dep.version}"
| def dockerTestImage = "${Docker.testImage}"
| def dockerAlpineTestImage = "${Docker.alpineTestImage}"
| def authProxyTestImage = "${Docker.authProxyTestImage}"
| def mostlyStaticDockerfile = "${mostlyStaticDockerfile.toString.replace(
| def ammoniteVersion = "${Deps.ammonite.dep.version}"
| def defaultGraalVMJavaVersion = "${deps.graalVmJavaVersion}"
| def defaultGraalVMVersion = "${deps.graalVmVersion}"
| def scalaPyVersion = "${Deps.scalaPy.dep.version}"
| def scalaPyMaxScalaNative = "${Deps.Versions.maxScalaNativeForScalaPy}"
| def bloopVersion = "${Deps.bloopRifle.dep.version}"
| def pprintVersion = "${TestDeps.pprint.dep.version}"
| def munitVersion = "${TestDeps.munit.dep.version}"
| def dockerTestImage = "${Docker.testImage}"
| def dockerAlpineTestImage = "${Docker.alpineTestImage}"
| def authProxyTestImage = "${Docker.authProxyTestImage}"
| def mostlyStaticDockerfile = "${mostlyStaticDockerfile.toString.replace(
"\\",
"\\\\"
)}"
| def cs = "${settings.cs().replace("\\", "\\\\")}"
| def workspaceDirName = "$workspaceDirName"
| def libsodiumVersion = "${deps.libsodiumVersion}"
| def dockerArchLinuxImage = "${TestDeps.archLinuxImage}"
| def cs = "${settings.cs().replace("\\", "\\\\")}"
| def workspaceDirName = "$workspaceDirName"
| def libsodiumVersion = "${deps.libsodiumVersion}"
| def dockerArchLinuxImage = "${TestDeps.archLinuxImage}"
|
| def toolkitVersion = "${Deps.toolkitVersion}"
| def toolkitVersionForNative04 = "${Deps.toolkitVersionForNative04}"
Expand Down
62 changes: 37 additions & 25 deletions modules/cli/src/main/scala/scala/cli/commands/repl/Repl.scala
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ import scala.build.errors.{
import scala.build.input.Inputs
import scala.build.internal.{Constants, Runner}
import scala.build.options.ScalacOpt.noDashPrefixes
import scala.build.options.{BuildOptions, JavaOpt, MaybeScalaVersion, Scope}
import scala.build.options.{BuildOptions, JavaOpt, MaybeScalaVersion, ScalaVersionUtil, Scope}
import scala.cli.commands.publish.ConfigUtil.*
import scala.cli.commands.run.Run.{
maybePrintSimpleScalacOutput,
Expand Down Expand Up @@ -54,10 +54,15 @@ object Repl extends ScalaCommand[ReplOptions] with BuildCommandHelpers {
override def sharedOptions(options: ReplOptions): Option[SharedOptions] = Some(options.shared)

override def buildOptions(ops: ReplOptions): Some[BuildOptions] =
Some(buildOptions0(ops, scala.cli.internal.Constants.maxAmmoniteScala3Version))
Some(buildOptions0(
ops,
scala.cli.internal.Constants.maxAmmoniteScala3Version,
scala.cli.internal.Constants.maxAmmoniteScala3LtsVersion
))
private[commands] def buildOptions0(
ops: ReplOptions,
maxAmmoniteScalaVer: String
maxAmmoniteScalaVer: String,
maxAmmoniteScalaLtsVer: String
): BuildOptions = {
import ops.*
import ops.sharedRepl.*
Expand All @@ -66,29 +71,36 @@ object Repl extends ScalaCommand[ReplOptions] with BuildCommandHelpers {

val ammoniteVersionOpt = ammoniteVersion.map(_.trim).filter(_.nonEmpty)
val baseOptions = shared.buildOptions().orExit(logger)

val maybeDowngradedScalaVersion = {
val isDefaultAmmonite = ammonite.contains(true) && ammoniteVersionOpt.isEmpty
extension (s: MaybeScalaVersion)
private def isLts: Boolean = s.versionOpt
.exists(v =>
v.startsWith(Constants.scala3LtsPrefix) ||
ScalaVersionUtil.scala3Lts.contains(v.toLowerCase)
)
baseOptions.scalaOptions.scalaVersion match
case Some(s)
if isDefaultAmmonite && s.isLts && s.versionOpt
.exists(_.coursierVersion > maxAmmoniteScalaLtsVer.coursierVersion) =>
logger.message(
s"Scala ${s.versionOpt.getOrElse(Constants.scala3Lts)} is not yet supported with this version of Ammonite"
)
logger.message(s"Defaulting to Scala $maxAmmoniteScalaLtsVer")
Some(MaybeScalaVersion(maxAmmoniteScalaLtsVer))
case None
if isDefaultAmmonite && maxAmmoniteScalaVer.coursierVersion < defaultScalaVersion.coursierVersion =>
logger.message(
s"Scala $defaultScalaVersion is not yet supported with this version of Ammonite"
)
logger.message(s"Defaulting to Scala $maxAmmoniteScalaVer")
Some(MaybeScalaVersion(maxAmmoniteScalaVer))
case s => s
}

baseOptions.copy(
scalaOptions = baseOptions.scalaOptions.copy(
scalaVersion = baseOptions.scalaOptions.scalaVersion
.orElse {
val shouldDowngrade = {
def needsDowngradeForAmmonite = {
import coursier.core.Version
Version(maxAmmoniteScalaVer) < Version(defaultScalaVersion)
}
ammonite.contains(true) &&
ammoniteVersionOpt.isEmpty &&
needsDowngradeForAmmonite
}
if (shouldDowngrade) {
logger.message(
s"Scala $defaultScalaVersion is not yet supported with this version of Ammonite"
)
logger.message(s"Defaulting to Scala $maxAmmoniteScalaVer")
Some(MaybeScalaVersion(maxAmmoniteScalaVer))
}
else None
}
),
scalaOptions = baseOptions.scalaOptions.copy(scalaVersion = maybeDowngradedScalaVersion),
javaOptions = baseOptions.javaOptions.copy(
javaOpts =
baseOptions.javaOptions.javaOpts ++
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
package scala.cli.commands.tests

import com.eed3si9n.expecty.Expecty.{assert => expect}
import com.eed3si9n.expecty.Expecty.assert as expect

import scala.build.internal.Constants
import scala.cli.commands.repl.{Repl, ReplOptions, SharedReplOptions}
import scala.cli.commands.shared.{SharedOptions, SharedPythonOptions}

Expand All @@ -26,8 +27,9 @@ class ReplOptionsTests extends munit.FunSuite {
ammonite = Some(true)
)
)
val maxVersion = "3.1.3"
val buildOptions = Repl.buildOptions0(replOptions, maxVersion)
val maxVersion = "3.1.3"
val maxLtsVersion = Constants.scala3Lts
val buildOptions = Repl.buildOptions0(replOptions, maxVersion, maxLtsVersion)
expect(buildOptions.scalaOptions.scalaVersion.flatMap(_.versionOpt).contains(maxVersion))
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -155,21 +155,12 @@ trait CompileScalacCompatTestDefinitions { _: CompileTestDefinitions =>
.call(cwd = root, check = false, stderr = os.Pipe)
expect(scalacRes.exitCode == cliRes.exitCode)
val scalacResErr = scalacRes.err.trim()
if (sv != Constants.scala3Lts) {
// TODO run this check for LTS when -Wconf gets fixed there
val cliResErr =
cliRes.err.trim().linesIterator.toList
// skip potentially irrelevant logs
.dropWhile(_.contains("Check"))
.mkString(System.lineSeparator())
expect(cliResErr == scalacResErr)
}
else expect(
TestUtil.removeAnsiColors(cliRes.err.trim())
.contains(
"method oldMethod in object WConfExample is deprecated since 1.0.0: This method will be removed"
)
)
val cliResErr =
cliRes.err.trim().linesIterator.toList
// skip potentially irrelevant logs
.dropWhile(_.contains("Check"))
.mkString(System.lineSeparator())
expect(cliResErr == scalacResErr)
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,10 @@ trait ReplAmmoniteTestDefinitions { _: ReplTestDefinitions =>
if s.startsWith("2.13") &&
Constants.maxAmmoniteScala213Version.coursierVersion < s.coursierVersion =>
Constants.maxAmmoniteScala213Version
case s
if s.startsWith(Constants.scala3LtsPrefix) &&
Constants.maxAmmoniteScala3LtsVersion.coursierVersion < s.coursierVersion =>
Constants.maxAmmoniteScala3LtsVersion
case s
if s.startsWith("3") &&
Constants.maxAmmoniteScala3Version.coursierVersion < s.coursierVersion =>
Expand All @@ -28,7 +32,10 @@ trait ReplAmmoniteTestDefinitions { _: ReplTestDefinitions =>
}

def actualMaxAmmoniteScalaVersion: String =
if (actualScalaVersion.startsWith("3")) Constants.maxAmmoniteScala3Version
if (actualScalaVersion.startsWith(Constants.scala3LtsPrefix))
Constants.maxAmmoniteScala3LtsVersion
else if (actualScalaVersion.startsWith(Constants.scala3NextPrefix))
Constants.maxAmmoniteScala3Version
else if (actualScalaVersion.startsWith("2.13")) Constants.maxAmmoniteScala213Version
else Constants.maxAmmoniteScala212Version

Expand Down
9 changes: 5 additions & 4 deletions project/deps.sc
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ object Scala {
def scala213 = "2.13.16"
def runnerScala3 = "3.0.2" // the newest version that is compatible with all Scala 3.x versions
def scala3LtsPrefix = "3.3" // used for the LTS version tags
def scala3Lts = s"$scala3LtsPrefix.4" // the LTS version currently used in the build
def scala3Lts = s"$scala3LtsPrefix.5" // the LTS version currently used in the build
def scala3NextPrefix = "3.6"
def scala3Next = s"$scala3NextPrefix.3" // the newest/next version of Scala
def scala3NextAnnounced =
Expand Down Expand Up @@ -54,9 +54,10 @@ object Scala {
(0 until max35).map(i => s"3.5.$i") ++ Seq(scala3Next)
}

def maxAmmoniteScala212Version = scala212
def maxAmmoniteScala213Version = "2.13.14"
def maxAmmoniteScala3Version = "3.5.1"
def maxAmmoniteScala212Version = scala212
def maxAmmoniteScala213Version = "2.13.14"
def maxAmmoniteScala3Version = "3.5.1"
def maxAmmoniteScala3LtsVersion = "3.3.4"
lazy val listMaxAmmoniteScalaVersion =
Seq(maxAmmoniteScala212Version, maxAmmoniteScala213Version, maxAmmoniteScala3Version)
lazy val listAllAmmonite = {
Expand Down

0 comments on commit e51e17a

Please sign in to comment.