From ffaec276e1700a070e6f3c2a1f6103b6e7ae18e2 Mon Sep 17 00:00:00 2001 From: Justin Patterson Date: Tue, 10 Oct 2017 09:41:14 -0500 Subject: [PATCH] #128: prevent OutOfBoundsException on trailing newline --- .../util/parsing/input/OffsetPosition.scala | 10 ++++++---- .../parsing/input/OffsetPositionTest.scala | 18 ++++++++++++++++++ 2 files changed, 24 insertions(+), 4 deletions(-) create mode 100644 shared/src/test/scala/scala/util/parsing/input/OffsetPositionTest.scala diff --git a/shared/src/main/scala/scala/util/parsing/input/OffsetPosition.scala b/shared/src/main/scala/scala/util/parsing/input/OffsetPosition.scala index c69fc4d9..7357880d 100644 --- a/shared/src/main/scala/scala/util/parsing/input/OffsetPosition.scala +++ b/shared/src/main/scala/scala/util/parsing/input/OffsetPosition.scala @@ -63,12 +63,14 @@ case class OffsetPosition(source: CharSequence, offset: Int) extends Position { * @return the line at `offset` (not including a newline) */ def lineContents: String = { - val endIndex = if (source.charAt(index(line) - 1) == '\n') { - index(line) - 1 + val lineStart = index(line - 1) + val lineEnd = index(line) + val endIndex = if ( lineStart < lineEnd && source.charAt(lineEnd - 1) == '\n') { + lineEnd - 1 } else { - index(line) + lineEnd } - source.subSequence(index(line - 1), endIndex).toString + source.subSequence(lineStart, endIndex).toString } /** Returns a string representation of the `Position`, of the form `line.column`. */ diff --git a/shared/src/test/scala/scala/util/parsing/input/OffsetPositionTest.scala b/shared/src/test/scala/scala/util/parsing/input/OffsetPositionTest.scala new file mode 100644 index 00000000..bbd9c9c4 --- /dev/null +++ b/shared/src/test/scala/scala/util/parsing/input/OffsetPositionTest.scala @@ -0,0 +1,18 @@ +package scala.util.parsing.input + +import org.junit.Test +import org.junit.Assert.assertEquals + +class OffsetPositionTest { + @Test + def printLineContentsWithTrailingNewLine: Unit = { + val op = new OffsetPosition("\n", 1) + assertEquals(op.lineContents, "") + } + + @Test + def printLineContentsWithEmptySource: Unit = { + val op = new OffsetPosition("", 0) + assertEquals(op.lineContents, "") + } +}