summaryrefslogtreecommitdiff
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
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.
-rw-r--r--src/reflect/scala/reflect/internal/util/Position.scala11
-rw-r--r--src/reflect/scala/reflect/internal/util/SourceFile.scala8
-rw-r--r--test/files/neg/t8015-ffb.check2
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