in server/server/src/main/kotlin/org/jetbrains/bazel/server/sync/ClasspathQuery.kt [15:56]
suspend fun classPathQuery(
target: Label,
bspInfo: BspInfo,
bazelRunner: BazelRunner,
workspaceContext: WorkspaceContext,
): BspJvmClasspath {
val queryFile = bspInfo.bazelBspDir.resolve("aspects/runtime_classpath_query.bzl")
val command =
bazelRunner.buildBazelCommand(workspaceContext = workspaceContext, inheritProjectviewOptionsOverride = true) {
cquery {
targets.add(target)
options.addAll(listOf("--starlark:file=$queryFile", "--output=starlark"))
}
}
val cqueryResult =
bazelRunner
.runBazelCommand(command, logProcessOutput = false, serverPidFuture = null)
.waitAndGetResult(ensureAllOutputRead = true)
if (cqueryResult.isNotSuccess) throw RuntimeException("Could not query target '$target' for runtime classpath")
try {
return bazelGson
.fromJson(cqueryResult.stdout.toJson(), JvmClasspath::class.java)
.toProtocolModel()
} catch (e: JsonSyntaxException) {
// sometimes Bazel returns two values to a query when multiple configurations apply to a target
return if (cqueryResult.stdoutLines.size > 1) {
val allOpts =
cqueryResult.stdoutLines.mapNotNull {
try {
bazelGson.fromJson(it, JvmClasspath::class.java)
} catch (_: JsonSyntaxException) {
null
}
}
allOpts
.maxByOrNull { it.runtimeClasspath.size + it.compileClasspath.size }!!
.toProtocolModel()
} else {
throw e
}
}
}