suspend fun classPathQuery()

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
      }
    }
  }