From a539cd131fba118270c22d947d226a706c2a1314 Mon Sep 17 00:00:00 2001 From: Tomasz Godzik Date: Wed, 29 Jun 2022 18:54:11 +0200 Subject: [PATCH] bugfix: Allow to run using DAP in Java only projects --- .../scala/bloop/bsp/BloopBspServices.scala | 5 +- .../scala/bloop/dap/BloopDebuggeeRunner.scala | 143 ++++++++---------- .../scala/bloop/dap/DebugServerSpec.scala | 4 +- 3 files changed, 66 insertions(+), 86 deletions(-) diff --git a/frontend/src/main/scala/bloop/bsp/BloopBspServices.scala b/frontend/src/main/scala/bloop/bsp/BloopBspServices.scala index 78bb10c8ef..c19a06a863 100644 --- a/frontend/src/main/scala/bloop/bsp/BloopBspServices.scala +++ b/frontend/src/main/scala/bloop/bsp/BloopBspServices.scala @@ -631,10 +631,7 @@ final class BloopBspServices( } ) case bsp.DebugSessionParamsDataKind.ScalaAttachRemote => - BloopDebuggeeRunner.forAttachRemote(state, ioScheduler, projects) match { - case Right(adapter) => Right(adapter) - case Left(error) => Left(JsonRpcResponse.invalidRequest(error)) - } + Right(BloopDebuggeeRunner.forAttachRemote(state, ioScheduler, projects)) case dataKind => Left(JsonRpcResponse.invalidRequest(s"Unsupported data kind: $dataKind")) } } diff --git a/frontend/src/main/scala/bloop/dap/BloopDebuggeeRunner.scala b/frontend/src/main/scala/bloop/dap/BloopDebuggeeRunner.scala index af95724aae..b4e179b6cf 100644 --- a/frontend/src/main/scala/bloop/dap/BloopDebuggeeRunner.scala +++ b/frontend/src/main/scala/bloop/dap/BloopDebuggeeRunner.scala @@ -27,8 +27,14 @@ import bloop.testing.TestInternals import monix.eval.Task import monix.execution.Scheduler -abstract class BloopDebuggeeRunner(initialState: State, ioScheduler: Scheduler) - extends DebuggeeRunner { +abstract class BloopDebuggeeRunner( + initialState: State, + ioScheduler: Scheduler, + debugeeScalaVersion: Option[String] +) extends DebuggeeRunner { + + // The version doesn't matter for project without Scala version (Java only) + val scalaVersion = debugeeScalaVersion.getOrElse("2.13.8") override def run(listener: DebuggeeListener): CancelableFuture[Unit] = { val debugSessionLogger = new DebuggeeLogger(listener, initialState.logger) @@ -52,8 +58,8 @@ private final class MainClassDebugAdapter( initialState: State, ioScheduler: Scheduler, override val classPath: Seq[Path], - val scalaVersion: String -) extends BloopDebuggeeRunner(initialState, ioScheduler) { + val debugeeScalaVersion: Option[String] +) extends BloopDebuggeeRunner(initialState, ioScheduler, debugeeScalaVersion) { val javaRuntime: Option[JavaRuntime] = JavaRuntime(env.javaHome.underlying) def name: String = s"${getClass.getSimpleName}(${project.name}, ${mainClass.`class`})" def start(state: State, listener: DebuggeeListener): Task[ExitStatus] = { @@ -86,8 +92,8 @@ private final class TestSuiteDebugAdapter( initialState: State, ioScheduler: Scheduler, override val classPath: Seq[Path], - val scalaVersion: String -) extends BloopDebuggeeRunner(initialState, ioScheduler) { + val debugeeScalaVersion: Option[String] +) extends BloopDebuggeeRunner(initialState, ioScheduler, debugeeScalaVersion) { override def name: String = { val projectsStr = projects.map(_.bspUri).mkString("[", ", ", "]") val selectedTests = testClasses.suites @@ -123,8 +129,8 @@ private final class AttachRemoteDebugAdapter( initialState: State, ioScheduler: Scheduler, override val classPath: Seq[Path], - val scalaVersion: String -) extends BloopDebuggeeRunner(initialState, ioScheduler) { + val debugeeScalaVersion: Option[String] +) extends BloopDebuggeeRunner(initialState, ioScheduler, debugeeScalaVersion) { override def name: String = s"${getClass.getSimpleName}(${initialState.build.origin})" override def start(state: State, listener: DebuggeeListener): Task[ExitStatus] = Task( ExitStatus.Ok @@ -133,10 +139,6 @@ private final class AttachRemoteDebugAdapter( object BloopDebuggeeRunner { - private def noScalaVersion: Left[String, DebuggeeRunner] = Left( - "No scala version specified for the project" - ) - def forMainClass( projects: Seq[Project], mainClass: ScalaMainClass, @@ -146,8 +148,8 @@ object BloopDebuggeeRunner { projects match { case Seq() => Left(s"No projects specified for main class: [$mainClass]") case Seq(project) => - (project.platform, project.scalaInstance) match { - case (jvm: Platform.Jvm, Some(scalaInstance)) => + project.platform match { + case jvm: Platform.Jvm => val classPathEntries = getClassPathEntries(state, project) val evaluationClassLoader = getEvaluationClassLoader(project, state) val classpath = getClasspath(state, project) @@ -161,12 +163,10 @@ object BloopDebuggeeRunner { state, ioScheduler, classpath, - scalaInstance.version + project.scalaInstance.map(_.version) ) ) - case (_, None) => - noScalaVersion - case (platform, _) => + case platform => Left(s"Unsupported platform: ${platform.getClass.getSimpleName}") } case projects => Left(s"Multiple projects specified for main class [$mainClass]: $projects") @@ -188,41 +188,35 @@ object BloopDebuggeeRunner { val javaRuntime = JavaRuntime(config.javaHome.underlying) val evaluationClassLoader = getEvaluationClassLoader(project, state) val classpath = getClasspath(state, project) - project.scalaInstance.fold[Either[String, DebuggeeRunner]]( - noScalaVersion - ) { scalaInstance => - Right( - new TestSuiteDebugAdapter( - projects, - testClasses, - classPathEntries, - javaRuntime, - evaluationClassLoader, - state, - ioScheduler, - classpath, - scalaInstance.version - ) + Right( + new TestSuiteDebugAdapter( + projects, + testClasses, + classPathEntries, + javaRuntime, + evaluationClassLoader, + state, + ioScheduler, + classpath, + project.scalaInstance.map(_.version) ) - } + ) + case project :: _ => - project.scalaInstance.fold[Either[String, DebuggeeRunner]]( - noScalaVersion - ) { scalaInstance => - Right( - new TestSuiteDebugAdapter( - projects, - testClasses, - Seq.empty, - None, - None, - state, - ioScheduler, - Seq.empty, - scalaInstance.version - ) + Right( + new TestSuiteDebugAdapter( + projects, + testClasses, + Seq.empty, + None, + None, + state, + ioScheduler, + Seq.empty, + project.scalaInstance.map(_.version) ) - } + ) + } } @@ -230,7 +224,7 @@ object BloopDebuggeeRunner { state: State, ioScheduler: Scheduler, projects: Seq[Project] - ): Either[String, DebuggeeRunner] = { + ): DebuggeeRunner = { projects match { case Seq(project) if project.platform.isInstanceOf[Platform.Jvm] => val Platform.Jvm(config, _, _, _, _, _) = project.platform @@ -238,36 +232,25 @@ object BloopDebuggeeRunner { val javaRuntime = JavaRuntime(config.javaHome.underlying) val evaluationClassLoader = getEvaluationClassLoader(project, state) val classpath = getClasspath(state, project) - project.scalaInstance.fold[Either[String, DebuggeeRunner]](noScalaVersion) { - scalaInstance => - Right( - new AttachRemoteDebugAdapter( - classPathEntries, - javaRuntime, - evaluationClassLoader, - state, - ioScheduler, - classpath, - scalaInstance.version - ) - ) - } + new AttachRemoteDebugAdapter( + classPathEntries, + javaRuntime, + evaluationClassLoader, + state, + ioScheduler, + classpath, + project.scalaInstance.map(_.version) + ) case projects => - projects.headOption - .flatMap(_.scalaInstance) - .fold[Either[String, DebuggeeRunner]](noScalaVersion) { scalaInstance => - Right( - new AttachRemoteDebugAdapter( - Seq.empty, - None, - None, - state, - ioScheduler, - Seq.empty, - scalaInstance.version - ) - ) - } + new AttachRemoteDebugAdapter( + Seq.empty, + None, + None, + state, + ioScheduler, + Seq.empty, + projects.headOption.flatMap(_.scalaInstance).map(_.version) + ) } } diff --git a/frontend/src/test/scala/bloop/dap/DebugServerSpec.scala b/frontend/src/test/scala/bloop/dap/DebugServerSpec.scala index 14d753c039..a608628e05 100644 --- a/frontend/src/test/scala/bloop/dap/DebugServerSpec.scala +++ b/frontend/src/test/scala/bloop/dap/DebugServerSpec.scala @@ -547,7 +547,7 @@ object DebugServerSpec extends DebugBspBaseSuite { val `Main.scala` = srcFor("Main.scala") val breakpoints = breakpointsArgs(`Main.scala`, 3) - val Right(attachRemoteProcessRunner) = + val attachRemoteProcessRunner = BloopDebuggeeRunner.forAttachRemote( state.compile(project).toTestState.state, defaultScheduler, @@ -755,7 +755,7 @@ object DebugServerSpec extends DebugBspBaseSuite { val `Main.scala` = srcFor("Main.scala") val breakpoints = breakpointsArgs(`Main.scala`, 4) - val Right(attachRemoteProcessRunner) = + val attachRemoteProcessRunner = BloopDebuggeeRunner.forAttachRemote( testState.state, defaultScheduler,