Skip to content

Commit 2a7023e

Browse files
authored
Merge pull request #3641 from Gedochao/feature/scalafix-test-scope
Apply `scalafix` rules to test scope inputs, too
2 parents 9da7662 + 528b8c9 commit 2a7023e

File tree

7 files changed

+75
-24
lines changed

7 files changed

+75
-24
lines changed

modules/cli/src/main/scala/scala/cli/commands/compile/Compile.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import scala.cli.commands.setupide.SetupIde
1313
import scala.cli.commands.shared.{HelpCommandGroup, HelpGroup, SharedOptions}
1414
import scala.cli.commands.update.Update
1515
import scala.cli.commands.util.BuildCommandHelpers
16+
import scala.cli.commands.util.BuildCommandHelpers.*
1617
import scala.cli.commands.{CommandUtils, ScalaCommand, SpecificationLevel, WatchUtil}
1718
import scala.cli.config.{ConfigDb, Keys}
1819
import scala.cli.packaging.Library.fullClassPathMaybeAsJar

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ object Fix extends ScalaCommand[FixOptions] {
5454
ScalafixRules.runRules(
5555
buildOptions = buildOpts,
5656
scalafixOptions = options.scalafix,
57+
sharedOptions = options.shared,
5758
inputs = inputs,
5859
check = options.check,
5960
compilerMaker = compilerMaker,

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

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,20 @@ import scala.build.errors.BuildException
1111
import scala.build.input.{Inputs, ScalaCliInvokeData}
1212
import scala.build.internal.{Constants, Runner}
1313
import scala.build.options.{BuildOptions, Scope}
14-
import scala.build.{Build, Logger, ScalafixArtifacts}
14+
import scala.build.{Build, Logger, Os, ScalafixArtifacts}
1515
import scala.cli.commands.fix.ScalafixOptions
16+
import scala.cli.commands.shared.SharedOptions
17+
import scala.cli.commands.util.BuildCommandHelpers.copyOutput
1618
import scala.cli.commands.util.CommandHelpers
19+
import scala.cli.commands.util.ScalacOptionsUtil.*
1720
import scala.jdk.CollectionConverters.*
1821
import scala.jdk.OptionConverters.*
1922

2023
object ScalafixRules extends CommandHelpers {
2124
def runRules(
2225
buildOptions: BuildOptions,
2326
scalafixOptions: ScalafixOptions,
27+
sharedOptions: SharedOptions,
2428
inputs: Inputs,
2529
compilerMaker: ScalaCompilerMaker,
2630
workspace: os.Path,
@@ -45,24 +49,28 @@ object ScalafixRules extends CommandHelpers {
4549
None,
4650
logger,
4751
crossBuilds = false,
48-
buildTests = false,
52+
buildTests = true,
4953
partial = None,
5054
actionableDiagnostics = actionableDiagnostics
5155
)
5256
val builds = res.orExit(logger)
5357

54-
builds.get(Scope.Main).flatMap(_.successfulOpt) match
55-
case None => sys.exit(1)
56-
case Some(build) =>
57-
val classPaths = build.fullClassPath
58-
val scalacOptions = build.options.scalaOptions.scalacOptions.toSeq.map(_.value.value)
58+
builds.builds match
59+
case b if b.forall(_.success) =>
60+
val successfulBuilds = b.collect { case s: Build.Successful => s }
61+
successfulBuilds.foreach(_.copyOutput(sharedOptions))
62+
val classPaths = successfulBuilds.flatMap(_.fullClassPath).distinct
63+
val scalacOptions =
64+
successfulBuilds.headOption.toSeq
65+
.flatMap(_.options.scalaOptions.scalacOptions.toSeq.map(_.value.value))
5966

6067
either {
6168
val artifacts =
6269
value(
6370
ScalafixArtifacts.artifacts(
6471
scalaVersion,
65-
build.options.classPathOptions.scalafixDependencies.values.flatten,
72+
successfulBuilds.headOption.toSeq
73+
.flatMap(_.options.classPathOptions.scalafixDependencies.values.flatten),
6674
value(buildOptions.finalRepositories),
6775
logger,
6876
buildOptions.internal.cache.getOrElse(FileCache())
@@ -76,10 +84,10 @@ object ScalafixRules extends CommandHelpers {
7684
Seq("--sourceroot", workspace.toString) ++
7785
Seq("--classpath", classPaths.mkString(java.io.File.pathSeparator)) ++
7886
Seq("--scala-version", scalaVersion) ++
79-
(if (check) Seq("--test") else Nil) ++
80-
(if (scalacOptions.nonEmpty) scalacOptions.flatMap(Seq("--scalac-options", _))
87+
(if check then Seq("--test") else Nil) ++
88+
(if scalacOptions.nonEmpty then scalacOptions.flatMap(Seq("--scalac-options", _))
8189
else Nil) ++
82-
(if (artifacts.toolsJars.nonEmpty)
90+
(if artifacts.toolsJars.nonEmpty then
8391
Seq("--tool-classpath", artifacts.toolsJars.mkString(java.io.File.pathSeparator))
8492
else Nil) ++
8593
scalafixOptions.scalafixRules.flatMap(Seq("-r", _))

modules/cli/src/main/scala/scala/cli/commands/package0/Package.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ import scala.cli.commands.publish.ConfigUtil.*
3737
import scala.cli.commands.run.Run.orPythonDetectionError
3838
import scala.cli.commands.shared.{HelpCommandGroup, HelpGroup, MainClassOptions, SharedOptions}
3939
import scala.cli.commands.util.BuildCommandHelpers
40+
import scala.cli.commands.util.BuildCommandHelpers.*
4041
import scala.cli.commands.{CommandUtils, ScalaCommand, WatchUtil}
4142
import scala.cli.config.{ConfigDb, Keys}
4243
import scala.cli.errors.ScalaJsLinkingError

modules/cli/src/main/scala/scala/cli/commands/run/Run.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import scala.cli.commands.run.RunMode
2525
import scala.cli.commands.setupide.SetupIde
2626
import scala.cli.commands.shared.{HelpCommandGroup, HelpGroup, SharedOptions}
2727
import scala.cli.commands.update.Update
28+
import scala.cli.commands.util.BuildCommandHelpers.*
2829
import scala.cli.commands.util.{BuildCommandHelpers, RunHadoop, RunSpark}
2930
import scala.cli.commands.{CommandUtils, ScalaCommand, SpecificationLevel, WatchUtil}
3031
import scala.cli.config.{ConfigDb, Keys}

modules/cli/src/main/scala/scala/cli/commands/util/BuildCommandHelpers.scala

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import scala.cli.commands.ScalaCommand
66
import scala.cli.commands.shared.SharedOptions
77
import scala.cli.commands.util.ScalacOptionsUtil.*
88

9-
trait BuildCommandHelpers { self: ScalaCommand[_] =>
9+
trait BuildCommandHelpers { self: ScalaCommand[?] =>
1010
extension (successfulBuild: Build.Successful) {
1111
def retainedMainClass(
1212
logger: Logger,
@@ -17,6 +17,23 @@ trait BuildCommandHelpers { self: ScalaCommand[_] =>
1717
self.argvOpt.map(_.mkString(" ")).getOrElse(actualFullCommand),
1818
logger
1919
)
20+
}
21+
22+
extension (builds: Builds) {
23+
def anyBuildCancelled: Boolean = builds.all.exists {
24+
case _: Build.Cancelled => true
25+
case _ => false
26+
}
27+
28+
def anyBuildFailed: Boolean = builds.all.exists {
29+
case _: Build.Failed => true
30+
case _ => false
31+
}
32+
}
33+
}
34+
35+
object BuildCommandHelpers {
36+
extension (successfulBuild: Build.Successful) {
2037

2138
/** -O -d defaults to --compile-output; if both are defined, --compile-output takes precedence
2239
*/
@@ -34,16 +51,4 @@ trait BuildCommandHelpers { self: ScalaCommand[_] =>
3451
)
3552
}
3653
}
37-
38-
extension (builds: Builds) {
39-
def anyBuildCancelled: Boolean = builds.all.exists {
40-
case _: Build.Cancelled => true
41-
case _ => false
42-
}
43-
44-
def anyBuildFailed: Boolean = builds.all.exists {
45-
case _: Build.Failed => true
46-
case _ => false
47-
}
48-
}
4954
}

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

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -292,4 +292,38 @@ trait FixScalafixRulesTestDefinitions {
292292
expect(updatedContent == expectedContent)
293293
}
294294
}
295+
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+
}
328+
}
295329
}

0 commit comments

Comments
 (0)