From f460b18f320942186caf9cfa58ba839185d8b0bf Mon Sep 17 00:00:00 2001 From: Katarzyna Marek Date: Tue, 20 Jun 2023 16:16:43 +0100 Subject: [PATCH] on disconnect kill scala-cli --- .../internal/metals/MetalsLspService.scala | 50 ++++++++++--------- .../scala/tests/scalacli/ScalaCliSuite.scala | 27 +++++----- 2 files changed, 39 insertions(+), 38 deletions(-) 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 acd156262b4..07f8fa770b1 100644 --- a/metals/src/main/scala/scala/meta/internal/metals/MetalsLspService.scala +++ b/metals/src/main/scala/scala/meta/internal/metals/MetalsLspService.scala @@ -1944,16 +1944,7 @@ class MetalsLspService( tables.buildServers.chooseServer(ScalaCliBuildTool.name) quickConnectToBuildServer() case Some(digest) if isBloopOrEmpty => - for { - _ <- - if (scalaCli.loaded(folder)) scalaCli.stop() - else Future.successful(()) - buildChange <- slowConnectToBloopServer( - forceImport, - buildTool, - digest, - ) - } yield buildChange + slowConnectToBloopServer(forceImport, buildTool, digest) case Some(digest) => indexer.reloadWorkspaceAndIndex( forceImport, @@ -2083,6 +2074,8 @@ class MetalsLspService( case other => Future.successful(other) } + val scalaCliPath = scalaCli.path + (for { _ <- disconnectOldBuildServer() maybeSession <- timerProvider.timed("Connected to build server", true) { @@ -2101,6 +2094,12 @@ class MetalsLspService( case None => Future.successful(BuildChange.None) } + _ <- scalaCliPath + .collectFirst { + case path if (!conflictsWithMainBsp(path.toNIO)) => + scalaCli.start(path) + } + .getOrElse(Future.successful(())) _ = initTreeView() } yield result) .recover { case NonFatal(e) => @@ -2123,13 +2122,16 @@ class MetalsLspService( scribe.info(s"Disconnecting from ${connection.main.name} session...") ) - bspSession match { - case None => Future.successful(()) - case Some(session) => - bspSession = None - mainBuildTargetsData.resetConnections(List.empty) - session.shutdown() - } + for { + _ <- scalaCli.stop() + _ <- bspSession match { + case None => Future.successful(()) + case Some(session) => + bspSession = None + mainBuildTargetsData.resetConnections(List.empty) + session.shutdown() + } + } yield () } private def importBuild(session: BspSession) = { @@ -2458,15 +2460,15 @@ class MetalsLspService( private def scalaCliDirOrFile(path: AbsolutePath): AbsolutePath = { val dir = path.parent val nioDir = dir.toNIO - val conflictsWithMainBsp = - buildTargets.sourceItems.filter(_.exists).exists { item => - val nioItem = item.toNIO - nioDir.startsWith(nioItem) || nioItem.startsWith(nioDir) - } - - if (conflictsWithMainBsp) path else dir + if (conflictsWithMainBsp(nioDir)) path else dir } + private def conflictsWithMainBsp(nioDir: Path) = + buildTargets.sourceItems.filter(_.exists).exists { item => + val nioItem = item.toNIO + nioDir.startsWith(nioItem) || nioItem.startsWith(nioDir) + } + def maybeImportScript(path: AbsolutePath): Option[Future[Unit]] = { val scalaCliPath = scalaCliDirOrFile(path) if ( diff --git a/tests/slow/src/test/scala/tests/scalacli/ScalaCliSuite.scala b/tests/slow/src/test/scala/tests/scalacli/ScalaCliSuite.scala index 64c3ae912d4..3b779697a68 100644 --- a/tests/slow/src/test/scala/tests/scalacli/ScalaCliSuite.scala +++ b/tests/slow/src/test/scala/tests/scalacli/ScalaCliSuite.scala @@ -184,21 +184,20 @@ class ScalaCliSuite extends BaseScalaCliSuite(V.scala3) { } yield () } - test("connecting-scalacli-as-fallback") { - cleanWorkspace() - FileLayout.fromString(simpleFileLayout, workspace) - for { - _ <- server.initialize() - _ <- server.initialized() - _ <- server.server.indexingPromise.future - _ <- server.didOpen("MyTests.scala") - _ <- assertDefinitionAtLocation( - "MyTests.scala", - "new Fo@@o", - "foo.sc", - ) - } yield () + cleanWorkspace() + FileLayout.fromString(simpleFileLayout, workspace) + for { + _ <- server.initialize() + _ <- server.initialized() + _ <- server.server.indexingPromise.future + _ <- server.didOpen("MyTests.scala") + _ <- assertDefinitionAtLocation( + "MyTests.scala", + "new Fo@@o", + "foo.sc", + ) + } yield () } test("relative-semanticdb-root") {