diff --git a/main/src/main/scala/sbt/internal/CrossJava.scala b/main/src/main/scala/sbt/internal/CrossJava.scala index 0e156a4c1..eea281007 100644 --- a/main/src/main/scala/sbt/internal/CrossJava.scala +++ b/main/src/main/scala/sbt/internal/CrossJava.scala @@ -477,18 +477,34 @@ private[sbt] object CrossJava { if (s eq null) "" else s - // expand Java versions to 1-20 to 1.x, and vice versa to accept both "1.8" and "8" - private val oneDot = Map((1L to 20L).toVector flatMap { i => - Vector(Vector(i) -> Vector(1L, i), Vector(1L, i) -> Vector(i)) - }: _*) - def expandJavaHomes(hs: Map[String, File]): Map[String, File] = - hs flatMap { + def expandJavaHomes(hs: Map[String, File]): Map[String, File] = { + val parsed = hs map { + case (k, v) => JavaVersion(k) -> v + } + // first ignore vnd + val withAndWithoutVnd = parsed flatMap { case (k, v) => - val jv = JavaVersion(k) - if (oneDot.contains(jv.numbers)) - Vector(k -> v, jv.withNumbers(oneDot(jv.numbers)).toString -> v) + if (k.vendor.isDefined) Vector(k -> v, k.withVendor(None) -> v) else Vector(k -> v) } + val normalizeNumbers = withAndWithoutVnd flatMap { + case (k, v) => + k.numbers match { + case Vector(1L, minor, _*) => + Vector(k -> v, k.withNumbers(Vector(minor)) -> v) + case Vector(major) if major > 1 => + Vector(k -> v, k.withNumbers(Vector(1L, major)) -> v) + case Vector(major, minor, _*) if major > 1 => + Vector(k -> v, k.withNumbers(Vector(major)) -> v, k.withNumbers(Vector(1L, major)) -> v) + case _ => + Vector(k -> v) + } + } + val result: Map[String, File] = normalizeNumbers map { + case (k, v) => (k.toString -> v) + } + result + } def wrapNull(a: Array[String]): Vector[String] = if (a eq null) Vector() diff --git a/main/src/test/scala/sbt/internal/CrossJavaTest.scala b/main/src/test/scala/sbt/internal/CrossJavaTest.scala index e5f402af2..2a9aba62b 100644 --- a/main/src/test/scala/sbt/internal/CrossJavaTest.scala +++ b/main/src/test/scala/sbt/internal/CrossJavaTest.scala @@ -10,6 +10,7 @@ package internal import org.scalatest._ import sbt.internal.CrossJava.JavaDiscoverConfig._ +import scala.collection.immutable.ListMap class CrossJavaTest extends FunSuite with DiagrammedAssertions { test("The Java home selector should select the most recent") { @@ -85,6 +86,14 @@ class CrossJavaTest extends FunSuite with DiagrammedAssertions { assert(file.getName == "11.0.2.hs-adpt") } + test("expandJavaHomes") { + val conf = new SdkmanDiscoverConfig { + override def candidates() = Vector("11.0.2.hs-adpt") + } + val hs = CrossJava.expandJavaHomes(ListMap(conf.javaHomes: _*)) + assert(hs.contains("11")) + } + test("SDKMAN candidate parsing") { assert( CrossJava