Skip to content

Commit ab05d82

Browse files
authored
Merge pull request #1440 from Gedochao/refactor-scala-command
Refactor `ScalaCommand` to enforce respecting help options
2 parents d50e707 + fbd8e54 commit ab05d82

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+371
-324
lines changed

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

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,15 @@
11
package scala.cli.commands
22

3-
import caseapp._
3+
import caseapp.*
44

55
import scala.build.internal.Constants
66
import scala.cli.CurrentParams
77

88
class About(isSipScala: Boolean) extends ScalaCommand[AboutOptions] {
99

10-
override def group = "Miscellaneous"
11-
12-
def run(options: AboutOptions, args: RemainingArgs): Unit = {
13-
CurrentParams.verbosity = options.verbosity.verbosity
10+
override def group = "Miscellaneous"
11+
override def verbosity(options: AboutOptions): Option[Int] = Some(options.verbosity.verbosity)
12+
override def runCommand(options: AboutOptions, args: RemainingArgs): Unit = {
1413
println(Version.versionInfo(isSipScala))
1514
val newestScalaCliVersion = Update.newestScalaCliVersion(options.ghToken.map(_.get()))
1615
val isOutdated = CommandUtils.isOutOfDateVersion(

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

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package scala.cli.commands
22

3-
import caseapp._
3+
import caseapp.*
44
import coursier.env.{EnvironmentUpdate, ProfileUpdater}
55

66
import java.io.File
@@ -9,11 +9,10 @@ import scala.cli.CurrentParams
99
import scala.util.Properties
1010

1111
object AddPath extends ScalaCommand[AddPathOptions] {
12-
override def hidden = true
13-
override def isRestricted = true
14-
def run(options: AddPathOptions, args: RemainingArgs): Unit = {
15-
CurrentParams.verbosity = options.verbosity
16-
12+
override def hidden = true
13+
override def isRestricted = true
14+
override def verbosity(options: AddPathOptions): Option[Int] = Some(options.verbosity)
15+
override def runCommand(options: AddPathOptions, args: RemainingArgs): Unit = {
1716
if (args.all.isEmpty) {
1817
if (!options.quiet)
1918
System.err.println("Nothing to do")

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

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

3-
import caseapp._
3+
import caseapp.*
44

55
import scala.build.Os
66
import scala.build.blooprifle.{BloopRifle, BloopRifleConfig}
77
import scala.cli.CurrentParams
8-
import scala.cli.commands.util.CommonOps._
9-
import scala.cli.commands.util.SharedCompilationServerOptionsUtil._
8+
import scala.cli.commands.util.CommonOps.*
9+
import scala.cli.commands.util.SharedCompilationServerOptionsUtil.*
1010

1111
object BloopExit extends ScalaCommand[BloopExitOptions] {
1212
override def hidden = true
@@ -16,7 +16,7 @@ object BloopExit extends ScalaCommand[BloopExitOptions] {
1616
)
1717

1818
private def mkBloopRifleConfig(opts: BloopExitOptions): BloopRifleConfig = {
19-
import opts._
19+
import opts.*
2020
compilationServer.bloopRifleConfig(
2121
logging.logger,
2222
coursier.coursierCache(logging.logger.coursierLogger("Downloading Bloop")),
@@ -26,8 +26,10 @@ object BloopExit extends ScalaCommand[BloopExitOptions] {
2626
)
2727
}
2828

29-
def run(options: BloopExitOptions, args: RemainingArgs): Unit = {
30-
CurrentParams.verbosity = options.logging.verbosity
29+
override def loggingOptions(options: BloopExitOptions): Option[LoggingOptions] =
30+
Some(options.logging)
31+
32+
override def runCommand(options: BloopExitOptions, args: RemainingArgs): Unit = {
3133
val bloopRifleConfig = mkBloopRifleConfig(options)
3234
val logger = options.logging.logger
3335

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

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

3-
import caseapp._
3+
import caseapp.*
44

55
import scala.build.Os
66
import scala.build.bloop.BloopThreads
77
import scala.build.blooprifle.internal.Constants
88
import scala.build.blooprifle.{BloopRifle, BloopRifleConfig}
99
import scala.build.options.{BuildOptions, InternalOptions}
1010
import scala.cli.CurrentParams
11-
import scala.cli.commands.util.CommonOps._
11+
import scala.cli.commands.util.CommonOps.*
1212
import scala.cli.commands.util.JvmUtils
13-
import scala.cli.commands.util.SharedCompilationServerOptionsUtil._
13+
import scala.cli.commands.util.SharedCompilationServerOptionsUtil.*
1414
import scala.concurrent.Await
1515
import scala.concurrent.duration.Duration
1616

@@ -22,7 +22,7 @@ object BloopStart extends ScalaCommand[BloopStartOptions] {
2222
)
2323

2424
private def mkBloopRifleConfig(opts: BloopStartOptions): BloopRifleConfig = {
25-
import opts._
25+
import opts.*
2626
val buildOptions = BuildOptions(
2727
javaOptions = JvmUtils.javaOptions(jvm).orExit(logging.logger),
2828
internal = InternalOptions(
@@ -39,8 +39,10 @@ object BloopStart extends ScalaCommand[BloopStartOptions] {
3939
)
4040
}
4141

42-
def run(options: BloopStartOptions, args: RemainingArgs): Unit = {
43-
CurrentParams.verbosity = options.logging.verbosity
42+
override def loggingOptions(options: BloopStartOptions): Option[LoggingOptions] =
43+
Some(options.logging)
44+
45+
override def runCommand(options: BloopStartOptions, args: RemainingArgs): Unit = {
4446
val threads = BloopThreads.create()
4547
val bloopRifleConfig = mkBloopRifleConfig(options)
4648
val logger = options.logging.logger

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

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,38 @@
11
package scala.cli.commands
22

3-
import caseapp._
4-
import com.github.plokhotnyuk.jsoniter_scala.core._
3+
import caseapp.*
4+
import com.github.plokhotnyuk.jsoniter_scala.core.*
55

66
import scala.build.EitherCps.{either, value}
7+
import scala.build.*
78
import scala.build.bsp.{BspReloadableOptions, BspThreads}
89
import scala.build.errors.BuildException
910
import scala.build.internal.CustomCodeWrapper
1011
import scala.build.options.BuildOptions
11-
import scala.build.{Build, CrossSources, Inputs, PersistentDiagnosticLogger, Sources}
1212
import scala.cli.CurrentParams
13-
import scala.cli.commands.publish.ConfigUtil._
14-
import scala.cli.commands.util.CommonOps._
15-
import scala.cli.commands.util.SharedOptionsUtil._
13+
import scala.cli.commands.publish.ConfigUtil.*
14+
import scala.cli.commands.util.CommonOps.*
15+
import scala.cli.commands.util.SharedOptionsUtil.*
1616
import scala.cli.config.{ConfigDb, Keys}
1717
import scala.concurrent.Await
1818
import scala.concurrent.duration.Duration
1919

2020
object Bsp extends ScalaCommand[BspOptions] {
2121
override def hidden = true
22-
def run(options: BspOptions, args: RemainingArgs): Unit = {
23-
CurrentParams.verbosity = options.shared.logging.verbosity
22+
private def latestSharedOptions(options: BspOptions): SharedOptions =
23+
options.jsonOptions.map { optionsPath =>
24+
val content = os.read.bytes(os.Path(optionsPath, os.pwd))
25+
readFromArray(content)(SharedOptions.jsonCodec)
26+
}.getOrElse(options.shared)
27+
override def sharedOptions(options: BspOptions): Option[SharedOptions] =
28+
Option(latestSharedOptions(options))
29+
30+
// not reusing buildOptions here, since they should be reloaded live instead
31+
override def runCommand(options: BspOptions, args: RemainingArgs): Unit = {
2432
if (options.shared.logging.verbosity >= 3)
2533
pprint.err.log(args)
2634

27-
val getSharedOptions: () => SharedOptions = () =>
28-
options.jsonOptions.map { optionsPath =>
29-
val content = os.read.bytes(os.Path(optionsPath, os.pwd))
30-
readFromArray(content)(SharedOptions.jsonCodec)
31-
}.getOrElse(options.shared)
35+
val getSharedOptions: () => SharedOptions = () => latestSharedOptions(options)
3236

3337
val argsToInputs: Seq[String] => Either[BuildException, Inputs] =
3438
argsSeq =>

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

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,17 @@
11
package scala.cli.commands
22

3-
import caseapp._
3+
import caseapp.*
44

55
import scala.build.internal.Constants
66
import scala.build.{Inputs, Os}
7-
import scala.cli.commands.util.CommonOps._
7+
import scala.cli.commands.util.CommonOps.*
88
import scala.cli.{CurrentParams, ScalaCli}
99

1010
object Clean extends ScalaCommand[CleanOptions] {
1111
override def group = "Main"
12-
def run(options: CleanOptions, args: RemainingArgs): Unit = {
13-
CurrentParams.verbosity = options.logging.verbosity
12+
override def loggingOptions(options: CleanOptions): Option[LoggingOptions] =
13+
Some(options.logging)
14+
override def runCommand(options: CleanOptions, args: RemainingArgs): Unit = {
1415
val inputs = Inputs(
1516
args.all,
1617
Os.pwd,

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

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,31 @@
11
package scala.cli.commands
22

3-
import caseapp._
3+
import caseapp.*
44

55
import java.io.File
66

7-
import scala.build.options.Scope
7+
import scala.build.options.{BuildOptions, Scope}
88
import scala.build.{Build, BuildThreads, Builds, Os}
99
import scala.cli.CurrentParams
10-
import scala.cli.commands.publish.ConfigUtil._
10+
import scala.cli.commands.publish.ConfigUtil.*
1111
import scala.cli.commands.util.BuildCommandHelpers
1212
import scala.cli.commands.util.CommonOps.SharedDirectoriesOptionsOps
13-
import scala.cli.commands.util.SharedOptionsUtil._
13+
import scala.cli.commands.util.SharedOptionsUtil.*
1414
import scala.cli.config.{ConfigDb, Keys}
1515

1616
object Compile extends ScalaCommand[CompileOptions] with BuildCommandHelpers {
1717
override def group = "Main"
1818
override def sharedOptions(options: CompileOptions): Option[SharedOptions] = Some(options.shared)
19-
20-
def run(options: CompileOptions, args: RemainingArgs): Unit = {
21-
maybePrintGroupHelp(options)
22-
val logger = options.shared.logger
23-
maybePrintSimpleScalacOutput(options, options.shared.buildOptions().orExit(logger))
24-
CurrentParams.verbosity = options.shared.logging.verbosity
25-
val inputs = options.shared.inputs(args.all).orExit(logger)
19+
override def runCommand(options: CompileOptions, args: RemainingArgs): Unit = {
20+
val logger = options.shared.logger
21+
val buildOptions = buildOptionsOrExit(options)
22+
val inputs = options.shared.inputs(args.all).orExit(logger)
2623
CurrentParams.workspaceOpt = Some(inputs.workspace)
2724
SetupIde.runSafe(
2825
options.shared,
2926
inputs,
3027
logger,
28+
buildOptions,
3129
Some(name),
3230
args.all
3331
)
@@ -74,8 +72,7 @@ object Compile extends ScalaCommand[CompileOptions] with BuildCommandHelpers {
7472
}
7573
}
7674

77-
val buildOptions = options.shared.buildOptions().orExit(logger)
78-
val threads = BuildThreads.create()
75+
val threads = BuildThreads.create()
7976

8077
val compilerMaker = options.shared.compilerMaker(threads).orExit(logger)
8178
val configDb = options.shared.configDb

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import caseapp.core.help.RuntimeCommandsHelp
44
import caseapp.core.{Error, RemainingArgs}
55

66
import scala.build.internal.Constants
7+
import scala.build.options.BuildOptions
78
import scala.cli.commands.util.SharedOptionsUtil.*
89
import scala.cli.{CurrentParams, ScalaCliHelp}
910

@@ -27,8 +28,7 @@ class Default(
2728
sys.exit(0)
2829
}
2930

30-
def run(options: DefaultOptions, args: RemainingArgs): Unit = {
31-
CurrentParams.verbosity = options.shared.logging.verbosity
31+
override def runCommand(options: DefaultOptions, args: RemainingArgs): Unit = {
3232
if options.version then println(Version.versionInfo(isSipScala))
3333
else
3434
{
@@ -39,7 +39,7 @@ class Default(
3939
if shouldDefaultToRun then RunOptions.parser else ReplOptions.parser
4040
}.parse(rawArgs) match
4141
case Left(e) => error(e)
42-
case Right((replOptions: ReplOptions, _)) => Repl.run(replOptions, args)
43-
case Right((runOptions: RunOptions, _)) => Run.run(runOptions, args)
42+
case Right((replOptions: ReplOptions, _)) => Repl.runCommand(replOptions, args)
43+
case Right((runOptions: RunOptions, _)) => Run.runCommand(runOptions, args)
4444
}
4545
}

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

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,26 @@
11
package scala.cli.commands
22

3-
import caseapp._
3+
import caseapp.*
44
import os.Path
55

66
import scala.build.actionable.ActionableDependencyHandler
77
import scala.build.actionable.ActionableDiagnostic.ActionableDependencyUpdateDiagnostic
88
import scala.build.internal.CustomCodeWrapper
9-
import scala.build.options.Scope
9+
import scala.build.options.{BuildOptions, Scope}
1010
import scala.build.{CrossSources, Logger, Position, Sources}
1111
import scala.cli.CurrentParams
12-
import scala.cli.commands.util.SharedOptionsUtil._
12+
import scala.cli.commands.util.SharedOptionsUtil.*
1313

1414
object DependencyUpdate extends ScalaCommand[DependencyUpdateOptions] {
15-
override def group = "Main"
16-
override def sharedOptions(options: DependencyUpdateOptions) = Some(options.shared)
15+
override def group = "Main"
16+
override def sharedOptions(options: DependencyUpdateOptions): Option[SharedOptions] =
17+
Some(options.shared)
18+
override def runCommand(options: DependencyUpdateOptions, args: RemainingArgs): Unit = {
19+
val verbosity = options.shared.logging.verbosity
20+
val buildOptions = buildOptionsOrExit(options)
1721

18-
def run(options: DependencyUpdateOptions, args: RemainingArgs): Unit = {
19-
val verbosity = options.shared.logging.verbosity
20-
CurrentParams.verbosity = verbosity
21-
22-
val logger = options.shared.logger
23-
val inputs = options.shared.inputs(args.all).orExit(logger)
24-
val buildOptions = options.shared.buildOptions().orExit(logger)
22+
val logger = options.shared.logger
23+
val inputs = options.shared.inputs(args.all).orExit(logger)
2524

2625
val (crossSources, _) =
2726
CrossSources.forInputs(
@@ -60,7 +59,7 @@ object DependencyUpdate extends ScalaCommand[DependencyUpdateOptions] {
6059
actionableUpdateDiagnostics.foreach(update =>
6160
println(s" * ${update.oldDependency.render} -> ${update.newVersion}")
6261
)
63-
println("""|To update all dependencies run:
62+
println("""|To update all dependencies run:
6463
| scala-cli dependency-update --all""".stripMargin)
6564
}
6665
}

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
package scala.cli.commands
22

3-
import caseapp._
3+
import caseapp.*
44

55
import scala.cli.CurrentParams
6-
import scala.cli.commands.util.CommonOps._
6+
import scala.cli.commands.util.CommonOps.*
77

88
object Directories extends ScalaCommand[DirectoriesOptions] {
99
override def hidden: Boolean = true
1010
override def isRestricted = true
11-
12-
def run(options: DirectoriesOptions, args: RemainingArgs): Unit = {
13-
CurrentParams.verbosity = options.verbosity.verbosity
11+
override def verbosity(options: DirectoriesOptions): Option[Int] =
12+
Some(options.verbosity.verbosity)
13+
override def runCommand(options: DirectoriesOptions, args: RemainingArgs): Unit = {
1414
if (args.all.nonEmpty) {
1515
System.err.println("The directories command doesn't accept arguments.")
1616
sys.exit(1)

0 commit comments

Comments
 (0)