blob: b01d242d445f9a0c2457e52375f936fe248292ce (
plain) (
tree)
|
|
/* NSC -- new Scala compiler
* Copyright 2002-2013 LAMP/EPFL
* @author Paul Phillips
*/
package scala.tools.nsc
package interpreter
import reporters._
import IMain._
import scala.reflect.internal.util.{OffsetPosition, Position}
/** Like ReplGlobal, a layer for ensuring extra functionality.
*/
class ReplReporter(intp: IMain) extends ConsoleReporter(intp.settings, Console.in, new ReplStrippingWriter(intp)) {
def printUntruncatedMessage(msg: String) = withoutTruncating(printMessage(msg))
/** Whether very long lines can be truncated. This exists so important
* debugging information (like printing the classpath) is not rendered
* invisible due to the max message length.
*/
private var _truncationOK: Boolean = !intp.settings.verbose
def truncationOK = _truncationOK
def withoutTruncating[T](body: => T): T = {
val saved = _truncationOK
_truncationOK = false
try body
finally _truncationOK = saved
}
override def warning(pos: Position, msg: String): Unit = withoutTruncating(super.warning(pos, msg))
override def error(pos: Position, msg: String): Unit = withoutTruncating(super.error(pos, msg))
import scala.io.AnsiColor.{ RED, YELLOW, RESET }
def severityColor(severity: Severity): String = severity match {
case ERROR => RED
case WARNING => YELLOW
case INFO => RESET
}
private val promptLength = replProps.promptText.lines.toList.last.length
private val indentation = " " * promptLength
// colorized console labels
override protected def clabel(severity: Severity): String = {
val label0 = super.clabel(severity)
if (replProps.colorOk) s"${severityColor(severity)}${label0}${RESET}" else label0
}
// shift indentation for source text entered at prompt
override def print(pos: Position, msg: String, severity: Severity) {
val adjusted =
if (pos.source.file.name == "<console>")
new OffsetPosition(pos.source, pos.offset.getOrElse(0)) {
override def lineContent = s"${indentation}${super.lineContent}"
override def lineCaret = s"${indentation}${super.lineCaret}"
}
else pos
super.print(adjusted, msg, severity)
}
override def printMessage(msg: String) {
// Avoiding deadlock if the compiler starts logging before
// the lazy val is complete.
if (intp.isInitializeComplete) {
if (intp.totalSilence) {
if (isReplTrace)
super.printMessage("[silent] " + msg)
}
else super.printMessage(msg)
}
else Console.println("[init] " + msg)
}
override def displayPrompt() = if (!intp.totalSilence) super.displayPrompt()
override def rerunWithDetails(setting: reflect.internal.settings.MutableSettings#Setting, name: String) =
s"; for details, enable `:setting $name' or `:replay $name'"
}
|