Skip to content

Default to the repl sub-command when no args are passed #1305

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Aug 31, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,18 @@ package scala.cli.commands

import caseapp._

// format: off
case class DefaultOptions(
@Recurse
runOptions: RunOptions = RunOptions(),
shared: SharedOptions = SharedOptions(),
@Recurse
sharedRun: SharedRunOptions = SharedRunOptions(),
@Recurse
sharedRepl: SharedReplOptions = SharedReplOptions(),
@Name("-version")
version: Boolean = false
version: Boolean = false
)
// format: on

object DefaultOptions {
implicit lazy val parser: Parser[DefaultOptions] = Parser.derive
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,32 +8,7 @@ final case class ReplOptions(
@Recurse
shared: SharedOptions = SharedOptions(),
@Recurse
sharedJava: SharedJavaOptions = SharedJavaOptions(),
@Recurse
watch: SharedWatchOptions = SharedWatchOptions(),
@Recurse
compileCross: CompileCrossOptions = CompileCrossOptions(),

@Group("Repl")
@HelpMessage("Use Ammonite (instead of the default Scala REPL)")
@Name("A")
@Name("amm")
ammonite: Option[Boolean] = None,

@Group("Repl")
@HelpMessage("Set the Ammonite version")
@Name("ammoniteVer")
ammoniteVersion: Option[String] = None,

@Group("Repl")
@Name("a")
@Hidden
ammoniteArg: List[String] = Nil,

@Group("Repl")
@Hidden
@HelpMessage("Don't actually run the REPL, just fetch it")
replDryRun: Boolean = false
sharedRepl: SharedReplOptions = SharedReplOptions()
)
// format: on

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,38 +15,7 @@ final case class RunOptions(
@Recurse
shared: SharedOptions = SharedOptions(),
@Recurse
benchmarking: BenchmarkingOptions = BenchmarkingOptions(),
@Recurse
sharedJava: SharedJavaOptions = SharedJavaOptions(),
@Recurse
watch: SharedWatchOptions = SharedWatchOptions(),
@Recurse
compileCross: CompileCrossOptions = CompileCrossOptions(),
@Recurse
mainClass: MainClassOptions = MainClassOptions(),
@Group("Run")
@Hidden
@HelpMessage("Run as a Spark job, using the spark-submit command")
@ExtraName("spark")
sparkSubmit: Option[Boolean] = None,
@Group("Run")
@HelpMessage("Run as a Spark job, using a vanilla Spark distribution downloaded by Scala CLI")
@ExtraName("sparkStandalone")
standaloneSpark: Option[Boolean] = None,
@Group("Run")
@HelpMessage("Run as a Hadoop job, using the \"hadoop jar\" command")
@ExtraName("hadoop")
hadoopJar: Boolean = false,
@Group("Run")
@HelpMessage("Print the command that would have been run (one argument per line), rather than running it")
command: Boolean = false,
@Group("Run")
@HelpMessage("Temporary / working directory where to write generated launchers")
scratchDir: Option[String] = None,
@Group("Run")
@Hidden
@HelpMessage("Run Java commands using a manifest-based class path (shortens command length)")
useManifest: Option[Boolean] = None
sharedRun: SharedRunOptions = SharedRunOptions()
)
// format: on

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package scala.cli.commands

import caseapp.*
import caseapp.core.help.Help

// format: off
final case class SharedReplOptions(
@Recurse
sharedJava: SharedJavaOptions = SharedJavaOptions(),
@Recurse
watch: SharedWatchOptions = SharedWatchOptions(),
@Recurse
compileCross: CompileCrossOptions = CompileCrossOptions(),

@Group("Repl")
@HelpMessage("Use Ammonite (instead of the default Scala REPL)")
@Name("A")
@Name("amm")
ammonite: Option[Boolean] = None,

@Group("Repl")
@HelpMessage("Set the Ammonite version")
@Name("ammoniteVer")
ammoniteVersion: Option[String] = None,

@Group("Repl")
@Name("a")
@Hidden
ammoniteArg: List[String] = Nil,

@Group("Repl")
@Hidden
@HelpMessage("Don't actually run the REPL, just fetch it")
replDryRun: Boolean = false
)
// format: on

object SharedReplOptions {
implicit lazy val parser: Parser[SharedReplOptions] = Parser.derive
implicit lazy val help: Help[SharedReplOptions] = Help.derive
// Parser.Aux for using SharedReplOptions with @Recurse in other options
implicit lazy val parserAux: Parser.Aux[SharedReplOptions, parser.D] = parser
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package scala.cli.commands

import caseapp.*
import caseapp.core.help.Help

import scala.cli.commands.BloopExitOptions.parser

// format: off
final case class SharedRunOptions(
@Recurse
benchmarking: BenchmarkingOptions = BenchmarkingOptions(),
@Recurse
sharedJava: SharedJavaOptions = SharedJavaOptions(),
@Recurse
watch: SharedWatchOptions = SharedWatchOptions(),
@Recurse
compileCross: CompileCrossOptions = CompileCrossOptions(),
@Recurse
mainClass: MainClassOptions = MainClassOptions(),
@Group("Run")
@Hidden
@HelpMessage("Run as a Spark job, using the spark-submit command")
@ExtraName("spark")
sparkSubmit: Option[Boolean] = None,
@Group("Run")
@HelpMessage("Run as a Spark job, using a vanilla Spark distribution downloaded by Scala CLI")
@ExtraName("sparkStandalone")
standaloneSpark: Option[Boolean] = None,
@Group("Run")
@HelpMessage("Run as a Hadoop job, using the \"hadoop jar\" command")
@ExtraName("hadoop")
hadoopJar: Boolean = false,
@Group("Run")
@HelpMessage("Print the command that would have been run (one argument per line), rather than running it")
command: Boolean = false,
@Group("Run")
@HelpMessage("Temporary / working directory where to write generated launchers")
scratchDir: Option[String] = None,
@Group("Run")
@Hidden
@HelpMessage("Run Java commands using a manifest-based class path (shortens command length)")
useManifest: Option[Boolean] = None
)
// format: on

object SharedRunOptions {
implicit lazy val parser: Parser[SharedRunOptions] = Parser.derive
implicit lazy val help: Help[SharedRunOptions] = Help.derive
// Parser.Aux for using SharedRunOptions with @Recurse in other options
implicit lazy val parserAux: Parser.Aux[SharedRunOptions, parser.D] = parser
}
3 changes: 2 additions & 1 deletion modules/cli/src/main/scala/scala/cli/ScalaCliCommands.scala
Original file line number Diff line number Diff line change
Expand Up @@ -106,12 +106,13 @@ class ScalaCliCommands(
override def main(args: Array[String]): Unit = {

// quick hack, until the raw args are kept in caseapp.RemainingArgs by case-app
actualDefaultCommand.anyArgs = args.nonEmpty
actualDefaultCommand.rawArgs = args

commands.foreach {
case c: NeedsArgvCommand => c.setArgv(progName +: args)
case _ =>
}
actualDefaultCommand.setArgv(progName +: args)

val processedArgs =
if (args.lengthCompare(1) > 0 && isShebangFile(args(0)))
Expand Down
27 changes: 14 additions & 13 deletions modules/cli/src/main/scala/scala/cli/commands/Default.scala
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package scala.cli.commands

import caseapp.core.help.RuntimeCommandsHelp
import caseapp.core.{Error, RemainingArgs}
import scala.cli.commands.util.SharedOptionsUtil.*

import scala.build.internal.Constants
import scala.cli.{CurrentParams, ScalaCliHelp}
Expand All @@ -16,10 +17,9 @@ class Default(

override protected def commandLength = 0

override def group = "Main"
override def sharedOptions(options: DefaultOptions) =
Some[scala.cli.commands.SharedOptions](options.runOptions.shared)
private[cli] var anyArgs = false
override def group = "Main"
override def sharedOptions(options: DefaultOptions): Option[SharedOptions] = Some(options.shared)
private[cli] var rawArgs = Array.empty[String]
override def helpAsked(progName: String, maybeOptions: Either[Error, DefaultOptions]): Nothing = {
println(defaultHelp)
sys.exit(0)
Expand All @@ -28,16 +28,17 @@ class Default(
println(defaultFullHelp)
sys.exit(0)
}

def run(options: DefaultOptions, args: RemainingArgs): Unit = {
CurrentParams.verbosity = options.runOptions.shared.logging.verbosity
if (options.version)
println(Version.versionInfo(isSipScala))
else if (anyArgs)
Run.run(
options.runOptions,
args
)
CurrentParams.verbosity = options.shared.logging.verbosity
if options.version then println(Version.versionInfo(isSipScala))
else
helpAsked(finalHelp.progName, Right(options))
(
if args.remaining.nonEmpty then RunOptions.parser
else ReplOptions.parser
).parse(rawArgs) match
case Left(e) => error(e)
case Right((replOptions: ReplOptions, _)) => Repl.run(replOptions, args)
case Right((runOptions: RunOptions, _)) => Run.run(runOptions, args)
}
}
24 changes: 15 additions & 9 deletions modules/cli/src/main/scala/scala/cli/commands/Repl.scala
Original file line number Diff line number Diff line change
Expand Up @@ -17,22 +17,23 @@ import scala.cli.commands.util.CommonOps.SharedDirectoriesOptionsOps

object Repl extends ScalaCommand[ReplOptions] {
override def group = "Main"
override def names = List(
override def names: List[List[String]] = List(
List("console"),
List("repl")
)
override def sharedOptions(options: ReplOptions) = Some(options.shared)
override def sharedOptions(options: ReplOptions): Option[SharedOptions] = Some(options.shared)

def buildOptions(ops: ReplOptions): BuildOptions = {
import ops._
import ops.sharedRepl._
def ammoniteVersionOpt = ammoniteVersion.map(_.trim).filter(_.nonEmpty)

val baseOptions = shared.buildOptions()
baseOptions.copy(
javaOptions = baseOptions.javaOptions.copy(
javaOpts =
baseOptions.javaOptions.javaOpts ++
sharedJava.allJavaOpts.map(JavaOpt(_)).map(Positioned.commandLine _)
sharedJava.allJavaOpts.map(JavaOpt(_)).map(Positioned.commandLine)
),
notForBloopOptions = baseOptions.notForBloopOptions.copy(
replOptions = baseOptions.notForBloopOptions.replOptions.copy(
Expand Down Expand Up @@ -90,7 +91,7 @@ object Repl extends ScalaCommand[ReplOptions] {
directories,
logger,
allowExit = allowExit,
options.replDryRun
options.sharedRepl.replDryRun
)
res match {
case Left(ex) =>
Expand All @@ -100,7 +101,7 @@ object Repl extends ScalaCommand[ReplOptions] {
}
}

val cross = options.compileCross.cross.getOrElse(false)
val cross = options.sharedRepl.compileCross.cross.getOrElse(false)
val configDb = ConfigDb.open(options.shared.directories.directories)
.orExit(logger)
val actionableDiagnostics =
Expand All @@ -110,14 +111,19 @@ object Repl extends ScalaCommand[ReplOptions] {

if (inputs.isEmpty) {
val artifacts = initialBuildOptions.artifacts(logger, Scope.Main).orExit(logger)
doRunRepl(initialBuildOptions, artifacts, None, allowExit = !options.watch.watchMode)
if (options.watch.watchMode) {
doRunRepl(
initialBuildOptions,
artifacts,
None,
allowExit = !options.sharedRepl.watch.watchMode
)
if (options.sharedRepl.watch.watchMode) {
// nothing to watch, just wait for Ctrl+C
WatchUtil.printWatchMessage()
WatchUtil.waitForCtrlC()
}
}
else if (options.watch.watchMode) {
else if (options.sharedRepl.watch.watchMode) {
val watcher = Build.watch(
inputs,
initialBuildOptions,
Expand Down Expand Up @@ -219,7 +225,7 @@ object Repl extends ScalaCommand[ReplOptions] {
.map(_.last.stripSuffix(".class"))
.sorted
val warnRootClasses = rootClasses.nonEmpty &&
options.notForBloopOptions.replOptions.useAmmoniteOpt.exists(_ == true)
options.notForBloopOptions.replOptions.useAmmoniteOpt.contains(true)
if (warnRootClasses)
logger.message(
s"Warning: found classes defined in the root package (${rootClasses.mkString(", ")})." +
Expand Down
Loading