@@ -10,7 +10,7 @@ package xsbt
10
10
import java .io .File
11
11
import java .util .Optional
12
12
13
- import scala .reflect .internal .util .{ FakePos , NoPosition , Position }
13
+ import scala .reflect .internal .util .{ FakePos , NoPosition , Position , RangePosition }
14
14
// Left for compatibility
15
15
import Compat ._
16
16
@@ -24,7 +24,13 @@ private object DelegatingReporter {
24
24
lineContent0 : String ,
25
25
offset0 : Option [Int ],
26
26
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 ])
28
34
extends xsbti.Position {
29
35
val line = o2oi(line0)
30
36
val lineContent = lineContent0
@@ -33,6 +39,12 @@ private object DelegatingReporter {
33
39
val sourceFile = o2jo(sourceFile0)
34
40
val pointer = o2oi(pointer0)
35
41
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)
36
48
override def toString =
37
49
(sourcePath0, line0) match {
38
50
case (Some (s), Some (l)) => s + " :" + l
@@ -42,7 +54,8 @@ private object DelegatingReporter {
42
54
}
43
55
44
56
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 )
46
59
}
47
60
48
61
import java .lang .{ Integer => I }
@@ -76,18 +89,39 @@ private object DelegatingReporter {
76
89
val line = pos.line
77
90
val lineContent = pos.lineContent.stripLineEnd
78
91
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)
80
98
val pointerSpace = lineContent.toList.take(pointer).map {
81
99
case '\t ' => '\t '
82
100
case _ => ' '
83
101
}
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
+ )
91
125
}
92
126
93
127
cleanPos(dirtyPos) match {
0 commit comments