@@ -3,6 +3,7 @@ package org.jetbrains.bsp.bazel.server.sync.languages.scala
33import org.jetbrains.bsp.bazel.info.BspTargetInfo
44import org.jetbrains.bsp.bazel.server.paths.BazelPathsResolver
55import java.nio.file.Path
6+ import java.util.jar.JarFile
67import java.util.regex.Pattern
78
89class 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