consolereporter.scala
来自「JAVA 语言的函数式编程扩展」· SCALA 代码 · 共 131 行
SCALA
131 行
/* NSC -- new Scala compiler * Copyright 2002-2008 LAMP/EPFL * @author Martin Odersky */// $Id: ConsoleReporter.scala 13796 2008-01-23 19:12:51Z michelou $package scala.tools.nsc.reportersimport java.io.{BufferedReader, InputStreamReader, IOException, PrintWriter}import util._/** * This class implements a Reporter that displays messages on a text * console. */class ConsoleReporter(val settings: Settings, reader: BufferedReader, writer: PrintWriter) extends AbstractReporter { /** Whether a short file name should be displayed before errors */ var shortname: Boolean = false private def label(severity: Severity): String = severity match { case ERROR => "error" case WARNING => "warning" case INFO => null } private def clabel(severity: Severity): String = { val label0 = label(severity) if (label0 eq null) "" else label0 + ": " } def this(settings: Settings) = this(settings, Console.in, new PrintWriter(Console.err, true)) /** Returns the number of errors issued totally as a string. * * @param severity ... * @return ... */ private def getCountString(severity: Severity): String = countElementsAsString((severity).count, label(severity)) /** Prints the message. */ //def printMessage(msg: String) { writer.println(msg) } // platform-dependent! def printMessage(msg: String) { writer.print(msg + "\n"); writer.flush() } /** Prints the message with the given position indication. */ def printMessage(posIn: Position, msg: String) { if (posIn ne null) { val pos = posIn.inUltimateSource(posIn.source.getOrElse(null)) val buf = new StringBuilder(msg) if (!pos.source.isEmpty) { buf.insert(0, " ") buf.insert(0, pos.line.map(ln => ":" + pos.line.get + ":").getOrElse(":")) } //println(getSource.file) pos match { case FakePos(msg) => buf.insert(0, msg + " ") case _ if !pos.source.isEmpty => val file = pos.source.get.file buf.insert(0, if (shortname) file.name else file.path) case _ => } printMessage(buf.toString()) if (!pos.line.isEmpty) printSourceLine(pos) } else printMessage(msg) } def print(pos: Position, msg: String, severity: Severity) { printMessage(pos, clabel(severity) + msg) } /** * @param pos ... */ def printSourceLine(pos: Position) { printMessage(pos.lineContent.stripLineEnd) printColumnMarker(pos) } /** Prints the column marker of the given position. * * @param pos ... */ def printColumnMarker(pos: Position) = if (!pos.column.isEmpty) { val buffer = new StringBuilder(pos.column.get) var i = 1 while (i < pos.column.get) { buffer.append(' ') i += 1 } if (pos.column.get > 0) buffer.append('^') printMessage(buffer.toString()) } /** Prints the number of errors and warnings if their are non-zero. */ def printSummary() { if (WARNING.count > 0) printMessage(getCountString(WARNING) + " found") if ( ERROR.count > 0) printMessage(getCountString(ERROR ) + " found") } def display(pos: Position, msg: String, severity: Severity) { severity.count += 1 print(pos, msg, severity) } def displayPrompt: Unit = try { var continue = true while (continue) { writer.print("r)esume, a)bort: ") writer.flush() var line = reader.readLine() if (line ne null) { line = line.toLowerCase() if ("abort" startsWith line) throw new Error("user abort") if ("resume" startsWith line) continue = false } } } catch { case ex: IOException => { ex.printStackTrace() throw new Error("input read error") } } override def flush() { writer.flush() }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?