Skip to content

Commit

Permalink
Merge pull request #2197 from Arthurm1/dependency_modules
Browse files Browse the repository at this point in the history
Implement BSP buildTargetDependencyModules
  • Loading branch information
tgodzik committed Nov 21, 2023
2 parents 598cd1f + be811be commit 6cb81c3
Show file tree
Hide file tree
Showing 4 changed files with 131 additions and 1 deletion.
55 changes: 54 additions & 1 deletion frontend/src/main/scala/bloop/bsp/BloopBspServices.scala
Expand Up @@ -139,6 +139,7 @@ final class BloopBspServices(
.requestAsync(endpoints.BuildTarget.scalaMainClasses)(p => schedule(scalaMainClasses(p)))
.requestAsync(endpoints.BuildTarget.scalaTestClasses)(p => schedule(scalaTestClasses(p)))
.requestAsync(endpoints.BuildTarget.dependencySources)(p => schedule(dependencySources(p)))
.requestAsync(endpoints.BuildTarget.dependencyModules)(p => schedule(dependencyModules(p)))
.requestAsync(endpoints.DebugSession.start)(p => schedule(startDebugSession(p)))
.requestAsync(endpoints.BuildTarget.jvmTestEnvironment)(p => schedule(jvmTestEnvironment(p)))
.requestAsync(endpoints.BuildTarget.jvmRunEnvironment)(p => schedule(jvmRunEnvironment(p)))
Expand Down Expand Up @@ -308,7 +309,7 @@ final class BloopBspServices(
debugProvider = Some(BloopBspServices.DefaultDebugProvider),
inverseSourcesProvider = Some(true),
dependencySourcesProvider = Some(true),
dependencyModulesProvider = None,
dependencyModulesProvider = Some(true),
resourcesProvider = Some(true),
outputPathsProvider = None,
buildTargetChangedProvider = Some(false),
Expand Down Expand Up @@ -1205,6 +1206,58 @@ final class BloopBspServices(
}
}

def dependencyModules(
request: bsp.DependencyModulesParams
): BspEndpointResponse[bsp.DependencyModulesResult] = {
def modules(
projects: Seq[ProjectMapping],
state: State
): BspResult[bsp.DependencyModulesResult] = {
val response = bsp.DependencyModulesResult(
projects.iterator.map {
case (target, project) =>
val modules = project.resolution.toList.flatMap { res =>
res.modules.map { module =>
val mavenDependencyModule = bsp.MavenDependencyModule(
module.organization,
module.name,
module.version,
module.artifacts.map(artifact =>
bsp.MavenDependencyModuleArtifact(
bsp.Uri(AbsolutePath(artifact.path).toBspUri),
artifact.classifier
)
),
None
)

val encoded = writeToArray(mavenDependencyModule)
bsp.DependencyModule(
module.name,
module.version,
Some(bsp.DependencyModuleDataKind.Maven),
Some(RawJson(encoded))
)
}
}.distinct
bsp.DependencyModulesItem(target, modules)
}.toList
)

Task.now((state, Right(response)))
}

ifInitialized(None) { (state: State, logger: BspServerLogger) =>
mapToProjects(request.targets, state) match {
case Left(error) =>
// Log the mapping error to the user via a log event + an error status code
logger.error(error)
Task.now((state, Right(bsp.DependencyModulesResult(Nil))))
case Right(mappings) => modules(mappings, state)
}
}
}

def dependencySources(
request: bsp.DependencySourcesParams
): BspEndpointResponse[bsp.DependencySourcesResult] = {
Expand Down
16 changes: 16 additions & 0 deletions frontend/src/test/scala/bloop/bsp/BspBaseSuite.scala
Expand Up @@ -349,6 +349,22 @@ abstract class BspBaseSuite extends BaseSuite with BspClientTest {
TestUtil.await(FiniteDuration(5, "s"))(resourcesTask)
}

def requestDependencyModules(project: TestProject): bsp.DependencyModulesResult = {
val dependencyModulesTask = {
client0
.request(
endpoints.BuildTarget.dependencyModules,
bsp.DependencyModulesParams(List(project.bspId))
)
.map {
case RpcFailure(_, error) => fail(s"Received error ${error}")
case RpcSuccess(modules, _) => modules
}
}

TestUtil.await(FiniteDuration(5, "s"))(dependencyModulesTask)
}

def requestDependencySources(project: TestProject): bsp.DependencySourcesResult = {
val dependencySourcesTask = {
client0
Expand Down
60 changes: 60 additions & 0 deletions frontend/src/test/scala/bloop/bsp/BspProtocolSpec.scala
Expand Up @@ -510,6 +510,66 @@ class BspProtocolSpec(
}
}

test("dependency modules request works") {
TestUtil.withinWorkspace { workspace =>
val logger = new RecordingLogger(ansiCodesSupported = false)
loadBspBuildFromResources("cross-test-build-scalajs-0.6", workspace, logger) { build =>
val mainProject = build.projectFor("test-project")
val testProject = build.projectFor("test-project-test")
val mainJsProject = build.projectFor("test-projectJS")
val testJsProject = build.projectFor("test-projectJS-test")
val rootMain = build.projectFor("cross-test-build-scalajs-0-6")
val rootTest = build.projectFor("cross-test-build-scalajs-0-6-test")

def checkDependencyModules(project: TestProject): Unit = {
val dependencyModulesResult = build.state.requestDependencyModules(project)
assert(dependencyModulesResult.items.size == 1)
val dependencyModules = dependencyModulesResult.items.flatMap(item =>
item.modules
.map(dependencyModule => {
val json = dependencyModule.data.get
val mavenModule = readFromArray[bsp.MavenDependencyModule](json.value)
val artifacts: List[Config.Artifact] = mavenModule.artifacts
.map(artifact =>
Config.Artifact(
dependencyModule.name,
artifact.classifier,
None,
artifact.uri.toPath
)
)
.distinct;
new Config.Module(
mavenModule.organization,
mavenModule.name,
mavenModule.version,
None,
artifacts
)
})
.distinct
)

val expectedModules = project.config.resolution.toList.flatMap { res =>
res.modules.map { m =>
val artifacts = m.artifacts.map(artifact => artifact.copy(checksum = None))
m.copy(configurations = None, artifacts = artifacts)
}
}.distinct

assertEquals(dependencyModules, expectedModules)
}

checkDependencyModules(mainProject)
checkDependencyModules(testProject)
checkDependencyModules(mainJsProject)
checkDependencyModules(testJsProject)
checkDependencyModules(rootMain)
checkDependencyModules(rootTest)
}
}
}

test("dependency sources request works") {
TestUtil.withinWorkspace { workspace =>
val logger = new RecordingLogger(ansiCodesSupported = false)
Expand Down
1 change: 1 addition & 0 deletions frontend/src/test/scala/bloop/bsp/TestConstants.scala
Expand Up @@ -16,6 +16,7 @@ object TestConstants {
"debugProvider": { "languageIds": ["scala", "java"] },
"inverseSourcesProvider": true,
"dependencySourcesProvider": true,
"dependencyModulesProvider": true,
"resourcesProvider": true,
"buildTargetChangedProvider": false,
"jvmRunEnvironmentProvider": true,
Expand Down

0 comments on commit 6cb81c3

Please sign in to comment.