From 3d23205d82e5a877a31c452c27fc89370780657b Mon Sep 17 00:00:00 2001 From: Marcin Abramowicz <44381959+abrams27@users.noreply.github.com> Date: Tue, 27 Jun 2023 13:05:34 +0200 Subject: [PATCH] [breaking change] bloop support dropped (#437) * bloop out from the installer * bloop out from the server * readme update * changelog --- CHANGELOG.md | 4 + README.md | 39 ---- WORKSPACE | 2 - .../bsp/bazel/commons/Constants.java | 3 - .../BloopBspConnectionDetailsCreator.kt | 48 ----- .../bazel/install/BloopEnvironmentCreator.kt | 69 ------ .../jetbrains/bsp/bazel/install/Install.kt | 14 -- .../bsp/bazel/install/cli/CliOptions.kt | 5 - .../bazel/install/cli/CliOptionsProvider.kt | 13 -- .../java/org/jetbrains/bsp/bazel/server/BUILD | 2 - .../jetbrains/bsp/bazel/server/bloop/BUILD | 25 --- .../bsp/bazel/server/bloop/BloopExporter.java | 193 ----------------- .../bloop/BloopExporterInitializer.java | 56 ----- .../server/bloop/BloopProjectWriter.java | 44 ---- .../bazel/server/bloop/BspModuleExporter.kt | 198 ------------------ .../bazel/server/bloop/BspProjectExporter.kt | 65 ------ .../bazel/server/bloop/ClasspathRewriter.java | 25 --- .../bsp/bazel/server/bloop/Naming.java | 31 --- .../bsp/bazel/server/bloop/ReGlobber.kt | 94 --------- .../bsp/bazel/server/bloop/ScalaInterop.kt | 32 --- .../bazel/server/bloop/SourceSetRewriter.kt | 21 -- .../jetbrains/bsp/bazel/server/bloop/BUILD | 46 ---- .../bazel/server/bloop/BloopExporterTest.kt | 33 --- .../server/bloop/BspModuleExporterTest.kt | 115 ---------- .../server/bloop/ClasspathRewriterTest.kt | 29 --- .../bsp/bazel/server/bloop/ReGlobberTest.kt | 105 ---------- .../server/bloop/SourceSetRewriterTest.kt | 43 ---- 27 files changed, 4 insertions(+), 1350 deletions(-) delete mode 100644 install/src/main/java/org/jetbrains/bsp/bazel/install/BloopBspConnectionDetailsCreator.kt delete mode 100644 install/src/main/java/org/jetbrains/bsp/bazel/install/BloopEnvironmentCreator.kt delete mode 100644 server/src/main/java/org/jetbrains/bsp/bazel/server/bloop/BUILD delete mode 100644 server/src/main/java/org/jetbrains/bsp/bazel/server/bloop/BloopExporter.java delete mode 100644 server/src/main/java/org/jetbrains/bsp/bazel/server/bloop/BloopExporterInitializer.java delete mode 100644 server/src/main/java/org/jetbrains/bsp/bazel/server/bloop/BloopProjectWriter.java delete mode 100644 server/src/main/java/org/jetbrains/bsp/bazel/server/bloop/BspModuleExporter.kt delete mode 100644 server/src/main/java/org/jetbrains/bsp/bazel/server/bloop/BspProjectExporter.kt delete mode 100644 server/src/main/java/org/jetbrains/bsp/bazel/server/bloop/ClasspathRewriter.java delete mode 100644 server/src/main/java/org/jetbrains/bsp/bazel/server/bloop/Naming.java delete mode 100644 server/src/main/java/org/jetbrains/bsp/bazel/server/bloop/ReGlobber.kt delete mode 100644 server/src/main/java/org/jetbrains/bsp/bazel/server/bloop/ScalaInterop.kt delete mode 100644 server/src/main/java/org/jetbrains/bsp/bazel/server/bloop/SourceSetRewriter.kt delete mode 100644 server/src/test/java/org/jetbrains/bsp/bazel/server/bloop/BUILD delete mode 100644 server/src/test/java/org/jetbrains/bsp/bazel/server/bloop/BloopExporterTest.kt delete mode 100644 server/src/test/java/org/jetbrains/bsp/bazel/server/bloop/BspModuleExporterTest.kt delete mode 100644 server/src/test/java/org/jetbrains/bsp/bazel/server/bloop/ClasspathRewriterTest.kt delete mode 100644 server/src/test/java/org/jetbrains/bsp/bazel/server/bloop/ReGlobberTest.kt delete mode 100644 server/src/test/java/org/jetbrains/bsp/bazel/server/bloop/SourceSetRewriterTest.kt diff --git a/CHANGELOG.md b/CHANGELOG.md index bf9a0ab56..52839ed32 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,10 @@ ## [Unreleased] +### Breaking changes 🚨 + +- Bloop support has been dropped. + ## [2.7.2] diff --git a/README.md b/README.md index ca8d58ea0..6598329a5 100644 --- a/README.md +++ b/README.md @@ -66,45 +66,6 @@ bazel run --stamp --define "maven_repo=file://$HOME/.m2/repository" //server/src cs launch -r m2Local org.jetbrains.bsp:bazel-bsp: -M org.jetbrains.bsp.bazel.install.Install ``` -### Using Bloop (_deprecated!_) - -By default Bazel BSP runs as a BSP server and invokes Bazel to compile, test and run targets. -This provides the most accurate build results at the expense of -compile/test/run latency. Bazel BSP can optionally be configured to use [Bloop](https://scalacenter.github.io/bloop/) -as the BSP server instead. Bloop provides a much lower latency with the trade-off that the Bloop model -may not perfectly represent the Bazel configuration. - -#### Installing with Bloop - -The instructions above will work in Bloop mode as well, simply pass ``--use_bloop`` as an installation option. -However, when using Bloop mode Bazel BSP can also install itself outside the source root directory. This can -be useful in large shared repositories where it's undesirable to keep the Bazel BSP projects inside the -repository itself. - -In the examples below, we'll use ``~/src/my-repo`` as the "repository root" and ``~/bazel-bsp-projects`` as the -"Bazel BSP project root", however both can be any directory. - -To install Bazel BSP outside the repository root: - -1) Change directories into the repository root: ``cd ~/src/my-repo`` -2) Invoke the Bazel BSP installer as described above (via Coursier or run the installer JAR directly), passing in: - 1) ``--use-bloop`` - 2) ``-d ~/bazel-bsp-projects/my-repo-project`` - -For example, using Coursier: - -```shell -cd ~/src/my-repository -cs launch org.jetbrains.bsp:bazel-bsp:2.7.2 -M org.jetbrains.bsp.bazel.install.Install \ - -- \ - --use-bloop \ - -t //my-targets/... \ - -d ~/bazel-bsp-projects/my-targets-project -``` - -This will create a set of BSP and Bloop projects in ``~/bazel-bsp-projects/my-targets-project`` which can then be opened -in IntelliJ or any other IDE that supports BSP. - ## Project Views In order to work on huge monorepos you might want to specify directories and targets to work on. To address this issue, diff --git a/WORKSPACE b/WORKSPACE index 8d4b6f551..b88c1ddaf 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -187,8 +187,6 @@ maven_install( "org.junit.jupiter:junit-jupiter:5.9.3", "com.fasterxml.jackson.core:jackson-databind:2.15.2", "com.fasterxml.jackson.module:jackson-module-kotlin:2.15.2", - "ch.epfl.scala:bloop-config_2.13:1.5.0", - "org.scala-lang:scala-library:2.13.11", "com.google.protobuf:protobuf-java:3.23.3", "io.grpc:grpc-stub:1.56.0", "io.grpc:grpc-netty:1.56.0", diff --git a/commons/src/main/java/org/jetbrains/bsp/bazel/commons/Constants.java b/commons/src/main/java/org/jetbrains/bsp/bazel/commons/Constants.java index ed25ff6e4..08ad70541 100644 --- a/commons/src/main/java/org/jetbrains/bsp/bazel/commons/Constants.java +++ b/commons/src/main/java/org/jetbrains/bsp/bazel/commons/Constants.java @@ -22,9 +22,6 @@ public class Constants { public static final String DOT_BSP_DIR_NAME = ".bsp"; public static final String BAZELBSP_JSON_FILE_NAME = "bazelbsp.json"; public static final String SERVER_CLASS_NAME = "org.jetbrains.bsp.bazel.server.ServerInitializer"; - public static final String BLOOP_BOOTSTRAP_CLASS_NAME = - "org.jetbrains.bsp.bazel.server.bloop.BloopExporterInitializer"; - public static final String BLOOP_SETTINGS_JSON_FILE_NAME = "bloop.settings.json"; public static final String CLASSPATH_FLAG = "-classpath"; public static final String BAZELBSP_TRACE_JSON_FILE_NAME = "bazelbsp.trace.json"; } diff --git a/install/src/main/java/org/jetbrains/bsp/bazel/install/BloopBspConnectionDetailsCreator.kt b/install/src/main/java/org/jetbrains/bsp/bazel/install/BloopBspConnectionDetailsCreator.kt deleted file mode 100644 index 3ec8197bd..000000000 --- a/install/src/main/java/org/jetbrains/bsp/bazel/install/BloopBspConnectionDetailsCreator.kt +++ /dev/null @@ -1,48 +0,0 @@ -package org.jetbrains.bsp.bazel.install - -import ch.epfl.scala.bsp4j.BspConnectionDetails -import io.vavr.control.Try -import org.jetbrains.bsp.bazel.commons.Constants -import java.net.URL -import java.nio.file.Files -import java.nio.file.Path - -class BloopBspConnectionDetailsCreator(bazelBspPath: Path) { - private val coursierDestination = bazelBspPath.resolve("cs") - - private fun downloadCoursier(): Try = - if (Files.isRegularFile(coursierDestination) && Files.isExecutable(coursierDestination)) { - Try.success(null) - } else if (Files.exists(coursierDestination)) { - Try.failure(IllegalArgumentException("file already exists: $coursierDestination, but was not executable")) - } else { - val url = System.getenv("FASTPASS_COURSIER_URL") ?: "https://git.io/coursier-cli" - Try.run { - Files.copy( - URL(url).openStream(), - coursierDestination - ) - coursierDestination.toFile().setExecutable(true) - } - } - - fun create(): Try = - downloadCoursier().map { - BspConnectionDetails( - Constants.NAME, - listOfNotNull( - coursierDestination.toString(), - "launch", - "ch.epfl.scala:bloop-launcher-core_2.13:1.5.0", - "--ttl", - "Inf", - "--", - "1.5.0" - ), - Constants.VERSION, - Constants.BSP_VERSION, - Constants.SUPPORTED_LANGUAGES - ) - } - -} diff --git a/install/src/main/java/org/jetbrains/bsp/bazel/install/BloopEnvironmentCreator.kt b/install/src/main/java/org/jetbrains/bsp/bazel/install/BloopEnvironmentCreator.kt deleted file mode 100644 index 14702f9e7..000000000 --- a/install/src/main/java/org/jetbrains/bsp/bazel/install/BloopEnvironmentCreator.kt +++ /dev/null @@ -1,69 +0,0 @@ -package org.jetbrains.bsp.bazel.install - -import io.vavr.control.Try -import org.jetbrains.bsp.bazel.commons.Constants -import org.jetbrains.bsp.bazel.install.cli.CliOptions -import org.jetbrains.bsp.bazel.installationcontext.InstallationContext -import java.nio.file.Path -import java.nio.file.Paths - -private data class WorkspaceSettings( - val refreshProjectsCommand: List -) - -private data class ProjectSettings( - val targets: List? -) - -class BloopEnvironmentCreator( - private val cliOptions: CliOptions, - private val installationContext: InstallationContext -) : EnvironmentCreator(cliOptions.workspaceRootDir) { - - private val projectRootDir = cliOptions.workspaceRootDir - private val bazelWorkspaceRootDir = cliOptions.bazelWorkspaceRootDir - private val launcherArgumentCreator = LauncherArgumentCreator(installationContext) - - override fun create(): Try = createDotBazelBsp() - .flatMap { bazelBspPath -> - createProjectSettings(bazelBspPath).flatMap { - BloopBspConnectionDetailsCreator(bazelBspPath).create() - } - } - .flatMap { createDotBsp(it) } - .flatMap { createDotBloop() } - - private fun createProjectSettings(bazelBspPath: Path): Try { - val projectSettings = ProjectSettings( - cliOptions.projectViewCliOptions?.targets - ) - val settingsFile = bazelBspPath.resolve("project.settings.json") - return writeJsonToFile(settingsFile, projectSettings) - } - - private fun createDotBloop(): Try = - createDir(projectRootDir, ".bloop") - .flatMap(::createBloopConfig) - - private fun createBloopConfig(path: Path): Try = - refreshProjectArgs().flatMap { - val settings = WorkspaceSettings(it) - val bloopSettingsJsonPath = path.resolve(Constants.BLOOP_SETTINGS_JSON_FILE_NAME) - writeJsonToFile(bloopSettingsJsonPath, settings) - } - - - private fun refreshProjectArgs(): Try> { - return launcherArgumentCreator.classpathArgv().map { - listOfNotNull( - launcherArgumentCreator.javaBinaryArgv(), - Constants.CLASSPATH_FLAG, - it, - launcherArgumentCreator.debuggerConnectionArgv(), - Constants.BLOOP_BOOTSTRAP_CLASS_NAME, - launcherArgumentCreator.bazelWorkspaceRootDir(), - launcherArgumentCreator.projectViewFilePathArgv() - ) - } - } -} diff --git a/install/src/main/java/org/jetbrains/bsp/bazel/install/Install.kt b/install/src/main/java/org/jetbrains/bsp/bazel/install/Install.kt index bf640daa7..6862727d8 100644 --- a/install/src/main/java/org/jetbrains/bsp/bazel/install/Install.kt +++ b/install/src/main/java/org/jetbrains/bsp/bazel/install/Install.kt @@ -17,10 +17,6 @@ object Install { if (cliOptions.helpCliOptions.isHelpOptionUsed) { cliOptions.helpCliOptions.printHelp() - } else if (cliOptions.bloopCliOptions.useBloop) { - createBloopEnvironmentAndInstallBloopBspServer(cliOptions) - .onSuccess { printInCaseOfSuccess(cliOptions) } - .onFailure(::printFailureReasonAndExit1) } else { createEnvironmentAndInstallBazelBspServer(cliOptions) .onSuccess { printInCaseOfSuccess(cliOptions) } @@ -28,16 +24,6 @@ object Install { } } - private fun createBloopEnvironmentAndInstallBloopBspServer(cliOptions: CliOptions): Try = - InstallationContextProvider.parseProjectViewOrGenerateAndSaveAndCreateInstallationContext(cliOptions) - .flatMap { createBloopEnvironment(it, cliOptions) } - - private fun createBloopEnvironment(installationContext: InstallationContext, cliOptions: CliOptions): Try { - val environmentCreator = BloopEnvironmentCreator(cliOptions, installationContext) - - return environmentCreator.create() - } - private fun createEnvironmentAndInstallBazelBspServer(cliOptions: CliOptions): Try = InstallationContextProvider.parseProjectViewOrGenerateAndSaveAndCreateInstallationContext(cliOptions) .flatMap(::createBspConnectionDetails) diff --git a/install/src/main/java/org/jetbrains/bsp/bazel/install/cli/CliOptions.kt b/install/src/main/java/org/jetbrains/bsp/bazel/install/cli/CliOptions.kt index bbd2a9324..caf4df53e 100644 --- a/install/src/main/java/org/jetbrains/bsp/bazel/install/cli/CliOptions.kt +++ b/install/src/main/java/org/jetbrains/bsp/bazel/install/cli/CliOptions.kt @@ -22,15 +22,10 @@ data class ProjectViewCliOptions internal constructor( val produceTraceLog: Boolean?, ) -data class BloopCliOptions internal constructor( - val useBloop: Boolean -) - data class CliOptions internal constructor( val helpCliOptions: HelpCliOptions, val workspaceRootDir: Path, val projectViewFilePath: Path?, val projectViewCliOptions: ProjectViewCliOptions?, - val bloopCliOptions: BloopCliOptions, val bazelWorkspaceRootDir: Path, ) diff --git a/install/src/main/java/org/jetbrains/bsp/bazel/install/cli/CliOptionsProvider.kt b/install/src/main/java/org/jetbrains/bsp/bazel/install/cli/CliOptionsProvider.kt index 0d633b00a..b68cd17d9 100644 --- a/install/src/main/java/org/jetbrains/bsp/bazel/install/cli/CliOptionsProvider.kt +++ b/install/src/main/java/org/jetbrains/bsp/bazel/install/cli/CliOptionsProvider.kt @@ -160,12 +160,6 @@ class CliOptionsProvider(private val args: Array) { .build() cliParserOptions.addOption(importDepthOption) - val useBloopOption = Option.builder(USE_BLOOP_SHORT_OPT) - .longOpt("use-bloop") - .desc("Use bloop as the BSP server rather than bazel-bsp.") - .build() - cliParserOptions.addOption(useBloopOption) - val bazelWorkspaceRootDirOption = Option.builder(BAZEL_WORKSPACE_ROOT_DIR_OPT) .longOpt("bazel-workspace") .hasArg() @@ -195,7 +189,6 @@ class CliOptionsProvider(private val args: Array) { workspaceRootDir = workspaceRootDir(cmd), projectViewFilePath = projectViewFilePath(cmd), projectViewCliOptions = createProjectViewCliOptions(cmd), - bloopCliOptions = createBloopCliOptions(cmd), bazelWorkspaceRootDir = bazelWorkspaceRootDir(cmd), ) @@ -216,8 +209,6 @@ class CliOptionsProvider(private val args: Array) { private fun isHelpOptionUsed(cmd: CommandLine): Boolean = cmd.hasOption(HELP_SHORT_OPT) - private fun useBloop(cmd: CommandLine): Boolean = cmd.hasOption(USE_BLOOP_SHORT_OPT) - private fun printHelp() { val formatter = HelpFormatter() formatter.width = 160 @@ -234,9 +225,6 @@ class CliOptionsProvider(private val args: Array) { ) } - private fun createBloopCliOptions(cmd: CommandLine): BloopCliOptions = - BloopCliOptions(useBloop = useBloop(cmd)) - private fun createProjectViewCliOptions(cmd: CommandLine): ProjectViewCliOptions? = if (isAnyGenerationFlagSet(cmd)) ProjectViewCliOptions( @@ -316,7 +304,6 @@ class CliOptionsProvider(private val args: Array) { private const val EXCLUDED_DIRECTORIES_LONG_OPT = "excluded-directories" private const val DERIVE_TARGETS_FLAG_SHORT_OPT = "v" private const val IMPORT_DEPTH_SHORT_OPT = "i" - private const val USE_BLOOP_SHORT_OPT = "u" private const val BAZEL_WORKSPACE_ROOT_DIR_OPT ="w" private const val PRODUCE_TRACE_LOG_OPT ="l" diff --git a/server/src/main/java/org/jetbrains/bsp/bazel/server/BUILD b/server/src/main/java/org/jetbrains/bsp/bazel/server/BUILD index 875032b5f..a8f60507d 100644 --- a/server/src/main/java/org/jetbrains/bsp/bazel/server/BUILD +++ b/server/src/main/java/org/jetbrains/bsp/bazel/server/BUILD @@ -16,7 +16,6 @@ kt_jvm_library( "//executioncontext/workspacecontext", "//logger", "//server/src/main/java/org/jetbrains/bsp/bazel/server/bep", - "//server/src/main/java/org/jetbrains/bsp/bazel/server/bloop", "//server/src/main/java/org/jetbrains/bsp/bazel/server/bsp", "//server/src/main/java/org/jetbrains/bsp/bazel/server/bsp/info", "//server/src/main/java/org/jetbrains/bsp/bazel/server/bsp/managers", @@ -24,7 +23,6 @@ kt_jvm_library( "//server/src/main/java/org/jetbrains/bsp/bazel/server/common", "//server/src/main/java/org/jetbrains/bsp/bazel/server/diagnostics", "//server/src/main/java/org/jetbrains/bsp/bazel/server/sync", - "@maven//:ch_epfl_scala_bloop_config_2_13", "@maven//:ch_epfl_scala_bsp4j", "@maven//:org_eclipse_lsp4j_org_eclipse_lsp4j_jsonrpc", ], diff --git a/server/src/main/java/org/jetbrains/bsp/bazel/server/bloop/BUILD b/server/src/main/java/org/jetbrains/bsp/bazel/server/bloop/BUILD deleted file mode 100644 index 7edde85f6..000000000 --- a/server/src/main/java/org/jetbrains/bsp/bazel/server/bloop/BUILD +++ /dev/null @@ -1,25 +0,0 @@ -load("@io_bazel_rules_kotlin//kotlin:jvm.bzl", "kt_jvm_library") - -kt_jvm_library( - name = "bloop", - srcs = glob([ - "*.java", - "*.kt", - ]), - visibility = ["//server:__subpackages__"], - deps = [ - "//executioncontext/workspacecontext", - "//logger", - "//server/src/main/java/org/jetbrains/bsp/bazel/server/bep", - "//server/src/main/java/org/jetbrains/bsp/bazel/server/bsp", - "//server/src/main/java/org/jetbrains/bsp/bazel/server/bsp/info", - "//server/src/main/java/org/jetbrains/bsp/bazel/server/bsp/managers", - "//server/src/main/java/org/jetbrains/bsp/bazel/server/bsp/utils", - "//server/src/main/java/org/jetbrains/bsp/bazel/server/common", - "//server/src/main/java/org/jetbrains/bsp/bazel/server/diagnostics", - "//server/src/main/java/org/jetbrains/bsp/bazel/server/sync", - "@maven//:ch_epfl_scala_bloop_config_2_13", - "@maven//:org_eclipse_lsp4j_org_eclipse_lsp4j_jsonrpc", - "@maven//:org_scala_lang_scala_library", - ], -) diff --git a/server/src/main/java/org/jetbrains/bsp/bazel/server/bloop/BloopExporter.java b/server/src/main/java/org/jetbrains/bsp/bazel/server/bloop/BloopExporter.java deleted file mode 100644 index fbda3998c..000000000 --- a/server/src/main/java/org/jetbrains/bsp/bazel/server/bloop/BloopExporter.java +++ /dev/null @@ -1,193 +0,0 @@ -package org.jetbrains.bsp.bazel.server.bloop; - -import ch.epfl.scala.bsp4j.BuildClient; -import ch.epfl.scala.bsp4j.BuildTargetIdentifier; -import ch.epfl.scala.bsp4j.DiagnosticSeverity; -import ch.epfl.scala.bsp4j.DidChangeBuildTarget; -import ch.epfl.scala.bsp4j.LogMessageParams; -import ch.epfl.scala.bsp4j.PublishDiagnosticsParams; -import ch.epfl.scala.bsp4j.ShowMessageParams; -import ch.epfl.scala.bsp4j.TaskFinishParams; -import ch.epfl.scala.bsp4j.TaskProgressParams; -import ch.epfl.scala.bsp4j.TaskStartParams; -import com.google.common.collect.Sets; -import java.io.PrintStream; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.HashSet; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; -import java.util.function.Predicate; -import java.util.stream.Collectors; -import org.eclipse.lsp4j.jsonrpc.CancelChecker; -import org.jetbrains.bsp.bazel.bazelrunner.BazelInfo; -import org.jetbrains.bsp.bazel.bazelrunner.BazelRunner; -import org.jetbrains.bsp.bazel.logger.BspClientLogger; -import org.jetbrains.bsp.bazel.logger.BspClientTestNotifier; -import org.jetbrains.bsp.bazel.server.bsp.info.BspInfo; -import org.jetbrains.bsp.bazel.server.bsp.managers.BazelBspCompilationManager; -import org.jetbrains.bsp.bazel.server.common.ServerContainer; -import org.jetbrains.bsp.bazel.server.sync.ProjectStorage; -import org.jetbrains.bsp.bazel.server.sync.model.Project; -import org.jetbrains.bsp.bazel.workspacecontext.WorkspaceContextProvider; - -class BloopExporter { - - private final BspInfo bspInfo; - private final WorkspaceContextProvider workspaceContextProvider; - private final Path workspaceRoot; - - static void validateNoFailedExternalTargets( - Set projectTargets, Set failedTargets) - throws BazelExportFailedException { - var failedExternalTargets = - failedTargets.stream() - .filter(Predicate.not(projectTargets::contains)) - .collect(Collectors.toSet()); - - if (!failedExternalTargets.isEmpty()) { - throw new BazelExportFailedException(failedExternalTargets); - } - } - - public BloopExporter( - BspInfo bspInfo, Path workspaceRoot, WorkspaceContextProvider workspaceContextProvider) { - this.bspInfo = bspInfo; - this.workspaceContextProvider = workspaceContextProvider; - this.workspaceRoot = workspaceRoot; - } - - public void export(CancelChecker cancelChecker) throws BazelExportFailedException { - var bspClientLogger = new BspClientLogger(); - var bspClientTestNotifier = new BspClientTestNotifier(); - var bazelRunner = BazelRunner.of(workspaceContextProvider, bspClientLogger, workspaceRoot); - var compilationManager = new BazelBspCompilationManager(bazelRunner, new ConcurrentHashMap()); - var serverContainer = - ServerContainer.create( - bspInfo, - workspaceContextProvider, - new NoopProjectStorage(), - bspClientLogger, - bspClientTestNotifier, - bazelRunner, - compilationManager, null); - var projectProvider = serverContainer.getProjectProvider(); - var client = new BloopBuildClient(System.out, serverContainer.getBazelInfo()); - initializeClient(serverContainer, client); - - var project = projectProvider.refreshAndGet(cancelChecker); - var projectTargets = - project.getModules().stream() - .map(m -> new BuildTargetIdentifier(m.getLabel().getValue())) - .collect(Collectors.toSet()); - - validateNoFailedExternalTargets(projectTargets, client.getFailedTargets()); - - serverContainer - .getBspClientLogger() - .timed( - "Exporting to bloop", - () -> { - var bloopPath = bspInfo.bspProjectRoot().resolve(".bloop"); - var writtenFiles = new BspProjectExporter(project, bloopPath).export(); - cleanUpBloopDirectory(writtenFiles, bloopPath); - }); - } - - private void initializeClient(ServerContainer serverContainer, BloopBuildClient client) { - serverContainer.getBspClientLogger().initialize(client); - serverContainer.getCompilationManager().setClient(client); - serverContainer - .getCompilationManager() - .setWorkspaceRoot(serverContainer.getBazelInfo().getWorkspaceRoot()); - } - - private void cleanUpBloopDirectory(Set expected, Path bloopRoot) { - try { - Files.list(bloopRoot) - .filter(name -> name.toString().endsWith(".config.json")) - .filter(p -> !expected.contains(p)) - .forEach(p -> p.toFile().delete()); - } catch (Exception e) { - // it's fine - } - } - - public static class BazelExportFailedException extends RuntimeException { - private final Set failedTargets; - - public BazelExportFailedException(Set failedTargets) { - this.failedTargets = failedTargets; - } - - public Set getFailedTargets() { - return this.failedTargets; - } - } - - private static class BloopBuildClient implements BuildClient { - - private final PrintStream out; - private final BazelInfo bazelInfo; - private final java.util.Set failedTargets = Sets.newHashSet(); - - BloopBuildClient(PrintStream out, BazelInfo bazelInfo) { - this.out = out; - this.bazelInfo = bazelInfo; - } - - public Set getFailedTargets() { - return new HashSet<>(failedTargets); - } - - @Override - public void onBuildShowMessage(ShowMessageParams showMessageParams) {} - - @Override - public void onBuildLogMessage(LogMessageParams logMessageParams) { - out.println(logMessageParams.getMessage()); - } - - @Override - public void onBuildTaskStart(TaskStartParams taskStartParams) {} - - @Override - public void onBuildTaskProgress(TaskProgressParams taskProgressParams) {} - - @Override - public void onBuildTaskFinish(TaskFinishParams taskFinishParams) {} - - @Override - public void onBuildPublishDiagnostics(PublishDiagnosticsParams publishDiagnosticsParams) { - if (publishDiagnosticsParams.getDiagnostics().stream() - .anyMatch(d -> d.getSeverity() == DiagnosticSeverity.ERROR)) { - BuildTargetIdentifier modifiedTargetLabel; - if (bazelInfo.getRelease().getMajor() > 5) { - // Since bazel 6, the main repository targets are stringified to "@//"-prefixed labels, - // contrary to "//"-prefixed in older Bazel versions. Unfortunately this does not apply - // to BEP data, probably due to a bug, so we need to add the "@" prefix here. - modifiedTargetLabel = - new BuildTargetIdentifier("@" + publishDiagnosticsParams.getBuildTarget().getUri()); - } else { - modifiedTargetLabel = publishDiagnosticsParams.getBuildTarget(); - } - - this.failedTargets.add(modifiedTargetLabel); - } - } - - @Override - public void onBuildTargetDidChange(DidChangeBuildTarget didChangeBuildTarget) {} - } - - private static final class NoopProjectStorage implements ProjectStorage { - - @Override - public Project load() { - return null; - } - - @Override - public void store(Project project) {} - } -} diff --git a/server/src/main/java/org/jetbrains/bsp/bazel/server/bloop/BloopExporterInitializer.java b/server/src/main/java/org/jetbrains/bsp/bazel/server/bloop/BloopExporterInitializer.java deleted file mode 100644 index 139a1fce6..000000000 --- a/server/src/main/java/org/jetbrains/bsp/bazel/server/bloop/BloopExporterInitializer.java +++ /dev/null @@ -1,56 +0,0 @@ -package org.jetbrains.bsp.bazel.server.bloop; - -import ch.epfl.scala.bsp4j.BuildTargetIdentifier; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.Arrays; -import java.util.stream.Collectors; -import org.jetbrains.bsp.bazel.server.bsp.info.BspInfo; -import org.jetbrains.bsp.bazel.workspacecontext.DefaultWorkspaceContextProvider; - -public class BloopExporterInitializer { - public static void main(String[] args) { - Path projectViewPath; - Path bspProjectRoot = Paths.get("").toAbsolutePath().getParent(); - Path projectRoot; - - if (args.length == 1) { - projectRoot = Paths.get(args[0]); - projectViewPath = null; - } else if (args.length == 2) { - projectRoot = Paths.get(args[0]); - projectViewPath = Paths.get(args[1]); - } else { - System.err.printf("Got too many args: %s%n", Arrays.toString(args)); - System.exit(1); - throw new RuntimeException(); - } - - boolean hasErrors = false; - try { - var bspInfo = new BspInfo(bspProjectRoot); - var workspaceContextProvider = new DefaultWorkspaceContextProvider(projectViewPath); - new BloopExporter(bspInfo, projectRoot, workspaceContextProvider) - .export(() -> {}); // no other CancelChecker available here - } catch (BloopExporter.BazelExportFailedException ex) { - hasErrors = true; - System.err.println( - "Error exporting bazel project, one more more transitive dependencies failed to build," - + " see the previous output for more information:"); - System.err.print('\t'); - System.err.println( - ex.getFailedTargets().stream() - .map(BuildTargetIdentifier::getUri) - .collect(Collectors.joining(", "))); - } catch (Exception ex) { - hasErrors = true; - ex.printStackTrace(); - } - - if (hasErrors) { - System.exit(1); - } else { - System.exit(0); - } - } -} diff --git a/server/src/main/java/org/jetbrains/bsp/bazel/server/bloop/BloopProjectWriter.java b/server/src/main/java/org/jetbrains/bsp/bazel/server/bloop/BloopProjectWriter.java deleted file mode 100644 index bfb7e35b9..000000000 --- a/server/src/main/java/org/jetbrains/bsp/bazel/server/bloop/BloopProjectWriter.java +++ /dev/null @@ -1,44 +0,0 @@ -package org.jetbrains.bsp.bazel.server.bloop; - -import bloop.config.Config; -import bloop.config.ConfigCodecs; -import bloop.config.package$; -import com.google.common.hash.Hashing; -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.nio.file.Path; - -public class BloopProjectWriter { - private final Path bloopRoot; - - public BloopProjectWriter(Path bloopRoot) { - this.bloopRoot = bloopRoot; - } - - private String safeFileName(String projectName) { - return projectName.replace('/', '.'); - } - - public Path write(Config.Project bloopProject) { - var configFile = new Config.File(Config.File$.MODULE$.LatestVersion(), bloopProject); - var outputPath = bloopRoot.resolve(safeFileName(bloopProject.name()) + ".config.json"); - if (outputPath.toFile().exists()) { - var configString = ConfigCodecs.toStr(configFile); - var hasher = Hashing.sha256(); - var newHash = hasher.hashString(configString, StandardCharsets.UTF_8); - try { - var existingHash = - com.google.common.io.Files.asByteSource(outputPath.toFile()).hash(hasher); - if (!newHash.equals(existingHash)) { - Files.writeString(outputPath, configString, StandardCharsets.UTF_8); - } - } catch (IOException ex) { - throw new RuntimeException(ex); - } - } else { - package$.MODULE$.write(configFile, outputPath); - } - return outputPath; - } -} diff --git a/server/src/main/java/org/jetbrains/bsp/bazel/server/bloop/BspModuleExporter.kt b/server/src/main/java/org/jetbrains/bsp/bazel/server/bloop/BspModuleExporter.kt deleted file mode 100644 index 7d939e380..000000000 --- a/server/src/main/java/org/jetbrains/bsp/bazel/server/bloop/BspModuleExporter.kt +++ /dev/null @@ -1,198 +0,0 @@ -package org.jetbrains.bsp.bazel.server.bloop - -import bloop.config.Config -import bloop.config.Config.* -import org.jetbrains.bsp.bazel.server.bloop.ScalaInterop.toListOption -import org.jetbrains.bsp.bazel.server.bloop.ScalaInterop.toOption -import org.jetbrains.bsp.bazel.server.bloop.ScalaInterop.toScalaList -import org.jetbrains.bsp.bazel.server.bsp.utils.SourceRootGuesser -import org.jetbrains.bsp.bazel.server.sync.languages.LanguageData -import org.jetbrains.bsp.bazel.server.sync.languages.java.JavaModule -import org.jetbrains.bsp.bazel.server.sync.languages.jvm.javaModule -import org.jetbrains.bsp.bazel.server.sync.languages.scala.ScalaModule -import org.jetbrains.bsp.bazel.server.sync.model.Label -import org.jetbrains.bsp.bazel.server.sync.model.Module -import org.jetbrains.bsp.bazel.server.sync.model.Project -import org.jetbrains.bsp.bazel.server.sync.model.Tag -import scala.Option -import scala.Some -import java.net.URI -import java.nio.file.Path -import java.nio.file.Paths - -class BspModuleExporter( - private val project: Project, - private val module: Module, - private val bloopRoot: Path, - private val classpathRewriter: ClasspathRewriter, - private val sourceSetRewriter: SourceSetRewriter, - private val defaultScalaModule: ScalaModule? -) { - private val extraJvmOptions = listOf( - "-Duser.dir=" + Paths.get( - project.workspaceRoot - ).toAbsolutePath() - ) - - fun export(): Config.Project { - if (module.tags.contains(Tag.NO_BUILD)) { - return createNoBuildModule() - } - val name = Naming.safeName(module.label) - val directory = Paths.get(module.baseDirectory) - val adjustedSourceSet = sourceSetRewriter.rewrite( - module.sourceSet - ) - val workspaceDir = project.workspaceRoot - val sourceRoots = adjustedSourceSet.sourceRoots.toScalaList() - val reGlobbed = ReGlobber.reGlob(module.baseDirectory, adjustedSourceSet) - val dependencies = - module.directDependencies.filter(::isIncludedDependency).map(Naming::safeName) - val compileClassPath = - extractCompileClassPathFromLanguage(module).let(classpathRewriter::rewrite) - val out = bloopRoot.resolve( - Naming.compilerOutputNameFor( - module.label - ) - ) - val classesDir = out.resolve("classes") - val resources = module.resources.map(SourceRootGuesser::getSourcesRoot).toSet() - val scalaMod = module.languageData?.let(::createScalaConfig) - val javaMod = createJavaConfig(module) - val platform = createPlatform(module) - val resolution = createResolution() - val testFramework = createTestFramework() - val tags = toBloopTags(module.tags) - return Project( - name, - directory, - Option.apply(Paths.get(workspaceDir)), - reGlobbed.sources, - reGlobbed.globs, - sourceRoots.map(Paths::get).toOption(), - dependencies.toScalaList(), - compileClassPath.toScalaList(), - out, - classesDir, - resources.map(Paths::get).toListOption(), - scalaMod.toOption(), - javaMod.toOption(), - Option.empty(), - testFramework.toOption(), - platform.toOption(), - resolution.toOption(), - tags.toListOption() - ) - } - - private fun createNoBuildModule(): Config.Project { - val out = bloopRoot.resolve( - Naming.compilerOutputNameFor( - module.label - ) - ) - val classesDir = out.resolve("classes") - val resources = module.resources - return Project( - module.label.value, - Paths.get(module.baseDirectory), - Option.apply(Paths.get(project.workspaceRoot)), - ScalaInterop.emptyList(), - Option.empty(), - Option.empty(), - ScalaInterop.emptyList(), - ScalaInterop.emptyList(), - out, - classesDir, - resources.map(Paths::get).toListOption(), - Option.empty(), - Option.empty(), - Option.empty(), - Option.empty(), - Option.empty(), - Option.empty(), - Option.empty() - ) - } - - private fun extractCompileClassPathFromLanguage(module: Module): List = - module.javaModule?.let(JavaModule::compileClasspath).orEmpty() - - private fun isIncludedDependency(label: Label): Boolean = project.findModule(label) != null - - private fun createTestFramework(): Test? = module.tags.takeIf { it.contains(Tag.TEST) }?.let { - val framework = TestFramework( - setOf("munit.internal.junitinterface.PantsFramework").toScalaList() - ) - Test( - setOf(framework).toScalaList(), TestOptions( - ScalaInterop.emptyList(), ScalaInterop.emptyList() - ) - ) - } - - private fun toBloopTags(tags: Set): Set = if (tags.contains(Tag.TEST)) { - hashSetOf("test") - } else { - hashSetOf("library") - } - - private fun createJavaConfig(module: Module): Java? = - module.javaModule?.let { - Java(sanitizeJavacOpts(it.javacOpts).toScalaList()) - } - - private fun sanitizeJavacOpts(opts: List): List = - opts.filter { p: String -> !BAD_JAVAC_OPTS.contains(p) } - - private fun createScalaConfig(data: LanguageData): Scala? = - (data as? ScalaModule)?.let(::createScalaConfig) - ?: defaultScalaModule?.let(::createScalaConfig) - - private fun createScalaConfig(scalaModule: ScalaModule): Scala = Scala( - scalaModule.sdk.organization, - "scala-compiler", - scalaModule.sdk.version, - scalaModule.scalacOpts.toScalaList(), - scalaModule.sdk.compilerJars.map(Paths::get).toScalaList(), - Option.empty(), - Some.apply( - `CompileSetup$`.`MODULE$`.apply( - `Mixed$`.`MODULE$`, true, false, false, true, true - ) - ) - ) - - private fun createPlatform(module: Module): Platform? = - module.javaModule?.run { - val runtimeJdk = runtimeJdk ?: jdk - val jvmConfig = JvmConfig( - runtimeJdk.javaHome?.let(Paths::get).toOption(), - (extraJvmOptions + jvmOps).toScalaList() - ) - val runtimeClassPath = classpathRewriter.rewrite(runtimeClasspath).toScalaList() - bloop.config.`Config$Platform$Jvm`( - jvmConfig, - mainClass.toOption(), - jvmConfig.toOption(), - runtimeClassPath.toOption(), - Option.empty() - ) - } - - private fun createResolution(): Resolution = module.sourceDependencies.map { sourceDep -> - val artifact = Artifact( - "", Option.apply("sources"), Option.empty(), Paths.get(sourceDep) - ) - Module( - "", "", "", Option.empty(), setOf(artifact).toScalaList() - ) - }.toScalaList().let(::Resolution) - - - companion object { - private val BAD_JAVAC_OPTS: Set = hashSetOf( - "-XepAllErrorsAsWarnings", "-Xep:PreconditionsInvalidPlaceholder:OFF", "-Werror:-path" - ) - } -} diff --git a/server/src/main/java/org/jetbrains/bsp/bazel/server/bloop/BspProjectExporter.kt b/server/src/main/java/org/jetbrains/bsp/bazel/server/bloop/BspProjectExporter.kt deleted file mode 100644 index 7c6b019cd..000000000 --- a/server/src/main/java/org/jetbrains/bsp/bazel/server/bloop/BspProjectExporter.kt +++ /dev/null @@ -1,65 +0,0 @@ -package org.jetbrains.bsp.bazel.server.bloop - -import org.jetbrains.bsp.bazel.server.sync.languages.java.JavaModule -import org.jetbrains.bsp.bazel.server.sync.languages.jvm.javaModule -import org.jetbrains.bsp.bazel.server.sync.languages.scala.ScalaModule -import org.jetbrains.bsp.bazel.server.sync.model.Module -import org.jetbrains.bsp.bazel.server.sync.model.Project -import java.net.URI -import java.nio.file.Path -import java.nio.file.Paths - -internal class BspProjectExporter(private val project: Project, private val bloopRoot: Path) { - fun export(): Set { - val bloopProjectWriter = BloopProjectWriter(bloopRoot) - val classpathRewriter = buildClassPathRewriter() - val sourceSetRewriter = SourceSetRewriter(IGNORED_SOURCES) - val anyScalaModule = project - .modules.map { - ScalaModule.fromLanguageData(it.languageData) - }.firstOrNull() - return project - .modules - .map{ - BspModuleExporter( - project, - it, - bloopRoot, - classpathRewriter, - sourceSetRewriter, - anyScalaModule - ).export() - } - .map(bloopProjectWriter::write) - .toSet() - } - - private fun buildClassPathRewriter(): ClasspathRewriter { - val localArtifactsBuilder = project.modules.flatMap { - val moduleOutput = classesOutputForModule(it, bloopRoot) - artifactsFromLanguageData(it).map { uri -> - uri to moduleOutput - } - }.toMap() - return ClasspathRewriter(localArtifactsBuilder) - } - - private fun artifactsFromLanguageData(module: Module): Set { - return module.javaModule - ?.let(JavaModule::allOutputs) - ?.toSet().orEmpty() - } - - private fun classesOutputForModule(mod: Module, bloopRoot: Path): URI { - return bloopRoot.resolve(Naming.compilerOutputNameFor(mod.label)).resolve("classes") - .toUri() - } - - companion object { - private val IGNORED_SOURCES: Set = hashSetOf( - Paths.get( - "tools/src/main/scala/com/twitter/bazel/resources_workaround/placeholder.scala" - ) - ) - } -} diff --git a/server/src/main/java/org/jetbrains/bsp/bazel/server/bloop/ClasspathRewriter.java b/server/src/main/java/org/jetbrains/bsp/bazel/server/bloop/ClasspathRewriter.java deleted file mode 100644 index cd47ccb37..000000000 --- a/server/src/main/java/org/jetbrains/bsp/bazel/server/bloop/ClasspathRewriter.java +++ /dev/null @@ -1,25 +0,0 @@ -package org.jetbrains.bsp.bazel.server.bloop; - -import java.net.URI; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -public class ClasspathRewriter { - - private final Map localArtifacts; - - public ClasspathRewriter(Map localArtifacts) { - this.localArtifacts = localArtifacts; - } - - public List rewrite(List input) { - return input.stream() - .map(p -> this.localArtifacts.getOrDefault(p, p)) - .distinct() - .map(Paths::get) - .collect(Collectors.toList()); - } -} diff --git a/server/src/main/java/org/jetbrains/bsp/bazel/server/bloop/Naming.java b/server/src/main/java/org/jetbrains/bsp/bazel/server/bloop/Naming.java deleted file mode 100644 index 25819aee3..000000000 --- a/server/src/main/java/org/jetbrains/bsp/bazel/server/bloop/Naming.java +++ /dev/null @@ -1,31 +0,0 @@ -package org.jetbrains.bsp.bazel.server.bloop; - -import com.google.common.io.BaseEncoding; -import java.nio.charset.StandardCharsets; -import java.security.MessageDigest; -import org.jetbrains.bsp.bazel.server.sync.model.Label; - -class Naming { - private Naming() {} - - public static String compilerOutputNameFor(Label label) { - try { - var digest = MessageDigest.getInstance("MD5"); - digest.update(label.getValue().getBytes(StandardCharsets.UTF_8)); - return "z_" + BaseEncoding.base16().encode(digest.digest()).substring(0, 12); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - public static String safeName(Label label) { - var labelName = label.getValue(); - if (labelName.startsWith("//")) { - labelName = labelName.substring(2); - } else if (labelName.startsWith("@//")) { - labelName = labelName.substring(3); - } - - return labelName; - } -} diff --git a/server/src/main/java/org/jetbrains/bsp/bazel/server/bloop/ReGlobber.kt b/server/src/main/java/org/jetbrains/bsp/bazel/server/bloop/ReGlobber.kt deleted file mode 100644 index 6b02ee8c6..000000000 --- a/server/src/main/java/org/jetbrains/bsp/bazel/server/bloop/ReGlobber.kt +++ /dev/null @@ -1,94 +0,0 @@ -package org.jetbrains.bsp.bazel.server.bloop - -import bloop.config.Config.SourcesGlobs -import com.google.common.io.Files -import org.jetbrains.bsp.bazel.server.bloop.ScalaInterop.emptyList -import org.jetbrains.bsp.bazel.server.bloop.ScalaInterop.toOption -import org.jetbrains.bsp.bazel.server.bloop.ScalaInterop.toScalaList -import org.jetbrains.bsp.bazel.server.sync.model.SourceSet -import scala.Option -import java.net.URI -import java.nio.file.Path -import java.nio.file.Paths -import kotlin.math.max -import scala.collection.immutable.List as SList - -object ReGlobber { - fun reGlob(baseDirectory: URI, sourceSet: SourceSet): ReGlobbed { - val sourceGlobs = reGlobImpl(baseDirectory, sourceSet.sources).toOption() - val sources = - if (sourceGlobs.isDefined) emptyList() else sourceSet.sources.map(Paths::get) - .toScalaList() - return ReGlobbed(sourceGlobs, sources) - } - - private fun commonPrefix(basePath: Path, paths: List): Path { - if (paths.isEmpty()) { - return basePath - } - - val maxPrefixLen = paths.minOf { it.nameCount } - 1 - val prefix = mutableListOf() - - for (n in 0 until maxPrefixLen) { - val prefixPart = paths[0].getName(n) - if (paths.all { it.getName(n) == prefixPart }) { - prefix.add(prefixPart.toString()) - } else { - break - } - } - - return if (prefix.isEmpty()) basePath - else basePath.resolve(Paths.get(prefix.first(), *prefix.drop(1).toTypedArray())) - } - - private fun makeRelative(basePath: Path, paths: List): List = - paths - .asSequence() - .map(basePath::relativize) - .filter { !it.startsWith("..") } - .toList() - - private fun reGlobImpl(baseDirectory: URI, sources: Set): SList? { - var basePath = Paths.get(baseDirectory) - val sourcePaths = sources.map(Paths::get) - var relativeLevels = 0 - - var relativePaths = makeRelative(basePath, sourcePaths) - val newPrefix = commonPrefix(basePath, relativePaths) - if (newPrefix != basePath) { - basePath = newPrefix - relativePaths = makeRelative(newPrefix, sourcePaths) - } - - val extensions = relativePaths - .mapNotNull { - relativeLevels = max(relativeLevels, it.nameCount) - Files.getFileExtension(it.toString()).takeUnless(String::isEmpty) - }.distinct() - .toList() - - return if (relativeLevels == 0) { - null - } else { - val walkDepth: Option - val globPrefix: String - if (relativeLevels == 1) { - walkDepth = relativeLevels.toOption() - globPrefix = "glob:*." - } else { - walkDepth = Option.empty() - globPrefix = "glob:**." - } - val includes = extensions.map { globPrefix + it } - val singleGlob = SourcesGlobs(basePath, walkDepth, includes.toScalaList(), emptyList()) - listOf(singleGlob).toScalaList() - } - } - - class ReGlobbed( - val globs: Option>, - val sources: SList - ) -} diff --git a/server/src/main/java/org/jetbrains/bsp/bazel/server/bloop/ScalaInterop.kt b/server/src/main/java/org/jetbrains/bsp/bazel/server/bloop/ScalaInterop.kt deleted file mode 100644 index 48795b06b..000000000 --- a/server/src/main/java/org/jetbrains/bsp/bazel/server/bloop/ScalaInterop.kt +++ /dev/null @@ -1,32 +0,0 @@ -package org.jetbrains.bsp.bazel.server.bloop - -import scala.Option -import scala.Some -import scala.collection.immutable.List -import scala.collection.immutable.`List$` -import scala.jdk.javaapi.CollectionConverters.asScala -import java.nio.file.Path - -object ScalaInterop { - fun emptyList(): List = `List$`.`MODULE$`.empty() - - fun emptyOption(): Option = Option.empty() - - fun T?.toOption(): Option = - this?.let { Some.apply(it) } ?: Option.empty() - - fun Path.toScalaList(): List = - listOf(this).toScalaList() - - fun Iterable.toScalaList(): List = - asScala(this).toList() - - fun Iterable.toListOption(): Option> = - asScala(this).toList().toOption() - - fun Iterator.toScalaList(): List = - asScala(this).toList() - - fun scalaListOf(vararg rest: T): List = - rest.toList().toScalaList() -} diff --git a/server/src/main/java/org/jetbrains/bsp/bazel/server/bloop/SourceSetRewriter.kt b/server/src/main/java/org/jetbrains/bsp/bazel/server/bloop/SourceSetRewriter.kt deleted file mode 100644 index be350f5fe..000000000 --- a/server/src/main/java/org/jetbrains/bsp/bazel/server/bloop/SourceSetRewriter.kt +++ /dev/null @@ -1,21 +0,0 @@ -package org.jetbrains.bsp.bazel.server.bloop - -import org.jetbrains.bsp.bazel.server.sync.model.SourceSet -import java.nio.file.Path -import java.nio.file.Paths - -class SourceSetRewriter(private val ignoredSources: Set) { - fun rewrite(input: SourceSet): SourceSet { - if (input.sources.size == 1) { - val singleSource: Path = Paths.get(input.sources.first()) - if (ignoredSources.any(singleSource::endsWith)) { - return EMPTY_SOURCE_SET - } - } - return input - } - - companion object { - private val EMPTY_SOURCE_SET = SourceSet(HashSet(), HashSet()) - } -} diff --git a/server/src/test/java/org/jetbrains/bsp/bazel/server/bloop/BUILD b/server/src/test/java/org/jetbrains/bsp/bazel/server/bloop/BUILD deleted file mode 100644 index 7c41f1b5e..000000000 --- a/server/src/test/java/org/jetbrains/bsp/bazel/server/bloop/BUILD +++ /dev/null @@ -1,46 +0,0 @@ -load("@//rules/kotlin:junit5.bzl", "kt_test") - -kt_test( - name = "BloopExporterTest", - size = "small", - src = "BloopExporterTest.kt", - deps = [ - "//server/src/main/java/org/jetbrains/bsp/bazel/server/bloop", - ], -) - -kt_test( - name = "BspModuleExporterTest", - size = "small", - src = "BspModuleExporterTest.kt", - deps = [ - "//server/src/main/java/org/jetbrains/bsp/bazel/server/bloop", - ], -) - -kt_test( - name = "ClasspathRewriterTest", - size = "small", - src = "ClasspathRewriterTest.kt", - deps = [ - "//server/src/main/java/org/jetbrains/bsp/bazel/server/bloop", - ], -) - -kt_test( - name = "ReGlobberTest", - size = "small", - src = "ReGlobberTest.kt", - deps = [ - "//server/src/main/java/org/jetbrains/bsp/bazel/server/bloop", - ], -) - -kt_test( - name = "SourceSetRewriterTest", - size = "small", - src = "SourceSetRewriterTest.kt", - deps = [ - "//server/src/main/java/org/jetbrains/bsp/bazel/server/bloop", - ], -) diff --git a/server/src/test/java/org/jetbrains/bsp/bazel/server/bloop/BloopExporterTest.kt b/server/src/test/java/org/jetbrains/bsp/bazel/server/bloop/BloopExporterTest.kt deleted file mode 100644 index a1512d1c0..000000000 --- a/server/src/test/java/org/jetbrains/bsp/bazel/server/bloop/BloopExporterTest.kt +++ /dev/null @@ -1,33 +0,0 @@ -package org.jetbrains.bsp.bazel.server.bloop - -import ch.epfl.scala.bsp4j.BuildTargetIdentifier -import org.jetbrains.bsp.bazel.server.bloop.BloopExporter.BazelExportFailedException -import org.junit.jupiter.api.Test -import org.junit.jupiter.api.fail - -class BloopExporterTest { - @Test - fun export_project_with_failed_direct_target_succeeds() { - val projectTargets = setOf(BuildTargetIdentifier("a"), BuildTargetIdentifier("b")) - val failedTargets = setOf(BuildTargetIdentifier("a")) - - try { - BloopExporter.validateNoFailedExternalTargets(projectTargets, failedTargets) - } catch (ex: BazelExportFailedException) { - fail(ex) - } - } - - @Test - fun export_project_with_failed_transitive_target_fails() { - val projectTargets = setOf(BuildTargetIdentifier("a"), BuildTargetIdentifier("b")) - val failedTargets = setOf(BuildTargetIdentifier("c")) - - try { - BloopExporter.validateNoFailedExternalTargets(projectTargets, failedTargets) - } catch (ex: BazelExportFailedException) { - return - } - fail("a BazelExportFailedException was expected but none was thrown") - } -} diff --git a/server/src/test/java/org/jetbrains/bsp/bazel/server/bloop/BspModuleExporterTest.kt b/server/src/test/java/org/jetbrains/bsp/bazel/server/bloop/BspModuleExporterTest.kt deleted file mode 100644 index 885c7af92..000000000 --- a/server/src/test/java/org/jetbrains/bsp/bazel/server/bloop/BspModuleExporterTest.kt +++ /dev/null @@ -1,115 +0,0 @@ -package org.jetbrains.bsp.bazel.server.bloop - -import bloop.config.Config -import io.kotest.matchers.shouldBe -import org.jetbrains.bsp.bazel.server.bloop.ScalaInterop.emptyOption -import org.jetbrains.bsp.bazel.server.bloop.ScalaInterop.scalaListOf -import org.jetbrains.bsp.bazel.server.bloop.ScalaInterop.toOption -import org.jetbrains.bsp.bazel.server.bloop.ScalaInterop.toScalaList -import org.jetbrains.bsp.bazel.server.sync.languages.java.JavaModule -import org.jetbrains.bsp.bazel.server.sync.languages.java.Jdk -import org.jetbrains.bsp.bazel.server.sync.languages.scala.ScalaModule -import org.jetbrains.bsp.bazel.server.sync.languages.scala.ScalaSdk -import org.jetbrains.bsp.bazel.server.sync.model.* -import org.junit.jupiter.api.Test -import java.nio.file.Path -import java.nio.file.Paths - -import org.jetbrains.bsp.bazel.server.bloop.ScalaInterop.emptyList as emptyScalaList - -class BspModuleExporterTest { - @Test - fun `export bsp library module`() { - val baseDirectory = Paths.get("base/").toAbsolutePath() - val bloopRoot = baseDirectory.resolve("bloop/").toAbsolutePath() - val moduleLabel = Label("//my/target") - - val bspModule = Module( - moduleLabel, - false, - listOf(Label("dep1")), - hashSetOf(Language.SCALA), - hashSetOf(Tag.LIBRARY), - baseDirectory.toUri(), - SourceSet( - hashSetOf(baseDirectory.resolve("file1.scala").toUri()), - hashSetOf(baseDirectory.toUri()) - ), - emptySet(), - emptySet(), - emptySet(), - ScalaModule( - ScalaSdk("scala", "2.12.15", "2.12.15", emptyList()), emptyList(), JavaModule( - Jdk("11", null), - null, - emptyList(), - emptyList(), - baseDirectory.toUri(), - emptyList(), - null, - emptyList(), - emptyList(), - listOf(baseDirectory.resolve("cp1").toUri()), - emptyList(), - emptyList(), - ) - ), - hashMapOf() - ) - val project = Project( - baseDirectory.toUri(), listOf(bspModule), emptyMap() - ) - val classPathRewriter = ClasspathRewriter(emptyMap()) - val soureSetRewriter = SourceSetRewriter(emptySet()) - val exporter = BspModuleExporter( - project, bspModule, bloopRoot, classPathRewriter, soureSetRewriter, null - ) - val ret = exporter.export() - val out = bloopRoot.resolve(Naming.compilerOutputNameFor(moduleLabel)) - ret shouldBe Config.Project( - "my/target", - baseDirectory, - scala.Option.apply(baseDirectory), - emptyScalaList(), - scalaListOf( - Config.SourcesGlobs( - baseDirectory, - scala.Option.apply(1), - scalaListOf("glob:*.scala"), - emptyScalaList() - ) - ).toOption(), - baseDirectory.toScalaList().toOption(), - emptyScalaList(), - scalaListOf(baseDirectory.resolve("cp1")), - out, - out.resolve("classes"), - emptyScalaList().toOption(), - Config.Scala( - "scala", - "scala-compiler", - "2.12.15", - emptyScalaList(), - emptyScalaList(), - emptyOption(), - Config.CompileSetup( - Config.`Mixed$`.`MODULE$`, true, false, false, true, true - ).toOption() - ).toOption(), - Config.Java(emptyScalaList()).toOption(), - emptyOption(), - emptyOption(), - bloop.config.`Config$Platform$Jvm`( - Config.JvmConfig( - emptyOption(), scalaListOf("-Duser.dir=${baseDirectory}") - ), emptyOption(), scala.Option.apply( - Config.JvmConfig( - emptyOption(), scalaListOf("-Duser.dir=${baseDirectory}") - ) - ), emptyScalaList().toOption(), emptyOption() - ).toOption(), - scala.Option.apply(Config.Resolution(emptyScalaList())), - scala.Option.apply(scalaListOf("library")) - ) - } -} diff --git a/server/src/test/java/org/jetbrains/bsp/bazel/server/bloop/ClasspathRewriterTest.kt b/server/src/test/java/org/jetbrains/bsp/bazel/server/bloop/ClasspathRewriterTest.kt deleted file mode 100644 index 7c53db7cf..000000000 --- a/server/src/test/java/org/jetbrains/bsp/bazel/server/bloop/ClasspathRewriterTest.kt +++ /dev/null @@ -1,29 +0,0 @@ -package org.jetbrains.bsp.bazel.server.bloop - -import io.kotest.matchers.collections.shouldContainExactly -import org.junit.jupiter.api.Test -import java.nio.file.Paths - -class ClasspathRewriterTest { - @Test - fun `rewrites classpath`() { - val root = Paths.get("root/") - val localRoot = Paths.get("local-root/") - val artifacts = mapOf( - root.resolve("artifact-1").toUri() to localRoot.resolve("local-artifact-1").toUri() - ) - - val rewriter = ClasspathRewriter(artifacts) - val ret = rewriter.rewrite( - listOf( - root.resolve("artifact-1").toUri(), - root.resolve("artifact-2").toUri() - ) - ) - - ret.shouldContainExactly( - localRoot.resolve("local-artifact-1").toAbsolutePath(), - root.resolve("artifact-2").toAbsolutePath() - ) - } -} diff --git a/server/src/test/java/org/jetbrains/bsp/bazel/server/bloop/ReGlobberTest.kt b/server/src/test/java/org/jetbrains/bsp/bazel/server/bloop/ReGlobberTest.kt deleted file mode 100644 index f23c99683..000000000 --- a/server/src/test/java/org/jetbrains/bsp/bazel/server/bloop/ReGlobberTest.kt +++ /dev/null @@ -1,105 +0,0 @@ -package org.jetbrains.bsp.bazel.server.bloop - -import bloop.config.Config -import io.kotest.matchers.collections.shouldBeEmpty -import io.kotest.matchers.shouldBe -import org.jetbrains.bsp.bazel.server.bloop.ScalaInterop.emptyList -import org.jetbrains.bsp.bazel.server.bloop.ScalaInterop.scalaListOf -import org.jetbrains.bsp.bazel.server.sync.model.SourceSet -import org.junit.jupiter.api.Test -import scala.jdk.javaapi.CollectionConverters -import java.nio.file.Paths - -class ReGlobberTest { - @Test - fun `reglobs sources with one level`() { - val basePath = Paths.get("base/path/") - val sourceSet = SourceSet( - hashSetOf( - basePath.resolve(Paths.get("file1.scala")).toUri(), - basePath.resolve(Paths.get("file2.scala")).toUri() - ), - emptySet() - ) - val reglobbed = ReGlobber.reGlob(basePath.toUri(), sourceSet) - - CollectionConverters.asJava(reglobbed.sources).shouldBeEmpty() - reglobbed.globs.get() shouldBe scalaListOf( - Config.SourcesGlobs( - basePath.toAbsolutePath(), - scala.Some.apply(1), - scalaListOf("glob:*.scala"), - emptyList() - ) - ) - } - - @Test - fun `reglobs sources with two levels`() { - val basePath = Paths.get("base/path/") - val sourceSet = SourceSet( - hashSetOf( - basePath.resolve(Paths.get("file1.scala")).toUri(), - basePath.resolve(Paths.get("child/file2.scala")).toUri() - ), - emptySet() - ) - val reglobbed = ReGlobber.reGlob(basePath.toUri(), sourceSet) - - CollectionConverters.asJava(reglobbed.sources).shouldBeEmpty() - reglobbed.globs.get() shouldBe scalaListOf( - Config.SourcesGlobs( - basePath.toAbsolutePath(), - scala.Option.empty(), - scalaListOf("glob:**.scala"), - emptyList() - ) - ) - } - - @Test - fun `reglobs sources with one level and base path`() { - val basePath = Paths.get("base/path/") - val sourceSet = SourceSet( - hashSetOf( - basePath.resolve(Paths.get("src/main/child/file1.scala")).toUri(), - basePath.resolve(Paths.get("src/main/child/file2.scala")).toUri() - ), - emptySet() - ) - val reglobbed = ReGlobber.reGlob(basePath.toUri(), sourceSet) - - CollectionConverters.asJava(reglobbed.sources).shouldBeEmpty() - reglobbed.globs.get() shouldBe scalaListOf( - Config.SourcesGlobs( - basePath.resolve("src/main/child").toAbsolutePath(), - scala.Option.apply(1), - scalaListOf("glob:*.scala"), - emptyList() - ) - ) - } - - @Test - fun `reglobs sources with two levels and base path`() { - val basePath = Paths.get("base/path/") - val sourceSet = SourceSet( - hashSetOf( - basePath.resolve(Paths.get("src/main/child/dir1/file1.scala")).toUri(), - basePath.resolve(Paths.get("src/main/child/file2.scala")).toUri() - ), - emptySet() - ) - val reglobbed = ReGlobber.reGlob(basePath.toUri(), sourceSet) - - CollectionConverters.asJava(reglobbed.sources).shouldBeEmpty() - reglobbed.globs.get() shouldBe scalaListOf( - Config.SourcesGlobs( - basePath.resolve("src/main/child").toAbsolutePath(), - scala.Option.empty(), - scalaListOf("glob:**.scala"), - emptyList() - ) - ) - } -} diff --git a/server/src/test/java/org/jetbrains/bsp/bazel/server/bloop/SourceSetRewriterTest.kt b/server/src/test/java/org/jetbrains/bsp/bazel/server/bloop/SourceSetRewriterTest.kt deleted file mode 100644 index aeb16ab0f..000000000 --- a/server/src/test/java/org/jetbrains/bsp/bazel/server/bloop/SourceSetRewriterTest.kt +++ /dev/null @@ -1,43 +0,0 @@ -package org.jetbrains.bsp.bazel.server.bloop - -import io.kotest.matchers.shouldBe -import org.jetbrains.bsp.bazel.server.sync.model.SourceSet -import org.junit.jupiter.api.Test -import java.net.URI -import java.nio.file.Paths - - -class SourceSetRewriterTest { - @Test - fun `passes through source sets without invalid entries`() { - val rewriter = SourceSetRewriter(hashSetOf(Paths.get("a/bad/path.scala"))) - val sourceSet = SourceSet( - hashSetOf(URI.create("file:///some/path/some.file")), - emptySet() - ) - val ret = rewriter.rewrite(sourceSet) - ret shouldBe sourceSet - } - - @Test - fun `passes through source sets with invalid entry and valid entry`() { - val rewriter = SourceSetRewriter(hashSetOf(Paths.get("a/bad/path.scala"))) - val sourceSet = SourceSet( - hashSetOf(URI.create("file:///some/path/some.file"), URI.create("file:///some/path/a/bad/path.scala")), - emptySet() - ) - val ret = rewriter.rewrite(sourceSet) - ret shouldBe sourceSet - } - - @Test - fun `rewrites source sets with invalid entries`() { - val rewriter = SourceSetRewriter(hashSetOf(Paths.get("a/bad/path.scala"))) - val sourceSet = SourceSet( - hashSetOf(URI.create("file:///some/path/a/bad/path.scala")), - emptySet() - ) - val ret = rewriter.rewrite(sourceSet) - ret shouldBe SourceSet(emptySet(), emptySet()) - } -}