diff --git a/modules/cli/src/main/scala/scala/cli/commands/compile/Compile.scala b/modules/cli/src/main/scala/scala/cli/commands/compile/Compile.scala index ee7c034628..8628479b1c 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/compile/Compile.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/compile/Compile.scala @@ -109,7 +109,7 @@ object Compile extends ScalaCommand[CompileOptions] with BuildCommandHelpers { None, logger, crossBuilds = cross, - buildTests = options.test, + buildTests = options.scope.test, partial = None, actionableDiagnostics = actionableDiagnostics, postAction = () => WatchUtil.printWatchMessage() @@ -128,7 +128,7 @@ object Compile extends ScalaCommand[CompileOptions] with BuildCommandHelpers { None, logger, crossBuilds = cross, - buildTests = options.test, + buildTests = options.scope.test, partial = None, actionableDiagnostics = actionableDiagnostics ) diff --git a/modules/cli/src/main/scala/scala/cli/commands/compile/CompileOptions.scala b/modules/cli/src/main/scala/scala/cli/commands/compile/CompileOptions.scala index b9751fda95..eaec64b49c 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/compile/CompileOptions.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/compile/CompileOptions.scala @@ -3,14 +3,7 @@ package scala.cli.commands.compile import caseapp.* import caseapp.core.help.Help -import scala.cli.commands.shared.{ - CrossOptions, - HasSharedOptions, - HelpGroup, - HelpMessages, - SharedOptions, - SharedWatchOptions -} +import scala.cli.commands.shared._ import scala.cli.commands.tags @HelpMessage(CompileOptions.helpMessage, "", CompileOptions.detailedHelpMessage) @@ -31,11 +24,8 @@ final case class CompileOptions( @Tag(tags.inShortHelp) printClassPath: Boolean = false, - @Group(HelpGroup.Compilation.toString) - @HelpMessage("Compile test scope") - @Tag(tags.should) - @Tag(tags.inShortHelp) - test: Boolean = false + @Recurse + scope: ScopeOptions = ScopeOptions() ) extends HasSharedOptions // format: on diff --git a/modules/cli/src/main/scala/scala/cli/commands/repl/Repl.scala b/modules/cli/src/main/scala/scala/cli/commands/repl/Repl.scala index 19b4400961..1cb5f0a166 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/repl/Repl.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/repl/Repl.scala @@ -12,7 +12,12 @@ import java.util.zip.ZipFile import scala.build.EitherCps.{either, value} import scala.build.* -import scala.build.errors.{BuildException, CantDownloadAmmoniteError, FetchingDependenciesError} +import scala.build.errors.{ + BuildException, + CantDownloadAmmoniteError, + FetchingDependenciesError, + MultipleScalaVersionsError +} import scala.build.input.Inputs import scala.build.internal.{Constants, Runner} import scala.build.options.{BuildOptions, JavaOpt, MaybeScalaVersion, Scope} @@ -24,6 +29,7 @@ import scala.cli.commands.run.Run.{ } import scala.cli.commands.run.RunMode import scala.cli.commands.shared.{HelpCommandGroup, HelpGroup, SharedOptions} +import scala.cli.commands.util.BuildCommandHelpers import scala.cli.commands.{ScalaCommand, WatchUtil} import scala.cli.config.{ConfigDb, Keys} import scala.cli.packaging.Library @@ -33,7 +39,7 @@ import scala.cli.{CurrentParams, ScalaCli} import scala.jdk.CollectionConverters.* import scala.util.Properties -object Repl extends ScalaCommand[ReplOptions] { +object Repl extends ScalaCommand[ReplOptions] with BuildCommandHelpers { override def group: String = HelpCommandGroup.Main.toString override def scalaSpecificationLevel = SpecificationLevel.MUST override def helpFormat: HelpFormat = super.helpFormat @@ -117,36 +123,25 @@ object Repl extends ScalaCommand[ReplOptions] { val directories = Directories.directories - def buildFailed(allowExit: Boolean): Unit = { - System.err.println("Compilation failed") - if (allowExit) - sys.exit(1) - } - def buildCancelled(allowExit: Boolean): Unit = { - System.err.println("Build cancelled") - if (allowExit) - sys.exit(1) - } - def doRunRepl( buildOptions: BuildOptions, - artifacts: Artifacts, - mainJarOrClassDir: Option[os.Path], + allArtifacts: Seq[Artifacts], + mainJarsOrClassDirs: Seq[os.Path], allowExit: Boolean, runMode: RunMode.HasRepl, - buildOpt: Option[Build.Successful] + successfulBuilds: Seq[Build.Successful] ): Unit = { val res = runRepl( - buildOptions, - programArgs, - artifacts, - mainJarOrClassDir, - directories, - logger, + options = buildOptions, + programArgs = programArgs, + allArtifacts = allArtifacts, + mainJarsOrClassDirs = mainJarsOrClassDirs, + directories = directories, + logger = logger, allowExit = allowExit, - options.sharedRepl.replDryRun, - runMode, - buildOpt + dryRun = options.sharedRepl.replDryRun, + runMode = runMode, + successfulBuilds = successfulBuilds ) res match { case Left(ex) => @@ -156,19 +151,23 @@ object Repl extends ScalaCommand[ReplOptions] { } } def doRunReplFromBuild( - build: Build.Successful, + builds: Seq[Build.Successful], allowExit: Boolean, runMode: RunMode.HasRepl, asJar: Boolean - ): Unit = + ): Unit = { doRunRepl( - build.options, - build.artifacts, - Some(if (asJar) Library.libraryJar(build) else build.output), - allowExit, - runMode, - Some(build) + // build options should be the same for both scopes + // combining them may cause for ammonite args to be duplicated, so we're using the main scope's opts + buildOptions = builds.head.options, + allArtifacts = builds.map(_.artifacts), + mainJarsOrClassDirs = + if (asJar) builds.map(Library.libraryJar(_)) else builds.map(_.output), + allowExit = allowExit, + runMode = runMode, + successfulBuilds = builds ) + } val cross = options.sharedRepl.compileCross.cross.getOrElse(false) val configDb = ConfigDbUtils.configDb.orExit(logger) @@ -178,18 +177,22 @@ object Repl extends ScalaCommand[ReplOptions] { ) if (inputs.isEmpty) { - val artifacts = initialBuildOptions.artifacts(logger, Scope.Main).orExit(logger) + val allArtifacts = + Seq(initialBuildOptions.artifacts(logger, Scope.Main).orExit(logger)) ++ + (if options.sharedRepl.scope.test + then Seq(initialBuildOptions.artifacts(logger, Scope.Test).orExit(logger)) + else Nil) // synchronizing, so that multiple presses to enter (handled by WatchUtil.waitForCtrlC) // don't try to run repls in parallel val lock = new Object def runThing() = lock.synchronized { doRunRepl( - initialBuildOptions, - artifacts, - None, + buildOptions = initialBuildOptions, + allArtifacts = allArtifacts, + mainJarsOrClassDirs = Seq.empty, allowExit = !options.sharedRepl.watch.watchMode, runMode = runMode(options), - buildOpt = None + successfulBuilds = Seq.empty ) } runThing() @@ -207,22 +210,20 @@ object Repl extends ScalaCommand[ReplOptions] { None, logger, crossBuilds = cross, - buildTests = false, + buildTests = options.sharedRepl.scope.test, partial = None, actionableDiagnostics = actionableDiagnostics, postAction = () => WatchUtil.printWatchMessage() ) { res => for (builds <- res.orReport(logger)) - builds.main match { - case s: Build.Successful => + postBuild(builds, allowExit = false) { + successfulBuilds => doRunReplFromBuild( - s, + successfulBuilds, allowExit = false, runMode = runMode(options), asJar = options.shared.asJar ) - case _: Build.Failed => buildFailed(allowExit = false) - case _: Build.Cancelled => buildCancelled(allowExit = false) } } try WatchUtil.waitForCtrlC(() => watcher.schedule()) @@ -237,25 +238,35 @@ object Repl extends ScalaCommand[ReplOptions] { None, logger, crossBuilds = cross, - buildTests = false, + buildTests = options.sharedRepl.scope.test, partial = None, actionableDiagnostics = actionableDiagnostics ) .orExit(logger) - builds.main match { - case s: Build.Successful => + postBuild(builds, allowExit = false) { + successfulBuilds => doRunReplFromBuild( - s, + successfulBuilds, allowExit = true, runMode = runMode(options), asJar = options.shared.asJar ) - case _: Build.Failed => buildFailed(allowExit = true) - case _: Build.Cancelled => buildCancelled(allowExit = true) } } } + def postBuild(builds: Builds, allowExit: Boolean)(f: Seq[Build.Successful] => Unit): Unit = { + if builds.anyBuildFailed then { + System.err.println("Compilation failed") + if allowExit then sys.exit(1) + } + else if builds.anyBuildCancelled then { + System.err.println("Build cancelled") + if allowExit then sys.exit(1) + } + else f(builds.builds.sortBy(_.scope).map(_.asInstanceOf[Build.Successful])) + } + private def maybeAdaptForWindows(args: Seq[String]): Seq[String] = if (Properties.isWin) args.map { a => @@ -268,14 +279,14 @@ object Repl extends ScalaCommand[ReplOptions] { private def runRepl( options: BuildOptions, programArgs: Seq[String], - artifacts: Artifacts, - mainJarOrClassDir: Option[os.Path], + allArtifacts: Seq[Artifacts], + mainJarsOrClassDirs: Seq[os.Path], directories: scala.build.Directories, logger: Logger, allowExit: Boolean, dryRun: Boolean, runMode: RunMode.HasRepl, - buildOpt: Option[Build.Successful] + successfulBuilds: Seq[Build.Successful] ): Either[BuildException, Unit] = either { val setupPython = options.notForBloopOptions.python.getOrElse(false) @@ -283,9 +294,13 @@ object Repl extends ScalaCommand[ReplOptions] { val cache = options.internal.cache.getOrElse(FileCache()) val shouldUseAmmonite = options.notForBloopOptions.replOptions.useAmmonite - val scalaParams = artifacts.scalaOpt match { - case Some(artifacts) => artifacts.params - case None => ScalaParameters(Constants.defaultScalaVersion) + val scalaParams: ScalaParameters = value { + val distinctScalaParams = allArtifacts.flatMap(_.scalaOpt).map(_.params).distinct + if distinctScalaParams.isEmpty then + Right(ScalaParameters(Constants.defaultScalaVersion)) + else if distinctScalaParams.length == 1 then + Right(distinctScalaParams.head) + else Left(MultipleScalaVersionsError(distinctScalaParams.map(_.scalaVersion))) } val (scalapyJavaOpts, scalapyExtraEnv) = @@ -302,7 +317,7 @@ object Repl extends ScalaCommand[ReplOptions] { // Putting current dir in PYTHONPATH, see // https://github.com/VirtusLab/scala-cli/pull/1616#issuecomment-1333283174 // for context. - val dirs = buildOpt.map(_.inputs.workspace).toSeq ++ Seq(os.pwd) + val dirs = successfulBuilds.map(_.inputs.workspace) ++ Seq(os.pwd) (props0, pythonPathEnv(dirs: _*)) } else @@ -338,15 +353,14 @@ object Repl extends ScalaCommand[ReplOptions] { // TODO Allow to disable printing the welcome banner and the "Loading..." message in Ammonite. - val rootClasses = mainJarOrClassDir match { - case None => Nil - case Some(dir) if os.isDir(dir) => + val rootClasses = mainJarsOrClassDirs.flatMap { + case dir if os.isDir(dir) => os.list(dir) .filter(_.last.endsWith(".class")) .filter(os.isFile(_)) // just in case .map(_.last.stripSuffix(".class")) .sorted - case Some(jar) => + case jar => var zf: ZipFile = null try { zf = new ZipFile(jar.toIO) @@ -396,7 +410,7 @@ object Repl extends ScalaCommand[ReplOptions] { replArtifacts.replJavaOpts ++ options.javaOptions.javaOpts.toSeq.map(_.value.value) ++ extraProps.toVector.sorted.map { case (k, v) => s"-D$k=$v" }, - classPath = mainJarOrClassDir.toSeq ++ replArtifacts.replClassPath, + classPath = mainJarsOrClassDirs ++ replArtifacts.replClassPath, mainClass = replArtifacts.replMainClass, args = maybeAdaptForWindows(depClassPathArgs ++ replArgs), logger = logger, @@ -411,8 +425,8 @@ object Repl extends ScalaCommand[ReplOptions] { value { ReplArtifacts.default( scalaParams, - artifacts.userDependencies, - artifacts.extraClassPath, + allArtifacts.flatMap(_.userDependencies).distinct, + allArtifacts.flatMap(_.extraClassPath).distinct, logger, cache, value(options.finalRepositories), @@ -427,9 +441,9 @@ object Repl extends ScalaCommand[ReplOptions] { ReplArtifacts.ammonite( scalaParams, options.notForBloopOptions.replOptions.ammoniteVersion(scalaParams.scalaVersion, logger), - artifacts.userDependencies, - artifacts.extraClassPath, - artifacts.extraSourceJars, + allArtifacts.flatMap(_.userDependencies), + allArtifacts.flatMap(_.extraClassPath), + allArtifacts.flatMap(_.extraSourceJars), value(options.finalRepositories), logger, cache, diff --git a/modules/cli/src/main/scala/scala/cli/commands/repl/SharedReplOptions.scala b/modules/cli/src/main/scala/scala/cli/commands/repl/SharedReplOptions.scala index 74631f5947..b3ad11667b 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/repl/SharedReplOptions.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/repl/SharedReplOptions.scala @@ -6,6 +6,7 @@ import caseapp.core.help.Help import scala.cli.commands.shared.{ CrossOptions, HelpGroup, + ScopeOptions, SharedJavaOptions, SharedPythonOptions, SharedWatchOptions @@ -48,7 +49,10 @@ final case class SharedReplOptions( @Hidden @Tag(tags.implementation) @HelpMessage("Don't actually run the REPL, just fetch it") - replDryRun: Boolean = false + replDryRun: Boolean = false, + + @Recurse + scope: ScopeOptions = ScopeOptions() ) // format: on diff --git a/modules/cli/src/main/scala/scala/cli/commands/shared/ScopeOptions.scala b/modules/cli/src/main/scala/scala/cli/commands/shared/ScopeOptions.scala new file mode 100644 index 0000000000..ecec14c04a --- /dev/null +++ b/modules/cli/src/main/scala/scala/cli/commands/shared/ScopeOptions.scala @@ -0,0 +1,20 @@ +package scala.cli.commands.shared + +import caseapp.* + +import scala.cli.commands.tags + +case class ScopeOptions( + @Group(HelpGroup.Compilation.toString) + @HelpMessage("Include test scope") + @Tag(tags.should) + @Tag(tags.inShortHelp) + @Name("testScope") + @Name("withTestScope") + @Name("withTest") + test: Boolean = false +) +object ScopeOptions { + implicit lazy val parser: Parser[ScopeOptions] = Parser.derive + implicit lazy val help: Help[ScopeOptions] = Help.derive +} diff --git a/modules/cli/src/main/scala/scala/cli/commands/util/BuildCommandHelpers.scala b/modules/cli/src/main/scala/scala/cli/commands/util/BuildCommandHelpers.scala index 794df8772b..1b2d465757 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/util/BuildCommandHelpers.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/util/BuildCommandHelpers.scala @@ -1,7 +1,7 @@ package scala.cli.commands.util import scala.build.errors.BuildException -import scala.build.{Build, Logger, Os} +import scala.build.{Build, Builds, Logger, Os} import scala.cli.commands.ScalaCommand import scala.cli.commands.shared.SharedOptions import scala.cli.commands.util.ScalacOptionsUtil.* @@ -34,4 +34,16 @@ trait BuildCommandHelpers { self: ScalaCommand[_] => ) } } + + extension (builds: Builds) { + def anyBuildCancelled: Boolean = builds.all.exists { + case _: Build.Cancelled => true + case _ => false + } + + def anyBuildFailed: Boolean = builds.all.exists { + case _: Build.Failed => true + case _ => false + } + } } diff --git a/modules/core/src/main/scala/scala/build/errors/MultipleScalaVersionsError.scala b/modules/core/src/main/scala/scala/build/errors/MultipleScalaVersionsError.scala new file mode 100644 index 0000000000..919fc584fe --- /dev/null +++ b/modules/core/src/main/scala/scala/build/errors/MultipleScalaVersionsError.scala @@ -0,0 +1,10 @@ +package scala.build.errors + +import scala.build.Position + +final class MultipleScalaVersionsError(scalaVersions: Seq[String]) + extends BuildException( + message = + s"Multiple Scala versions are present in the build (${scalaVersions.mkString(" ")}), even though only one is allowed in this context.", + positions = Nil + ) diff --git a/modules/integration/src/test/scala/scala/cli/integration/ReplTestDefinitions.scala b/modules/integration/src/test/scala/scala/cli/integration/ReplTestDefinitions.scala index 22f2023aff..3bd1f0ee29 100644 --- a/modules/integration/src/test/scala/scala/cli/integration/ReplTestDefinitions.scala +++ b/modules/integration/src/test/scala/scala/cli/integration/ReplTestDefinitions.scala @@ -30,12 +30,43 @@ abstract class ReplTestDefinitions extends ScalaCliSuite with TestScalaVersionAr case s => s } - test("default dry run") { + test("dry run (default)") { TestInputs.empty.fromRoot { root => os.proc(TestUtil.cli, "repl", extraOptions, "--repl-dry-run").call(cwd = root) } } + test("dry run (with main scope sources)") { + TestInputs( + os.rel / "Example.scala" -> + """object Example extends App { + | println("Hello") + |} + |""".stripMargin + ).fromRoot { root => + os.proc(TestUtil.cli, "repl", ".", extraOptions, "--repl-dry-run").call(cwd = root) + } + } + + test("dry run (with main and test scope sources, and the --test flag)") { + TestInputs( + os.rel / "Example.scala" -> + """object Example extends App { + | println("Hello") + |} + |""".stripMargin, + os.rel / "Example.test.scala" -> + s"""//> using dep org.scalameta::munit::${Constants.munitVersion} + | + |class Example extends munit.FunSuite { + | test("is true true") { assert(true) } + |} + |""".stripMargin + ).fromRoot { root => + os.proc(TestUtil.cli, "repl", ".", extraOptions, "--repl-dry-run", "--test").call(cwd = root) + } + } + def actualMaxAmmoniteScalaVersion: String = if (actualScalaVersion.startsWith("3")) Constants.maxAmmoniteScala3Version else if (actualScalaVersion.startsWith("2.13")) Constants.maxAmmoniteScala213Version @@ -74,6 +105,48 @@ abstract class ReplTestDefinitions extends ScalaCliSuite with TestScalaVersionAr } } + def ammoniteTestScope(useMaxAmmoniteScalaVersion: Boolean): Unit = { + val message = "something something ammonite" + TestInputs( + os.rel / "example" / "TestScopeExample.test.scala" -> + s"""package example + | + |object TestScopeExample { + | def message: String = "$message" + |} + |""".stripMargin + ).fromRoot { root => + val testExtraOptions = if (useMaxAmmoniteScalaVersion) ammoniteExtraOptions else extraOptions + val ammArgs = Seq("-c", "println(example.TestScopeExample.message)") + .map { + if (Properties.isWin) + a => if (a.contains(" ")) "\"" + a.replace("\"", "\\\"") + "\"" else a + else + identity + } + .flatMap(arg => Seq("--ammonite-arg", arg)) + val res = + os.proc( + TestUtil.cli, + "--power", + "repl", + ".", + testExtraOptions, + "--test", + "--ammonite", + ammArgs + ) + .call(cwd = root, stderr = os.Pipe) + val output = res.out.trim() + expect(output == message) + if (useMaxAmmoniteScalaVersion) { + // the maximum Scala version supported by ammonite is being used, so we shouldn't downgrade + val errOutput = res.err.trim() + expect(!errOutput.contains("not yet supported with this version of Ammonite")) + } + } + } + def ammoniteScalapyTest(useMaxAmmoniteScalaVersion: Boolean): Unit = { val testExtraOptions = if (useMaxAmmoniteScalaVersion) ammoniteExtraOptions else extraOptions val inputs = TestInputs( @@ -148,6 +221,10 @@ abstract class ReplTestDefinitions extends ScalaCliSuite with TestScalaVersionAr ammoniteScalapyTest(useMaxAmmoniteScalaVersion = true) } + test("ammonite with test scope sources") { + ammoniteTestScope(useMaxAmmoniteScalaVersion = true) + } + test("default values in help") { TestInputs.empty.fromRoot { root => val res = os.proc(TestUtil.cli, "--power", "repl", extraOptions, "--help").call(cwd = root) diff --git a/modules/integration/src/test/scala/scala/cli/integration/ReplTests3StableDefinitions.scala b/modules/integration/src/test/scala/scala/cli/integration/ReplTests3StableDefinitions.scala index 2947923bb0..66223190fa 100644 --- a/modules/integration/src/test/scala/scala/cli/integration/ReplTests3StableDefinitions.scala +++ b/modules/integration/src/test/scala/scala/cli/integration/ReplTests3StableDefinitions.scala @@ -11,5 +11,9 @@ trait ReplTests3StableDefinitions { _: ReplTestDefinitions => test(s"ammonite scalapy$defaultScalaVersionString") { ammoniteScalapyTest(useMaxAmmoniteScalaVersion = false) } + + test(s"ammonite with test scope sources$defaultScalaVersionString") { + ammoniteTestScope(useMaxAmmoniteScalaVersion = false) + } } } diff --git a/website/docs/reference/cli-options.md b/website/docs/reference/cli-options.md index bf0e362952..2351c432d5 100644 --- a/website/docs/reference/cli-options.md +++ b/website/docs/reference/cli-options.md @@ -154,10 +154,6 @@ Aliases: `-p`, `--print-classpath` Print the resulting class path -### `--test` - -Compile test scope - ## Config options Available in commands: @@ -1434,6 +1430,20 @@ Aliases: `--verbose-scalac` Turn verbosity on for scalac. This is an alias for --scalac-option -verbose +## Scope options + +Available in commands: + +[`compile`](./commands.md#compile), [`repl` , `console`](./commands.md#repl) + + + +### `--test` + +Aliases: `--test-scope`, `--with-test`, `--with-test-scope` + +Include test scope + ## Secret options Available in commands: diff --git a/website/docs/reference/commands.md b/website/docs/reference/commands.md index 84ca3165cf..62c4cad0e6 100644 --- a/website/docs/reference/commands.md +++ b/website/docs/reference/commands.md @@ -32,7 +32,7 @@ All supported types of inputs can be mixed with each other. For detailed documentation refer to our website: https://scala-cli.virtuslab.org/docs/commands/compile -Accepts option groups: [compilation server](./cli-options.md#compilation-server-options), [compile](./cli-options.md#compile-options), [coursier](./cli-options.md#coursier-options), [cross](./cli-options.md#cross-options), [debug](./cli-options.md#debug-options), [dependency](./cli-options.md#dependency-options), [global suppress warning](./cli-options.md#global-suppress-warning-options), [help group](./cli-options.md#help-group-options), [input](./cli-options.md#input-options), [jvm](./cli-options.md#jvm-options), [logging](./cli-options.md#logging-options), [markdown](./cli-options.md#markdown-options), [power](./cli-options.md#power-options), [python](./cli-options.md#python-options), [Scala.js](./cli-options.md#scalajs-options), [Scala Native](./cli-options.md#scala-native-options), [scalac](./cli-options.md#scalac-options), [scalac extra](./cli-options.md#scalac-extra-options), [semantic db](./cli-options.md#semantic-db-options), [shared](./cli-options.md#shared-options), [snippet](./cli-options.md#snippet-options), [source generator](./cli-options.md#source-generator-options), [suppress warning](./cli-options.md#suppress-warning-options), [verbosity](./cli-options.md#verbosity-options), [version](./cli-options.md#version-options), [watch](./cli-options.md#watch-options), [workspace](./cli-options.md#workspace-options) +Accepts option groups: [compilation server](./cli-options.md#compilation-server-options), [compile](./cli-options.md#compile-options), [coursier](./cli-options.md#coursier-options), [cross](./cli-options.md#cross-options), [debug](./cli-options.md#debug-options), [dependency](./cli-options.md#dependency-options), [global suppress warning](./cli-options.md#global-suppress-warning-options), [help group](./cli-options.md#help-group-options), [input](./cli-options.md#input-options), [jvm](./cli-options.md#jvm-options), [logging](./cli-options.md#logging-options), [markdown](./cli-options.md#markdown-options), [power](./cli-options.md#power-options), [python](./cli-options.md#python-options), [Scala.js](./cli-options.md#scalajs-options), [Scala Native](./cli-options.md#scala-native-options), [scalac](./cli-options.md#scalac-options), [scalac extra](./cli-options.md#scalac-extra-options), [scope](./cli-options.md#scope-options), [semantic db](./cli-options.md#semantic-db-options), [shared](./cli-options.md#shared-options), [snippet](./cli-options.md#snippet-options), [source generator](./cli-options.md#source-generator-options), [suppress warning](./cli-options.md#suppress-warning-options), [verbosity](./cli-options.md#verbosity-options), [version](./cli-options.md#version-options), [watch](./cli-options.md#watch-options), [workspace](./cli-options.md#workspace-options) ## config @@ -206,7 +206,7 @@ All supported types of inputs can be mixed with each other. For detailed documentation refer to our website: https://scala-cli.virtuslab.org/docs/commands/repl -Accepts option groups: [compilation server](./cli-options.md#compilation-server-options), [coursier](./cli-options.md#coursier-options), [cross](./cli-options.md#cross-options), [debug](./cli-options.md#debug-options), [dependency](./cli-options.md#dependency-options), [global suppress warning](./cli-options.md#global-suppress-warning-options), [help group](./cli-options.md#help-group-options), [input](./cli-options.md#input-options), [java](./cli-options.md#java-options), [java prop](./cli-options.md#java-prop-options), [jvm](./cli-options.md#jvm-options), [logging](./cli-options.md#logging-options), [markdown](./cli-options.md#markdown-options), [power](./cli-options.md#power-options), [python](./cli-options.md#python-options), [repl](./cli-options.md#repl-options), [Scala.js](./cli-options.md#scalajs-options), [Scala Native](./cli-options.md#scala-native-options), [scalac](./cli-options.md#scalac-options), [scalac extra](./cli-options.md#scalac-extra-options), [semantic db](./cli-options.md#semantic-db-options), [shared](./cli-options.md#shared-options), [snippet](./cli-options.md#snippet-options), [source generator](./cli-options.md#source-generator-options), [suppress warning](./cli-options.md#suppress-warning-options), [verbosity](./cli-options.md#verbosity-options), [version](./cli-options.md#version-options), [watch](./cli-options.md#watch-options), [workspace](./cli-options.md#workspace-options) +Accepts option groups: [compilation server](./cli-options.md#compilation-server-options), [coursier](./cli-options.md#coursier-options), [cross](./cli-options.md#cross-options), [debug](./cli-options.md#debug-options), [dependency](./cli-options.md#dependency-options), [global suppress warning](./cli-options.md#global-suppress-warning-options), [help group](./cli-options.md#help-group-options), [input](./cli-options.md#input-options), [java](./cli-options.md#java-options), [java prop](./cli-options.md#java-prop-options), [jvm](./cli-options.md#jvm-options), [logging](./cli-options.md#logging-options), [markdown](./cli-options.md#markdown-options), [power](./cli-options.md#power-options), [python](./cli-options.md#python-options), [repl](./cli-options.md#repl-options), [Scala.js](./cli-options.md#scalajs-options), [Scala Native](./cli-options.md#scala-native-options), [scalac](./cli-options.md#scalac-options), [scalac extra](./cli-options.md#scalac-extra-options), [scope](./cli-options.md#scope-options), [semantic db](./cli-options.md#semantic-db-options), [shared](./cli-options.md#shared-options), [snippet](./cli-options.md#snippet-options), [source generator](./cli-options.md#source-generator-options), [suppress warning](./cli-options.md#suppress-warning-options), [verbosity](./cli-options.md#verbosity-options), [version](./cli-options.md#version-options), [watch](./cli-options.md#watch-options), [workspace](./cli-options.md#workspace-options) ## package diff --git a/website/docs/reference/scala-command/cli-options.md b/website/docs/reference/scala-command/cli-options.md index 29f8753123..a1ea21b9c8 100644 --- a/website/docs/reference/scala-command/cli-options.md +++ b/website/docs/reference/scala-command/cli-options.md @@ -156,12 +156,6 @@ Aliases: `-p`, `--print-classpath` Print the resulting class path -### `--test` - -`SHOULD have` per Scala Runner specification - -Compile test scope - ## Config options Available in commands: @@ -946,6 +940,22 @@ Aliases: `--verbose-scalac` Turn verbosity on for scalac. This is an alias for --scalac-option -verbose +## Scope options + +Available in commands: + +[`compile`](./commands.md#compile), [`repl` , `console`](./commands.md#repl) + + + +### `--test` + +Aliases: `--test-scope`, `--with-test`, `--with-test-scope` + +`SHOULD have` per Scala Runner specification + +Include test scope + ## Shared options Available in commands: diff --git a/website/docs/reference/scala-command/commands.md b/website/docs/reference/scala-command/commands.md index 102d412df2..e1afc27a37 100644 --- a/website/docs/reference/scala-command/commands.md +++ b/website/docs/reference/scala-command/commands.md @@ -31,7 +31,7 @@ All supported types of inputs can be mixed with each other. For detailed documentation refer to our website: https://scala-cli.virtuslab.org/docs/commands/compile -Accepts option groups: [compilation server](./cli-options.md#compilation-server-options), [compile](./cli-options.md#compile-options), [coursier](./cli-options.md#coursier-options), [cross](./cli-options.md#cross-options), [debug](./cli-options.md#debug-options), [dependency](./cli-options.md#dependency-options), [global suppress warning](./cli-options.md#global-suppress-warning-options), [help group](./cli-options.md#help-group-options), [input](./cli-options.md#input-options), [jvm](./cli-options.md#jvm-options), [logging](./cli-options.md#logging-options), [markdown](./cli-options.md#markdown-options), [power](./cli-options.md#power-options), [python](./cli-options.md#python-options), [Scala.js](./cli-options.md#scalajs-options), [Scala Native](./cli-options.md#scala-native-options), [scalac](./cli-options.md#scalac-options), [scalac extra](./cli-options.md#scalac-extra-options), [semantic db](./cli-options.md#semantic-db-options), [shared](./cli-options.md#shared-options), [snippet](./cli-options.md#snippet-options), [source generator](./cli-options.md#source-generator-options), [suppress warning](./cli-options.md#suppress-warning-options), [verbosity](./cli-options.md#verbosity-options), [version](./cli-options.md#version-options), [watch](./cli-options.md#watch-options), [workspace](./cli-options.md#workspace-options) +Accepts option groups: [compilation server](./cli-options.md#compilation-server-options), [compile](./cli-options.md#compile-options), [coursier](./cli-options.md#coursier-options), [cross](./cli-options.md#cross-options), [debug](./cli-options.md#debug-options), [dependency](./cli-options.md#dependency-options), [global suppress warning](./cli-options.md#global-suppress-warning-options), [help group](./cli-options.md#help-group-options), [input](./cli-options.md#input-options), [jvm](./cli-options.md#jvm-options), [logging](./cli-options.md#logging-options), [markdown](./cli-options.md#markdown-options), [power](./cli-options.md#power-options), [python](./cli-options.md#python-options), [Scala.js](./cli-options.md#scalajs-options), [Scala Native](./cli-options.md#scala-native-options), [scalac](./cli-options.md#scalac-options), [scalac extra](./cli-options.md#scalac-extra-options), [scope](./cli-options.md#scope-options), [semantic db](./cli-options.md#semantic-db-options), [shared](./cli-options.md#shared-options), [snippet](./cli-options.md#snippet-options), [source generator](./cli-options.md#source-generator-options), [suppress warning](./cli-options.md#suppress-warning-options), [verbosity](./cli-options.md#verbosity-options), [version](./cli-options.md#version-options), [watch](./cli-options.md#watch-options), [workspace](./cli-options.md#workspace-options) ### config @@ -108,7 +108,7 @@ All supported types of inputs can be mixed with each other. For detailed documentation refer to our website: https://scala-cli.virtuslab.org/docs/commands/repl -Accepts option groups: [compilation server](./cli-options.md#compilation-server-options), [coursier](./cli-options.md#coursier-options), [cross](./cli-options.md#cross-options), [debug](./cli-options.md#debug-options), [dependency](./cli-options.md#dependency-options), [global suppress warning](./cli-options.md#global-suppress-warning-options), [help group](./cli-options.md#help-group-options), [input](./cli-options.md#input-options), [java](./cli-options.md#java-options), [java prop](./cli-options.md#java-prop-options), [jvm](./cli-options.md#jvm-options), [logging](./cli-options.md#logging-options), [markdown](./cli-options.md#markdown-options), [power](./cli-options.md#power-options), [python](./cli-options.md#python-options), [repl](./cli-options.md#repl-options), [Scala.js](./cli-options.md#scalajs-options), [Scala Native](./cli-options.md#scala-native-options), [scalac](./cli-options.md#scalac-options), [scalac extra](./cli-options.md#scalac-extra-options), [semantic db](./cli-options.md#semantic-db-options), [shared](./cli-options.md#shared-options), [snippet](./cli-options.md#snippet-options), [source generator](./cli-options.md#source-generator-options), [suppress warning](./cli-options.md#suppress-warning-options), [verbosity](./cli-options.md#verbosity-options), [version](./cli-options.md#version-options), [watch](./cli-options.md#watch-options), [workspace](./cli-options.md#workspace-options) +Accepts option groups: [compilation server](./cli-options.md#compilation-server-options), [coursier](./cli-options.md#coursier-options), [cross](./cli-options.md#cross-options), [debug](./cli-options.md#debug-options), [dependency](./cli-options.md#dependency-options), [global suppress warning](./cli-options.md#global-suppress-warning-options), [help group](./cli-options.md#help-group-options), [input](./cli-options.md#input-options), [java](./cli-options.md#java-options), [java prop](./cli-options.md#java-prop-options), [jvm](./cli-options.md#jvm-options), [logging](./cli-options.md#logging-options), [markdown](./cli-options.md#markdown-options), [power](./cli-options.md#power-options), [python](./cli-options.md#python-options), [repl](./cli-options.md#repl-options), [Scala.js](./cli-options.md#scalajs-options), [Scala Native](./cli-options.md#scala-native-options), [scalac](./cli-options.md#scalac-options), [scalac extra](./cli-options.md#scalac-extra-options), [scope](./cli-options.md#scope-options), [semantic db](./cli-options.md#semantic-db-options), [shared](./cli-options.md#shared-options), [snippet](./cli-options.md#snippet-options), [source generator](./cli-options.md#source-generator-options), [suppress warning](./cli-options.md#suppress-warning-options), [verbosity](./cli-options.md#verbosity-options), [version](./cli-options.md#version-options), [watch](./cli-options.md#watch-options), [workspace](./cli-options.md#workspace-options) ### run diff --git a/website/docs/reference/scala-command/runner-specification.md b/website/docs/reference/scala-command/runner-specification.md index 85e6f827bf..55135bcaef 100644 --- a/website/docs/reference/scala-command/runner-specification.md +++ b/website/docs/reference/scala-command/runner-specification.md @@ -312,7 +312,9 @@ Aliases: `-p` ,`--print-classpath` **--test** -Compile test scope +Include test scope + +Aliases: `--test-scope` ,`--with-test-scope` ,`--with-test`
@@ -1630,6 +1632,12 @@ Run the application in the background, automatically kill the process and restar Aliases: `--revolver` +**--test** + +Include test scope + +Aliases: `--test-scope` ,`--with-test-scope` ,`--with-test` +
### Implementantation specific options