From 068fe2ad0acaaa48f5a7ae02c8d3b50069e327da Mon Sep 17 00:00:00 2001 From: Adrien Piquerez Date: Tue, 5 May 2020 17:51:36 +0200 Subject: [PATCH] add BuildServerCapabilities --- .../internal/server/BuildServerProtocol.scala | 3 +- .../bsp/BuildServerCapabilities.scala | 37 +++++++++++++++++ .../sbt/internal/bsp/BuildTarget.scala | 2 + .../sbt/internal/bsp/CompileProvider.scala | 32 +++++++++++++++ .../internal/bsp/InitializeBuildResult.scala | 10 ++--- .../BuildServerCapabilitiesFormats.scala | 27 ++++++++++++ .../bsp/codec/CompileProviderFormats.scala | 27 ++++++++++++ .../codec/InitializeBuildResultFormats.scala | 4 +- .../sbt/internal/bsp/codec/JsonProtocol.scala | 2 + protocol/src/main/contraband/bsp.contra | 41 ++++++++++++++++--- 10 files changed, 172 insertions(+), 13 deletions(-) create mode 100644 protocol/src/main/contraband-scala/sbt/internal/bsp/BuildServerCapabilities.scala create mode 100644 protocol/src/main/contraband-scala/sbt/internal/bsp/CompileProvider.scala create mode 100644 protocol/src/main/contraband-scala/sbt/internal/bsp/codec/BuildServerCapabilitiesFormats.scala create mode 100644 protocol/src/main/contraband-scala/sbt/internal/bsp/codec/CompileProviderFormats.scala diff --git a/main/src/main/scala/sbt/internal/server/BuildServerProtocol.scala b/main/src/main/scala/sbt/internal/server/BuildServerProtocol.scala index ddf9662b6..5f1875dce 100644 --- a/main/src/main/scala/sbt/internal/server/BuildServerProtocol.scala +++ b/main/src/main/scala/sbt/internal/server/BuildServerProtocol.scala @@ -27,7 +27,8 @@ import sjsonnew.support.scalajson.unsafe.Converter object BuildServerProtocol { import sbt.internal.bsp.codec.JsonProtocol._ private val bspVersion = "2.0.0-M5" - private val capabilities = BuildClientCapabilities(languageIds = Vector("scala")) + private val languageIds = Vector("scala") + private val capabilities = BuildServerCapabilities(CompileProvider(languageIds)) lazy val globalSettings: Seq[Def.Setting[_]] = Seq( bspWorkspace := Def.taskDyn { diff --git a/protocol/src/main/contraband-scala/sbt/internal/bsp/BuildServerCapabilities.scala b/protocol/src/main/contraband-scala/sbt/internal/bsp/BuildServerCapabilities.scala new file mode 100644 index 000000000..d7bdb594b --- /dev/null +++ b/protocol/src/main/contraband-scala/sbt/internal/bsp/BuildServerCapabilities.scala @@ -0,0 +1,37 @@ +/** + * This code is generated using [[http://www.scala-sbt.org/contraband/ sbt-contraband]]. + */ + +// DO NOT EDIT MANUALLY +package sbt.internal.bsp +/** @param compileProvider The languages the server supports compilation via method buildTarget/compile. */ +final class BuildServerCapabilities private ( + val compileProvider: Option[sbt.internal.bsp.CompileProvider]) extends Serializable { + + + + override def equals(o: Any): Boolean = o match { + case x: BuildServerCapabilities => (this.compileProvider == x.compileProvider) + case _ => false + } + override def hashCode: Int = { + 37 * (37 * (17 + "sbt.internal.bsp.BuildServerCapabilities".##) + compileProvider.##) + } + override def toString: String = { + "BuildServerCapabilities(" + compileProvider + ")" + } + private[this] def copy(compileProvider: Option[sbt.internal.bsp.CompileProvider] = compileProvider): BuildServerCapabilities = { + new BuildServerCapabilities(compileProvider) + } + def withCompileProvider(compileProvider: Option[sbt.internal.bsp.CompileProvider]): BuildServerCapabilities = { + copy(compileProvider = compileProvider) + } + def withCompileProvider(compileProvider: sbt.internal.bsp.CompileProvider): BuildServerCapabilities = { + copy(compileProvider = Option(compileProvider)) + } +} +object BuildServerCapabilities { + + def apply(compileProvider: Option[sbt.internal.bsp.CompileProvider]): BuildServerCapabilities = new BuildServerCapabilities(compileProvider) + def apply(compileProvider: sbt.internal.bsp.CompileProvider): BuildServerCapabilities = new BuildServerCapabilities(Option(compileProvider)) +} diff --git a/protocol/src/main/contraband-scala/sbt/internal/bsp/BuildTarget.scala b/protocol/src/main/contraband-scala/sbt/internal/bsp/BuildTarget.scala index d1d7e3cbe..efd74fe05 100644 --- a/protocol/src/main/contraband-scala/sbt/internal/bsp/BuildTarget.scala +++ b/protocol/src/main/contraband-scala/sbt/internal/bsp/BuildTarget.scala @@ -21,8 +21,10 @@ package sbt.internal.bsp - display icons or colors in the user interface. Pre-defined tags are listed in `BuildTargetTag` but clients and servers are free to define new tags for custom purposes. + * @param capabilities The capabilities of this build target. * @param languageIds The set of languages that this target contains. The ID string for each language is defined in the LSP. + * @param dependencies The direct upstream build target dependencies of this build target * @param dataKind Kind of data to expect in the `data` field. If this field is not set, the kind of data is not specified. * @param data Language-specific metadata about this target. See ScalaBuildTarget as an example. diff --git a/protocol/src/main/contraband-scala/sbt/internal/bsp/CompileProvider.scala b/protocol/src/main/contraband-scala/sbt/internal/bsp/CompileProvider.scala new file mode 100644 index 000000000..638c55998 --- /dev/null +++ b/protocol/src/main/contraband-scala/sbt/internal/bsp/CompileProvider.scala @@ -0,0 +1,32 @@ +/** + * This code is generated using [[http://www.scala-sbt.org/contraband/ sbt-contraband]]. + */ + +// DO NOT EDIT MANUALLY +package sbt.internal.bsp +final class CompileProvider private ( + val languageIds: Vector[String]) extends Serializable { + + + + override def equals(o: Any): Boolean = o match { + case x: CompileProvider => (this.languageIds == x.languageIds) + case _ => false + } + override def hashCode: Int = { + 37 * (37 * (17 + "sbt.internal.bsp.CompileProvider".##) + languageIds.##) + } + override def toString: String = { + "CompileProvider(" + languageIds + ")" + } + private[this] def copy(languageIds: Vector[String] = languageIds): CompileProvider = { + new CompileProvider(languageIds) + } + def withLanguageIds(languageIds: Vector[String]): CompileProvider = { + copy(languageIds = languageIds) + } +} +object CompileProvider { + + def apply(languageIds: Vector[String]): CompileProvider = new CompileProvider(languageIds) +} diff --git a/protocol/src/main/contraband-scala/sbt/internal/bsp/InitializeBuildResult.scala b/protocol/src/main/contraband-scala/sbt/internal/bsp/InitializeBuildResult.scala index 7eb8c7e98..1c7413563 100644 --- a/protocol/src/main/contraband-scala/sbt/internal/bsp/InitializeBuildResult.scala +++ b/protocol/src/main/contraband-scala/sbt/internal/bsp/InitializeBuildResult.scala @@ -15,7 +15,7 @@ final class InitializeBuildResult private ( val displayName: String, val version: String, val bspVersion: String, - val capabilities: sbt.internal.bsp.BuildClientCapabilities, + val capabilities: sbt.internal.bsp.BuildServerCapabilities, val data: Option[sjsonnew.shaded.scalajson.ast.unsafe.JValue]) extends Serializable { @@ -30,7 +30,7 @@ final class InitializeBuildResult private ( override def toString: String = { "InitializeBuildResult(" + displayName + ", " + version + ", " + bspVersion + ", " + capabilities + ", " + data + ")" } - private[this] def copy(displayName: String = displayName, version: String = version, bspVersion: String = bspVersion, capabilities: sbt.internal.bsp.BuildClientCapabilities = capabilities, data: Option[sjsonnew.shaded.scalajson.ast.unsafe.JValue] = data): InitializeBuildResult = { + private[this] def copy(displayName: String = displayName, version: String = version, bspVersion: String = bspVersion, capabilities: sbt.internal.bsp.BuildServerCapabilities = capabilities, data: Option[sjsonnew.shaded.scalajson.ast.unsafe.JValue] = data): InitializeBuildResult = { new InitializeBuildResult(displayName, version, bspVersion, capabilities, data) } def withDisplayName(displayName: String): InitializeBuildResult = { @@ -42,7 +42,7 @@ final class InitializeBuildResult private ( def withBspVersion(bspVersion: String): InitializeBuildResult = { copy(bspVersion = bspVersion) } - def withCapabilities(capabilities: sbt.internal.bsp.BuildClientCapabilities): InitializeBuildResult = { + def withCapabilities(capabilities: sbt.internal.bsp.BuildServerCapabilities): InitializeBuildResult = { copy(capabilities = capabilities) } def withData(data: Option[sjsonnew.shaded.scalajson.ast.unsafe.JValue]): InitializeBuildResult = { @@ -54,6 +54,6 @@ final class InitializeBuildResult private ( } object InitializeBuildResult { - def apply(displayName: String, version: String, bspVersion: String, capabilities: sbt.internal.bsp.BuildClientCapabilities, data: Option[sjsonnew.shaded.scalajson.ast.unsafe.JValue]): InitializeBuildResult = new InitializeBuildResult(displayName, version, bspVersion, capabilities, data) - def apply(displayName: String, version: String, bspVersion: String, capabilities: sbt.internal.bsp.BuildClientCapabilities, data: sjsonnew.shaded.scalajson.ast.unsafe.JValue): InitializeBuildResult = new InitializeBuildResult(displayName, version, bspVersion, capabilities, Option(data)) + def apply(displayName: String, version: String, bspVersion: String, capabilities: sbt.internal.bsp.BuildServerCapabilities, data: Option[sjsonnew.shaded.scalajson.ast.unsafe.JValue]): InitializeBuildResult = new InitializeBuildResult(displayName, version, bspVersion, capabilities, data) + def apply(displayName: String, version: String, bspVersion: String, capabilities: sbt.internal.bsp.BuildServerCapabilities, data: sjsonnew.shaded.scalajson.ast.unsafe.JValue): InitializeBuildResult = new InitializeBuildResult(displayName, version, bspVersion, capabilities, Option(data)) } diff --git a/protocol/src/main/contraband-scala/sbt/internal/bsp/codec/BuildServerCapabilitiesFormats.scala b/protocol/src/main/contraband-scala/sbt/internal/bsp/codec/BuildServerCapabilitiesFormats.scala new file mode 100644 index 000000000..f0603903d --- /dev/null +++ b/protocol/src/main/contraband-scala/sbt/internal/bsp/codec/BuildServerCapabilitiesFormats.scala @@ -0,0 +1,27 @@ +/** + * This code is generated using [[http://www.scala-sbt.org/contraband/ sbt-contraband]]. + */ + +// DO NOT EDIT MANUALLY +package sbt.internal.bsp.codec +import _root_.sjsonnew.{ Unbuilder, Builder, JsonFormat, deserializationError } +trait BuildServerCapabilitiesFormats { self: sbt.internal.bsp.codec.CompileProviderFormats with sjsonnew.BasicJsonProtocol => +implicit lazy val BuildServerCapabilitiesFormat: JsonFormat[sbt.internal.bsp.BuildServerCapabilities] = new JsonFormat[sbt.internal.bsp.BuildServerCapabilities] { + override def read[J](__jsOpt: Option[J], unbuilder: Unbuilder[J]): sbt.internal.bsp.BuildServerCapabilities = { + __jsOpt match { + case Some(__js) => + unbuilder.beginObject(__js) + val compileProvider = unbuilder.readField[Option[sbt.internal.bsp.CompileProvider]]("compileProvider") + unbuilder.endObject() + sbt.internal.bsp.BuildServerCapabilities(compileProvider) + case None => + deserializationError("Expected JsObject but found None") + } + } + override def write[J](obj: sbt.internal.bsp.BuildServerCapabilities, builder: Builder[J]): Unit = { + builder.beginObject() + builder.addField("compileProvider", obj.compileProvider) + builder.endObject() + } +} +} diff --git a/protocol/src/main/contraband-scala/sbt/internal/bsp/codec/CompileProviderFormats.scala b/protocol/src/main/contraband-scala/sbt/internal/bsp/codec/CompileProviderFormats.scala new file mode 100644 index 000000000..1dbbf1ff0 --- /dev/null +++ b/protocol/src/main/contraband-scala/sbt/internal/bsp/codec/CompileProviderFormats.scala @@ -0,0 +1,27 @@ +/** + * This code is generated using [[http://www.scala-sbt.org/contraband/ sbt-contraband]]. + */ + +// DO NOT EDIT MANUALLY +package sbt.internal.bsp.codec +import _root_.sjsonnew.{ Unbuilder, Builder, JsonFormat, deserializationError } +trait CompileProviderFormats { self: sjsonnew.BasicJsonProtocol => +implicit lazy val CompileProviderFormat: JsonFormat[sbt.internal.bsp.CompileProvider] = new JsonFormat[sbt.internal.bsp.CompileProvider] { + override def read[J](__jsOpt: Option[J], unbuilder: Unbuilder[J]): sbt.internal.bsp.CompileProvider = { + __jsOpt match { + case Some(__js) => + unbuilder.beginObject(__js) + val languageIds = unbuilder.readField[Vector[String]]("languageIds") + unbuilder.endObject() + sbt.internal.bsp.CompileProvider(languageIds) + case None => + deserializationError("Expected JsObject but found None") + } + } + override def write[J](obj: sbt.internal.bsp.CompileProvider, builder: Builder[J]): Unit = { + builder.beginObject() + builder.addField("languageIds", obj.languageIds) + builder.endObject() + } +} +} diff --git a/protocol/src/main/contraband-scala/sbt/internal/bsp/codec/InitializeBuildResultFormats.scala b/protocol/src/main/contraband-scala/sbt/internal/bsp/codec/InitializeBuildResultFormats.scala index 9ecb59118..1b555b42c 100644 --- a/protocol/src/main/contraband-scala/sbt/internal/bsp/codec/InitializeBuildResultFormats.scala +++ b/protocol/src/main/contraband-scala/sbt/internal/bsp/codec/InitializeBuildResultFormats.scala @@ -5,7 +5,7 @@ // DO NOT EDIT MANUALLY package sbt.internal.bsp.codec import _root_.sjsonnew.{ Unbuilder, Builder, JsonFormat, deserializationError } -trait InitializeBuildResultFormats { self: sbt.internal.bsp.codec.BuildClientCapabilitiesFormats with sbt.internal.util.codec.JValueFormats with sjsonnew.BasicJsonProtocol => +trait InitializeBuildResultFormats { self: sbt.internal.bsp.codec.BuildServerCapabilitiesFormats with sbt.internal.util.codec.JValueFormats with sjsonnew.BasicJsonProtocol => implicit lazy val InitializeBuildResultFormat: JsonFormat[sbt.internal.bsp.InitializeBuildResult] = new JsonFormat[sbt.internal.bsp.InitializeBuildResult] { override def read[J](__jsOpt: Option[J], unbuilder: Unbuilder[J]): sbt.internal.bsp.InitializeBuildResult = { __jsOpt match { @@ -14,7 +14,7 @@ implicit lazy val InitializeBuildResultFormat: JsonFormat[sbt.internal.bsp.Initi val displayName = unbuilder.readField[String]("displayName") val version = unbuilder.readField[String]("version") val bspVersion = unbuilder.readField[String]("bspVersion") - val capabilities = unbuilder.readField[sbt.internal.bsp.BuildClientCapabilities]("capabilities") + val capabilities = unbuilder.readField[sbt.internal.bsp.BuildServerCapabilities]("capabilities") val data = unbuilder.readField[Option[sjsonnew.shaded.scalajson.ast.unsafe.JValue]]("data") unbuilder.endObject() sbt.internal.bsp.InitializeBuildResult(displayName, version, bspVersion, capabilities, data) diff --git a/protocol/src/main/contraband-scala/sbt/internal/bsp/codec/JsonProtocol.scala b/protocol/src/main/contraband-scala/sbt/internal/bsp/codec/JsonProtocol.scala index ccef86a85..cd7453496 100644 --- a/protocol/src/main/contraband-scala/sbt/internal/bsp/codec/JsonProtocol.scala +++ b/protocol/src/main/contraband-scala/sbt/internal/bsp/codec/JsonProtocol.scala @@ -16,6 +16,8 @@ trait JsonProtocol extends sjsonnew.BasicJsonProtocol with sbt.internal.bsp.codec.DiagnosticFormats with sbt.internal.bsp.codec.BuildClientCapabilitiesFormats with sbt.internal.bsp.codec.InitializeBuildParamsFormats + with sbt.internal.bsp.codec.CompileProviderFormats + with sbt.internal.bsp.codec.BuildServerCapabilitiesFormats with sbt.internal.bsp.codec.InitializeBuildResultFormats with sbt.internal.bsp.codec.PublishDiagnosticsParamsFormats with sbt.internal.bsp.codec.WorkspaceBuildTargetsResultFormats diff --git a/protocol/src/main/contraband/bsp.contra b/protocol/src/main/contraband/bsp.contra index a61b1581a..d90e3392d 100644 --- a/protocol/src/main/contraband/bsp.contra +++ b/protocol/src/main/contraband/bsp.contra @@ -28,14 +28,14 @@ type BuildTarget { ## are free to define new tags for custom purposes. tags: [String] - # The capabilities of this build target. + ## The capabilities of this build target. capabilities: sbt.internal.bsp.BuildTargetCapabilities! ## The set of languages that this target contains. ## The ID string for each language is defined in the LSP. languageIds: [String] - # The direct upstream build target dependencies of this build target + ## The direct upstream build target dependencies of this build target dependencies: [sbt.internal.bsp.BuildTargetIdentifier] ## Kind of data to expect in the `data` field. If this field is not set, the kind of data is not specified. @@ -158,12 +158,43 @@ type InitializeBuildResult { bspVersion: String! ## The capabilities of the build server - capabilities: sbt.internal.bsp.BuildClientCapabilities! + capabilities: sbt.internal.bsp.BuildServerCapabilities! ## Additional metadata about the server data: sjsonnew.shaded.scalajson.ast.unsafe.JValue } +type BuildServerCapabilities { + ## The languages the server supports compilation via method buildTarget/compile. + compileProvider: sbt.internal.bsp.CompileProvider + + # The languages the server supports test execution via method buildTarget/test + # testProvider: TestProvider + + # The languages the server supports run via method buildTarget/run + # runProvider: RunProvider + + # The server can provide a list of targets that contain a + # single text document via the method buildTarget/inverseSources + # inverseSourcesProvider: Boolean + + # The server provides sources for library dependencies + # via method buildTarget/dependencySources + # dependencySourcesProvider: Boolean + + # The server provides all the resource dependencies + # via method buildTarget/resources + # resourcesProvider: Boolean + + # The server sends notifications to the client on build + # target change events via buildTarget/didChange + # buildTargetChangedProvider: Boolean +} + +type CompileProvider { + languageIds: [String] +} + ## Publish Diagnostics type PublishDiagnosticsParams { ## The document where the diagnostics are published. @@ -235,10 +266,10 @@ type TaskStartParams { ## Optional message describing the task. message: String - ## Kind of data to expect in the `data` field. + # Kind of data to expect in the `data` field. # dataKind: String - ## Optional metadata about the task. + # Optional metadata about the task. # data: Any }