Skip to content

Commit 19d1c81

Browse files
committed
Merge pull request scala#3993 from puffnfresh/feature/color-repl
Color REPL under -Dscala.color
2 parents 4cd4af1 + 33fd418 commit 19d1c81

File tree

5 files changed

+49
-5
lines changed

5 files changed

+49
-5
lines changed

src/compiler/scala/tools/nsc/reporters/ConsoleReporter.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ class ConsoleReporter(val settings: Settings, reader: BufferedReader, writer: Pr
2929
case INFO => null
3030
}
3131

32-
private def clabel(severity: Severity): String = {
32+
protected def clabel(severity: Severity): String = {
3333
val label0 = label(severity)
3434
if (label0 eq null) "" else label0 + ": "
3535
}

src/repl/scala/tools/nsc/interpreter/ILoop.scala

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -412,8 +412,14 @@ class ILoop(in0: Option[BufferedReader], protected val out: JPrintWriter)
412412
}
413413

414414
private def readOneLine() = {
415+
import scala.io.AnsiColor.{ MAGENTA, RESET }
415416
out.flush()
416-
in readLine prompt
417+
in readLine (
418+
if (replProps.colorOk)
419+
MAGENTA + prompt + RESET
420+
else
421+
prompt
422+
)
417423
}
418424

419425
/** The main read-eval-print loop for the repl. It calls

src/repl/scala/tools/nsc/interpreter/MemberHandlers.scala

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,18 @@ trait MemberHandlers {
102102

103103
class GenericHandler(member: Tree) extends MemberHandler(member)
104104

105+
import scala.io.AnsiColor.{ BOLD, BLUE, GREEN, RESET }
106+
107+
def color(c: String, s: String) =
108+
if (replProps.colorOk) string2code(BOLD) + string2code(c) + s + string2code(RESET)
109+
else s
110+
111+
def colorName(s: String) =
112+
color(BLUE, string2code(s))
113+
114+
def colorType(s: String) =
115+
color(GREEN, string2code(s))
116+
105117
class ValHandler(member: ValDef) extends MemberDefHandler(member) {
106118
val maxStringElements = 1000 // no need to mkString billions of elements
107119
override def definesValue = true
@@ -119,15 +131,20 @@ trait MemberHandlers {
119131
if (replProps.vids) s"""" + f"@$${System.identityHashCode($path)}%8x" + """"
120132
else ""
121133

122-
""" + "%s%s: %s = " + %s""".format(string2code(prettyName), vidString, string2code(req typeOf name), resultString)
134+
val nameString = colorName(prettyName) + vidString
135+
val typeString = colorType(req typeOf name)
136+
s""" + "$nameString: $typeString = " + $resultString"""
123137
}
124138
}
125139
}
126140

127141
class DefHandler(member: DefDef) extends MemberDefHandler(member) {
128142
override def definesValue = flattensToEmpty(member.vparamss) // true if 0-arity
129-
override def resultExtractionCode(req: Request) =
130-
if (mods.isPublic) codegenln(name, ": ", req.typeOf(name)) else ""
143+
override def resultExtractionCode(req: Request) = {
144+
val nameString = colorName(name)
145+
val typeString = colorType(req typeOf name)
146+
if (mods.isPublic) s""" + "$nameString: $typeString\\n"""" else ""
147+
}
131148
}
132149

133150
abstract class MacroHandler(member: DefDef) extends MemberDefHandler(member) {

src/repl/scala/tools/nsc/interpreter/ReplProps.scala

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@ class ReplProps {
1313
private def bool(name: String) = BooleanProp.keyExists(name)
1414
private def int(name: String) = IntProp(name)
1515

16+
// This property is used in TypeDebugging. Let's recycle it.
17+
val colorOk = bool("scala.color")
18+
1619
val info = bool("scala.repl.info")
1720
val debug = bool("scala.repl.debug")
1821
val trace = bool("scala.repl.trace")

src/repl/scala/tools/nsc/interpreter/ReplReporter.scala

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,24 @@ class ReplReporter(intp: IMain) extends ConsoleReporter(intp.settings, Console.i
3232
override def warning(pos: Position, msg: String): Unit = withoutTruncating(super.warning(pos, msg))
3333
override def error(pos: Position, msg: String): Unit = withoutTruncating(super.error(pos, msg))
3434

35+
import scala.io.AnsiColor.{ RED, YELLOW, RESET }
36+
37+
def severityColor(severity: Severity): String = severity match {
38+
case ERROR => RED
39+
case WARNING => YELLOW
40+
case INFO => RESET
41+
}
42+
43+
override def print(pos: Position, msg: String, severity: Severity) {
44+
val prefix = (
45+
if (replProps.colorOk)
46+
severityColor(severity) + clabel(severity) + RESET
47+
else
48+
clabel(severity)
49+
)
50+
printMessage(pos, prefix + msg)
51+
}
52+
3553
override def printMessage(msg: String) {
3654
// Avoiding deadlock if the compiler starts logging before
3755
// the lazy val is complete.

0 commit comments

Comments
 (0)