diff options
author | Felix Mulder <felix.mulder@gmail.com> | 2016-09-19 20:00:44 +0200 |
---|---|---|
committer | Felix Mulder <felix.mulder@gmail.com> | 2016-10-10 13:25:34 +0200 |
commit | 1532c82788ab2366df04cac2e418d3db98390ef4 (patch) | |
tree | cf77d386016cc442c161d7fce347b7fd4e89e3a6 /src | |
parent | e24289ac19a21c6b3794d02e8fe42766224f173c (diff) | |
download | dotty-1532c82788ab2366df04cac2e418d3db98390ef4.tar.gz dotty-1532c82788ab2366df04cac2e418d3db98390ef4.tar.bz2 dotty-1532c82788ab2366df04cac2e418d3db98390ef4.zip |
Remove duplication of console reporters
Diffstat (limited to 'src')
-rw-r--r-- | src/dotty/tools/dotc/Compiler.scala | 2 | ||||
-rw-r--r-- | src/dotty/tools/dotc/core/Contexts.scala | 2 | ||||
-rw-r--r-- | src/dotty/tools/dotc/repl/CompilingInterpreter.scala | 40 | ||||
-rw-r--r-- | src/dotty/tools/dotc/reporting/ConsoleReporter.scala | 86 | ||||
-rw-r--r-- | src/dotty/tools/dotc/reporting/FancyConsoleReporter.scala | 93 |
5 files changed, 82 insertions, 141 deletions
diff --git a/src/dotty/tools/dotc/Compiler.scala b/src/dotty/tools/dotc/Compiler.scala index ea6254f5b..178cba7c4 100644 --- a/src/dotty/tools/dotc/Compiler.scala +++ b/src/dotty/tools/dotc/Compiler.scala @@ -8,7 +8,7 @@ import Symbols._ import Types._ import Scopes._ import typer.{FrontEnd, Typer, ImportInfo, RefChecks} -import reporting.{Reporter, ConsoleReporter, FancyConsoleReporter} +import reporting.{Reporter, ConsoleReporter} import Phases.Phase import transform._ import transform.TreeTransforms.{TreeTransform, TreeTransformer} diff --git a/src/dotty/tools/dotc/core/Contexts.scala b/src/dotty/tools/dotc/core/Contexts.scala index d1447a98f..5c9fdaf88 100644 --- a/src/dotty/tools/dotc/core/Contexts.scala +++ b/src/dotty/tools/dotc/core/Contexts.scala @@ -501,7 +501,7 @@ object Contexts { outer = NoContext period = InitialPeriod mode = Mode.None - typerState = new TyperState(new FancyConsoleReporter()) + typerState = new TyperState(new ConsoleReporter()) printerFn = new RefinedPrinter(_) owner = NoSymbol sstate = settings.defaultState diff --git a/src/dotty/tools/dotc/repl/CompilingInterpreter.scala b/src/dotty/tools/dotc/repl/CompilingInterpreter.scala index 70b32a16a..0964de303 100644 --- a/src/dotty/tools/dotc/repl/CompilingInterpreter.scala +++ b/src/dotty/tools/dotc/repl/CompilingInterpreter.scala @@ -16,7 +16,7 @@ import scala.collection.mutable.{ListBuffer, HashSet, ArrayBuffer} //import ast.parser.SyntaxAnalyzer import io.{PlainFile, VirtualDirectory} import scala.reflect.io.{PlainDirectory, Directory} -import reporting.{ConsoleReporter, FancyConsoleReporter, Reporter} +import reporting.{ConsoleReporter, Reporter} import core.Flags import util.{SourceFile, NameTransformer} import io.ClassPath @@ -117,30 +117,22 @@ class CompilingInterpreter( } } - private def customPrintMessage(msg: String) = { - if (!delayOutput) { - out.print(/*clean*/(msg) + "\n") - // Suppress clean for now for compiler messages - // Otherwise we will completely delete all references to - // line$object$ module classes. The previous interpreter did not - // have the project because the module class was written without the final `$' - // and therefore escaped the purge. We can turn this back on once - // we drop the final `$' from module classes. - out.flush() - } else { - previousOutput += (/*clean*/(msg) + "\n") + private def newReporter = + new ConsoleReporter(Console.in, out) { + override def printMessage(msg: String) = + if (!delayOutput) { + out.print(/*clean*/(msg) + "\n") + // Suppress clean for now for compiler messages + // Otherwise we will completely delete all references to + // line$object$ module classes. The previous interpreter did not + // have the project because the module class was written without the final `$' + // and therefore escaped the purge. We can turn this back on once + // we drop the final `$' from module classes. + out.flush() + } else { + previousOutput += (/*clean*/(msg) + "\n") + } } - } - - private def newReporter(implicit ctx: Context) = - if (ctx.settings.color.value == "never") - new ConsoleReporter(Console.in, out) { - override def printMessage(msg: String) = customPrintMessage(msg) - } - else - new FancyConsoleReporter(Console.in, out) { - override def printMessage(msg: String) = customPrintMessage(msg) - } /** the previous requests this interpreter has processed */ private val prevRequests = new ArrayBuffer[Request]() diff --git a/src/dotty/tools/dotc/reporting/ConsoleReporter.scala b/src/dotty/tools/dotc/reporting/ConsoleReporter.scala index 92eea9fa9..a5979bd5b 100644 --- a/src/dotty/tools/dotc/reporting/ConsoleReporter.scala +++ b/src/dotty/tools/dotc/reporting/ConsoleReporter.scala @@ -8,13 +8,14 @@ import core.Contexts._ import Reporter._ import java.io.{ BufferedReader, IOException, PrintWriter } import scala.reflect.internal.util._ -import diagnostic.Message -import diagnostic.MessageContainer +import printing.SyntaxHighlighting._ +import printing.Highlighting._ +import diagnostic.{ Message, MessageContainer } import diagnostic.messages._ /** - * This class implements a Reporter that displays messages on a text - * console. + * This class implements a more Fancy version (with colors!) of the regular + * `ConsoleReporter` */ class ConsoleReporter( reader: BufferedReader = Console.in, @@ -26,32 +27,72 @@ class ConsoleReporter( /** maximal number of error messages to be printed */ protected def ErrorLimit = 100 - def printSourceLine(pos: SourcePosition) = - printMessage(pos.lineContent.stripLineEnd) - - def printColumnMarker(pos: SourcePosition) = - if (pos.exists) { printMessage(" " * pos.column + "^") } - /** Prints the message. */ def printMessage(msg: String): Unit = { writer.print(msg + "\n"); writer.flush() } + def stripColor(str: String): String = + str.replaceAll("\u001B\\[[;\\d]*m", "") + + def sourceLine(pos: SourcePosition)(implicit ctx: Context): (String, Int) = { + val lineNum = s"${pos.line}:" + (lineNum + hl"${pos.lineContent.stripLineEnd}", lineNum.length) + } + + def columnMarker(pos: SourcePosition, offset: Int)(implicit ctx: Context) = + if (pos.startLine == pos.endLine) { + val whitespace = " " * (pos.column + offset) + val carets = + Red("^" * math.max(1, pos.endColumn - pos.startColumn)) + + whitespace + carets.show + } else { + Red(" " * (pos.column + offset) + "^").show + } + + def errorMsg(pos: SourcePosition, msg: String, offset: Int)(implicit ctx: Context) = { + var hasLongLines = false + val leastWhitespace = msg.lines.foldLeft(Int.MaxValue) { (minPad, line) => + val lineLength = stripColor(line).length + val padding = + math.min(math.max(0, ctx.settings.pageWidth.value - offset - lineLength), offset + pos.startColumn) + + if (padding < minPad) padding + else minPad + } + + msg + .lines + .map { line => " " * leastWhitespace + line } + .mkString(sys.props("line.separator")) + } + + def posStr(pos: SourcePosition, kind: String, errorId: String)(implicit ctx: Context) = + if (pos.exists) Blue({ + val file = pos.source.file.toString + val errId = if (errorId != "") s"[$errorId] " else "" + val prefix = s"-- ${errId}${kind}: $file " + prefix + + ("-" * math.max(ctx.settings.pageWidth.value - stripColor(prefix).length, 0)) + }).show else "" + /** Prints the message with the given position indication. */ def printMessageAndPos(msg: Message, pos: SourcePosition, kind: String)(implicit ctx: Context): Unit = { - val posStr = if (pos.exists) s"$pos: " else "" - printMessage(s"${posStr}${kind}: ${msg.msg}") + printMessage(posStr(pos, kind, msg.errorId)) if (pos.exists) { - printSourceLine(pos) - printColumnMarker(pos) - } + val (src, offset) = sourceLine(pos) + val marker = columnMarker(pos, offset) + val err = errorMsg(pos, msg.msg, offset) + + printMessage(List(src, marker, err).mkString("\n")) + } else printMessage(msg.msg) } - def printExplanation(m: Message)(implicit ctx: Context): Unit = - printMessage( - s"""| - |Explanation - |=========== - |${m.explanation}""".stripMargin - ) + def printExplanation(m: Message)(implicit ctx: Context): Unit = { + printMessage(hl"""| + |${Blue("Explanation")} + |${Blue("===========")}""".stripMargin) + printMessage(m.explanation) + } override def doReport(m: MessageContainer)(implicit ctx: Context): Unit = { m match { @@ -87,3 +128,4 @@ class ConsoleReporter( override def flush()(implicit ctx: Context): Unit = { writer.flush() } } + diff --git a/src/dotty/tools/dotc/reporting/FancyConsoleReporter.scala b/src/dotty/tools/dotc/reporting/FancyConsoleReporter.scala deleted file mode 100644 index 725e69ff8..000000000 --- a/src/dotty/tools/dotc/reporting/FancyConsoleReporter.scala +++ /dev/null @@ -1,93 +0,0 @@ -package dotty.tools -package dotc -package reporting - -import scala.collection.mutable -import util.SourcePosition -import core.Contexts._ -import Reporter._ -import java.io.{ BufferedReader, IOException, PrintWriter } -import scala.reflect.internal.util._ -import printing.SyntaxHighlighting._ -import printing.Highlighting._ -import diagnostic.Message - -/** - * This class implements a more Fancy version (with colors!) of the regular - * `ConsoleReporter` - */ -class FancyConsoleReporter( - reader: BufferedReader = Console.in, - writer: PrintWriter = new PrintWriter(Console.err, true) -) extends ConsoleReporter(reader, writer) { - - def stripColor(str: String): String = - str.replaceAll("\u001B\\[[;\\d]*m", "") - - def sourceLine(pos: SourcePosition)(implicit ctx: Context): (String, Int) = { - val lineNum = s"${pos.line}:" - (lineNum + hl"${pos.lineContent.stripLineEnd}", lineNum.length) - } - - def columnMarker(pos: SourcePosition, offset: Int)(implicit ctx: Context) = - if (pos.startLine == pos.endLine) { - val whitespace = " " * (pos.column + offset) - val carets = - Red("^" * math.max(1, pos.endColumn - pos.startColumn)) - - whitespace + carets.show - } else { - Red(" " * (pos.column + offset) + "^").show - } - - def errorMsg(pos: SourcePosition, msg: String, offset: Int)(implicit ctx: Context) = { - var hasLongLines = false - val leastWhitespace = msg.lines.foldLeft(Int.MaxValue) { (minPad, line) => - val lineLength = stripColor(line).length - val padding = - math.min(math.max(0, ctx.settings.pageWidth.value - offset - lineLength), offset + pos.startColumn) - - if (padding < minPad) padding - else minPad - } - - msg - .lines - .map { line => " " * leastWhitespace + line } - .mkString(sys.props("line.separator")) - } - - def posStr(pos: SourcePosition, kind: String)(implicit ctx: Context) = - if (pos.exists) Blue({ - val file = pos.source.file.toString - - val outer = if (pos.outer.exists) { - s"This location is in code that was inlined at ${pos.outer}:\n" + - printStr(pos.outer) + "\n" + "-" * ctx.settings.pageWidth.value - } else "" - - val prefix = s"-- $kind: $file " - prefix + - ("-" * math.max(ctx.settings.pageWidth.value - stripColor(prefix).length, 0)) + - "\n" + outer - }).show else "" - - /** Prints the message with the given position indication. */ - override def printMessageAndPos(msg: Message, pos: SourcePosition, kind: String)(implicit ctx: Context): Unit = { - printMessage(posStr(pos, kind)) - if (pos.exists) { - val (src, offset) = sourceLine(pos) - val marker = columnMarker(pos, offset) - val err = errorMsg(pos, msg.msg, offset) - - printMessage(List(src, marker, err).mkString("\n")) - } else printMessage(msg.msg) - } - - override def printExplanation(m: Message)(implicit ctx: Context): Unit = { - printMessage(hl"""| - |${Blue("Explanation")} - |${Blue("===========")}""".stripMargin) - printMessage(m.explanation) - } -} |