From 728e2d36fdae6d48d00cd6b9f4ee175295dc5fc5 Mon Sep 17 00:00:00 2001 From: Piotr Chabelski Date: Mon, 19 Sep 2022 14:58:06 +0200 Subject: [PATCH 1/2] Fix how Scala version is picked so that `2.12.1` is supported and respected --- .../scala/build/options/ScalaVersionUtil.scala | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/modules/options/src/main/scala/scala/build/options/ScalaVersionUtil.scala b/modules/options/src/main/scala/scala/build/options/ScalaVersionUtil.scala index c25482884e..378167b0cb 100644 --- a/modules/options/src/main/scala/scala/build/options/ScalaVersionUtil.scala +++ b/modules/options/src/main/scala/scala/build/options/ScalaVersionUtil.scala @@ -221,13 +221,14 @@ object ScalaVersionUtil { if (filtered.isEmpty) matchingStableVersions else filtered }.filter(v => isSupportedVersion(v.repr)) - if (validMatchingVersions.isEmpty) - Left(new UnsupportedScalaVersionError( - scalaVersionStringArg, - latestSupportedStableVersions - )) - else - Right(validMatchingVersions.max.repr) + + validMatchingVersions.find(_.repr == scalaVersionStringArg) match { + case Some(v) => Right(v.repr) + case None if validMatchingVersions.nonEmpty => Right(validMatchingVersions.max.repr) + case _ => Left( + new UnsupportedScalaVersionError(scalaVersionStringArg, latestSupportedStableVersions) + ) + } } } From 59ab39b9ea374fb032a0f6a2d4dad787019ddf6f Mon Sep 17 00:00:00 2001 From: Piotr Chabelski Date: Mon, 19 Sep 2022 14:59:32 +0200 Subject: [PATCH 2/2] Turn off unsupported `-release` compiler flag on Scala `2.12.x` < `2.12.5` --- .../build/src/main/scala/scala/build/Build.scala | 15 +++++++++++---- .../cli/integration/RunTestDefinitions.scala | 14 ++++++++++++++ .../scala/build/options/ScalaVersionUtil.scala | 7 +++++++ 3 files changed, 32 insertions(+), 4 deletions(-) diff --git a/modules/build/src/main/scala/scala/build/Build.scala b/modules/build/src/main/scala/scala/build/Build.scala index 06ffe02d51..c7ea1237a2 100644 --- a/modules/build/src/main/scala/scala/build/Build.scala +++ b/modules/build/src/main/scala/scala/build/Build.scala @@ -18,13 +18,14 @@ import scala.build.compiler.{ScalaCompiler, ScalaCompilerMaker} import scala.build.errors.* import scala.build.internal.resource.ResourceMapper import scala.build.internal.{Constants, CustomCodeWrapper, MainClass, Util} +import scala.build.options.ScalaVersionUtil.maybeScalaPatchVersion import scala.build.options.* import scala.build.options.validation.ValidationException import scala.build.postprocessing.* import scala.collection.mutable.ListBuffer import scala.concurrent.duration.DurationInt -import scala.util.Properties import scala.util.control.NonFatal +import scala.util.{Properties, Try} trait Build { def inputs: Inputs @@ -825,9 +826,15 @@ object Build { Seq(ScalacOpt("-scalajs")) else Nil - val scalacReleaseV = releaseFlagVersion - .map(v => List("-release", v).map(ScalacOpt(_))) - .getOrElse(Nil) + val scalacReleaseV = + // the -release flag is not supported for Scala 2.12.x < 2.12.5 + if params.scalaVersion.startsWith("2.12") && + params.scalaVersion.maybeScalaPatchVersion.exists(_ < 5) + then Nil + else + releaseFlagVersion + .map(v => List("-release", v).map(ScalacOpt(_))) + .getOrElse(Nil) val scalapyOptions = if ( diff --git a/modules/integration/src/test/scala/scala/cli/integration/RunTestDefinitions.scala b/modules/integration/src/test/scala/scala/cli/integration/RunTestDefinitions.scala index be10eeea68..59c34882be 100644 --- a/modules/integration/src/test/scala/scala/cli/integration/RunTestDefinitions.scala +++ b/modules/integration/src/test/scala/scala/cli/integration/RunTestDefinitions.scala @@ -2380,6 +2380,20 @@ abstract class RunTestDefinitions(val scalaVersionOpt: Option[String]) } } + if (actualScalaVersion.startsWith("2.12.")) + test("verify that Scala version 2.12.x < 2.12.4 is respected and compiles correctly") { + TestInputs(os.rel / "s.sc" -> "println(util.Properties.versionNumberString)").fromRoot { + root => + (1 until 4).foreach { scalaPatchVersion => + val scala212VersionString = s"2.12.$scalaPatchVersion" + val res = + os.proc(TestUtil.cli, "run", ".", "-S", scala212VersionString, TestUtil.extraOptions) + .call(cwd = root) + expect(res.out.trim == scala212VersionString) + } + } + } + def scalapyNativeTest(): Unit = { val inputs = TestInputs( os.rel / "helloscalapy.sc" -> diff --git a/modules/options/src/main/scala/scala/build/options/ScalaVersionUtil.scala b/modules/options/src/main/scala/scala/build/options/ScalaVersionUtil.scala index 378167b0cb..3a9908b7b9 100644 --- a/modules/options/src/main/scala/scala/build/options/ScalaVersionUtil.scala +++ b/modules/options/src/main/scala/scala/build/options/ScalaVersionUtil.scala @@ -19,6 +19,7 @@ import scala.build.errors.{ import scala.build.internal.Regexes.scala2NightlyRegex import scala.build.internal.Util import scala.concurrent.duration.DurationInt +import scala.util.Try import scala.util.control.NonFatal object ScalaVersionUtil { @@ -291,4 +292,10 @@ object ScalaVersionUtil { .distinct } + extension (sv: String) { + def maybeScalaPatchVersion: Option[Int] = sv + .split('.').drop(2).headOption + .flatMap(_.split('-').headOption) + .flatMap(pv => Try(pv.toInt).toOption) + } }