diff --git a/project/MimaFilters.scala b/project/MimaFilters.scala index aa2192492cb3..4b3690babd0b 100644 --- a/project/MimaFilters.scala +++ b/project/MimaFilters.scala @@ -32,6 +32,8 @@ object MimaFilters extends AutoPlugin { ProblemFilters.exclude[DirectMissingMethodProblem]("scala.Predef#ArrayCharSequence.isEmpty"), ProblemFilters.exclude[DirectMissingMethodProblem]("scala.runtime.ArrayCharSequence.isEmpty"), + // private[scala] member used by Properties and by REPL + ProblemFilters.exclude[DirectMissingMethodProblem]("scala.util.Properties.consoleIsTerminal"), ) override val buildSettings = Seq( diff --git a/src/library/scala/util/Properties.scala b/src/library/scala/util/Properties.scala index 414b82ae963c..05c454e6dcf5 100644 --- a/src/library/scala/util/Properties.scala +++ b/src/library/scala/util/Properties.scala @@ -158,9 +158,17 @@ private[scala] trait PropertiesTrait { private[scala] def isAvian = javaVmName contains "Avian" private[scala] def coloredOutputEnabled: Boolean = propOrElse("scala.color", "auto") match { - case "auto" => System.console() != null && !isWin - case a if a.toLowerCase() == "true" => true - case _ => false + case "auto" => !isWin && consoleIsTerminal + case s => "" == s || "true".equalsIgnoreCase(s) + } + + /** System.console.isTerminal, or just check for null console on JDK < 22 */ + private[scala] lazy val consoleIsTerminal: Boolean = { + val console = System.console + def isTerminal: Boolean = + try classOf[java.io.Console].getMethod("isTerminal", null).invoke(console).asInstanceOf[Boolean] + catch { case _: NoSuchMethodException => false } + console != null && (!isJavaAtLeast("22") || isTerminal) } // This is looking for javac, tools.jar, etc. diff --git a/src/repl/scala/tools/nsc/interpreter/ILoop.scala b/src/repl/scala/tools/nsc/interpreter/ILoop.scala index b611f58d89a6..471bfb97ef74 100644 --- a/src/repl/scala/tools/nsc/interpreter/ILoop.scala +++ b/src/repl/scala/tools/nsc/interpreter/ILoop.scala @@ -29,6 +29,7 @@ import io.AbstractFile import scala.concurrent.{Await, Future} import java.io.BufferedReader +import scala.util.Properties.consoleIsTerminal import scala.util.{Try, Success, Failure} import Completion._ @@ -905,7 +906,7 @@ class ILoop(in0: Option[BufferedReader], protected val out: JPrintWriter) extend * supplied as a `() => Completion`; the Completion object provides a concrete Completer. */ def chooseReader(settings: Settings): InteractiveReader = { - if (settings.Xnojline) SimpleReader() + if (settings.Xnojline || !consoleIsTerminal) SimpleReader() else { type Completer = () => Completion type ReaderMaker = Completer => InteractiveReader