From f23a861d52559680053f9203e63e60b47dbd1862 Mon Sep 17 00:00:00 2001 From: Tomasz Godzik Date: Thu, 6 Jul 2023 12:56:28 +0200 Subject: [PATCH] bugfix: Don't deduplicate all options when using Metals PReviously, we would use `.distinct` on all project scalac options which would remove values for different options if the happened to be the same. Now, we only deduplicate semanticdb options. Fixes https://github.com/scalameta/metals/issues/5400 --- .../src/main/scala/bloop/data/Project.scala | 6 ++-- .../scala/bloop/bsp/BspMetalsClientSpec.scala | 36 ++++++++++++++++++- 2 files changed, 38 insertions(+), 4 deletions(-) diff --git a/frontend/src/main/scala/bloop/data/Project.scala b/frontend/src/main/scala/bloop/data/Project.scala index 025e35064c..d5a6716685 100644 --- a/frontend/src/main/scala/bloop/data/Project.scala +++ b/frontend/src/main/scala/bloop/data/Project.scala @@ -454,10 +454,10 @@ object Project { // engine so that semanticdb files are replicated in those directories val hasSemanticDB = hasScalaSemanticDBEnabledInCompilerOptions(options) val pluginOption = if (hasSemanticDB) Nil else List(s"-Xplugin:$pluginPath") - val baseOptions = s"-P:semanticdb:sourceroot:$workspaceDir" :: options.filterNot( - isScalaSemanticdbSourceRoot + val baseOptions = s"-P:semanticdb:sourceroot:$workspaceDir" :: options.filterNot(opt => + isScalaSemanticdbSourceRoot(opt) || baseSemanticdbOptions.contains(opt) ) - (baseOptions ++ baseSemanticdbOptions ++ pluginOption).distinct + baseOptions ++ baseSemanticdbOptions ++ pluginOption } def enableDottySemanticdb(options: List[String]) = { diff --git a/frontend/src/test/scala/bloop/bsp/BspMetalsClientSpec.scala b/frontend/src/test/scala/bloop/bsp/BspMetalsClientSpec.scala index cacf35d559..f270ed04ad 100644 --- a/frontend/src/test/scala/bloop/bsp/BspMetalsClientSpec.scala +++ b/frontend/src/test/scala/bloop/bsp/BspMetalsClientSpec.scala @@ -167,7 +167,14 @@ class BspMetalsClientSpec( ) val scalacOptions = state.scalaOptions(`A`)._2.items.head.options - assert(scalacOptions == correctSourceRootOption :: defaultScalacOptions.drop(1)) + val expectedScalacOptions = correctSourceRootOption :: List( + "-Xplugin:path-to-plugin/semanticdb-scalac_2.12.18-4.7.8.jar", + "-Yrangepos", + "-P:semanticdb:failures:warning", + "-P:semanticdb:synthetics:on", + "-Xplugin-require:semanticdb" + ) + assert(scalacOptions == expectedScalacOptions) } } } @@ -469,6 +476,33 @@ class BspMetalsClientSpec( } } + test("save-compile-semanticDB-many-options") { + TestUtil.withinWorkspace { workspace => + val `A` = TestProject( + workspace, + "A", + dummyFooScalaAndBarJavaSources, + scalacOptions = List("-release", "8", "-Ybackend-parallelism", "8") + ) + val projects = List(`A`) + TestProject.populateWorkspace(workspace, projects) + val logger = new RecordingLogger(ansiCodesSupported = false) + val extraParams = BloopExtraBuildParams( + ownsBuildFiles = None, + clientClassesRootDir = None, + semanticdbVersion = Some(semanticdbVersion), + supportedScalaVersions = Some(List(testedScalaVersion)), + javaSemanticdbVersion = Some(javaSemanticdbVersion) + ) + loadBspState(workspace, projects, logger, "Metals", bloopExtraParams = extraParams) { state => + val compiledState = state.compile(`A`).toTestState + assert(compiledState.status == ExitStatus.Ok) + assertSemanticdbFileFor("Foo.scala", compiledState) + assertSemanticdbFileFor("Bar.java", compiledState) + } + } + } + test("compile is successful with semanticDB and javac processorpath") { TestUtil.withinWorkspace { workspace => val logger = new RecordingLogger(ansiCodesSupported = false)