Improve run command warning

When the user inputs `run` or `runMain` we shouldn't print the warning
about multiple classes because in the case of run they already will be
prompted to select the classes and in the case of runMain, they are
already required to specify the class name.

Bonus:
 * improve punctuation
 * add clear screen to selector dialogue
 * print selector dialogue in one call to println -- this should prevent
   the possibility of messages from other threads being interlaced with
   the dialogue
This commit is contained in:
Ethan Atkins 2019-12-17 10:24:20 -08:00
parent 293e83ef9f
commit 44ef718448
2 changed files with 26 additions and 11 deletions

View File

@ -716,7 +716,15 @@ object Defaults extends BuildCommon {
forkOptions := forkOptionsTask.value,
selectMainClass := mainClass.value orElse askForMainClass(discoveredMainClasses.value),
mainClass in run := (selectMainClass in run).value,
mainClass := pickMainClassOrWarn(discoveredMainClasses.value, streams.value.log),
mainClass := {
val logWarning = state.value.currentCommand
.flatMap(_.commandLine.split(" ").headOption.map(_.trim))
.fold(true) {
case "run" | "runMain" => false
case _ => true
}
pickMainClassOrWarn(discoveredMainClasses.value, streams.value.log, logWarning)
},
runMain := foregroundRunMainTask.evaluated,
run := foregroundRunTask.evaluated,
fgRun := runTask(fullClasspath, mainClass in run, runner in run).evaluated,
@ -1483,12 +1491,16 @@ object Defaults extends BuildCommon {
def pickMainClass(classes: Seq[String]): Option[String] =
sbt.SelectMainClass(None, classes)
private def pickMainClassOrWarn(classes: Seq[String], logger: Logger): Option[String] = {
private def pickMainClassOrWarn(
classes: Seq[String],
logger: Logger,
logWarning: Boolean
): Option[String] = {
classes match {
case multiple if multiple.size > 1 =>
logger.warn(
"Multiple main classes detected. Run 'show discoveredMainClasses' to see the list"
)
case multiple if multiple.size > 1 && logWarning =>
val msg =
"Multiple main classes detected. Run 'show discoveredMainClasses' to see the list."
logger.warn(msg)
case _ =>
}
pickMainClass(classes)

View File

@ -7,6 +7,7 @@
package sbt
import sbt.internal.util.ConsoleAppender
import sbt.internal.util.Util.{ AnyOps, none }
object SelectMainClass {
@ -19,12 +20,14 @@ object SelectMainClass {
case Nil => None
case head :: Nil => Some(head)
case multiple =>
promptIfMultipleChoices flatMap { prompt =>
println("\nMultiple main classes detected, select one to run:\n")
for ((className, index) <- multiple.zipWithIndex)
println(" [" + (index + 1) + "] " + className)
promptIfMultipleChoices.flatMap { prompt =>
val header = "\nMultiple main classes detected. Select one to run:\n"
val classes = multiple.zipWithIndex
.map { case (className, index) => s" [${index + 1}] $className" }
.mkString("\n")
println(ConsoleAppender.clearScreen(0) + header + classes)
val line = trim(prompt("\nEnter number: "))
println("")
toInt(line, multiple.length) map multiple.apply
}
}