Skip to content

Commit

Permalink
feature: Add support for buildTarget/jvmCompileClasspath
Browse files Browse the repository at this point in the history
Previously, classpath would be obtained via scalacOptions and javacOptions requests, which would cause additional querries even if client was only interested in actual javac/scalac options.

Now, we don't send classpath together with scalac/javac options if the client declares that they will use the new jvmCompileClasspath request, which they should then trigger.
  • Loading branch information
tgodzik committed Mar 15, 2024
1 parent a85502b commit 00ca6f5
Show file tree
Hide file tree
Showing 8 changed files with 299 additions and 233 deletions.
4 changes: 2 additions & 2 deletions MODULE.bazel
Expand Up @@ -71,7 +71,7 @@ maven.install(
artifacts = [
"com.google.code.gson:gson:2.10.1",
"com.google.guava:guava:31.0.1-jre",
"ch.epfl.scala:bsp4j:2.2.0-M1",
"ch.epfl.scala:bsp4j:2.2.0-M2",
"commons-io:commons-io:jar:2.15.1",
"commons-cli:commons-cli:jar:1.6.0",
"org.apache.logging.log4j:log4j-api:2.23.1",
Expand Down Expand Up @@ -99,7 +99,7 @@ maven.install(
fetch_sources = True,
lock_file = "//:maven_install.json",
repositories = [
"https://repo.maven.apache.org/maven2",
"https://repo.maven.apache.org/maven2"
],
)
use_repo(
Expand Down
476 changes: 253 additions & 223 deletions MODULE.bazel.lock

Large diffs are not rendered by default.

Expand Up @@ -3,6 +3,8 @@ package org.jetbrains.bsp.bazel
import ch.epfl.scala.bsp4j.BuildTarget
import ch.epfl.scala.bsp4j.BuildTargetCapabilities
import ch.epfl.scala.bsp4j.BuildTargetIdentifier
import ch.epfl.scala.bsp4j.JvmCompileClasspathItem
import ch.epfl.scala.bsp4j.JvmCompileClasspathResult
import ch.epfl.scala.bsp4j.WorkspaceBuildTargetsResult
import ch.epfl.scala.bsp4j.ScalacOptionsItem
import ch.epfl.scala.bsp4j.ScalacOptionsParams
Expand Down Expand Up @@ -48,5 +50,4 @@ object BazelBspScalaProjectTest : BazelBspTestBaseScenario() {
testClient.testScalacOptions(60.seconds, scalaOptionsParams, expectedScalaOptionsResult)
}
}

}
11 changes: 6 additions & 5 deletions maven_install.json
@@ -1,8 +1,9 @@
{
"__AUTOGENERATED_FILE_DO_NOT_MODIFY_THIS_FILE_MANUALLY": "THERE_IS_NO_DATA_ONLY_ZUUL",
"__INPUT_ARTIFACTS_HASH": 1457657702,
"__RESOLVED_ARTIFACTS_HASH": -1324999880,
"__INPUT_ARTIFACTS_HASH": -1462113559,
"__RESOLVED_ARTIFACTS_HASH": -374736354,
"conflict_resolution": {
"ch.epfl.scala:bsp4j:2.2.0-M1": "ch.epfl.scala:bsp4j:2.2.0-M2",
"com.google.code.gson:gson:2.8.9": "com.google.code.gson:gson:2.10.1",
"com.google.errorprone:error_prone_annotations:2.3.2": "com.google.errorprone:error_prone_annotations:2.23.0",
"com.google.guava:guava:31.0.1-jre": "com.google.guava:guava:32.1.3-android",
Expand All @@ -15,10 +16,10 @@
"artifacts": {
"ch.epfl.scala:bsp4j": {
"shasums": {
"jar": "b21b471404f989c3351a6cd02160f3f7de7f7b7276ced6d65b192260c6a9ef04",
"sources": "41cddede304e9439d98c193f3882b81b1c50ea77a20531949f79575b63e5401d"
"jar": "cf13ce15161190b2fa88dc646229979d3cfb48407c0ca5f4b866d1c32d9f5c19",
"sources": "4c1108ffcd20efa4f46448fddc29249c1d4400ba4cfbc0f36135404b60269d61"
},
"version": "2.2.0-M1"
"version": "2.2.0-M2"
},
"com.fasterxml.jackson.core:jackson-annotations": {
"shasums": {
Expand Down
Expand Up @@ -24,6 +24,7 @@ public class BazelBuildServerCapabilities(
jvmRunEnvironmentProvider: Boolean = false,
jvmTestEnvironmentProvider: Boolean = false,
canReload: Boolean = false,
jvmCompileClasspathProvider: Boolean = false,
public val workspaceLibrariesProvider: Boolean = false,
public val workspaceDirectoriesProvider: Boolean = false,
public val workspaceInvalidTargetsProvider: Boolean = false,
Expand All @@ -43,5 +44,6 @@ public class BazelBuildServerCapabilities(
this.jvmRunEnvironmentProvider = jvmRunEnvironmentProvider
this.jvmTestEnvironmentProvider = jvmTestEnvironmentProvider
this.canReload = canReload
this.jvmCompileClasspathProvider = jvmCompileClasspathProvider
}
}
Expand Up @@ -23,6 +23,8 @@ import ch.epfl.scala.bsp4j.JavaBuildServer
import ch.epfl.scala.bsp4j.JavacOptionsParams
import ch.epfl.scala.bsp4j.JavacOptionsResult
import ch.epfl.scala.bsp4j.JvmBuildServer
import ch.epfl.scala.bsp4j.JvmCompileClasspathParams
import ch.epfl.scala.bsp4j.JvmCompileClasspathResult
import ch.epfl.scala.bsp4j.JvmRunEnvironmentParams
import ch.epfl.scala.bsp4j.JvmRunEnvironmentResult
import ch.epfl.scala.bsp4j.JvmTestEnvironmentParams
Expand Down Expand Up @@ -350,6 +352,17 @@ class BspServerApi(private val bazelServicesBuilder: (BuildClient) -> BazelServi
)
}

override fun buildTargetJvmCompileClasspath(params: JvmCompileClasspathParams): CompletableFuture<JvmCompileClasspathResult> {
return runner.handleRequest(
"jvmCompileClasspath",
{ cancelChecker: CancelChecker, params: JvmCompileClasspathParams ->
projectSyncService.jvmCompileClasspath(
cancelChecker, params
)
}, params
)
}

override fun buildTargetJvmTestEnvironment(
params: JvmTestEnvironmentParams
): CompletableFuture<JvmTestEnvironmentResult> {
Expand Down
Expand Up @@ -16,6 +16,9 @@ import ch.epfl.scala.bsp4j.InverseSourcesResult
import ch.epfl.scala.bsp4j.JavacOptionsItem
import ch.epfl.scala.bsp4j.JavacOptionsParams
import ch.epfl.scala.bsp4j.JavacOptionsResult
import ch.epfl.scala.bsp4j.JvmCompileClasspathItem
import ch.epfl.scala.bsp4j.JvmCompileClasspathParams
import ch.epfl.scala.bsp4j.JvmCompileClasspathResult
import ch.epfl.scala.bsp4j.JvmEnvironmentItem
import ch.epfl.scala.bsp4j.JvmMainClass
import ch.epfl.scala.bsp4j.JvmRunEnvironmentParams
Expand Down Expand Up @@ -102,7 +105,8 @@ class BspProjectMapper(
workspaceLibrariesProvider = true,
workspaceDirectoriesProvider = true,
workspaceInvalidTargetsProvider = true,
runWithDebugProvider = true
runWithDebugProvider = true,
jvmCompileClasspathProvider = true,
)
return InitializeBuildResult(
Constants.NAME, Constants.VERSION, Constants.BSP_VERSION, capabilities
Expand Down Expand Up @@ -188,7 +192,7 @@ class BspProjectMapper(
val canTest = module.tags.contains(Tag.TEST) && !module.tags.contains(Tag.MANUAL)
val canRun = module.tags.contains(Tag.APPLICATION) && !module.tags.contains(Tag.MANUAL)
val canDebug = canRun || canTest // runnable and testable targets should be debuggable
return BuildTargetCapabilities().also { it.canCompile = canCompile; it.canTest = canTest; it.canRun = canRun; it.canDebug = canDebug }
return BuildTargetCapabilities().also { it.canCompile = canCompile; it.canTest = canTest; it.canRun = canRun; it.canDebug = canDebug; }
}

private fun isBuildableIfManual(module: Module): Boolean =
Expand Down Expand Up @@ -300,6 +304,14 @@ class BspProjectMapper(
val result = getJvmEnvironmentItems(project, targets, cancelChecker)
return JvmTestEnvironmentResult(result)
}
fun jvmCompileClasspath(
project: Project, params: JvmCompileClasspathParams, cancelChecker: CancelChecker
): JvmCompileClasspathResult {
val items = params.targets.collectClasspathForTargetsAndApply(project, cancelChecker) { module, ideClasspath ->
JvmCompileClasspathItem(BspMappings.toBspId(module), ideClasspath.map { it.toString() })
}
return JvmCompileClasspathResult(items)
}

private fun getJvmEnvironmentItems(
project: Project, targets: List<BuildTargetIdentifier>, cancelChecker: CancelChecker
Expand Down
Expand Up @@ -11,6 +11,8 @@ import ch.epfl.scala.bsp4j.InverseSourcesParams
import ch.epfl.scala.bsp4j.InverseSourcesResult
import ch.epfl.scala.bsp4j.JavacOptionsParams
import ch.epfl.scala.bsp4j.JavacOptionsResult
import ch.epfl.scala.bsp4j.JvmCompileClasspathParams
import ch.epfl.scala.bsp4j.JvmCompileClasspathResult
import ch.epfl.scala.bsp4j.JvmRunEnvironmentParams
import ch.epfl.scala.bsp4j.JvmRunEnvironmentResult
import ch.epfl.scala.bsp4j.JvmTestEnvironmentParams
Expand Down Expand Up @@ -113,6 +115,11 @@ class ProjectSyncService(private val bspMapper: BspProjectMapper, private val pr
return bspMapper.jvmTestEnvironment(project, params, cancelChecker)
}

fun jvmCompileClasspath(cancelChecker: CancelChecker, params: JvmCompileClasspathParams): JvmCompileClasspathResult {
val project = projectProvider.get(cancelChecker)
return bspMapper.jvmCompileClasspath(project, params, cancelChecker)
}

fun buildTargetJavacOptions(cancelChecker: CancelChecker, params: JavacOptionsParams): JavacOptionsResult {
val project = projectProvider.get(cancelChecker)
return bspMapper.buildTargetJavacOptions(project, params, cancelChecker)
Expand Down

0 comments on commit 00ca6f5

Please sign in to comment.