From 37c33b75aa6e9296cf4bd78ff6d408bd6f482fff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20=C5=BBarnowski?= Date: Wed, 4 Dec 2019 10:43:12 +0100 Subject: [PATCH] Don't wait for output prefix if it is already present --- .../metals/debug/DebuggeeOutput.scala | 24 ++++++++++++------- .../internal/metals/debug/TestDebugger.scala | 5 ++-- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/tests/unit/src/main/scala/scala/meta/internal/metals/debug/DebuggeeOutput.scala b/tests/unit/src/main/scala/scala/meta/internal/metals/debug/DebuggeeOutput.scala index 2273ca936ea..b7abe25ae04 100644 --- a/tests/unit/src/main/scala/scala/meta/internal/metals/debug/DebuggeeOutput.scala +++ b/tests/unit/src/main/scala/scala/meta/internal/metals/debug/DebuggeeOutput.scala @@ -3,13 +3,13 @@ package scala.meta.internal.metals.debug import scala.collection.mutable import scala.concurrent.Future import scala.concurrent.Promise -import scala.meta.internal.metals.debug.DebuggeeOutput.OutputListener +import scala.meta.internal.metals.debug.DebuggeeOutput.PrefixPattern final class DebuggeeOutput { private val output = new StringBuilder - @volatile private var listeners = mutable.Buffer.empty[OutputListener] + @volatile private var listeners = mutable.Buffer.empty[PrefixPattern] - def apply(): String = output.toString() + def apply(): String = synchronized(output.toString()) def append(message: String): Unit = synchronized { output.append(message) @@ -18,15 +18,19 @@ final class DebuggeeOutput { listeners = remaining } - def awaitPrefix(category: String, prefix: String): Future[Unit] = { - val promise = Promise[Unit]() - listeners.append(new OutputListener(prefix, promise)) - promise.future + def awaitPrefix(prefix: String): Future[Unit] = synchronized { + if (output.startsWith(prefix)) { + Future.unit + } else { + val promise = Promise[Unit]() + listeners.append(new PrefixPattern(prefix, promise)) + promise.future + } } } object DebuggeeOutput { - protected final class OutputListener(prefix: String, promise: Promise[Unit]) { + protected final class PrefixPattern(prefix: String, promise: Promise[Unit]) { def matches(output: String): Boolean = { if (output.startsWith(prefix)) { promise.success(()) @@ -35,5 +39,9 @@ object DebuggeeOutput { false } } + + def foo(): Unit = { + promise.success(()) + } } } diff --git a/tests/unit/src/main/scala/scala/meta/internal/metals/debug/TestDebugger.scala b/tests/unit/src/main/scala/scala/meta/internal/metals/debug/TestDebugger.scala index 6ea0f493054..53b021ac344 100644 --- a/tests/unit/src/main/scala/scala/meta/internal/metals/debug/TestDebugger.scala +++ b/tests/unit/src/main/scala/scala/meta/internal/metals/debug/TestDebugger.scala @@ -60,11 +60,12 @@ final class TestDebugger(connect: RemoteServer.Listener => Debugger)( import org.eclipse.lsp4j.debug.{OutputEventArgumentsCategory => Category} ifNotFailed { output - .awaitPrefix(Category.STDOUT, prefix) + .awaitPrefix(prefix) .withTimeout(seconds, TimeUnit.SECONDS) .recoverWith { case timeout: TimeoutException => - val error = s"No prefix [$prefix] in [${output()}]" + val error = + s"No prefix [${prefix.getBytes()}] in [${output().getBytes()}]" Future.failed(new Exception(error, timeout)) } }