Skip to content

Commit cde439e

Browse files
committed
Downgrade Scala to 3.3.4 for Ammonite with LTS
1 parent e004010 commit cde439e

File tree

5 files changed

+104
-79
lines changed

5 files changed

+104
-79
lines changed

build.sc

+50-47
Original file line numberDiff line numberDiff line change
@@ -504,6 +504,7 @@ trait Core extends ScalaCliCrossSbtModule
504504
| def scala3NextRcVersion = "${Scala.scala3NextRc}"
505505
| def scala3NextPrefix = "${Scala.scala3NextPrefix}"
506506
| def scala3LtsPrefix = "${Scala.scala3LtsPrefix}"
507+
| def scala3Lts = "${Scala.scala3Lts}"
507508
|
508509
| def workspaceDirName = "$workspaceDirName"
509510
| def projectFileName = "$projectFileName"
@@ -833,12 +834,13 @@ trait Cli extends CrossSbtModule with ProtoBuildModule with CliLaunchers
833834
|
834835
|/** Build-time constants. Generated by mill. */
835836
|object Constants {
836-
| def pythonInterfaceOrg = "${Deps.pythonInterface.dep.module.organization.value}"
837-
| def pythonInterfaceName = "${Deps.pythonInterface.dep.module.name.value}"
838-
| def pythonInterfaceVersion = "${Deps.pythonInterface.dep.version}"
839-
| def launcherTypeResourcePath = "${launcherTypeResourcePath.toString}"
840-
| def defaultFilesResourcePath = "$defaultFilesResourcePath"
841-
| def maxAmmoniteScala3Version = "${Scala.maxAmmoniteScala3Version}"
837+
| def pythonInterfaceOrg = "${Deps.pythonInterface.dep.module.organization.value}"
838+
| def pythonInterfaceName = "${Deps.pythonInterface.dep.module.name.value}"
839+
| def pythonInterfaceVersion = "${Deps.pythonInterface.dep.version}"
840+
| def launcherTypeResourcePath = "${launcherTypeResourcePath.toString}"
841+
| def defaultFilesResourcePath = "$defaultFilesResourcePath"
842+
| def maxAmmoniteScala3Version = "${Scala.maxAmmoniteScala3Version}"
843+
| def maxAmmoniteScala3LtsVersion = "${Scala.maxAmmoniteScala3LtsVersion}"
842844
|}
843845
|""".stripMargin
844846
if (!os.isFile(dest) || os.read(dest) != code)
@@ -1034,51 +1036,52 @@ trait CliIntegration extends SbtModule with ScalaCliPublishModule with HasTests
10341036
|
10351037
|/** Build-time constants. Generated by mill. */
10361038
|object Constants {
1037-
| def allJavaVersions = Seq(${Java.allJavaVersions.sorted.mkString(", ")})
1038-
| def bspVersion = "${Deps.bsp4j.dep.version}"
1039-
| def bloopMinimumJvmVersion = ${Java.minimumBloopJava}
1040-
| def minimumInternalJvmVersion = ${Java.minimumInternalJava}
1041-
| def defaultJvmVersion = ${Java.defaultJava}
1042-
| def scala212 = "${Scala.scala212}"
1043-
| def scala213 = "${Scala.scala213}"
1044-
| def scalaSnapshot213 = "${TestDeps.scalaSnapshot213}"
1045-
| def scala3LtsPrefix = "${Scala.scala3LtsPrefix}"
1046-
| def scala3Lts = "${Scala.scala3Lts}"
1047-
| def scala3NextPrefix = "${Scala.scala3NextPrefix}"
1048-
| def scala3NextRc = "${Scala.scala3NextRc}"
1049-
| def scala3NextRcAnnounced = "${Scala.scala3NextRcAnnounced}"
1050-
| def scala3Next = "${Scala.scala3Next}"
1051-
| def scala3NextAnnounced = "${Scala.scala3NextAnnounced}"
1052-
| def defaultScala = "${Scala.defaultUser}"
1053-
| def defaultScalafmtVersion = "${Deps.scalafmtCli.dep.version}"
1054-
| def maxAmmoniteScala212Version = "${Scala.maxAmmoniteScala212Version}"
1055-
| def maxAmmoniteScala213Version = "${Scala.maxAmmoniteScala213Version}"
1056-
| def maxAmmoniteScala3Version = "${Scala.maxAmmoniteScala3Version}"
1057-
| def scalaJsVersion = "${Scala.scalaJs}"
1058-
| def scalaJsCliVersion = "${Scala.scalaJsCli}"
1059-
| def scalaNativeVersion = "${Deps.Versions.scalaNative}"
1060-
| def scalaNativeVersion04 = "${Deps.Versions.scalaNative04}"
1061-
| def scalaNativeVersion05 = "${Deps.Versions.scalaNative05}"
1039+
| def allJavaVersions = Seq(${Java.allJavaVersions.sorted.mkString(", ")})
1040+
| def bspVersion = "${Deps.bsp4j.dep.version}"
1041+
| def bloopMinimumJvmVersion = ${Java.minimumBloopJava}
1042+
| def minimumInternalJvmVersion = ${Java.minimumInternalJava}
1043+
| def defaultJvmVersion = ${Java.defaultJava}
1044+
| def scala212 = "${Scala.scala212}"
1045+
| def scala213 = "${Scala.scala213}"
1046+
| def scalaSnapshot213 = "${TestDeps.scalaSnapshot213}"
1047+
| def scala3LtsPrefix = "${Scala.scala3LtsPrefix}"
1048+
| def scala3Lts = "${Scala.scala3Lts}"
1049+
| def scala3NextPrefix = "${Scala.scala3NextPrefix}"
1050+
| def scala3NextRc = "${Scala.scala3NextRc}"
1051+
| def scala3NextRcAnnounced = "${Scala.scala3NextRcAnnounced}"
1052+
| def scala3Next = "${Scala.scala3Next}"
1053+
| def scala3NextAnnounced = "${Scala.scala3NextAnnounced}"
1054+
| def defaultScala = "${Scala.defaultUser}"
1055+
| def defaultScalafmtVersion = "${Deps.scalafmtCli.dep.version}"
1056+
| def maxAmmoniteScala212Version = "${Scala.maxAmmoniteScala212Version}"
1057+
| def maxAmmoniteScala213Version = "${Scala.maxAmmoniteScala213Version}"
1058+
| def maxAmmoniteScala3Version = "${Scala.maxAmmoniteScala3Version}"
1059+
| def maxAmmoniteScala3LtsVersion = "${Scala.maxAmmoniteScala3LtsVersion}"
1060+
| def scalaJsVersion = "${Scala.scalaJs}"
1061+
| def scalaJsCliVersion = "${Scala.scalaJsCli}"
1062+
| def scalaNativeVersion = "${Deps.Versions.scalaNative}"
1063+
| def scalaNativeVersion04 = "${Deps.Versions.scalaNative04}"
1064+
| def scalaNativeVersion05 = "${Deps.Versions.scalaNative05}"
10621065
| def semanticDbJavacPluginVersion = "${Deps.semanticDbJavac.dep.version}"
1063-
| def ammoniteVersion = "${Deps.ammonite.dep.version}"
1064-
| def defaultGraalVMJavaVersion = "${deps.graalVmJavaVersion}"
1065-
| def defaultGraalVMVersion = "${deps.graalVmVersion}"
1066-
| def scalaPyVersion = "${Deps.scalaPy.dep.version}"
1067-
| def scalaPyMaxScalaNative = "${Deps.Versions.maxScalaNativeForScalaPy}"
1068-
| def bloopVersion = "${Deps.bloopRifle.dep.version}"
1069-
| def pprintVersion = "${TestDeps.pprint.dep.version}"
1070-
| def munitVersion = "${TestDeps.munit.dep.version}"
1071-
| def dockerTestImage = "${Docker.testImage}"
1072-
| def dockerAlpineTestImage = "${Docker.alpineTestImage}"
1073-
| def authProxyTestImage = "${Docker.authProxyTestImage}"
1074-
| def mostlyStaticDockerfile = "${mostlyStaticDockerfile.toString.replace(
1066+
| def ammoniteVersion = "${Deps.ammonite.dep.version}"
1067+
| def defaultGraalVMJavaVersion = "${deps.graalVmJavaVersion}"
1068+
| def defaultGraalVMVersion = "${deps.graalVmVersion}"
1069+
| def scalaPyVersion = "${Deps.scalaPy.dep.version}"
1070+
| def scalaPyMaxScalaNative = "${Deps.Versions.maxScalaNativeForScalaPy}"
1071+
| def bloopVersion = "${Deps.bloopRifle.dep.version}"
1072+
| def pprintVersion = "${TestDeps.pprint.dep.version}"
1073+
| def munitVersion = "${TestDeps.munit.dep.version}"
1074+
| def dockerTestImage = "${Docker.testImage}"
1075+
| def dockerAlpineTestImage = "${Docker.alpineTestImage}"
1076+
| def authProxyTestImage = "${Docker.authProxyTestImage}"
1077+
| def mostlyStaticDockerfile = "${mostlyStaticDockerfile.toString.replace(
10751078
"\\",
10761079
"\\\\"
10771080
)}"
1078-
| def cs = "${settings.cs().replace("\\", "\\\\")}"
1079-
| def workspaceDirName = "$workspaceDirName"
1080-
| def libsodiumVersion = "${deps.libsodiumVersion}"
1081-
| def dockerArchLinuxImage = "${TestDeps.archLinuxImage}"
1081+
| def cs = "${settings.cs().replace("\\", "\\\\")}"
1082+
| def workspaceDirName = "$workspaceDirName"
1083+
| def libsodiumVersion = "${deps.libsodiumVersion}"
1084+
| def dockerArchLinuxImage = "${TestDeps.archLinuxImage}"
10821085
|
10831086
| def toolkitVersion = "${Deps.toolkitVersion}"
10841087
| def toolkitVersionForNative04 = "${Deps.toolkitVersionForNative04}"

modules/cli/src/main/scala/scala/cli/commands/repl/Repl.scala

+37-25
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import scala.build.errors.{
2222
import scala.build.input.Inputs
2323
import scala.build.internal.{Constants, Runner}
2424
import scala.build.options.ScalacOpt.noDashPrefixes
25-
import scala.build.options.{BuildOptions, JavaOpt, MaybeScalaVersion, Scope}
25+
import scala.build.options.{BuildOptions, JavaOpt, MaybeScalaVersion, ScalaVersionUtil, Scope}
2626
import scala.cli.commands.publish.ConfigUtil.*
2727
import scala.cli.commands.run.Run.{
2828
maybePrintSimpleScalacOutput,
@@ -54,10 +54,15 @@ object Repl extends ScalaCommand[ReplOptions] with BuildCommandHelpers {
5454
override def sharedOptions(options: ReplOptions): Option[SharedOptions] = Some(options.shared)
5555

5656
override def buildOptions(ops: ReplOptions): Some[BuildOptions] =
57-
Some(buildOptions0(ops, scala.cli.internal.Constants.maxAmmoniteScala3Version))
57+
Some(buildOptions0(
58+
ops,
59+
scala.cli.internal.Constants.maxAmmoniteScala3Version,
60+
scala.cli.internal.Constants.maxAmmoniteScala3LtsVersion
61+
))
5862
private[commands] def buildOptions0(
5963
ops: ReplOptions,
60-
maxAmmoniteScalaVer: String
64+
maxAmmoniteScalaVer: String,
65+
maxAmmoniteScalaLtsVer: String
6166
): BuildOptions = {
6267
import ops.*
6368
import ops.sharedRepl.*
@@ -66,29 +71,36 @@ object Repl extends ScalaCommand[ReplOptions] with BuildCommandHelpers {
6671

6772
val ammoniteVersionOpt = ammoniteVersion.map(_.trim).filter(_.nonEmpty)
6873
val baseOptions = shared.buildOptions().orExit(logger)
74+
75+
val maybeDowngradedScalaVersion = {
76+
val isDefaultAmmonite = ammonite.contains(true) && ammoniteVersionOpt.isEmpty
77+
extension (s: MaybeScalaVersion)
78+
private def isLts: Boolean = s.versionOpt
79+
.exists(v =>
80+
v.startsWith(Constants.scala3LtsPrefix) ||
81+
ScalaVersionUtil.scala3Lts.contains(v.toLowerCase)
82+
)
83+
baseOptions.scalaOptions.scalaVersion match
84+
case Some(s)
85+
if isDefaultAmmonite && s.isLts && s.versionOpt
86+
.exists(_.coursierVersion > maxAmmoniteScalaLtsVer.coursierVersion) =>
87+
logger.message(
88+
s"Scala ${s.versionOpt.getOrElse(Constants.scala3Lts)} is not yet supported with this version of Ammonite"
89+
)
90+
logger.message(s"Defaulting to Scala $maxAmmoniteScalaLtsVer")
91+
Some(MaybeScalaVersion(maxAmmoniteScalaLtsVer))
92+
case None
93+
if isDefaultAmmonite && maxAmmoniteScalaVer.coursierVersion < defaultScalaVersion.coursierVersion =>
94+
logger.message(
95+
s"Scala $defaultScalaVersion is not yet supported with this version of Ammonite"
96+
)
97+
logger.message(s"Defaulting to Scala $maxAmmoniteScalaVer")
98+
Some(MaybeScalaVersion(maxAmmoniteScalaVer))
99+
case s => s
100+
}
101+
69102
baseOptions.copy(
70-
scalaOptions = baseOptions.scalaOptions.copy(
71-
scalaVersion = baseOptions.scalaOptions.scalaVersion
72-
.orElse {
73-
val shouldDowngrade = {
74-
def needsDowngradeForAmmonite = {
75-
import coursier.core.Version
76-
Version(maxAmmoniteScalaVer) < Version(defaultScalaVersion)
77-
}
78-
ammonite.contains(true) &&
79-
ammoniteVersionOpt.isEmpty &&
80-
needsDowngradeForAmmonite
81-
}
82-
if (shouldDowngrade) {
83-
logger.message(
84-
s"Scala $defaultScalaVersion is not yet supported with this version of Ammonite"
85-
)
86-
logger.message(s"Defaulting to Scala $maxAmmoniteScalaVer")
87-
Some(MaybeScalaVersion(maxAmmoniteScalaVer))
88-
}
89-
else None
90-
}
91-
),
103+
scalaOptions = baseOptions.scalaOptions.copy(scalaVersion = maybeDowngradedScalaVersion),
92104
javaOptions = baseOptions.javaOptions.copy(
93105
javaOpts =
94106
baseOptions.javaOptions.javaOpts ++

modules/cli/src/test/scala/cli/commands/tests/ReplOptionsTests.scala

+5-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
package scala.cli.commands.tests
22

3-
import com.eed3si9n.expecty.Expecty.{assert => expect}
3+
import com.eed3si9n.expecty.Expecty.assert as expect
44

5+
import scala.build.internal.Constants
56
import scala.cli.commands.repl.{Repl, ReplOptions, SharedReplOptions}
67
import scala.cli.commands.shared.{SharedOptions, SharedPythonOptions}
78

@@ -26,8 +27,9 @@ class ReplOptionsTests extends munit.FunSuite {
2627
ammonite = Some(true)
2728
)
2829
)
29-
val maxVersion = "3.1.3"
30-
val buildOptions = Repl.buildOptions0(replOptions, maxVersion)
30+
val maxVersion = "3.1.3"
31+
val maxLtsVersion = Constants.scala3Lts
32+
val buildOptions = Repl.buildOptions0(replOptions, maxVersion, maxLtsVersion)
3133
expect(buildOptions.scalaOptions.scalaVersion.flatMap(_.versionOpt).contains(maxVersion))
3234
}
3335

modules/integration/src/test/scala/scala/cli/integration/ReplAmmoniteTestDefinitions.scala

+8-1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@ trait ReplAmmoniteTestDefinitions { _: ReplTestDefinitions =>
2020
if s.startsWith("2.13") &&
2121
Constants.maxAmmoniteScala213Version.coursierVersion < s.coursierVersion =>
2222
Constants.maxAmmoniteScala213Version
23+
case s
24+
if s.startsWith(Constants.scala3LtsPrefix) &&
25+
Constants.maxAmmoniteScala3LtsVersion.coursierVersion < s.coursierVersion =>
26+
Constants.maxAmmoniteScala3LtsVersion
2327
case s
2428
if s.startsWith("3") &&
2529
Constants.maxAmmoniteScala3Version.coursierVersion < s.coursierVersion =>
@@ -28,7 +32,10 @@ trait ReplAmmoniteTestDefinitions { _: ReplTestDefinitions =>
2832
}
2933

3034
def actualMaxAmmoniteScalaVersion: String =
31-
if (actualScalaVersion.startsWith("3")) Constants.maxAmmoniteScala3Version
35+
if (actualScalaVersion.startsWith(Constants.scala3LtsPrefix))
36+
Constants.maxAmmoniteScala3LtsVersion
37+
else if (actualScalaVersion.startsWith(Constants.scala3NextPrefix))
38+
Constants.maxAmmoniteScala3Version
3239
else if (actualScalaVersion.startsWith("2.13")) Constants.maxAmmoniteScala213Version
3340
else Constants.maxAmmoniteScala212Version
3441

project/deps.sc

+4-3
Original file line numberDiff line numberDiff line change
@@ -54,9 +54,10 @@ object Scala {
5454
(0 until max35).map(i => s"3.5.$i") ++ Seq(scala3Next)
5555
}
5656

57-
def maxAmmoniteScala212Version = scala212
58-
def maxAmmoniteScala213Version = "2.13.14"
59-
def maxAmmoniteScala3Version = "3.5.1"
57+
def maxAmmoniteScala212Version = scala212
58+
def maxAmmoniteScala213Version = "2.13.14"
59+
def maxAmmoniteScala3Version = "3.5.1"
60+
def maxAmmoniteScala3LtsVersion = "3.3.4"
6061
lazy val listMaxAmmoniteScalaVersion =
6162
Seq(maxAmmoniteScala212Version, maxAmmoniteScala213Version, maxAmmoniteScala3Version)
6263
lazy val listAllAmmonite = {

0 commit comments

Comments
 (0)