From 5d81f2c3d136d166376293237b19f179b5f7695b Mon Sep 17 00:00:00 2001 From: Alec Theriault Date: Wed, 7 May 2025 06:10:34 -0400 Subject: [PATCH] fix: BSP error status code in more cases Ensures that `buildTarget/compile` returns a `StatusCode.Error` instead of a JSON-RPC error even when the compile error is buried deeper in the `Incomplete` causes. Fixes #8104 --- .../internal/server/BuildServerProtocol.scala | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/main/src/main/scala/sbt/internal/server/BuildServerProtocol.scala b/main/src/main/scala/sbt/internal/server/BuildServerProtocol.scala index 9bb371a78..d2c812167 100644 --- a/main/src/main/scala/sbt/internal/server/BuildServerProtocol.scala +++ b/main/src/main/scala/sbt/internal/server/BuildServerProtocol.scala @@ -789,11 +789,19 @@ object BuildServerProtocol { Keys.compile.result.value match { case Value(_) => StatusCode.Success case Inc(cause) => - cause.getCause match { - case _: CompileFailed => StatusCode.Error - case _: InterruptedException => StatusCode.Cancelled - case err => throw cause + var statusCodeOpt: Option[Int] + def updateCode(code: Int): Unit = + statusCodeOpt = Some(statusCodeOpt match { + case None => code + case Some(oldCode) => oldCode.max(code) + }) + + Incomplete.visitAll(cause.getCause) { + case _: CompileFailed => updateCode(StatusCode.Error) + case _: InterruptedException => updateCode(StatusCode.Cancelled) } + + statusCodeOpt.getOrElse(throw cause) } }