Skip to content

Commit 08d034a

Browse files
committed
Resolve Scala SDK independently for each target
This prepares us for changes in `rules_scala` that will allow customizing the Scala version for each target. In order to achieve that, we can no longer resolve the Scala SDK globally as the maximal version used. We need to use per-target info. Scala SDK will be still discovered based on the compiler class path. Now though we will look into an implicit dependency of each target, the `_scalac`. This change is backward-compatible, as the mentioned data is already available. It is also forward-compatible with the anticipated cross-build feature of `rules_scala`. (see: bazel-contrib/rules_scala#1290) The aspect will produce additional data – namely few compiler classpath jars per Scala target. Perhaps we could review this change in the future to normalize the data back. Now it's not possible, as the data about alternative configurations (here: of scalac) is discarded in the server.
1 parent 86a3f57 commit 08d034a

File tree

5 files changed

+32
-29
lines changed

5 files changed

+32
-29
lines changed

aspects/rules/scala/scala_info.bzl

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,10 @@ def extract_scala_info(target, ctx, output_groups, **kwargs):
4242
# check of _scala_toolchain is necessary, because SCALA_TOOLCHAIN will always be present
4343
if hasattr(ctx.rule.attr, "_scala_toolchain"):
4444
common_scalac_opts = ctx.toolchains[SCALA_TOOLCHAIN].scalacopts
45+
if hasattr(ctx.rule.attr, "_scalac"):
46+
compiler_classpath = find_scalac_classpath(ctx.rule.attr._scalac.default_runfiles.files.to_list())
47+
if compiler_classpath:
48+
scala_info["compiler_classpath"] = map(file_location, compiler_classpath)
4549
else:
4650
common_scalac_opts = []
4751
scala_info["scalac_opts"] = common_scalac_opts + getattr(ctx.rule.attr, "scalacopts", [])

server/src/main/kotlin/org/jetbrains/bsp/bazel/server/sync/BazelProjectMapper.kt

Lines changed: 17 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -179,29 +179,27 @@ class BazelProjectMapper(
179179
private fun calculateScalaLibrariesMapper(targetsToImport: Sequence<TargetInfo>): Map<String, List<Library>> {
180180
val projectLevelScalaSdkLibraries = calculateProjectLevelScalaLibraries()
181181
val scalaTargets = targetsToImport.filter { it.hasScalaTargetInfo() }.map { it.id }
182-
return projectLevelScalaSdkLibraries
183-
?.let { libraries -> scalaTargets.associateWith { libraries } }
184-
.orEmpty()
182+
return scalaTargets.associateWith {
183+
languagePluginsService.scalaLanguagePlugin.scalaSdks[it]?.compilerJars?.mapNotNull {
184+
projectLevelScalaSdkLibraries[it]
185+
}.orEmpty()
186+
}
185187
}
186188

187-
private fun calculateProjectLevelScalaLibraries(): List<Library>? {
188-
val scalaSdkLibrariesJars = getProjectLevelScalaSdkLibrariesJars()
189-
return if (scalaSdkLibrariesJars.isNotEmpty()) {
190-
scalaSdkLibrariesJars.map {
191-
Library(
192-
label = Paths.get(it).name,
193-
outputs = setOf(it),
194-
sources = emptySet(),
195-
dependencies = emptyList()
196-
)
197-
}
198-
} else null
199-
}
189+
private fun calculateProjectLevelScalaLibraries(): Map<URI, Library> =
190+
getProjectLevelScalaSdkLibrariesJars().associateWith {
191+
Library(
192+
label = Paths.get(it).name,
193+
outputs = setOf(it),
194+
sources = emptySet(),
195+
dependencies = emptyList()
196+
)
197+
}
200198

201199
private fun getProjectLevelScalaSdkLibrariesJars(): Set<URI> =
202-
languagePluginsService.scalaLanguagePlugin.scalaSdk
203-
?.compilerJars
204-
?.toSet().orEmpty()
200+
languagePluginsService.scalaLanguagePlugin.scalaSdks.values.toSet().flatMap {
201+
it.compilerJars
202+
}.toSet()
205203

206204
private fun calculateAndroidLibrariesMapper(targetsToImport: Sequence<TargetInfo>): Map<String, List<Library>> =
207205
targetsToImport.mapNotNull { target ->

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,25 +26,25 @@ class ScalaLanguagePlugin(
2626
private val bazelPathsResolver: BazelPathsResolver
2727
) : LanguagePlugin<ScalaModule>() {
2828

29-
var scalaSdk: ScalaSdk? = null
29+
var scalaSdks: Map<String, ScalaSdk> = emptyMap()
3030

3131
override fun prepareSync(targets: Sequence<BspTargetInfo.TargetInfo>) {
32-
scalaSdk = ScalaSdkResolver(bazelPathsResolver).resolve(targets)
32+
scalaSdks = targets.associateBy(
33+
{ it.id },
34+
ScalaSdkResolver(bazelPathsResolver)::resolveSdk
35+
).filterValues{ it != null }.mapValues{ it.value!! }
3336
}
3437

3538
override fun resolveModule(targetInfo: BspTargetInfo.TargetInfo): ScalaModule? {
3639
if (!targetInfo.hasScalaTargetInfo()) {
3740
return null
3841
}
3942
val scalaTargetInfo = targetInfo.scalaTargetInfo
40-
val sdk = getScalaSdkOrThrow()
43+
val sdk = scalaSdks[targetInfo.id] ?: return null
4144
val scalacOpts = scalaTargetInfo.scalacOptsList
4245
return ScalaModule(sdk, scalacOpts, javaLanguagePlugin.resolveModule(targetInfo))
4346
}
4447

45-
private fun getScalaSdkOrThrow(): ScalaSdk =
46-
scalaSdk ?: throw RuntimeException("Failed to resolve Scala SDK for project")
47-
4848
override fun dependencySources(
4949
targetInfo: BspTargetInfo.TargetInfo,
5050
dependencyGraph: DependencyGraph

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,13 @@ class ScalaSdkResolver(private val bazelPathsResolver: BazelPathsResolver) {
1515
.sortedWith(SCALA_VERSION_COMPARATOR)
1616
.lastOrNull()
1717

18-
private fun resolveSdk(targetInfo: BspTargetInfo.TargetInfo): ScalaSdk? {
19-
if (!targetInfo.hasScalaToolchainInfo()) {
18+
fun resolveSdk(targetInfo: BspTargetInfo.TargetInfo): ScalaSdk? {
19+
if (!targetInfo.hasScalaTargetInfo()) {
2020
return null
2121
}
22-
val scalaToolchain = targetInfo.scalaToolchainInfo
22+
val scalaTarget = targetInfo.scalaTargetInfo
2323
val compilerJars =
24-
bazelPathsResolver.resolvePaths(scalaToolchain.compilerClasspathList).sorted()
24+
bazelPathsResolver.resolvePaths(scalaTarget.compilerClasspathList).sorted()
2525
val maybeVersions = compilerJars.mapNotNull(::extractVersion)
2626
if (maybeVersions.none()) {
2727
return null

server/src/main/kotlin/org/jetbrains/bsp/bazel/server/sync/proto/bsp_target_info.proto

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ message JavaRuntimeInfo {
4949

5050
message ScalaTargetInfo {
5151
repeated string scalac_opts = 1;
52+
repeated FileLocation compiler_classpath = 2;
5253
}
5354

5455
message ScalaToolchainInfo {

0 commit comments

Comments
 (0)