From b5afcf8a0ce5ae8c1d7063b4b7eb69d1f12cb51a Mon Sep 17 00:00:00 2001 From: Adrien Piquerez Date: Tue, 19 Mar 2024 16:16:47 +0100 Subject: [PATCH] Fix server completion tests --- .gitignore | 3 +-- main-settings/src/main/scala/sbt/Structure.scala | 2 -- main/src/main/scala/sbt/Defaults.scala | 10 ++++++---- .../sbt/internal/server/BuildServerProtocol.scala | 14 +++++++------- .../internal/server/LanguageServerProtocol.scala | 1 - server-test/src/server-test/completions/build.sbt | 1 + .../test/_global/_global/definedTestNames/data | 0 .../test/scala/testpkg/ServerCompletionsTest.scala | 2 -- .../src/test/scala/testpkg/TestServer.scala | 5 ++--- 9 files changed, 17 insertions(+), 21 deletions(-) rename server-test/src/server-test/completions/target/{ => out/jvm/scala-3.3.1/completions}/streams/test/_global/_global/definedTestNames/data (100%) diff --git a/.gitignore b/.gitignore index d2a0e91e5..8b8d533f0 100644 --- a/.gitignore +++ b/.gitignore @@ -1,12 +1,11 @@ target/ __pycache__ -out node_modules vscode-sbt-scala/client/server npm-debug.log *.vsix *_pid*.log -!sbt/src/server-test/completions/target +!server-test/src/server-test/completions/target .big .idea .bloop diff --git a/main-settings/src/main/scala/sbt/Structure.scala b/main-settings/src/main/scala/sbt/Structure.scala index 5579b520c..3e507179e 100644 --- a/main-settings/src/main/scala/sbt/Structure.scala +++ b/main-settings/src/main/scala/sbt/Structure.scala @@ -403,8 +403,6 @@ object Scoped: )((thisTask, deps) => thisTask.dependsOn(deps: _*)) def failure: Initialize[Task[Incomplete]] = init(_.failure) def result: Initialize[Task[Result[A1]]] = init(_.result) - def xtriggeredBy[A2](tasks: Initialize[Task[A2]]*): Initialize[Task[A1]] = - nonLocal(tasks.toSeq.asInstanceOf[Seq[AnyInitTask]], Def.triggeredBy) def triggeredBy[A2](tasks: Initialize[Task[A2]]*): Initialize[Task[A1]] = nonLocal(tasks.toSeq.asInstanceOf[Seq[AnyInitTask]], Def.triggeredBy) def runBefore[A2](tasks: Initialize[Task[A2]]*): Initialize[Task[A1]] = diff --git a/main/src/main/scala/sbt/Defaults.scala b/main/src/main/scala/sbt/Defaults.scala index 340b45800..b78b94a63 100644 --- a/main/src/main/scala/sbt/Defaults.scala +++ b/main/src/main/scala/sbt/Defaults.scala @@ -1007,7 +1007,7 @@ object Defaults extends BuildCommon { discoveredMainClasses := compile .map(discoverMainClasses) .storeAs(discoveredMainClasses) - .xtriggeredBy(compile) + .triggeredBy(compile) .value, discoveredSbtPlugins := discoverSbtPluginNames.value, // This fork options, scoped to the configuration is used for tests @@ -1268,9 +1268,11 @@ object Defaults extends BuildCommon { testFrameworks.value.flatMap(f => f.create(loader, log).map(x => (f, x))).toMap }, definedTests := detectTests.value, - definedTestNames := (definedTests map (_.map( - _.name - ).distinct) storeAs definedTestNames triggeredBy compile).value, + definedTestNames := definedTests + .map(_.map(_.name).distinct) + .storeAs(definedTestNames) + .triggeredBy(compile) + .value, testQuick / testFilter := testQuickFilter.value, executeTests := { import sbt.TupleSyntax.* diff --git a/main/src/main/scala/sbt/internal/server/BuildServerProtocol.scala b/main/src/main/scala/sbt/internal/server/BuildServerProtocol.scala index 64cb80157..3e29b1fe6 100644 --- a/main/src/main/scala/sbt/internal/server/BuildServerProtocol.scala +++ b/main/src/main/scala/sbt/internal/server/BuildServerProtocol.scala @@ -39,7 +39,7 @@ import java.util.concurrent.atomic.AtomicBoolean import scala.collection.mutable import scala.util.control.NonFatal -import scala.util.{ Failure, Success } +import scala.util.{ Try, Failure, Success } import scala.annotation.nowarn import sbt.testing.Framework @@ -790,12 +790,12 @@ object BuildServerProtocol { } } - private val jsonParser: Parser[JValue] = (Parsers.any.*).map(_.mkString) - .map(JsonParser.parseUnsafe) + private val jsonParser: Parser[Try[JValue]] = Parsers.any.*.map(_.mkString) + .map(JsonParser.parseFromString) private def bspRunTask: Def.Initialize[InputTask[Unit]] = - Def.input((s: State) => jsonParser).flatMapTask { json => - val runParams = Converter.fromJson[RunParams](json).get + Def.input(_ => jsonParser).flatMapTask { json => + val runParams = json.flatMap(Converter.fromJson[RunParams]).get val defaultClass = Keys.mainClass.value val defaultJvmOptions = Keys.javaOptions.value @@ -837,8 +837,8 @@ object BuildServerProtocol { } private def bspTestTask: Def.Initialize[InputTask[Unit]] = - Def.input((s: State) => jsonParser).flatMapTask { json => - val testParams = Converter.fromJson[TestParams](json).get + Def.input(_ => jsonParser).flatMapTask { json => + val testParams = json.flatMap(Converter.fromJson[TestParams]).get val workspace = bspFullWorkspace.value val resultTask: Def.Initialize[Task[Result[Seq[Unit]]]] = testParams.dataKind match { diff --git a/main/src/main/scala/sbt/internal/server/LanguageServerProtocol.scala b/main/src/main/scala/sbt/internal/server/LanguageServerProtocol.scala index 8279c2fbb..c21b88764 100644 --- a/main/src/main/scala/sbt/internal/server/LanguageServerProtocol.scala +++ b/main/src/main/scala/sbt/internal/server/LanguageServerProtocol.scala @@ -84,7 +84,6 @@ private[sbt] object LanguageServerProtocol { onCancellationRequest(Option(r.id), param) case r: JsonRpcRequestMessage if r.method == "sbt/completion" => - import sbt.protocol.codec.JsonProtocol._ val param = Converter.fromJson[CP](json(r)).get onCompletionRequest(Option(r.id), param) diff --git a/server-test/src/server-test/completions/build.sbt b/server-test/src/server-test/completions/build.sbt index 90de9d529..c4918e8d5 100644 --- a/server-test/src/server-test/completions/build.sbt +++ b/server-test/src/server-test/completions/build.sbt @@ -1,4 +1,5 @@ val hello = taskKey[Unit]("Say hello") +scalaVersion := "3.3.1" hello := {} diff --git a/server-test/src/server-test/completions/target/streams/test/_global/_global/definedTestNames/data b/server-test/src/server-test/completions/target/out/jvm/scala-3.3.1/completions/streams/test/_global/_global/definedTestNames/data similarity index 100% rename from server-test/src/server-test/completions/target/streams/test/_global/_global/definedTestNames/data rename to server-test/src/server-test/completions/target/out/jvm/scala-3.3.1/completions/streams/test/_global/_global/definedTestNames/data diff --git a/server-test/src/test/scala/testpkg/ServerCompletionsTest.scala b/server-test/src/test/scala/testpkg/ServerCompletionsTest.scala index fc88619c0..2165de63d 100644 --- a/server-test/src/test/scala/testpkg/ServerCompletionsTest.scala +++ b/server-test/src/test/scala/testpkg/ServerCompletionsTest.scala @@ -14,7 +14,6 @@ class ServerCompletionsTest extends AbstractServerTest { override val testDirectory: String = "completions" test("return basic completions on request") { - pending // TODO fix completion request failed val completionStr = """{ "query": "" }""" svr.sendJsonRpc( s"""{ "jsonrpc": "2.0", "id": 15, "method": "sbt/completion", "params": $completionStr }""" @@ -35,7 +34,6 @@ class ServerCompletionsTest extends AbstractServerTest { } test("return completions for user classes") { - pending // TODO fix empty items val completionStr = """{ "query": "testOnly org." }""" svr.sendJsonRpc( s"""{ "jsonrpc": "2.0", "id": 17, "method": "sbt/completion", "params": $completionStr }""" diff --git a/server-test/src/test/scala/testpkg/TestServer.scala b/server-test/src/test/scala/testpkg/TestServer.scala index b1dccae3a..98d04630a 100644 --- a/server-test/src/test/scala/testpkg/TestServer.scala +++ b/server-test/src/test/scala/testpkg/TestServer.scala @@ -183,6 +183,7 @@ case class TestServer( try IO.read(portfile).isEmpty catch { case _: IOException => true } def waitForPortfile(duration: FiniteDuration): Unit = { + hostLog(s"wait $duration until the server is ready to respond") val deadline = duration.fromNow var nextLog = 10.seconds.fromNow while (portfileIsEmpty() && !deadline.isOverdue && process.isAlive) { @@ -195,9 +196,7 @@ case class TestServer( if (deadline.isOverdue) sys.error(s"Timeout. $portfile is not found.") if (!process.isAlive) sys.error(s"Server unexpectedly terminated.") } - private val waitDuration: FiniteDuration = 1.minute - hostLog(s"wait $waitDuration until the server is ready to respond") - waitForPortfile(waitDuration) + waitForPortfile(1.minute) @tailrec private def connect(attempt: Int): Socket = {