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 /src/reflect/scala/reflect/internal/util | |
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.
Diffstat (limited to 'src/reflect/scala/reflect/internal/util')
-rw-r--r-- | src/reflect/scala/reflect/internal/util/Position.scala | 11 | ||||
-rw-r--r-- | src/reflect/scala/reflect/internal/util/SourceFile.scala | 8 |
2 files changed, 16 insertions, 3 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 = |