Skip to content

Commit b50afb9

Browse files
committed
feat: use the new ScalaAction from BSP4J
This is a simplified version of VirtusLab#1969 that gets rid of the `ActionableDiagnostic` that is used internally and instead just ensures that any time a `TextEdit` is created there is a `title`. Then we take all the information already contained in the `Diagnostic` and make a `ScalaAction` from it to be forwarded via the diagnostic data.
1 parent 3e9da63 commit b50afb9

File tree

10 files changed

+43
-39
lines changed

10 files changed

+43
-39
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,4 @@ out/
77
.bsp
88
.scala-build
99
dest/
10+
target/

modules/build/src/main/scala/scala/build/bsp/BspClient.scala

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package scala.build.bsp
22

3+
import ch.epfl.scala.bsp4j.{ScalaAction, ScalaDiagnostic, ScalaTextEdit, ScalaWorkspaceEdit}
34
import ch.epfl.scala.bsp4j as b
5+
import com.google.gson.Gson
46

57
import java.lang.Boolean as JBoolean
68
import java.net.URI
@@ -229,9 +231,16 @@ class BspClient(
229231
new b.Diagnostic(range, diag.message)
230232

231233
diag.textEdit.foreach { textEdit =>
232-
val bTextEdit = TextEdit(range, textEdit.newText)
233-
bDiag.setData(bTextEdit.toJsonTree())
234+
val bScalaTextEdit = new ScalaTextEdit(range, textEdit.newText)
235+
val bScalaWorkspaceEdit = new ScalaWorkspaceEdit(List(bScalaTextEdit).asJava)
236+
val bAction = new ScalaAction(textEdit.title)
237+
bAction.setEdit(bScalaWorkspaceEdit)
238+
val bScalaDiagnostic = new ScalaDiagnostic
239+
bScalaDiagnostic.setActions(List(bAction).asJava)
240+
bDiag.setData("scala")
241+
bDiag.setData(new Gson().toJsonTree(bScalaDiagnostic))
234242
}
243+
235244
bDiag.setSeverity(diag.severity.toBsp4j)
236245
bDiag.setSource("scala-cli")
237246
val params = new b.PublishDiagnosticsParams(

modules/build/src/main/scala/scala/build/bsp/package.scala

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,17 @@
11
package scala.build
22

3-
import ch.epfl.scala.bsp4j.SourcesItem
3+
import ch.epfl.scala.bsp4j.{
4+
ScalaAction,
5+
ScalaDiagnostic,
6+
ScalaTextEdit,
7+
ScalaWorkspaceEdit,
8+
SourcesItem
9+
}
410
import ch.epfl.scala.bsp4j as b
511

612
import java.util.concurrent.CompletableFuture
713

14+
import scala.build.errors.Diagnostic
815
import scala.jdk.CollectionConverters.*
916

1017
package object bsp {

modules/build/src/test/scala/scala/build/tests/ActionableDiagnosticTests.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import scala.build.actionable.ActionableDiagnostic.*
1010
import scala.build.Position.File
1111
import coursier.core.Version
1212

13-
import scala.build.errors.{BuildException, CompositeBuildException, UnsupportedAmmoniteImportError}
13+
import scala.build.errors.{BuildException, CompositeBuildException}
1414

1515
class ActionableDiagnosticTests extends munit.FunSuite {
1616

modules/core/src/main/scala/scala/build/errors/Diagnostic.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ trait Diagnostic {
1111
}
1212

1313
object Diagnostic {
14-
case class TextEdit(newText: String)
14+
case class TextEdit(title: String, newText: String)
1515
object Messages {
1616
val bloopTooOld =
1717
"JVM that is hosting bloop is older than the requested runtime. Please run command `bloop exit`, and then use `--jvm` flag to restart Bloop"

modules/core/src/main/scala/scala/build/errors/UnsupportedAmmoniteImportError.scala

Lines changed: 0 additions & 12 deletions
This file was deleted.

modules/integration/src/test/scala/scala/cli/integration/BspTestDefinitions.scala

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1345,16 +1345,22 @@ abstract class BspTestDefinitions(val scalaVersionOpt: Option[String])
13451345
strictlyCheckMessage = false
13461346
)
13471347

1348-
val textEdit = new Gson().fromJson[TextEdit](
1348+
val scalaDiagnostic = new Gson().fromJson[b.ScalaDiagnostic](
13491349
updateActionableDiagnostic.getData().asInstanceOf[JsonElement],
1350-
classOf[TextEdit]
1350+
classOf[b.ScalaDiagnostic]
13511351
)
13521352

1353-
expect(textEdit.newText.contains("com.lihaoyi::os-lib:"))
1354-
expect(textEdit.range.getStart.getLine == 0)
1355-
expect(textEdit.range.getStart.getCharacter == 15)
1356-
expect(textEdit.range.getEnd.getLine == 0)
1357-
expect(textEdit.range.getEnd.getCharacter == 40)
1353+
val actions = scalaDiagnostic.getActions().asScala
1354+
assert(actions.size == 1)
1355+
val changes = actions.head.getEdit().getChanges().asScala
1356+
assert(changes.size == 1)
1357+
val textEdit = changes.head
1358+
1359+
expect(textEdit.getNewText().contains("com.lihaoyi::os-lib:"))
1360+
expect(textEdit.getRange().getStart.getLine == 0)
1361+
expect(textEdit.getRange().getStart.getCharacter == 15)
1362+
expect(textEdit.getRange().getEnd.getLine == 0)
1363+
expect(textEdit.getRange().getEnd.getCharacter == 40)
13581364
}
13591365
}
13601366
}

modules/options/src/main/scala/scala/build/actionable/ActionableDiagnostic.scala

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,6 @@ import scala.build.Position
66
import scala.build.errors.Diagnostic.TextEdit
77
import scala.build.errors.{Diagnostic, Severity}
88

9-
abstract class ActionableDiagnostic extends Diagnostic {
10-
11-
/** Provide the new content which will be replaced by actionable diagnostic
12-
*/
13-
def suggestion: String
14-
15-
override def severity = Severity.Hint
16-
17-
override def textEdit: Option[TextEdit] = Some(TextEdit(suggestion))
18-
}
19-
209
object ActionableDiagnostic {
2110

2211
case class ActionableDependencyUpdateDiagnostic(
@@ -25,9 +14,13 @@ object ActionableDiagnostic {
2514
newVersion: String,
2615
dependencyModuleName: String,
2716
suggestion: String
28-
) extends ActionableDiagnostic {
17+
) extends Diagnostic {
2918
override def message: String =
3019
s"""|"$dependencyModuleName is outdated, update to $newVersion"
3120
| $dependencyModuleName $currentVersion -> $suggestion""".stripMargin
21+
22+
override def textEdit: Option[TextEdit] = Some(TextEdit(message, suggestion))
23+
24+
override def severity: Severity = Severity.Hint
3225
}
3326
}

modules/options/src/main/scala/scala/build/actionable/ActionableHandler.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@ package scala.build.actionable
22

33
import scala.build.Logger
44
import scala.build.Ops.*
5-
import scala.build.errors.{BuildException, CompositeBuildException}
5+
import scala.build.errors.{BuildException, CompositeBuildException, Diagnostic}
66
import scala.build.options.BuildOptions
77

8-
trait ActionableHandler[A <: ActionableDiagnostic] {
8+
trait ActionableHandler[A <: Diagnostic] {
99

1010
/** Type of setting used to generate actionable diagnostic
1111
*/

modules/options/src/main/scala/scala/build/actionable/ActionablePreprocessor.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ object ActionablePreprocessor {
1111

1212
def generateActionableDiagnostics(
1313
options: BuildOptions
14-
): Either[BuildException, Seq[ActionableDiagnostic]] =
14+
): Either[BuildException, Seq[Diagnostic]] =
1515
actionableHandlers
1616
.map(handler => handler.createActionableDiagnostics(options))
1717
.sequence

0 commit comments

Comments
 (0)