From 614b836214d763c31404307519f7d3f558f3f336 Mon Sep 17 00:00:00 2001 From: Tomasz Godzik Date: Thu, 5 Sep 2024 15:53:47 +0200 Subject: [PATCH] bugfix: Fix duplicate options detection Fixes https://github.com/VirtusLab/scala-cli/issues/2708 Previously, for some of the options we would not deduplicate at all instead of using the full value. Now, for keys that can be added multiple times with different values we deduplicate the full option. --- .../scala/scala/build/tests/BuildTests.scala | 22 +++++++++++++++---- .../scala/scala/build/options/ScalacOpt.scala | 5 +++-- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/modules/build/src/test/scala/scala/build/tests/BuildTests.scala b/modules/build/src/test/scala/scala/build/tests/BuildTests.scala index 47a9ed9ca8..b940c103ae 100644 --- a/modules/build/src/test/scala/scala/build/tests/BuildTests.scala +++ b/modules/build/src/test/scala/scala/build/tests/BuildTests.scala @@ -625,10 +625,24 @@ abstract class BuildTests(server: Boolean) extends TestUtil.ScalaCliBuildSuite { } test("cli scalac options shadowing using directives") { - val cliScalacOptions = Seq("-Xmaxwarns", "4", "-g:source") - val usingDirectiveScalacOptions = Seq("-nobootcp", "-Xmaxwarns", "5", "-g:none") + val cliScalacOptions = Seq("-Xmaxwarns", "4", "-g:source", "-language:no2AutoTupling") + val usingDirectiveScalacOptions = Seq( + "-nobootcp", + "-Xmaxwarns", + "5", + "-g:none", + "-language:no2AutoTupling", + "-language:strictEquality" + ) - val expectedOptions = Seq("-Xmaxwarns", "4", "-g:source", "-nobootcp") + val expectedOptions = Seq( + "-Xmaxwarns", + "4", + "-g:source", + "-language:no2AutoTupling", + "-nobootcp", + "-language:strictEquality" + ) val inputs = TestInputs( os.rel / "foo.scala" -> @@ -650,7 +664,7 @@ abstract class BuildTests(server: Boolean) extends TestUtil.ScalaCliBuildSuite { assert(maybeBuild.isRight) val build = maybeBuild.toOption.get val scalacOptions = build.options.scalaOptions.scalacOptions.toSeq.map(_.value.value) - expect(scalacOptions == expectedOptions) + assertEquals(scalacOptions, expectedOptions) } } diff --git a/modules/options/src/main/scala/scala/build/options/ScalacOpt.scala b/modules/options/src/main/scala/scala/build/options/ScalacOpt.scala index 466142bb62..f158461491 100644 --- a/modules/options/src/main/scala/scala/build/options/ScalacOpt.scala +++ b/modules/options/src/main/scala/scala/build/options/ScalacOpt.scala @@ -8,8 +8,9 @@ final case class ScalacOpt(value: String) { else Some("@").filter(value.startsWith) /** @return raw key for the option (only if the key can be shadowed from the CLI) */ - private[options] def shadowableKey: Option[String] = - key.filterNot(key => ScalacOpt.repeatingKeys.exists(_.startsWith(key))) + private[options] def shadowableKey: Option[String] = key match + case Some(key) if ScalacOpt.repeatingKeys.exists(_.startsWith(key)) => Some(value) + case otherwise => otherwise } object ScalacOpt {