summaryrefslogtreecommitdiff
path: root/src/reflect/scala/reflect/internal/util
diff options
context:
space:
mode:
authorSom Snytt <som.snytt@gmail.com>2013-12-18 01:26:34 -0800
committerSom Snytt <som.snytt@gmail.com>2014-01-08 07:43:42 -0800
commit8be560a1cf6306ea4ed2596f3b6631c2e44d8213 (patch)
treeb7e1801122eea25e69c6d552f49cd69706a3510f /src/reflect/scala/reflect/internal/util
parentbb2e99a69201060b88dd25602def42f31ba9ab65 (diff)
downloadscala-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.scala11
-rw-r--r--src/reflect/scala/reflect/internal/util/SourceFile.scala8
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 =