feat: add optional framework field to the bsp

This commit is contained in:
Kamil Podsiadlo 2022-03-04 10:53:25 +01:00
parent c7f2c046b6
commit 23b50688ba
5 changed files with 48 additions and 19 deletions

View File

@ -419,7 +419,7 @@ object Keys {
val bspBuildTargetScalacOptions = inputKey[Unit]("").withRank(DTask)
val bspBuildTargetScalacOptionsItem = taskKey[ScalacOptionsItem]("").withRank(DTask)
val bspScalaTestClasses = inputKey[Unit]("Corresponds to buildTarget/scalaTestClasses request").withRank(DTask)
val bspScalaTestClassesItem = taskKey[ScalaTestClassesItem]("").withRank(DTask)
val bspScalaTestClassesItem = taskKey[Seq[ScalaTestClassesItem]]("").withRank(DTask)
val bspScalaMainClasses = inputKey[Unit]("Corresponds to buildTarget/scalaMainClasses request").withRank(DTask)
val bspScalaMainClassesItem = taskKey[ScalaMainClassesItem]("").withRank(DTask)
val bspReporter = taskKey[BuildServerReporter]("").withRank(DTask)

View File

@ -242,7 +242,7 @@ object BuildServerProtocol {
val filter = ScopeFilter.in(workspace.scopes.values.toList)
Def.task {
val items = bspScalaTestClassesItem.result.all(filter).value
val successfulItems = anyOrThrow(items)
val successfulItems = anyOrThrow(items).flatten.toVector
val result = ScalaTestClassesResult(successfulItems.toVector, None)
s.respondEvent(result)
}
@ -840,15 +840,30 @@ object BuildServerProtocol {
}
}
private def scalaTestClassesTask: Initialize[Task[ScalaTestClassesItem]] = Def.task {
val testClasses = Keys.definedTests.?.value
.getOrElse(Seq.empty)
.map(_.name)
.toVector
ScalaTestClassesItem(
bspTargetIdentifier.value,
testClasses
)
private def scalaTestClassesTask: Initialize[Task[Seq[ScalaTestClassesItem]]] = Def.task {
Keys.definedTests.?.value match {
case None => Vector.empty
case Some(definitions) =>
val fingerprints = Keys.loadedTestFrameworks.?.value
.getOrElse(Map.empty)
.values
.flatMap { framework =>
framework.fingerprints().map(fingerprint => (fingerprint, framework))
}
.toMap
definitions
.groupBy(defn => fingerprints.get(defn.fingerprint))
.map {
case (framework, definitions) =>
ScalaTestClassesItem(
bspTargetIdentifier.value,
definitions.map(_.name).toVector,
framework.map(_.name())
)
}
.toSeq
}
}
private def scalaMainClassesTask: Initialize[Task[ScalaMainClassesItem]] = Def.task {

View File

@ -7,25 +7,27 @@ package sbt.internal.bsp
/**
* @param target The build target that contains the test classes.
* @param classes The fully qualified names of the test classes in this target
* @param framework The name of the test framework used in test classes.
*/
final class ScalaTestClassesItem private (
val target: sbt.internal.bsp.BuildTargetIdentifier,
val classes: Vector[String]) extends Serializable {
val classes: Vector[String],
val framework: Option[String]) extends Serializable {
override def equals(o: Any): Boolean = this.eq(o.asInstanceOf[AnyRef]) || (o match {
case x: ScalaTestClassesItem => (this.target == x.target) && (this.classes == x.classes)
case x: ScalaTestClassesItem => (this.target == x.target) && (this.classes == x.classes) && (this.framework == x.framework)
case _ => false
})
override def hashCode: Int = {
37 * (37 * (37 * (17 + "sbt.internal.bsp.ScalaTestClassesItem".##) + target.##) + classes.##)
37 * (37 * (37 * (37 * (17 + "sbt.internal.bsp.ScalaTestClassesItem".##) + target.##) + classes.##) + framework.##)
}
override def toString: String = {
"ScalaTestClassesItem(" + target + ", " + classes + ")"
"ScalaTestClassesItem(" + target + ", " + classes + ", " + framework + ")"
}
private[this] def copy(target: sbt.internal.bsp.BuildTargetIdentifier = target, classes: Vector[String] = classes): ScalaTestClassesItem = {
new ScalaTestClassesItem(target, classes)
private[this] def copy(target: sbt.internal.bsp.BuildTargetIdentifier = target, classes: Vector[String] = classes, framework: Option[String] = framework): ScalaTestClassesItem = {
new ScalaTestClassesItem(target, classes, framework)
}
def withTarget(target: sbt.internal.bsp.BuildTargetIdentifier): ScalaTestClassesItem = {
copy(target = target)
@ -33,8 +35,15 @@ final class ScalaTestClassesItem private (
def withClasses(classes: Vector[String]): ScalaTestClassesItem = {
copy(classes = classes)
}
def withFramework(framework: Option[String]): ScalaTestClassesItem = {
copy(framework = framework)
}
def withFramework(framework: String): ScalaTestClassesItem = {
copy(framework = Option(framework))
}
}
object ScalaTestClassesItem {
def apply(target: sbt.internal.bsp.BuildTargetIdentifier, classes: Vector[String]): ScalaTestClassesItem = new ScalaTestClassesItem(target, classes)
def apply(target: sbt.internal.bsp.BuildTargetIdentifier, classes: Vector[String], framework: Option[String]): ScalaTestClassesItem = new ScalaTestClassesItem(target, classes, framework)
def apply(target: sbt.internal.bsp.BuildTargetIdentifier, classes: Vector[String], framework: String): ScalaTestClassesItem = new ScalaTestClassesItem(target, classes, Option(framework))
}

View File

@ -13,8 +13,9 @@ implicit lazy val ScalaTestClassesItemFormat: JsonFormat[sbt.internal.bsp.ScalaT
unbuilder.beginObject(__js)
val target = unbuilder.readField[sbt.internal.bsp.BuildTargetIdentifier]("target")
val classes = unbuilder.readField[Vector[String]]("classes")
val framework = unbuilder.readField[Option[String]]("framework")
unbuilder.endObject()
sbt.internal.bsp.ScalaTestClassesItem(target, classes)
sbt.internal.bsp.ScalaTestClassesItem(target, classes, framework)
case None =>
deserializationError("Expected JsObject but found None")
}
@ -23,6 +24,7 @@ implicit lazy val ScalaTestClassesItemFormat: JsonFormat[sbt.internal.bsp.ScalaT
builder.beginObject()
builder.addField("target", obj.target)
builder.addField("classes", obj.classes)
builder.addField("framework", obj.framework)
builder.endObject()
}
}

View File

@ -636,6 +636,9 @@ type ScalaTestClassesItem {
## The fully qualified names of the test classes in this target
classes: [String]
## The name of the test framework used in test classes.
framework: String
}
## Scala Main Class Request