Skip to content

Commit 9d9741f

Browse files
committed
sbt.internal.inc.Position: record range information
Follow up to sbt/util#173
1 parent 746d474 commit 9d9741f

File tree

7 files changed

+89
-23
lines changed

7 files changed

+89
-23
lines changed

build.sbt

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,16 @@ lazy val zincPersist = (project in internalPath / "zinc-persist")
211211
exclude[DirectMissingMethodProblem]("sbt.internal.inc.schema.AnalyzedClass.copy"),
212212
exclude[DirectMissingMethodProblem]("sbt.internal.inc.schema.AnalyzedClass.this"),
213213
exclude[ReversedMissingMethodProblem]("sbt.internal.inc.schema.Version.isV11"),
214-
exclude[DirectMissingMethodProblem]("sbt.internal.inc.binary.converters.ProtobufReaders.this")
214+
exclude[DirectMissingMethodProblem]("sbt.internal.inc.binary.converters.ProtobufReaders.this"),
215+
216+
// Added {start,end}{Offset,Line,Column}
217+
exclude[DirectMissingMethodProblem]("sbt.internal.inc.schema.Position.apply"),
218+
exclude[DirectMissingMethodProblem]("sbt.internal.inc.schema.Position.copy"),
219+
exclude[DirectMissingMethodProblem]("sbt.internal.inc.schema.Position.this"),
220+
221+
// Renamed vals in a private[sbt] class
222+
exclude[DirectMissingMethodProblem]("sbt.internal.inc.javac.DiagnosticsReporter#PositionImpl.endPosition"),
223+
exclude[DirectMissingMethodProblem]("sbt.internal.inc.javac.DiagnosticsReporter#PositionImpl.startPosition"),
215224
)
216225
}
217226
)

internal/compiler-bridge/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 {

internal/zinc-compile-core/src/main/scala/sbt/internal/inc/javac/DiagnosticsReporter.scala

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import java.util.Optional
1515
import java.io.File
1616
import javax.tools.{ Diagnostic, JavaFileObject, DiagnosticListener }
1717
import sbt.io.IO
18-
import sbt.util.InterfaceUtil.o2jo
18+
import sbt.util.InterfaceUtil.{ o2jo, jo2o }
1919
import xsbti.{ Severity, Reporter }
2020
import javax.tools.Diagnostic.NOPOS
2121

@@ -59,14 +59,19 @@ object DiagnosticsReporter {
5959
override val line: Optional[Integer],
6060
override val lineContent: String,
6161
override val offset: Optional[Integer],
62-
val startPosition: Option[Long],
63-
val endPosition: Option[Long]
62+
override val startOffset: Optional[Integer],
63+
override val endOffset: Optional[Integer]
6464
) extends xsbti.Position {
6565
override val sourcePath: Optional[String] = o2jo(sourceUri)
6666
override val sourceFile: Optional[File] = o2jo(sourceUri.map(new File(_)))
6767
override val pointer: Optional[Integer] = o2jo(Option.empty[Integer])
6868
override val pointerSpace: Optional[String] = o2jo(Option.empty[String])
6969

70+
override val startLine: Optional[Integer] = o2jo(Option.empty)
71+
override val startColumn: Optional[Integer] = o2jo(Option.empty)
72+
override val endLine: Optional[Integer] = o2jo(Option.empty)
73+
override val endColumn: Optional[Integer] = o2jo(Option.empty)
74+
7075
override def toString: String =
7176
if (sourceUri.isDefined) s"${sourceUri.get}:${if (line.isPresent) line.get else -1}"
7277
else ""
@@ -98,8 +103,8 @@ object DiagnosticsReporter {
98103
val sourcePath: Option[String] = source map (obj => IO.toFile(obj.toUri).getAbsolutePath)
99104
val line: Optional[Integer] = o2jo(checkNoPos(d.getLineNumber) map (_.toInt))
100105
val offset: Optional[Integer] = o2jo(checkNoPos(d.getPosition) map (_.toInt))
101-
val startPosition: Option[Long] = checkNoPos(d.getStartPosition)
102-
val endPosition: Option[Long] = checkNoPos(d.getEndPosition)
106+
val startOffset: Optional[Integer] = o2jo(checkNoPos(d.getStartPosition) map (_.toInt))
107+
val endOffset: Optional[Integer] = o2jo(checkNoPos(d.getEndPosition) map (_.toInt))
103108

104109
def lineContent: String = {
105110
def getDiagnosticLine: Option[String] =
@@ -127,17 +132,17 @@ object DiagnosticsReporter {
127132
source match {
128133
case None => ""
129134
case Some(source) =>
130-
(Option(source.getCharContent(true)), startPosition, endPosition) match {
135+
(Option(source.getCharContent(true)), jo2o(startOffset), jo2o(endOffset)) match {
131136
case (Some(cc), Some(start), Some(end)) =>
132-
cc.subSequence(start.toInt, end.toInt).toString
137+
cc.subSequence(start, end).toString
133138
case _ => ""
134139
}
135140
}
136141

137142
getDiagnosticLine.getOrElse(getExpression)
138143
}
139144

140-
new PositionImpl(sourcePath, line, lineContent, offset, startPosition, endPosition)
145+
new PositionImpl(sourcePath, line, lineContent, offset, startOffset, endOffset)
141146
}
142147

143148
}

internal/zinc-persist/src/main/protobuf/schema.proto

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,12 @@ message Position {
6666
string pointerSpace = 5;
6767
string sourcePath = 6;
6868
string sourceFilepath = 7;
69+
sint32 startOffset = 8;
70+
sint32 endOffset = 9;
71+
sint32 startLine = 10;
72+
sint32 startColumn = 11;
73+
sint32 endLine = 12;
74+
sint32 endColumn = 13;
6975
}
7076

7177
message Problem {

internal/zinc-persist/src/main/scala/sbt/internal/inc/binary/converters/ProtobufReaders.scala

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,13 @@ final class ProtobufReaders(mapper: ReadMapper, currentVersion: schema.Version)
128128
pointer0 = fromInt(position.pointer),
129129
pointerSpace0 = fromString(position.pointerSpace),
130130
sourcePath0 = fromString(position.sourcePath),
131-
sourceFile0 = fromString(position.sourceFilepath).map(fromPathString)
131+
sourceFile0 = fromString(position.sourceFilepath).map(fromPathString),
132+
startOffset0 = fromInt(position.startOffset),
133+
endOffset0 = fromInt(position.endOffset),
134+
startLine0 = fromInt(position.startLine),
135+
startColumn0 = fromInt(position.startColumn),
136+
endLine0 = fromInt(position.endLine),
137+
endColumn0 = fromInt(position.endColumn),
132138
)
133139
}
134140

internal/zinc-persist/src/main/scala/sbt/internal/inc/binary/converters/ProtobufWriters.scala

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,13 @@ final class ProtobufWriters(mapper: WriteMapper) {
130130
pointer = position.pointer.toOption.fold(MissingInt)(_.toInt),
131131
pointerSpace = position.pointerSpace.toOption.getOrElse(MissingString),
132132
sourcePath = position.sourcePath.toOption.getOrElse(MissingString),
133-
sourceFilepath = position.sourceFile.toOption.fold(MissingString)(toStringPath)
133+
sourceFilepath = position.sourceFile.toOption.fold(MissingString)(toStringPath),
134+
startOffset = position.startOffset.toOption.fold(MissingInt)(_.toInt),
135+
endOffset = position.endOffset.toOption.fold(MissingInt)(_.toInt),
136+
startLine = position.startLine.toOption.fold(MissingInt)(_.toInt),
137+
startColumn = position.startColumn.toOption.fold(MissingInt)(_.toInt),
138+
endLine = position.endLine.toOption.fold(MissingInt)(_.toInt),
139+
endColumn = position.endColumn.toOption.fold(MissingInt)(_.toInt)
134140
)
135141
}
136142

project/Dependencies.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ object Dependencies {
88
val scala213 = "2.13.0-M2"
99

1010
private val ioVersion = "1.2.0"
11-
private val utilVersion = "1.2.0"
11+
private val utilVersion = "1.2.1"
1212
private val lmVersion = "1.2.0"
1313

1414
private val sbtIO = "org.scala-sbt" %% "io" % ioVersion

0 commit comments

Comments
 (0)