Skip to content

Commit

Permalink
improvement: restart sbt server on java home change
Browse files Browse the repository at this point in the history
  • Loading branch information
kasiaMarek committed Jul 11, 2023
1 parent 749a182 commit caca31e
Show file tree
Hide file tree
Showing 4 changed files with 54 additions and 2 deletions.
12 changes: 12 additions & 0 deletions metals/src/main/scala/scala/meta/internal/bsp/BspConnector.scala
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,10 @@ import scala.meta.internal.bsp.BspConfigGenerationStatus._
import scala.meta.internal.builds.BuildServerProvider
import scala.meta.internal.builds.BuildTools
import scala.meta.internal.builds.SbtBuildTool
import scala.meta.internal.builds.ShellRunner
import scala.meta.internal.metals.BloopServers
import scala.meta.internal.metals.BuildServerConnection
import scala.meta.internal.metals.JdkSources
import scala.meta.internal.metals.Messages
import scala.meta.internal.metals.Messages.BspSwitch
import scala.meta.internal.metals.MetalsEnrichments._
Expand Down Expand Up @@ -73,6 +75,7 @@ class BspConnector(
def connect(
workspace: AbsolutePath,
userConfiguration: UserConfiguration,
shellRunner: ShellRunner,
)(implicit ec: ExecutionContext): Future[Option[BspSession]] = {
def connect(
workspace: AbsolutePath
Expand All @@ -88,8 +91,17 @@ class BspConnector(
if details.getName() == SbtBuildTool.name =>
tables.buildServers.chooseServer(SbtBuildTool.name)
val shouldReload = SbtBuildTool.writeSbtMetalsPlugins(workspace)
val shouldShutdownOldServer = !SbtBuildTool.checkCorrectJavaVersion(
workspace,
userConfiguration.javaHome.orElse(JdkSources.defaultJavaHome),
)
val connectionF =
for {
_ <-
if (shouldShutdownOldServer)
SbtBuildTool(workspace, () => userConfiguration)
.shutdownBspServer(shellRunner, workspace)
else Future.successful(())
connection <- bspServers.newServer(workspace, details)
_ <-
if (shouldReload) connection.workspaceReload()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,14 @@ import scala.meta.internal.io.FileIO
import scala.meta.internal.metals.BuildServerConnection
import scala.meta.internal.metals.Cancelable
import scala.meta.internal.metals.ClosableOutputStream
import scala.meta.internal.metals.JdkSources
import scala.meta.internal.metals.MetalsBuildClient
import scala.meta.internal.metals.MetalsEnrichments._
import scala.meta.internal.metals.MetalsServerConfig
import scala.meta.internal.metals.QuietInputStream
import scala.meta.internal.metals.SocketConnection
import scala.meta.internal.metals.Tables
import scala.meta.internal.metals.UserConfiguration
import scala.meta.internal.metals.clients.language.MetalsLanguageClient
import scala.meta.internal.mtags.MD5
import scala.meta.internal.mtags.URIEncoderDecoder
Expand All @@ -43,6 +45,7 @@ final class BspServers(
tables: Tables,
bspGlobalInstallDirectories: List[AbsolutePath],
config: MetalsServerConfig,
userConfig: () => UserConfiguration,
)(implicit ec: ExecutionContextExecutorService) {

def resolve(): BspResolvedResult = {
Expand Down Expand Up @@ -92,7 +95,10 @@ final class BspServers(
args,
projectDirectory,
redirectErrorOutput = false,
Map(),
userConfig().javaHome
.orElse(JdkSources.defaultJavaHome)
.map("JAVA_HOME" -> _)
.toMap,
processOut = None,
processErr = Some(l => scribe.info("BSP server: " + l)),
discardInput = false,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -382,4 +382,37 @@ object SbtBuildTool {
val prepend = autoImports.mkString("", "\n", "\n")
prepend + text
}

def checkCorrectJavaVersion(
workspace: AbsolutePath,
optJavaHome: Option[String],
): Boolean = {
val bspConfigFile = workspace.resolve(".bsp").resolve("sbt.json")
if (bspConfigFile.isFile) {
val matchesSbtJavaHome =
for {
javaHome <- optJavaHome
javaHomePath <- (s"file://$javaHome").toAbsolutePathSafe
text <- bspConfigFile.readTextOpt
json = ujson.read(text)
args <- json("argv").arrOpt
firstArg <- args.headOption
javaArg <- firstArg.strOpt
} yield {
val possibleJavaBinaries =
List(javaHomePath, javaHomePath.resolve("jre"))
.map(_.resolve("bin/java"))
.flatMap(path => List(path, path.dealias))
val sbtJavaHomeIsCorrect =
possibleJavaBinaries.exists(_.toString == javaArg)
if (!sbtJavaHomeIsCorrect) {
scribe.debug(
s"Java binary used by sbt server $javaArg doesn't match the expected java home. Possible paths considered: $possibleJavaBinaries"
)
}
sbtJavaHomeIsCorrect
}
matchesSbtJavaHome.getOrElse(true)
} else true
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -412,6 +412,7 @@ class MetalsLspService(
tables,
bspGlobalDirectories,
clientConfig.initialConfig,
userConfig,
)

private val bspConnector: BspConnector = new BspConnector(
Expand Down Expand Up @@ -2060,7 +2061,7 @@ class MetalsLspService(
(for {
_ <- disconnectOldBuildServer()
maybeSession <- timerProvider.timed("Connected to build server", true) {
bspConnector.connect(folder, userConfig())
bspConnector.connect(folder, userConfig(), shellRunner)
}
result <- maybeSession match {
case Some(session) =>
Expand Down

0 comments on commit caca31e

Please sign in to comment.