diff --git a/metals/src/main/scala/scala/meta/internal/bsp/BspConnector.scala b/metals/src/main/scala/scala/meta/internal/bsp/BspConnector.scala index 489d64d7020..c662f3f7e0c 100644 --- a/metals/src/main/scala/scala/meta/internal/bsp/BspConnector.scala +++ b/metals/src/main/scala/scala/meta/internal/bsp/BspConnector.scala @@ -35,6 +35,7 @@ class BspConnector( statusBar: StatusBar, bspConfigGenerator: BspConfigGenerator, currentConnection: () => Option[BuildServerConnection], + restartBspServer: () => Future[Boolean], )(implicit ec: ExecutionContext) { /** @@ -100,10 +101,19 @@ class BspConnector( if details.getName() == SbtBuildTool.name => tables.buildServers.chooseServer(SbtBuildTool.name) val shouldReload = SbtBuildTool.writeSbtMetalsPlugins(projectRoot) + def restartSbtBuildServer() = currentConnection() + .withFilter(_.isSbt) + .map(_ => restartBspServer().ignoreValue) + .getOrElse(Future.successful(())) val connectionF = for { _ <- SbtBuildTool(projectRoot, () => userConfiguration) - .ensureCorrectJavaVersion(shellRunner, projectRoot, client) + .ensureCorrectJavaVersion( + shellRunner, + projectRoot, + client, + restartSbtBuildServer, + ) connection <- bspServers.newServer( projectRoot, bspTraceRoot, diff --git a/metals/src/main/scala/scala/meta/internal/builds/SbtBuildTool.scala b/metals/src/main/scala/scala/meta/internal/builds/SbtBuildTool.scala index 26914bbd0c6..ab7b5324ae0 100644 --- a/metals/src/main/scala/scala/meta/internal/builds/SbtBuildTool.scala +++ b/metals/src/main/scala/scala/meta/internal/builds/SbtBuildTool.scala @@ -8,6 +8,7 @@ import java.util.concurrent.TimeoutException import scala.concurrent.ExecutionContext import scala.concurrent.Future +import scala.concurrent.Promise import scala.meta.inputs.Input import scala.meta.internal.metals.MetalsEnrichments._ @@ -196,20 +197,32 @@ case class SbtBuildTool( shellRunner: ShellRunner, workspace: AbsolutePath, languageClient: LanguageClient, + restartSbtBuildServer: () => Future[Unit], )(implicit ex: ExecutionContext): Future[Unit] = if (checkCorrectJavaVersion(workspace, userConfig().javaHome)) { Future.successful(()) } else { - languageClient - .showMessageRequest(Messages.SbtServerJavaHomeUpdate.params()) - .asScala - .flatMap { - case Messages.SbtServerJavaHomeUpdate.restart => - shutdownBspServer(shellRunner).ignoreValue - case _ => Future.successful(()) - } - .withTimeout(10, TimeUnit.SECONDS) - .recover { case _: TimeoutException => Future.successful(()) } + val promise = Promise[Unit]() + val future: Future[Unit] = + languageClient + .showMessageRequest(Messages.SbtServerJavaHomeUpdate.params()) + .asScala + .flatMap { + case Messages.SbtServerJavaHomeUpdate.restart => + if (promise.isCompleted) { + // executes when user chooses `restart` after the timeout + restartSbtBuildServer() + } else shutdownBspServer(shellRunner).ignoreValue + case _ => + promise.trySuccess(()) + Future.successful(()) + } + .withTimeout(15, TimeUnit.SECONDS) + .recover { case _: TimeoutException => + Future.successful(()) + } + future.onComplete(promise.tryComplete(_)) + promise.future } } diff --git a/metals/src/main/scala/scala/meta/internal/metals/MetalsLspService.scala b/metals/src/main/scala/scala/meta/internal/metals/MetalsLspService.scala index 861355bbdd7..5555a1f7556 100644 --- a/metals/src/main/scala/scala/meta/internal/metals/MetalsLspService.scala +++ b/metals/src/main/scala/scala/meta/internal/metals/MetalsLspService.scala @@ -429,6 +429,7 @@ class MetalsLspService( statusBar, bspConfigGenerator, () => bspSession.map(_.mainConnection), + restartBspServer, ) private val workspaceSymbols: WorkspaceSymbolProvider =