Skip to content

Commit 92e1df3

Browse files
committed
sbt.internal.inc.Position: record range information
Follow up to sbt/util#173 Rewritten from sbt/zinc@ed1b515
1 parent 8fcc9d3 commit 92e1df3

File tree

1 file changed

+45
-11
lines changed

1 file changed

+45
-11
lines changed

src/main/scala/xsbt/DelegatingReporter.scala

Lines changed: 45 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ package xsbt
1010
import java.io.File
1111
import java.util.Optional
1212

13-
import scala.reflect.internal.util.{ FakePos, NoPosition, Position }
13+
import scala.reflect.internal.util.{ FakePos, NoPosition, Position, RangePosition }
1414
// Left for compatibility
1515
import Compat._
1616

@@ -24,7 +24,13 @@ private object DelegatingReporter {
2424
lineContent0: String,
2525
offset0: Option[Int],
2626
pointer0: Option[Int],
27-
pointerSpace0: Option[String])
27+
pointerSpace0: Option[String],
28+
startOffset0: Option[Int],
29+
endOffset0: Option[Int],
30+
startLine0: Option[Int],
31+
startColumn0: Option[Int],
32+
endLine0: Option[Int],
33+
endColumn0: Option[Int])
2834
extends xsbti.Position {
2935
val line = o2oi(line0)
3036
val lineContent = lineContent0
@@ -33,6 +39,12 @@ private object DelegatingReporter {
3339
val sourceFile = o2jo(sourceFile0)
3440
val pointer = o2oi(pointer0)
3541
val pointerSpace = o2jo(pointerSpace0)
42+
override val startOffset = o2oi(startOffset0)
43+
override val endOffset = o2oi(endOffset0)
44+
override val startLine = o2oi(startLine0)
45+
override val startColumn = o2oi(startColumn0)
46+
override val endLine = o2oi(endLine0)
47+
override val endColumn = o2oi(endColumn0)
3648
override def toString =
3749
(sourcePath0, line0) match {
3850
case (Some(s), Some(l)) => s + ":" + l
@@ -42,7 +54,8 @@ private object DelegatingReporter {
4254
}
4355

4456
object PositionImpl {
45-
def empty: PositionImpl = new PositionImpl(None, None, None, "", None, None, None)
57+
def empty: PositionImpl =
58+
new PositionImpl(None, None, None, "", None, None, None, None, None, None, None, None, None)
4659
}
4760

4861
import java.lang.{ Integer => I }
@@ -76,18 +89,39 @@ private object DelegatingReporter {
7689
val line = pos.line
7790
val lineContent = pos.lineContent.stripLineEnd
7891
val offset = pos.point
79-
val pointer = offset - src.lineToOffset(src.offsetToLine(offset))
92+
93+
// Same logic as Position#line
94+
def lineOf(offset: Int) = src.offsetToLine(offset) + 1
95+
def columnOf(offset: Int) = offset - src.lineToOffset(src.offsetToLine(offset))
96+
97+
val pointer = columnOf(offset)
8098
val pointerSpace = lineContent.toList.take(pointer).map {
8199
case '\t' => '\t'
82100
case _ => ' '
83101
}
84-
new PositionImpl(Option(sourcePath),
85-
Option(sourceFile),
86-
Option(line),
87-
lineContent,
88-
Option(offset),
89-
Option(pointer),
90-
Option(pointerSpace.mkString))
102+
103+
val startOffset = if (pos.isRange) Some(pos.start) else None
104+
val endOffset = if (pos.isRange) Some(pos.end) else None
105+
val startLine = if (pos.isRange) Some(lineOf(pos.start)) else None
106+
val startColumn = if (pos.isRange) Some(columnOf(pos.start)) else None
107+
val endLine = if (pos.isRange) Some(lineOf(pos.end)) else None
108+
val endColumn = if (pos.isRange) Some(columnOf(pos.end)) else None
109+
110+
new PositionImpl(
111+
Option(sourcePath),
112+
Option(sourceFile),
113+
Option(line),
114+
lineContent,
115+
Option(offset),
116+
Option(pointer),
117+
Option(pointerSpace.mkString),
118+
startOffset,
119+
endOffset,
120+
startLine,
121+
startColumn,
122+
endLine,
123+
endColumn
124+
)
91125
}
92126

93127
cleanPos(dirtyPos) match {

0 commit comments

Comments
 (0)