Skip to content

Commit 62af1e0

Browse files
authored
Merge pull request #29 from pielas/jar_based_scala_version_detection
Detecting scala version using manifest's Bundle-Version in case jar name doesn't contain version
2 parents 1f8f9f2 + 44e771c commit 62af1e0

File tree

1 file changed

+29
-3
lines changed
  • server/server/src/main/kotlin/org/jetbrains/bsp/bazel/server/sync/languages/scala

1 file changed

+29
-3
lines changed

server/server/src/main/kotlin/org/jetbrains/bsp/bazel/server/sync/languages/scala/ScalaSdkResolver.kt

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package org.jetbrains.bsp.bazel.server.sync.languages.scala
33
import org.jetbrains.bsp.bazel.info.BspTargetInfo
44
import org.jetbrains.bsp.bazel.server.paths.BazelPathsResolver
55
import java.nio.file.Path
6+
import java.util.jar.JarFile
67
import java.util.regex.Pattern
78

89
class ScalaSdkResolver(private val bazelPathsResolver: BazelPathsResolver) {
@@ -27,12 +28,36 @@ class ScalaSdkResolver(private val bazelPathsResolver: BazelPathsResolver) {
2728
)
2829
}
2930

30-
private fun extractVersion(path: Path): String? {
31+
private fun extractVersion(path: Path): String? = extractVersionFromPath(path) ?: extractVersionFromJar(path)
32+
33+
private fun extractVersionFromPath(path: Path): String? {
3134
val name = path.fileName.toString()
32-
val matcher = VERSION_PATTERN.matcher(name)
35+
val matcher = PATH_VERSION_PATTERN.matcher(name)
3336
return if (matcher.matches()) matcher.group(1) else null
3437
}
3538

39+
private fun extractVersionFromJar(path: Path): String? {
40+
if (!path.toString().endsWith(".jar")) {
41+
return null
42+
}
43+
44+
try {
45+
JarFile(path.toFile()).use { jar ->
46+
jar.manifest?.mainAttributes?.let { attributes ->
47+
attributes.getValue("Bundle-Version")?.let {
48+
val versionMatcher = JAR_VERSION_PATTERN.matcher(it)
49+
if (versionMatcher.find()) {
50+
return versionMatcher.group(1)
51+
}
52+
}
53+
}
54+
}
55+
} catch (e: Exception) {
56+
e.printStackTrace()
57+
}
58+
return null
59+
}
60+
3661
private fun toBinaryVersion(version: String): String =
3762
version
3863
.split("\\.".toRegex())
@@ -41,7 +66,8 @@ class ScalaSdkResolver(private val bazelPathsResolver: BazelPathsResolver) {
4166
.joinToString(".")
4267

4368
companion object {
44-
private val VERSION_PATTERN =
69+
private val PATH_VERSION_PATTERN =
4570
Pattern.compile("(?:processed_)?scala3?-(?:library|compiler|reflect)(?:_3)?-([.\\d]+)\\.jar")
71+
private val JAR_VERSION_PATTERN = Pattern.compile("(\\d+\\.\\d+\\.\\d+)")
4672
}
4773
}

0 commit comments

Comments
 (0)