aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/reporting/MessageRendering.scala
diff options
context:
space:
mode:
authorFelix Mulder <felix.mulder@gmail.com>2016-11-04 14:23:45 +0100
committerFelix Mulder <felix.mulder@gmail.com>2016-11-04 14:43:31 +0100
commitf9328badfe54f9c1d5c9bf9ab528e5ed14849a88 (patch)
tree260cad265b2f6708e06ec2ac72291e0107d2aea7 /src/dotty/tools/dotc/reporting/MessageRendering.scala
parent8ea583671a0dc88a9a8ef59eb4f60d70541adfce (diff)
downloaddotty-f9328badfe54f9c1d5c9bf9ab528e5ed14849a88.tar.gz
dotty-f9328badfe54f9c1d5c9bf9ab528e5ed14849a88.tar.bz2
dotty-f9328badfe54f9c1d5c9bf9ab528e5ed14849a88.zip
Clean up in ConsoleReporter & MessageRendering
Diffstat (limited to 'src/dotty/tools/dotc/reporting/MessageRendering.scala')
-rw-r--r--src/dotty/tools/dotc/reporting/MessageRendering.scala48
1 files changed, 38 insertions, 10 deletions
diff --git a/src/dotty/tools/dotc/reporting/MessageRendering.scala b/src/dotty/tools/dotc/reporting/MessageRendering.scala
index 79632c965..24d583b19 100644
--- a/src/dotty/tools/dotc/reporting/MessageRendering.scala
+++ b/src/dotty/tools/dotc/reporting/MessageRendering.scala
@@ -12,15 +12,30 @@ import util.SourcePosition
import scala.collection.mutable
trait MessageRendering {
+ /** Remove ANSI coloring from `str`, useful for getting real length of
+ * strings
+ *
+ * @return string stripped of ANSI escape codes
+ */
def stripColor(str: String): String =
str.replaceAll("\u001B\\[[;\\d]*m", "")
+ /** When inlining a method call, if there's an error we'd like to get the
+ * outer context and the `pos` at which the call was inlined.
+ *
+ * @return a list of strings with inline locations
+ */
def outer(pos: SourcePosition, prefix: String)(implicit ctx: Context): List[String] =
if (pos.outer.exists) {
s"$prefix| This location is in code that was inlined at ${pos.outer}" ::
outer(pos.outer, prefix)
} else Nil
+ /** Get the sourcelines before and after the position, as well as the offset
+ * for rendering line numbers
+ *
+ * @return (lines before error, lines after error, line numbers offset)
+ */
def sourceLines(pos: SourcePosition)(implicit ctx: Context): (List[String], List[String], Int) = {
var maxLen = Int.MinValue
def render(xs: List[Int]) =
@@ -39,6 +54,7 @@ trait MessageRendering {
(render(before), render(after), maxLen)
}
+ /** The column markers aligned under the error */
def columnMarker(pos: SourcePosition, offset: Int)(implicit ctx: Context): String = {
val prefix = " " * (offset - 1)
val whitespace = " " * pos.startColumn
@@ -51,21 +67,30 @@ trait MessageRendering {
s"$prefix|$whitespace${carets.show}"
}
+ /** The error message (`msg`) aligned under `pos`
+ *
+ * @return aligned error message
+ */
def errorMsg(pos: SourcePosition, msg: String, offset: Int)(implicit ctx: Context): String = {
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)
+ val currPad = math.min(
+ math.max(0, ctx.settings.pageWidth.value - offset - lineLength),
+ offset + pos.startColumn
+ )
- if (padding < minPad) padding
- else minPad
+ math.min(currPad, minPad)
}
msg.lines
- .map { line => " " * (offset - 1) + "|" + (" " * (leastWhitespace - offset)) + line }
+ .map { line => " " * (offset - 1) + "|" + (" " * (leastWhitespace - offset)) + line}
.mkString(sys.props("line.separator"))
}
+ /** The separator between errors containing the source file and error type
+ *
+ * @return separator containing error location and kind
+ */
def posStr(pos: SourcePosition, diagnosticLevel: String, message: Message)(implicit ctx: Context): String =
if (pos.exists) Blue({
val file = pos.source.file.toString
@@ -82,15 +107,19 @@ trait MessageRendering {
("-" * math.max(ctx.settings.pageWidth.value - stripColor(prefix).length, 0))
}).show else ""
+ /** Explanation rendered under "Explanation" header */
def explanation(m: Message)(implicit ctx: Context): String = {
- val sb = new StringBuilder(hl"""|
- |${Blue("Explanation")}
- |${Blue("===========")}""".stripMargin)
+ val sb = new StringBuilder(
+ hl"""|
+ |${Blue("Explanation")}
+ |${Blue("===========")}"""
+ )
sb.append('\n').append(m.explanation)
if (m.explanation.lastOption != Some('\n')) sb.append('\n')
sb.toString
}
+ /** The whole message rendered from `msg` */
def messageAndPos(msg: Message, pos: SourcePosition, diagnosticLevel: String)(implicit ctx: Context): String = {
val sb = mutable.StringBuilder.newBuilder
sb.append(posStr(pos, diagnosticLevel, msg)).append('\n')
@@ -103,7 +132,7 @@ trait MessageRendering {
sb.toString
}
- def diagnosticLevel(cont: MessageContainer): String = {
+ def diagnosticLevel(cont: MessageContainer): String =
cont match {
case m: Error => "Error"
case m: FeatureWarning => "Feature Warning"
@@ -113,5 +142,4 @@ trait MessageRendering {
case m: Warning => "Warning"
case m: Info => "Info"
}
- }
}