Skip to content

Commit

Permalink
Add help for repl, scalafmt and scaladoc
Browse files Browse the repository at this point in the history
  • Loading branch information
wleczny committed Oct 24, 2022
1 parent e913882 commit 76ccdac
Show file tree
Hide file tree
Showing 4 changed files with 134 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,20 @@ case class HelpGroupOptions(
@HelpMessage("Show options for ScalaJS")
helpJs: Boolean = false,
@HelpMessage("Show options for ScalaNative")
helpNative: Boolean = false
helpNative: Boolean = false,
@HelpMessage("Show options for scaladoc")
@Name("scaladocHelp")
@Name("docHelp")
@Name("helpDoc")
helpScaladoc: Boolean = false,
@HelpMessage("Show options for scalafmt")
@Name("replHelp")
helpRepl: Boolean = false,
@HelpMessage("Show options for scalafmt")
@Name("scalafmtHelp")
@Name("fmtHelp")
@Name("helpFmt")
helpScalafmt: Boolean = false
) {

private def printHelpWithGroup(help: Help[_], helpFormat: HelpFormat, group: String): Nothing = {
Expand Down
87 changes: 84 additions & 3 deletions modules/cli/src/main/scala/scala/cli/commands/ScalaCommand.scala
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,18 @@ import caseapp.core.help.{Help, HelpFormat}
import caseapp.core.parser.Parser
import caseapp.core.util.Formatter
import caseapp.core.{Arg, Error, RemainingArgs}
import dependency.*

import scala.annotation.tailrec
import scala.build.EitherCps.{either, value}
import scala.build.compiler.SimpleScalaCompiler
import scala.build.internal.Constants
import scala.build.errors.BuildException
import scala.build.internal.{Constants, Runner}
import scala.build.options.{BuildOptions, Scope}
import scala.cli.commands.util.CommandHelpers
import scala.build.{Artifacts, Positioned, ReplArtifacts}
import scala.cli.commands.util.ScalacOptionsUtil.*
import scala.cli.commands.util.SharedOptionsUtil.*
import scala.cli.commands.util.{CommandHelpers, FmtOptionsUtil}
import scala.cli.{CurrentParams, ScalaCli}
import scala.util.{Properties, Try}

Expand All @@ -23,6 +27,7 @@ abstract class ScalaCommand[T](implicit myParser: Parser[T], help: Help[T])

def sharedOptions(t: T): Option[SharedOptions] = // hello borked unused warning
None

override def hasFullHelp = true

override def parser: Parser[T] =
Expand All @@ -31,6 +36,7 @@ abstract class ScalaCommand[T](implicit myParser: Parser[T], help: Help[T])
def isRestricted: Boolean = false

protected var argvOpt = Option.empty[Array[String]]

override def setArgv(argv: Array[String]): Unit = {
argvOpt = Some(argv)
}
Expand All @@ -39,6 +45,7 @@ abstract class ScalaCommand[T](implicit myParser: Parser[T], help: Help[T])
protected def progName: String = ScalaCli.progName

// TODO Manage to have case-app give use the exact command name that was used instead

/** The actual sub-command name that was used. If the sub-command name is a list of strings, space
* is used as the separator. If [[argvOpt]] hasn't been defined, it defaults to [[name]].
*/
Expand Down Expand Up @@ -84,6 +91,7 @@ abstract class ScalaCommand[T](implicit myParser: Parser[T], help: Help[T])
new Completer[T] {
def optionName(prefix: String, state: Option[T]): List[CompletionItem] =
parent.optionName(prefix, state)

def optionValue(arg: Arg, prefix: String, state: Option[T]): List[CompletionItem] = {
val candidates = arg.name.name match {
case "dependency" =>
Expand Down Expand Up @@ -117,6 +125,7 @@ abstract class ScalaCommand[T](implicit myParser: Parser[T], help: Help[T])
}
candidates ++ parent.optionValue(arg, prefix, state)
}

def argument(prefix: String, state: Option[T]): List[CompletionItem] =
parent.argument(prefix, state)
}
Expand All @@ -128,6 +137,7 @@ abstract class ScalaCommand[T](implicit myParser: Parser[T], help: Help[T])

/** Print `scalac` output if passed options imply no inputs are necessary and raw `scalac` output
* is required instead. (i.e. `--scalac-option -help`)
*
* @param options
* command options
*/
Expand Down Expand Up @@ -159,6 +169,74 @@ abstract class ScalaCommand[T](implicit myParser: Parser[T], help: Help[T])
sys.exit(exitCode)
}

def maybePrintToolsHelp(options: T, buildOptions: BuildOptions): Unit =
for {
shared <- sharedOptions(options)
logger = shared.logger
artifacts <- buildOptions.artifacts(logger, Scope.Main).toOption
scalaArtifacts <- artifacts.scalaOpt
scalaParams = scalaArtifacts.params
if shared.helpGroups.helpScaladoc || shared.helpGroups.helpRepl || shared.helpGroups.helpScalafmt
} {
val exitCode: Either[BuildException, Int] = either {
val (classPath: Seq[os.Path], mainClass: String) =
if (shared.helpGroups.helpScaladoc) {
val docArtifacts = value {
Artifacts.fetch(
Positioned.none(Seq(dep"org.scala-lang::scaladoc:${scalaParams.scalaVersion}")),
buildOptions.finalRepositories,
Some(scalaParams),
logger,
buildOptions.finalCache,
None
)
}
(docArtifacts.files.map(os.Path(_, os.pwd)), "dotty.tools.scaladoc.Main")
}
else if (shared.helpGroups.helpRepl) {
val initialBuildOptions = buildOptionsOrExit(options)
val artifacts = initialBuildOptions.artifacts(logger, Scope.Main).orExit(logger)
val replArtifacts = value {
ReplArtifacts.default(
scalaParams,
artifacts.userDependencies,
Nil,
logger,
buildOptions.finalCache,
Nil,
None
)
}
(replArtifacts.replClassPath, replArtifacts.replMainClass)
}
else {
val fmtArtifacts = value {
Artifacts.fetch(
Positioned.none(Seq(
dep"${Constants.scalafmtOrganization}:${Constants.scalafmtName}:${Constants.defaultScalafmtVersion}"
)),
buildOptions.finalRepositories,
Some(scalaParams),
logger,
buildOptions.finalCache,
None
)
}
(fmtArtifacts.files.map(os.Path(_, os.pwd)), "org.scalafmt.cli.Cli")
}
val retCode = Runner.runJvm(
buildOptions.javaHome().value.javaCommand,
Nil,
classPath,
mainClass,
Seq("-help"),
logger
).waitFor()
retCode
}
sys.exit(exitCode.orExit(logger))
}

override def helpFormat: HelpFormat =
HelpFormat.default()
.withSortedGroups(Some(Seq(
Expand Down Expand Up @@ -251,7 +329,10 @@ abstract class ScalaCommand[T](implicit myParser: Parser[T], help: Help[T])
final override def run(options: T, remainingArgs: RemainingArgs): Unit = {
verbosity(options).foreach(v => CurrentParams.verbosity = v)
maybePrintGroupHelp(options)
buildOptions(options).foreach(bo => maybePrintSimpleScalacOutput(options, bo))
buildOptions(options).foreach { bo =>
maybePrintSimpleScalacOutput(options, bo)
maybePrintToolsHelp(options, bo)
}
runCommand(options, remainingArgs)
}
}
18 changes: 18 additions & 0 deletions website/docs/reference/cli-options.md
Original file line number Diff line number Diff line change
Expand Up @@ -364,6 +364,24 @@ Show options for ScalaJS

Show options for ScalaNative

### `--help-scaladoc`

Aliases: `--scaladoc-help`, `--doc-help`, `--help-doc`

Show options for scaladoc

### `--help-repl`

Aliases: `--repl-help`

Show options for scalafmt

### `--help-scalafmt`

Aliases: `--scalafmt-help`, `--fmt-help`, `--help-fmt`

Show options for scalafmt

## Install completions options

Available in commands:
Expand Down
18 changes: 18 additions & 0 deletions website/docs/reference/scala-command/cli-options.md
Original file line number Diff line number Diff line change
Expand Up @@ -314,6 +314,24 @@ Show options for ScalaJS

Show options for ScalaNative

### `--help-scaladoc`

Aliases: `--scaladoc-help`, `--doc-help`, `--help-doc`

Show options for scaladoc

### `--help-repl`

Aliases: `--repl-help`

Show options for scalafmt

### `--help-scalafmt`

Aliases: `--scalafmt-help`, `--fmt-help`, `--help-fmt`

Show options for scalafmt

## Install completions options

Available in commands:
Expand Down

0 comments on commit 76ccdac

Please sign in to comment.