Skip to content

Commit 72b7fde

Browse files
Pass default dialect to scalafmt (#223)
So that 'scala fmt .' works fine out-of-the-box for Scala 3 sources.
1 parent b04afc8 commit 72b7fde

File tree

3 files changed

+65
-7
lines changed

3 files changed

+65
-7
lines changed

modules/cli/src/main/scala/scala/cli/commands/Fmt.scala

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

33
import caseapp._
44

5-
import scala.build.Inputs
6-
import scala.build.internal.Runner
5+
import scala.build.internal.{CustomCodeWrapper, Runner}
6+
import scala.build.{CrossSources, Inputs, Sources}
77
import scala.cli.internal.FetchExternalBinary
88

99
object Fmt extends ScalaCommand[FmtOptions] {
@@ -12,16 +12,16 @@ object Fmt extends ScalaCommand[FmtOptions] {
1212
def run(options: FmtOptions, args: RemainingArgs): Unit = {
1313

1414
// TODO If no input is given, just pass '.' to scalafmt?
15-
val (sourceFiles, workspace) =
15+
val (sourceFiles, workspace, inputsOpt) =
1616
if (args.remaining.isEmpty)
17-
(Seq(os.pwd), os.pwd)
17+
(Seq(os.pwd), os.pwd, None)
1818
else {
1919
val i = options.shared.inputsOrExit(args)
2020
val s = i.sourceFiles().collect {
2121
case sc: Inputs.Script => sc.path
2222
case sc: Inputs.ScalaFile => sc.path
2323
}
24-
(s, i.workspace)
24+
(s, i.workspace, Some(i))
2525
}
2626

2727
val logger = options.shared.logger
@@ -31,6 +31,36 @@ object Fmt extends ScalaCommand[FmtOptions] {
3131
logger.debug("No source files, not formatting anything")
3232
else {
3333

34+
def scalaVerOpt = inputsOpt.map { inputs =>
35+
val crossSources =
36+
CrossSources.forInputs(
37+
inputs,
38+
Sources.defaultPreprocessors(
39+
options.buildOptions.scriptOptions.codeWrapper.getOrElse(CustomCodeWrapper)
40+
)
41+
).orExit(logger)
42+
val sharedOptions = crossSources.sharedOptions(options.buildOptions)
43+
sharedOptions
44+
.scalaParams
45+
.orExit(logger)
46+
.scalaVersion
47+
}
48+
49+
def dialectOpt = options.dialect.map(_.trim).filter(_.nonEmpty).orElse {
50+
scalaVerOpt.flatMap {
51+
case v if v.startsWith("2.12.") => Some("Scala212")
52+
case v if v.startsWith("2.13.") => Some("Scala213")
53+
case v if v.startsWith("3.") => Some("Scala3")
54+
case _ => None
55+
}
56+
}
57+
58+
val dialectArgs =
59+
if (options.scalafmtArg.isEmpty && !os.exists(workspace / ".scalafmt.conf"))
60+
dialectOpt.toSeq.flatMap(dialect => Seq("--config-str", s"runner.dialect=$dialect"))
61+
else
62+
Nil
63+
3464
val fmtLauncher = options.scalafmtLauncher.filter(_.nonEmpty) match {
3565
case Some(launcher) =>
3666
os.Path(launcher, os.pwd)
@@ -41,7 +71,10 @@ object Fmt extends ScalaCommand[FmtOptions] {
4171

4272
logger.debug(s"Using scalafmt launcher $fmtLauncher")
4373

44-
val command = Seq(fmtLauncher.toString) ++ sourceFiles.map(_.toString)
74+
val command = Seq(fmtLauncher.toString) ++
75+
sourceFiles.map(_.toString) ++
76+
dialectArgs ++
77+
options.scalafmtArg
4578
Runner.run(
4679
"scalafmt",
4780
command,

modules/cli/src/main/scala/scala/cli/commands/FmtOptions.scala

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package scala.cli.commands
33
import caseapp._
44

55
import scala.build.internal.Constants
6+
import scala.build.options.BuildOptions
67
import scala.cli.internal.FetchExternalBinary
78
import scala.util.Properties
89

@@ -11,19 +12,34 @@ import scala.util.Properties
1112
final case class FmtOptions(
1213
@Recurse
1314
shared: SharedOptions = SharedOptions(),
15+
16+
@Group("Format")
1417
@HelpMessage("Check that sources are well formatted")
1518
check: Boolean = false,
1619

20+
@Group("Format")
1721
@Hidden
1822
osArchSuffix: Option[String] = None,
23+
@Group("Format")
1924
@Hidden
2025
scalafmtTag: Option[String] = None,
26+
@Group("Format")
2127
@Hidden
2228
scalafmtGithubOrgName: Option[String] = None,
29+
@Group("Format")
2330
@Hidden
2431
scalafmtExtension: Option[String] = None,
32+
@Group("Format")
33+
@Hidden
34+
scalafmtLauncher: Option[String] = None,
35+
36+
@Group("Format")
37+
@Name("F")
2538
@Hidden
26-
scalafmtLauncher: Option[String] = None
39+
scalafmtArg: List[String] = Nil,
40+
41+
@Group("Format")
42+
dialect: Option[String] = None
2743
) {
2844
// format: on
2945

@@ -38,6 +54,9 @@ final case class FmtOptions(
3854
(url, !tag0.startsWith("v"))
3955
}
4056

57+
def buildOptions: BuildOptions =
58+
shared.buildOptions(enableJmh = false, jmhVersion = None, ignoreErrors = false)
59+
4160
}
4261

4362
object FmtOptions {

website/docs/reference/cli-options.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,12 @@ Check that sources are well formatted
280280

281281
#### `--scalafmt-launcher`
282282

283+
#### `--scalafmt-arg`
284+
285+
Aliases: `-F`
286+
287+
#### `--dialect`
288+
283289
## Help options
284290

285291
Available in commands:

0 commit comments

Comments
 (0)