Merge pull request #6397 from arixmkii/bsp-env-var

Environment variables support in BSP debug session
This commit is contained in:
eugene yokota 2021-03-19 11:45:01 -04:00 committed by GitHub
commit b8691cba88
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 36 additions and 12 deletions

View File

@ -503,7 +503,10 @@ object BuildServerProtocol {
ErrorCodes.ParseError, ErrorCodes.ParseError,
e.getMessage e.getMessage
) )
case Success(value) => value case Success(value) =>
value.withEnvironmentVariables(
envVars.value.map { case (k, v) => s"$k=$v" }.toVector ++ value.environmentVariables
)
} }
case Some(dataKind) => case Some(dataKind) =>
@ -521,7 +524,8 @@ object BuildServerProtocol {
) )
), ),
runParams.arguments, runParams.arguments,
defaultJvmOptions.toVector defaultJvmOptions.toVector,
envVars.value.map { case (k, v) => s"$k=$v" }.toVector
) )
} }
@ -587,7 +591,12 @@ object BuildServerProtocol {
workingDirectory = Some(baseDirectory.value), workingDirectory = Some(baseDirectory.value),
runJVMOptions = mainClass.jvmOptions, runJVMOptions = mainClass.jvmOptions,
connectInput = connectInput.value, connectInput = connectInput.value,
envVars = envVars.value envVars = mainClass.environmentVariables
.flatMap(_.split("=", 2).toList match {
case key :: value :: Nil => Some(key -> value)
case _ => None
})
.toMap
) )
val runner = new ForkRun(forkOpts) val runner = new ForkRun(forkOpts)
val statusCode = runner val statusCode = runner
@ -649,7 +658,12 @@ object BuildServerProtocol {
private def scalaMainClassesTask: Initialize[Task[ScalaMainClassesItem]] = Def.task { private def scalaMainClassesTask: Initialize[Task[ScalaMainClassesItem]] = Def.task {
val jvmOptions = Keys.javaOptions.value.toVector val jvmOptions = Keys.javaOptions.value.toVector
val mainClasses = Keys.discoveredMainClasses.value.map( val mainClasses = Keys.discoveredMainClasses.value.map(
ScalaMainClass(_, Vector(), jvmOptions) ScalaMainClass(
_,
Vector(),
jvmOptions,
envVars.value.map { case (k, v) => s"$k=$v" }.toVector
)
) )
ScalaMainClassesItem( ScalaMainClassesItem(
bspTargetIdentifier.value, bspTargetIdentifier.value,

View File

@ -8,26 +8,28 @@ package sbt.internal.bsp
* @param class The main class to run. * @param class The main class to run.
* @param arguments The user arguments to the main entrypoint. * @param arguments The user arguments to the main entrypoint.
* @param jvmOptions The jvm options for the application. * @param jvmOptions The jvm options for the application.
* @param environmentVariables Additional environment variables for the application.
*/ */
final class ScalaMainClass private ( final class ScalaMainClass private (
val `class`: String, val `class`: String,
val arguments: Vector[String], val arguments: Vector[String],
val jvmOptions: Vector[String]) extends Serializable { val jvmOptions: Vector[String],
val environmentVariables: Vector[String]) extends Serializable {
override def equals(o: Any): Boolean = this.eq(o.asInstanceOf[AnyRef]) || (o match { override def equals(o: Any): Boolean = this.eq(o.asInstanceOf[AnyRef]) || (o match {
case x: ScalaMainClass => (this.`class` == x.`class`) && (this.arguments == x.arguments) && (this.jvmOptions == x.jvmOptions) case x: ScalaMainClass => (this.`class` == x.`class`) && (this.arguments == x.arguments) && (this.jvmOptions == x.jvmOptions) && (this.environmentVariables == x.environmentVariables)
case _ => false case _ => false
}) })
override def hashCode: Int = { override def hashCode: Int = {
37 * (37 * (37 * (37 * (17 + "sbt.internal.bsp.ScalaMainClass".##) + `class`.##) + arguments.##) + jvmOptions.##) 37 * (37 * (37 * (37 * (37 * (17 + "sbt.internal.bsp.ScalaMainClass".##) + `class`.##) + arguments.##) + jvmOptions.##) + environmentVariables.##)
} }
override def toString: String = { override def toString: String = {
"ScalaMainClass(" + `class` + ", " + arguments + ", " + jvmOptions + ")" "ScalaMainClass(" + `class` + ", " + arguments + ", " + jvmOptions + ", " + environmentVariables + ")"
} }
private[this] def copy(`class`: String = `class`, arguments: Vector[String] = arguments, jvmOptions: Vector[String] = jvmOptions): ScalaMainClass = { private[this] def copy(`class`: String = `class`, arguments: Vector[String] = arguments, jvmOptions: Vector[String] = jvmOptions, environmentVariables: Vector[String] = environmentVariables): ScalaMainClass = {
new ScalaMainClass(`class`, arguments, jvmOptions) new ScalaMainClass(`class`, arguments, jvmOptions, environmentVariables)
} }
def withClass(`class`: String): ScalaMainClass = { def withClass(`class`: String): ScalaMainClass = {
copy(`class` = `class`) copy(`class` = `class`)
@ -38,8 +40,11 @@ final class ScalaMainClass private (
def withJvmOptions(jvmOptions: Vector[String]): ScalaMainClass = { def withJvmOptions(jvmOptions: Vector[String]): ScalaMainClass = {
copy(jvmOptions = jvmOptions) copy(jvmOptions = jvmOptions)
} }
def withEnvironmentVariables(environmentVariables: Vector[String]): ScalaMainClass = {
copy(environmentVariables = environmentVariables)
}
} }
object ScalaMainClass { object ScalaMainClass {
def apply(`class`: String, arguments: Vector[String], jvmOptions: Vector[String]): ScalaMainClass = new ScalaMainClass(`class`, arguments, jvmOptions) def apply(`class`: String, arguments: Vector[String], jvmOptions: Vector[String], environmentVariables: Vector[String]): ScalaMainClass = new ScalaMainClass(`class`, arguments, jvmOptions, environmentVariables)
} }

View File

@ -14,8 +14,9 @@ implicit lazy val ScalaMainClassFormat: JsonFormat[sbt.internal.bsp.ScalaMainCla
val `class` = unbuilder.readField[String]("class") val `class` = unbuilder.readField[String]("class")
val arguments = unbuilder.readField[Vector[String]]("arguments") val arguments = unbuilder.readField[Vector[String]]("arguments")
val jvmOptions = unbuilder.readField[Vector[String]]("jvmOptions") val jvmOptions = unbuilder.readField[Vector[String]]("jvmOptions")
val environmentVariables = unbuilder.readField[Vector[String]]("environmentVariables")
unbuilder.endObject() unbuilder.endObject()
sbt.internal.bsp.ScalaMainClass(`class`, arguments, jvmOptions) sbt.internal.bsp.ScalaMainClass(`class`, arguments, jvmOptions, environmentVariables)
case None => case None =>
deserializationError("Expected JsObject but found None") deserializationError("Expected JsObject but found None")
} }
@ -25,6 +26,7 @@ implicit lazy val ScalaMainClassFormat: JsonFormat[sbt.internal.bsp.ScalaMainCla
builder.addField("class", obj.`class`) builder.addField("class", obj.`class`)
builder.addField("arguments", obj.arguments) builder.addField("arguments", obj.arguments)
builder.addField("jvmOptions", obj.jvmOptions) builder.addField("jvmOptions", obj.jvmOptions)
builder.addField("environmentVariables", obj.environmentVariables)
builder.endObject() builder.endObject()
} }
} }

View File

@ -631,4 +631,7 @@ type ScalaMainClass {
## The jvm options for the application. ## The jvm options for the application.
jvmOptions: [String] jvmOptions: [String]
## Additional environment variables for the application.
environmentVariables: [String]
} }