Skip to content

Commit 7cc9fab

Browse files
committed
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 scalameta/metals#5400
1 parent f2aec2f commit 7cc9fab

2 files changed

Lines changed: 38 additions & 4 deletions

File tree

frontend/src/main/scala/bloop/data/Project.scala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -454,10 +454,10 @@ object Project {
454454
// engine so that semanticdb files are replicated in those directories
455455
val hasSemanticDB = hasScalaSemanticDBEnabledInCompilerOptions(options)
456456
val pluginOption = if (hasSemanticDB) Nil else List(s"-Xplugin:$pluginPath")
457-
val baseOptions = s"-P:semanticdb:sourceroot:$workspaceDir" :: options.filterNot(
458-
isScalaSemanticdbSourceRoot
457+
val baseOptions = s"-P:semanticdb:sourceroot:$workspaceDir" :: options.filterNot(opt =>
458+
isScalaSemanticdbSourceRoot(opt) || baseSemanticdbOptions.contains(opt)
459459
)
460-
(baseOptions ++ baseSemanticdbOptions ++ pluginOption).distinct
460+
baseOptions ++ baseSemanticdbOptions ++ pluginOption
461461
}
462462

463463
def enableDottySemanticdb(options: List[String]) = {

frontend/src/test/scala/bloop/bsp/BspMetalsClientSpec.scala

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,14 @@ class BspMetalsClientSpec(
172172
)
173173

174174
val scalacOptions = state.scalaOptions(`A`)._2.items.head.options
175-
assert(scalacOptions == correctSourceRootOption :: defaultScalacOptions.drop(1))
175+
val expectedScalacOptions = correctSourceRootOption :: List(
176+
"-Xplugin:path-to-plugin/semanticdb-scalac_2.12.18-4.7.8.jar",
177+
"-Yrangepos",
178+
"-P:semanticdb:failures:warning",
179+
"-P:semanticdb:synthetics:on",
180+
"-Xplugin-require:semanticdb"
181+
)
182+
assert(scalacOptions == expectedScalacOptions)
176183
}
177184
}
178185
}
@@ -474,6 +481,33 @@ class BspMetalsClientSpec(
474481
}
475482
}
476483

484+
test("save-compile-semanticDB-many-options") {
485+
TestUtil.withinWorkspace { workspace =>
486+
val `A` = TestProject(
487+
workspace,
488+
"A",
489+
dummyFooScalaAndBarJavaSources,
490+
scalacOptions = List("-release", "8", "-Ybackend-parallelism", "8")
491+
)
492+
val projects = List(`A`)
493+
TestProject.populateWorkspace(workspace, projects)
494+
val logger = new RecordingLogger(ansiCodesSupported = false)
495+
val extraParams = BloopExtraBuildParams(
496+
ownsBuildFiles = None,
497+
clientClassesRootDir = None,
498+
semanticdbVersion = Some(semanticdbVersion),
499+
supportedScalaVersions = Some(List(testedScalaVersion)),
500+
javaSemanticdbVersion = Some(javaSemanticdbVersion)
501+
)
502+
loadBspState(workspace, projects, logger, "Metals", bloopExtraParams = extraParams) { state =>
503+
val compiledState = state.compile(`A`).toTestState
504+
assert(compiledState.status == ExitStatus.Ok)
505+
assertSemanticdbFileFor("Foo.scala", compiledState)
506+
assertSemanticdbFileFor("Bar.java", compiledState)
507+
}
508+
}
509+
}
510+
477511
test("compile is successful with semanticDB and javac processorpath") {
478512
TestUtil.withinWorkspace { workspace =>
479513
val logger = new RecordingLogger(ansiCodesSupported = false)

0 commit comments

Comments
 (0)