From 6bfd6906b0ab13818f781eabf2aabd6222b31664 Mon Sep 17 00:00:00 2001 From: Piotr Chabelski Date: Thu, 12 Sep 2024 11:57:20 +0200 Subject: [PATCH] Pass `setup-ide` java props to BSP --- modules/cli/src/main/scala/scala/cli/ScalaCli.scala | 5 +++++ .../scala/scala/cli/commands/ScalaCommand.scala | 7 ++++--- .../scala/cli/commands/setupide/SetupIde.scala | 1 + .../scala/cli/integration/BspTestDefinitions.scala | 13 +++++++++++++ 4 files changed, 23 insertions(+), 3 deletions(-) diff --git a/modules/cli/src/main/scala/scala/cli/ScalaCli.scala b/modules/cli/src/main/scala/scala/cli/ScalaCli.scala index 104068dffa..8f4b853380 100644 --- a/modules/cli/src/main/scala/scala/cli/ScalaCli.scala +++ b/modules/cli/src/main/scala/scala/cli/ScalaCli.scala @@ -65,6 +65,10 @@ object ScalaCli { def getDefaultScalaVersion: String = launcherOptions.scalaRunner.cliUserScalaVersion.getOrElse(Constants.defaultScalaVersion) + private var launcherJavaPropArgs: List[String] = List.empty + + def getLauncherJavaPropArgs: List[String] = launcherJavaPropArgs + private def partitionArgs(args: Array[String]): (Array[String], Array[String]) = { val systemProps = args.takeWhile(_.startsWith("-D")) (systemProps, args.drop(systemProps.size)) @@ -294,6 +298,7 @@ object ScalaCli { } } val (systemProps, scalaCliArgs) = partitionArgs(remainingArgs) + if systemProps.nonEmpty then launcherJavaPropArgs = systemProps.toList setSystemProps(systemProps) (new BouncycastleSignerMaker).maybeInit() diff --git a/modules/cli/src/main/scala/scala/cli/commands/ScalaCommand.scala b/modules/cli/src/main/scala/scala/cli/commands/ScalaCommand.scala index 121b3d269a..93693edcae 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/ScalaCommand.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/ScalaCommand.scala @@ -41,9 +41,10 @@ abstract class ScalaCommand[T <: HasGlobalOptions](implicit myParser: Parser[T], private val globalOptionsAtomic: AtomicReference[GlobalOptions] = new AtomicReference(GlobalOptions.default) - private def globalOptions: GlobalOptions = globalOptionsAtomic.get() - protected def launcherOptions: LauncherOptions = ScalaCli.launcherOptions - protected def defaultScalaVersion: String = ScalaCli.getDefaultScalaVersion + private def globalOptions: GlobalOptions = globalOptionsAtomic.get() + protected def launcherOptions: LauncherOptions = ScalaCli.launcherOptions + protected def defaultScalaVersion: String = ScalaCli.getDefaultScalaVersion + protected def launcherJavaPropArgs: List[String] = ScalaCli.getLauncherJavaPropArgs def sharedOptions(t: T): Option[SharedOptions] = // hello borked unused warning None diff --git a/modules/cli/src/main/scala/scala/cli/commands/setupide/SetupIde.scala b/modules/cli/src/main/scala/scala/cli/commands/setupide/SetupIde.scala index 0e196d84b1..1b3aa42ce3 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/setupide/SetupIde.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/setupide/SetupIde.scala @@ -162,6 +162,7 @@ object SetupIde extends ScalaCommand[SetupIdeOptions] { val bspArgs = List(launcher) ++ finalLauncherOptions.toCliArgs ++ + launcherJavaPropArgs ++ List("bsp") ++ debugOpt ++ List("--json-options", scalaCliBspJsonDestination.toString) ++ diff --git a/modules/integration/src/test/scala/scala/cli/integration/BspTestDefinitions.scala b/modules/integration/src/test/scala/scala/cli/integration/BspTestDefinitions.scala index d7255f62e3..bf732018c5 100644 --- a/modules/integration/src/test/scala/scala/cli/integration/BspTestDefinitions.scala +++ b/modules/integration/src/test/scala/scala/cli/integration/BspTestDefinitions.scala @@ -2202,4 +2202,17 @@ abstract class BspTestDefinitions extends ScalaCliSuite with TestScalaVersionArg expect(bspConfig.argv.indexOfSlice(cliVersionArgs) < bspConfig.argv.indexOf("bsp")) } } + + test("setup-ide passes Java props to the BSP configuration correctly") { + val scriptName = "hello.sc" + TestInputs(os.rel / scriptName -> s"""println("Hello")""").fromRoot { root => + val javaProps = List("-Dfoo=bar", "-Dbar=baz") + os.proc(TestUtil.cli, javaProps, "setup-ide", scriptName, extraOptions) + .call(cwd = root) + val bspConfig = readBspConfig(root) + expect(bspConfig.argv.head == TestUtil.cliPath) + expect(bspConfig.argv.containsSlice(javaProps)) + expect(bspConfig.argv.indexOfSlice(javaProps) < bspConfig.argv.indexOf("bsp")) + } + } }