From e936d1c4e0d998a8e5310f772494b8b568a7c07d Mon Sep 17 00:00:00 2001 From: Yadu Krishnan Date: Thu, 18 Jul 2024 10:55:15 +0200 Subject: [PATCH] BugFix - Export issues when full scala version is not used in directives (#3032) * Fixed resolving scala version when only major/minor part is provided in directives * Added tests for export with different scala versions * Fixed issue with export using the scala version resolved from BuildOptions as per review * scalafmt ran * Update modules/integration/src/test/scala/scala/cli/integration/ExportCommonTestDefinitions.scala Co-authored-by: Piotr Chabelski * Update modules/cli/src/main/scala/scala/cli/exportCmd/MillProjectDescriptor.scala Co-authored-by: Piotr Chabelski * Update modules/cli/src/main/scala/scala/cli/exportCmd/SbtProjectDescriptor.scala Co-authored-by: Piotr Chabelski * Update modules/integration/src/test/scala/scala/cli/integration/ExportTestProjects.scala Co-authored-by: Piotr Chabelski * fixed errors after review comments --------- Co-authored-by: Piotr Chabelski --- .../cli/exportCmd/MillProjectDescriptor.scala | 6 +++--- .../cli/exportCmd/SbtProjectDescriptor.scala | 8 +++++--- .../ExportCommonTestDefinitions.scala | 18 ++++++++++++++++++ .../cli/integration/ExportTestProjects.scala | 10 ++++++++++ .../scala/build/options/ScalaOptions.scala | 1 + 5 files changed, 37 insertions(+), 6 deletions(-) diff --git a/modules/cli/src/main/scala/scala/cli/exportCmd/MillProjectDescriptor.scala b/modules/cli/src/main/scala/scala/cli/exportCmd/MillProjectDescriptor.scala index 9aa9877fa5..4985fa41e6 100644 --- a/modules/cli/src/main/scala/scala/cli/exportCmd/MillProjectDescriptor.scala +++ b/modules/cli/src/main/scala/scala/cli/exportCmd/MillProjectDescriptor.scala @@ -38,9 +38,9 @@ final case class MillProjectDescriptor( options.classPathOptions.allExtraDependencies.toSeq .forall(_.value.nameAttributes == NoAttributes) - val sv = options.scalaOptions.scalaVersion - .flatMap(_.versionOpt) // FIXME If versionOpt is empty, the project is pure Java - .getOrElse(ScalaCli.getDefaultScalaVersion) + val sv = options.scalaParams.toOption.flatten.map(_.scalaVersion).getOrElse( + ScalaCli.getDefaultScalaVersion // FIXME account for pure Java projects, where Scala version isn't defined + ) if (pureJava) MillProject() diff --git a/modules/cli/src/main/scala/scala/cli/exportCmd/SbtProjectDescriptor.scala b/modules/cli/src/main/scala/scala/cli/exportCmd/SbtProjectDescriptor.scala index 1da57d236e..3e1f46ec73 100644 --- a/modules/cli/src/main/scala/scala/cli/exportCmd/SbtProjectDescriptor.scala +++ b/modules/cli/src/main/scala/scala/cli/exportCmd/SbtProjectDescriptor.scala @@ -121,9 +121,11 @@ final case class SbtProjectDescriptor( private def scalaVersionSettings(options: BuildOptions): SbtProject = { val scalaVerSetting = { - val sv = options.scalaOptions.scalaVersion - .flatMap(_.versionOpt) // FIXME If versionOpt is empty, the project is pure Java - .getOrElse(ScalaCli.getDefaultScalaVersion) + + val sv = options.scalaParams.toOption.flatten.map(_.scalaVersion).getOrElse( + ScalaCli.getDefaultScalaVersion // FIXME account for pure Java projects, where Scala version isn't defined + ) + s"""scalaVersion := "$sv"""" } diff --git a/modules/integration/src/test/scala/scala/cli/integration/ExportCommonTestDefinitions.scala b/modules/integration/src/test/scala/scala/cli/integration/ExportCommonTestDefinitions.scala index 7aec73f0e3..c716d55726 100644 --- a/modules/integration/src/test/scala/scala/cli/integration/ExportCommonTestDefinitions.scala +++ b/modules/integration/src/test/scala/scala/cli/integration/ExportCommonTestDefinitions.scala @@ -61,6 +61,16 @@ trait ExportCommonTestDefinitions { _: ScalaCliSuite & TestScalaVersionArgs => expect(output.contains("Hello")) } + protected def scalaVersionTest(scalaVersion: String): Unit = + prepareTestInputs(ExportTestProjects.scalaVersionTest(scalaVersion)).fromRoot { + root => + exportCommand(".").call(cwd = root, stdout = os.Inherit) + val res = buildToolCommand(root, runMainArgs*) + .call(cwd = root / outputDir) + val output = res.out.text(Charset.defaultCharset()) + expect(output.contains("Hello")) + } + def extraSourceFromDirectiveWithExtraDependency(inputs: String*): Unit = prepareTestInputs( ExportTestProjects.extraSourceFromDirectiveWithExtraDependency(actualScalaVersion) @@ -86,6 +96,8 @@ trait ExportCommonTestDefinitions { _: ScalaCliSuite & TestScalaVersionArgs => } } + private val scalaVersionsInDir: Seq[String] = Seq("2.12", "2.13", "2", "3", "3.lts") + if (runExportTests) { test("compile-time only for jsoniter macros") { compileOnlyTest() @@ -105,5 +117,11 @@ trait ExportCommonTestDefinitions { _: ScalaCliSuite & TestScalaVersionArgs => test("extra source passed both via directive and from command line") { extraSourceFromDirectiveWithExtraDependency(".") } + scalaVersionsInDir.foreach { scalaV => + test(s"check export for project with scala version in directive as $scalaV") { + scalaVersionTest(scalaV) + } + } + } } diff --git a/modules/integration/src/test/scala/scala/cli/integration/ExportTestProjects.scala b/modules/integration/src/test/scala/scala/cli/integration/ExportTestProjects.scala index a67b176bfd..77e4352360 100644 --- a/modules/integration/src/test/scala/scala/cli/integration/ExportTestProjects.scala +++ b/modules/integration/src/test/scala/scala/cli/integration/ExportTestProjects.scala @@ -314,4 +314,14 @@ object ExportTestProjects { |} |""".stripMargin ) + + def scalaVersionTest(scalaVersion: String): TestInputs = + TestInputs( + os.rel / "Hello.scala" -> + s"""//> using scala $scalaVersion + |object Main extends App { + | println("Hello") + |} + |""".stripMargin + ) } diff --git a/modules/options/src/main/scala/scala/build/options/ScalaOptions.scala b/modules/options/src/main/scala/scala/build/options/ScalaOptions.scala index 9679a83f71..6f5f959337 100644 --- a/modules/options/src/main/scala/scala/build/options/ScalaOptions.scala +++ b/modules/options/src/main/scala/scala/build/options/ScalaOptions.scala @@ -3,6 +3,7 @@ package scala.build.options import dependency.AnyDependency import scala.build.Positioned +import scala.build.internal.Constants final case class ScalaOptions( scalaVersion: Option[MaybeScalaVersion] = None,