diff options
author | Som Snytt <som.snytt@gmail.com> | 2013-12-18 01:26:34 -0800 |
---|---|---|
committer | Som Snytt <som.snytt@gmail.com> | 2014-01-08 07:43:42 -0800 |
commit | 8be560a1cf6306ea4ed2596f3b6631c2e44d8213 (patch) | |
tree | b7e1801122eea25e69c6d552f49cd69706a3510f | |
parent | bb2e99a69201060b88dd25602def42f31ba9ab65 (diff) | |
download | scala-8be560a1cf6306ea4ed2596f3b6631c2e44d8213.tar.gz scala-8be560a1cf6306ea4ed2596f3b6631c2e44d8213.tar.bz2 scala-8be560a1cf6306ea4ed2596f3b6631c2e44d8213.zip |
SI-8015 Unprintables in messages
The line content to display should include the whole line,
inclusive of embedded line breaks, and any control chars
should be displayed in unicode escape.
-rw-r--r-- | src/reflect/scala/reflect/internal/util/Position.scala | 11 | ||||
-rw-r--r-- | src/reflect/scala/reflect/internal/util/SourceFile.scala | 8 | ||||
-rw-r--r-- | test/files/neg/t8015-ffb.check | 2 |
3 files changed, 17 insertions, 4 deletions
diff --git a/src/reflect/scala/reflect/internal/util/Position.scala b/src/reflect/scala/reflect/internal/util/Position.scala index 15cfda26b5..dbee31bfca 100644 --- a/src/reflect/scala/reflect/internal/util/Position.scala +++ b/src/reflect/scala/reflect/internal/util/Position.scala @@ -207,7 +207,16 @@ private[util] trait InternalPositionImpl { def showError(msg: String): String = finalPosition match { case FakePos(fmsg) => s"$fmsg $msg" case NoPosition => msg - case pos => s"${pos.line}: $msg\n${pos.lineContent}\n${pos.lineCarat}" + case pos => f"${pos.line}: $msg%n${u(pos.lineContent)}%n${pos.lineCarat}" + } + private def u(s: String) = { + def uu(c: Int) = f"\\u$c%04x" + def uable(c: Int) = (c < 0x20 && c != '\t') || c == 0x7F + if (s exists (c => uable(c))) { + val sb = new StringBuilder + s foreach (c => sb append (if (uable(c)) uu(c) else c)) + sb.toString + } else s } def showDebug: String = toString def show = ( diff --git a/src/reflect/scala/reflect/internal/util/SourceFile.scala b/src/reflect/scala/reflect/internal/util/SourceFile.scala index 1da334d41f..39c4ac8a95 100644 --- a/src/reflect/scala/reflect/internal/util/SourceFile.scala +++ b/src/reflect/scala/reflect/internal/util/SourceFile.scala @@ -37,8 +37,12 @@ abstract class SourceFile { override def toString() = file.name def path = file.path - def lineToString(index: Int): String = - content drop lineToOffset(index) takeWhile (c => !isLineBreakChar(c.toChar)) mkString "" + def lineToString(index: Int): String = { + val start = lineToOffset(index) + var end = start + while (!isEndOfLine(end)) end += 1 + content.slice(start, end) mkString "" + } @tailrec final def skipWhitespace(offset: Int): Int = diff --git a/test/files/neg/t8015-ffb.check b/test/files/neg/t8015-ffb.check index 90c8d045b4..9b2171ea47 100644 --- a/test/files/neg/t8015-ffb.check +++ b/test/files/neg/t8015-ffb.check @@ -1,5 +1,5 @@ t8015-ffb.scala:10: warning: side-effecting nullary methods are discouraged: suggest defining as `def w()` instead - def w = { x + def w = { x\u000c() } // ^L is colored blue on this screen, hardly visible ^ error: No warnings can be incurred under -Xfatal-warnings. one warning found |