Skip to content

Commit

Permalink
Redirect -target:<target> to --jvm, handle ambiguities and make i…
Browse files Browse the repository at this point in the history
…t Scala version independent
  • Loading branch information
Gedochao committed Oct 4, 2022
1 parent 5b024df commit 5a4d2ec
Show file tree
Hide file tree
Showing 4 changed files with 36 additions and 15 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,13 @@ object ScalacOptions {
"-release" // redirected to --jvm
)

/** This includes all the scalac options which are redirected to native Scala CLI options based on
* a prefix
*/
val ScalaCliRedirectedPrefixes = Set(
"-target" // -target:<target> redirected to --jvm <target>
)

private val scalacOptionsArgument: Argument[List[String]] =
new Argument[List[String]] {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,13 +48,14 @@ object JvmUtils {
Seq.empty
}

val releaseOpt = scalacOpts.toScalacOptShadowingSeq.getScalacOption("-release")
val targetOpt = scalacOpts.getScalacPrefixOption("-target")
val jvmIds = jvm.toSeq ++ releaseOpt ++ targetOpt
val jvmIdOpt: Option[String] = value {
jvm -> scalacOpts.toScalacOptShadowingSeq.getScalacOption("-release") match {
case (Some(j1), Some(j2)) if j1 == j2 => Right(Some(j1))
case (Some(j1), Some(j2)) => Left(AmbiguousJvmError(Seq(j1, j2)))
case (Some(j), _) => Right(Some(j))
case (_, Some(j)) => Right(Some(j))
case _ => Right(None)
jvmIds match {
case Seq() => Right(None)
case Seq(j, tail*) if tail.forall(_ == j) => Right(Some(j))
case ids @ _ => Left(AmbiguousJvmError(ids))
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,13 +19,18 @@ object ScalacOptionsUtil {
def toScalacOptShadowingSeq: ShadowingSeq[ScalacOpt] =
ShadowingSeq.from(opts.filter(_.nonEmpty).map(ScalacOpt(_)))

def getScalacPrefixOption(prefixKey: String): Option[String] =
opts.find(_.startsWith(s"$prefixKey:")).map(_.stripPrefix(s"$prefixKey:"))

}

extension (opts: ShadowingSeq[ScalacOpt]) {
def filterScalacOptionKeys(f: String => Boolean): ShadowingSeq[ScalacOpt] =
opts.filterKeys(_.key.exists(f))
def filterNonRedirected: ShadowingSeq[ScalacOpt] =
opts.filterScalacOptionKeys(!ScalacOptions.ScalaCliRedirectedOptions.contains(_))
opts
.filterScalacOptionKeys(!ScalacOptions.ScalaCliRedirectedOptions.contains(_))
.filterScalacOptionKeys(k => !ScalacOptions.ScalaCliRedirectedPrefixes.exists(k.startsWith))
def getScalacOption(key: String): Option[String] =
opts.get(ScalacOpt(key)).headOption.map(_.value)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2556,7 +2556,7 @@ abstract class RunTestDefinitions(val scalaVersionOpt: Option[String])
}
}

test("different jvm values passed to --jvm and -release should produce an error message") {
test("different jvm values passed to --jvm, -release and -target:<target> should fail") {
TestInputs(os.rel / "s.sc" -> """println("Hello")""")
.fromRoot { root =>
val res = os.proc(
Expand All @@ -2566,29 +2566,37 @@ abstract class RunTestDefinitions(val scalaVersionOpt: Option[String])
"8",
"--jvm",
"11",
"-target:9",
extraOptions
).call(cwd = root, check = false, stderr = os.Pipe)
val expectedError =
s"[${Console.RED}error${Console.RESET}] Ambiguous JVM, more than one JVM have been passed: 11, 8."
s"[${Console.RED}error${Console.RESET}] Ambiguous JVM, more than one JVM have been passed: 11, 8, 9."
expect(res.err.trim == expectedError)
}
}

test("-release allows to set the JVM on par with --jvm") {
test("-release and -target allow to set the JVM on par with --jvm") {
val expectedMsg = "Hello"
TestInputs(os.rel / "s.sc" ->
s"""import java.net.http.HttpRequest
|println("$expectedMsg")""".stripMargin)
.fromRoot { root =>
val res8 = os.proc(TestUtil.cli, "s.sc", "-release", "8", extraOptions)
val res8release = os.proc(TestUtil.cli, "s.sc", "-release", "8", extraOptions)
.call(cwd = root, check = false, stderr = os.Pipe)
expect(res8.exitCode == 1)
expect(res8release.exitCode == 1)
val res8target = os.proc(TestUtil.cli, "s.sc", "-target:8", extraOptions)
.call(cwd = root, check = false, stderr = os.Pipe)
expect(res8target.exitCode == 1)
val res8jvm = os.proc(TestUtil.cli, "s.sc", "--jvm", "8", extraOptions)
.call(cwd = root, check = false, stderr = os.Pipe)
expect(res8.err.trim == res8jvm.err.trim)
val res11 = os.proc(TestUtil.cli, "s.sc", "-release", "11", extraOptions)
expect(res8jvm.err.trim == res8release.err.trim)
expect(res8jvm.err.trim == res8target.err.trim)
val res11release = os.proc(TestUtil.cli, "s.sc", "-release", "11", extraOptions)
.call(cwd = root)
expect(res11release.out.trim == expectedMsg)
val res11target = os.proc(TestUtil.cli, "s.sc", "-target:11", extraOptions)
.call(cwd = root)
expect(res11.out.trim == expectedMsg)
expect(res11release.out.trim == res11target.out.trim)
}
}
}

0 comments on commit 5a4d2ec

Please sign in to comment.