diff --git a/metals/src/main/scala/scala/meta/internal/builds/BuildTools.scala b/metals/src/main/scala/scala/meta/internal/builds/BuildTools.scala index d4b887940c8..620d0b53173 100644 --- a/metals/src/main/scala/scala/meta/internal/builds/BuildTools.scala +++ b/metals/src/main/scala/scala/meta/internal/builds/BuildTools.scala @@ -11,6 +11,8 @@ import scala.meta.internal.metals.MetalsEnrichments._ import scala.meta.internal.metals.UserConfiguration import scala.meta.io.AbsolutePath +import ujson.ParsingFailedException + /** * Detects what build tool is used in this workspace. * @@ -80,13 +82,17 @@ final class BuildTools( def scalaCliProject: Option[AbsolutePath] = searchForBuildTool(_.resolve("project.scala").isFile) .orElse { - ScalaCliBspScope.scalaCliBspRoot(workspace) match { - case Nil => None - case path :: Nil if path.isFile => Some(path.parent) - case path :: Nil => - scribe.info(s"path: $path") - Some(path) - case _ => Some(workspace) + try { + ScalaCliBspScope.scalaCliBspRoot(workspace) match { + case Nil => None + case path :: Nil if path.isFile => Some(path.parent) + case path :: Nil => Some(path) + case _ => Some(workspace) + } + } catch { + case _: ParsingFailedException => + scribe.warn(s"could not parse scala-cli build server configuration") + None } } 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 ef2c828080e..ab0db75a147 100644 --- a/metals/src/main/scala/scala/meta/internal/metals/MetalsLspService.scala +++ b/metals/src/main/scala/scala/meta/internal/metals/MetalsLspService.scala @@ -17,6 +17,7 @@ import scala.concurrent.TimeoutException import scala.concurrent.duration._ import scala.util.Failure import scala.util.Success +import scala.util.Try import scala.util.control.NonFatal import scala.meta.internal.bsp.BspConfigGenerationStatus._ @@ -1273,7 +1274,8 @@ class MetalsLspService( event.eventType match { case EventType.CreateOrModify - if path.isInBspDirectory(folder) && path.extension == "json" => + if path.isInBspDirectory(folder) && path.extension == "json" + && isValidBspFile(path) => scribe.info(s"Detected new build tool in $path") quickConnectToBuildServer() case _ => @@ -1311,6 +1313,9 @@ class MetalsLspService( } } + private def isValidBspFile(path: AbsolutePath): Boolean = + path.readTextOpt.exists(text => Try(ujson.read(text)).toOption.nonEmpty) + private def onChange(paths: Seq[AbsolutePath]): Future[Unit] = { paths.foreach { path => fingerprints.add(path, FileIO.slurp(path, charset))