From 2c78ad2914498e7f722a3e835beb4a012afb5b6e Mon Sep 17 00:00:00 2001 From: Som Snytt Date: Thu, 11 Apr 2024 11:04:36 -0700 Subject: [PATCH] Console color only if JDK 22 says isConsole --- .../tools/nsc/interpreter/shell/ILoop.scala | 2 +- .../nsc/interpreter/shell/ShellConfig.scala | 17 +++++++++++++---- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/repl-frontend/scala/tools/nsc/interpreter/shell/ILoop.scala b/src/repl-frontend/scala/tools/nsc/interpreter/shell/ILoop.scala index d34487a5c4ca..7242bb0a9668 100644 --- a/src/repl-frontend/scala/tools/nsc/interpreter/shell/ILoop.scala +++ b/src/repl-frontend/scala/tools/nsc/interpreter/shell/ILoop.scala @@ -1009,7 +1009,7 @@ object ILoop { def batchText: String = delegate.batchText def batchMode: Boolean = delegate.batchMode def doCompletion: Boolean = delegate.doCompletion - def haveInteractiveConsole: Boolean = delegate.haveInteractiveConsole + override def haveInteractiveConsole: Boolean = delegate.haveInteractiveConsole def xsource: String = "" diff --git a/src/repl-frontend/scala/tools/nsc/interpreter/shell/ShellConfig.scala b/src/repl-frontend/scala/tools/nsc/interpreter/shell/ShellConfig.scala index 76405daf3751..e522ced3490b 100644 --- a/src/repl-frontend/scala/tools/nsc/interpreter/shell/ShellConfig.scala +++ b/src/repl-frontend/scala/tools/nsc/interpreter/shell/ShellConfig.scala @@ -25,6 +25,7 @@ import scala.tools.nsc.Properties.{ shellBannerString, shellInterruptedString, shellPromptString, shellWelcomeString, userHome, versionString, versionNumberString, } +import scala.util.Properties.isJavaAtLeast object ShellConfig { val EDITOR = envOrNone("EDITOR") @@ -38,7 +39,7 @@ object ShellConfig { val batchText: String = if (settings.execute.isSetByUser) settings.execute.value else "" val batchMode: Boolean = batchText.nonEmpty val doCompletion: Boolean = !(settings.noCompletion.value || batchMode) - val haveInteractiveConsole: Boolean = !settings.Xnojline.value + override val haveInteractiveConsole: Boolean = super.haveInteractiveConsole && !settings.Xnojline.value def xsource: String = if (settings.isScala3: @nowarn) settings.source.value.versionString else "" } case _ => new ShellConfig { @@ -47,7 +48,7 @@ object ShellConfig { val batchText: String = "" val batchMode: Boolean = false val doCompletion: Boolean = !settings.noCompletion.value - val haveInteractiveConsole: Boolean = !settings.Xnojline.value + override val haveInteractiveConsole: Boolean = super.haveInteractiveConsole && !settings.Xnojline.value def xsource: String = if (settings.isScala3: @nowarn) settings.source.value.versionString else "" } } @@ -59,7 +60,15 @@ trait ShellConfig { def batchText: String def batchMode: Boolean def doCompletion: Boolean - def haveInteractiveConsole: Boolean + def haveInteractiveConsole: Boolean = System.console != null && consoleIsTerminal + + // false if JDK 22 and the system console says !isTerminal + def consoleIsTerminal: Boolean = { + def isTerminal: Boolean = + try classOf[java.io.Console].getMethod("isTerminal", null).invoke(System.console).asInstanceOf[Boolean] + catch { case _: NoSuchMethodException => false } + !isJavaAtLeast(22) || isTerminal + } // source compatibility, i.e., -Xsource def xsource: String @@ -68,7 +77,7 @@ trait ShellConfig { private def int(name: String) = Prop[Int](name) // This property is used in TypeDebugging. Let's recycle it. - val colorOk = coloredOutputEnabled + val colorOk = coloredOutputEnabled && haveInteractiveConsole val historyFile = s"$userHome/.scala_history_jline3"