Skip to content

Commit a192831

Browse files
committed
Ensure fix sub-command respects the --semanticdb flag
1 parent 93bfe4f commit a192831

File tree

2 files changed

+78
-37
lines changed

2 files changed

+78
-37
lines changed

modules/cli/src/main/scala/scala/cli/commands/fix/ScalafixRules.scala

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import scala.build.compiler.ScalaCompilerMaker
1010
import scala.build.errors.BuildException
1111
import scala.build.input.{Inputs, ScalaCliInvokeData}
1212
import scala.build.internal.{Constants, Runner}
13+
import scala.build.internals.ConsoleUtils.ScalaCliConsole.warnPrefix
1314
import scala.build.options.{BuildOptions, Scope}
1415
import scala.build.{Build, Logger, Os, ScalafixArtifacts}
1516
import scala.cli.commands.fix.ScalafixOptions
@@ -32,11 +33,28 @@ object ScalafixRules extends CommandHelpers {
3233
actionableDiagnostics: Option[Boolean],
3334
logger: Logger
3435
)(using ScalaCliInvokeData): Either[BuildException, Int] = {
35-
val buildOptionsWithSemanticDb = buildOptions.copy(scalaOptions =
36-
buildOptions.scalaOptions.copy(semanticDbOptions =
37-
buildOptions.scalaOptions.semanticDbOptions.copy(generateSemanticDbs = Some(true))
38-
)
39-
)
36+
sharedOptions.semanticDbOptions.semanticDb match {
37+
case Some(false) =>
38+
logger.message(
39+
s"""$warnPrefix SemanticDB files' generation was explicitly set to false.
40+
|$warnPrefix Some scalafix rules require .semanticdb files and may not work properly."""
41+
.stripMargin
42+
)
43+
case Some(true) =>
44+
logger.debug("SemanticDB files' generation enabled.")
45+
case None =>
46+
logger.debug("Defaulting SemanticDB files' generation to true, to satisfy scalafix needs.")
47+
}
48+
val buildOptionsWithSemanticDb =
49+
if buildOptions.scalaOptions.semanticDbOptions.generateSemanticDbs.isEmpty then
50+
buildOptions.copy(scalaOptions =
51+
buildOptions.scalaOptions.copy(semanticDbOptions =
52+
buildOptions.scalaOptions.semanticDbOptions.copy(generateSemanticDbs =
53+
Some(true)
54+
)
55+
)
56+
)
57+
else buildOptions
4058

4159
val scalaVersion =
4260
buildOptions.scalaParams.orExit(logger).map(_.scalaVersion)

modules/integration/src/test/scala/scala/cli/integration/FixScalafixRulesTestDefinitions.scala

Lines changed: 55 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ package scala.cli.integration
22

33
import com.eed3si9n.expecty.Expecty.expect
44

5+
import scala.util.Properties
6+
57
trait FixScalafixRulesTestDefinitions {
68
_: FixTestDefinitions =>
79
protected val scalafixConfFileName: String = ".scalafix.conf"
@@ -293,37 +295,58 @@ trait FixScalafixRulesTestDefinitions {
293295
}
294296
}
295297

296-
test("scalafix rules requiring SemanticDB run correctly with test scope sources") {
297-
val compilerOptions =
298-
if (actualScalaVersion.startsWith("2.12")) Seq("-Ywarn-unused-import")
299-
else Seq("-Wunused:imports")
300-
TestInputs(
301-
os.rel / scalafixConfFileName ->
302-
"""rules = [
303-
| DisableSyntax,
304-
| LeakingImplicitClassVal,
305-
| NoValInForComprehension,
306-
| ExplicitResultTypes,
307-
| OrganizeImports
308-
|]
309-
|ExplicitResultTypes.fetchScala3CompilerArtifactsOnVersionMismatch = true
310-
|""".stripMargin,
311-
os.rel / projectFileName ->
312-
s"""//> using test.dep org.scalameta::munit::${Constants.munitVersion}
313-
|//> using options ${compilerOptions.mkString(" ")}
314-
|""".stripMargin,
315-
os.rel / "example.test.scala" ->
316-
"""import munit.FunSuite
317-
|
318-
|class Munit extends FunSuite {
319-
| test("foo") {
320-
| assert(2 + 2 == 4)
321-
| println("Hello from Munit")
322-
| }
323-
|}
324-
|""".stripMargin
325-
).fromRoot { root =>
326-
os.proc(TestUtil.cli, "fix", ".", "--power", extraOptions).call(cwd = root)
327-
}
298+
for {
299+
(semanticDbOptions, expectedSuccess) <- Seq(
300+
Nil -> true, // .semanticdb files should be implicitly generated when Scalafix is run
301+
Seq("--semanticdb") -> true,
302+
Seq("--semanticdb=false") -> false
303+
)
304+
semanticDbOptionsDescription =
305+
if (semanticDbOptions.nonEmpty) s" (${semanticDbOptions.mkString(" ")})"
306+
else ""
307+
verb = if (expectedSuccess) "run" else "fail"
308+
if !Properties.isWin || expectedSuccess
328309
}
310+
test(
311+
s"scalafix rules requiring SemanticDB $verb correctly with test scope sources$semanticDbOptionsDescription"
312+
) {
313+
val compilerOptions =
314+
if (actualScalaVersion.startsWith("2.12")) Seq("-Ywarn-unused-import")
315+
else Seq("-Wunused:imports")
316+
TestInputs(
317+
os.rel / scalafixConfFileName ->
318+
"""rules = [
319+
| DisableSyntax,
320+
| LeakingImplicitClassVal,
321+
| NoValInForComprehension,
322+
| ExplicitResultTypes,
323+
| OrganizeImports
324+
|]
325+
|ExplicitResultTypes.fetchScala3CompilerArtifactsOnVersionMismatch = true
326+
|""".stripMargin,
327+
os.rel / projectFileName ->
328+
s"""//> using test.dep org.scalameta::munit::${Constants.munitVersion}
329+
|//> using options ${compilerOptions.mkString(" ")}
330+
|""".stripMargin,
331+
os.rel / "example.test.scala" ->
332+
"""import munit.FunSuite
333+
|
334+
|class Munit extends FunSuite {
335+
| test("foo") {
336+
| assert(2 + 2 == 4)
337+
| println("Hello from Munit")
338+
| }
339+
|}
340+
|""".stripMargin
341+
).fromRoot { root =>
342+
val res = os.proc(TestUtil.cli, "fix", ".", "--power", semanticDbOptions, extraOptions)
343+
.call(cwd = root, check = false, stderr = os.Pipe)
344+
val successful = res.exitCode == 0
345+
expect(successful == expectedSuccess)
346+
if (!expectedSuccess)
347+
expect(
348+
res.err.trim().contains("SemanticDB files' generation was explicitly set to false")
349+
)
350+
}
351+
}
329352
}

0 commit comments

Comments
 (0)