From 5e3a102606a034dd6b4c4ac4b5ebed6028850f1d Mon Sep 17 00:00:00 2001 From: Guillaume Martres Date: Tue, 14 Aug 2018 02:00:41 +0900 Subject: [PATCH] xsbti.Position: Also add {start,end}{Line,Column} Positions in the Language Server Protocol and Build Server Protocol are line/column-based instead of offset-based, so this is more convenient. Computing the line/column from the offset is possible but requires reading the source file. --- .../src/main/java/xsbti/Position.java | 4 ++++ .../main/scala/sbt/util/InterfaceUtil.scala | 24 +++++++++++++++---- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/internal/util-interface/src/main/java/xsbti/Position.java b/internal/util-interface/src/main/java/xsbti/Position.java index 0f27e295e..c23c53b22 100644 --- a/internal/util-interface/src/main/java/xsbti/Position.java +++ b/internal/util-interface/src/main/java/xsbti/Position.java @@ -22,4 +22,8 @@ public interface Position // Default values to avoid breaking binary compatibility default Optional startOffset() { return Optional.empty(); } default Optional endOffset() { return Optional.empty(); } + default Optional startLine() { return Optional.empty(); } + default Optional startColumn() { return Optional.empty(); } + default Optional endLine() { return Optional.empty(); } + default Optional endColumn() { return Optional.empty(); } } diff --git a/internal/util-logging/src/main/scala/sbt/util/InterfaceUtil.scala b/internal/util-logging/src/main/scala/sbt/util/InterfaceUtil.scala index a2d705600..b11a3e54c 100644 --- a/internal/util-logging/src/main/scala/sbt/util/InterfaceUtil.scala +++ b/internal/util-logging/src/main/scala/sbt/util/InterfaceUtil.scala @@ -46,7 +46,7 @@ object InterfaceUtil { sourcePath0: Option[String], sourceFile0: Option[File] ): Position = - position(line0, content, offset0, pointer0, pointerSpace0, sourcePath0, sourceFile0, None, None) + position(line0, content, offset0, pointer0, pointerSpace0, sourcePath0, sourceFile0, None, None, None, None, None, None) def position( line0: Option[Integer], @@ -57,7 +57,11 @@ object InterfaceUtil { sourcePath0: Option[String], sourceFile0: Option[File], startOffset0: Option[Integer], - endOffset0: Option[Integer] + endOffset0: Option[Integer], + startLine0: Option[Integer], + startColumn0: Option[Integer], + endLine0: Option[Integer], + endColumn0: Option[Integer] ): Position = new ConcretePosition(line0, content, @@ -67,7 +71,11 @@ object InterfaceUtil { sourcePath0, sourceFile0, startOffset0, - endOffset0) + endOffset0, + startLine0, + startColumn0, + endLine0, + endColumn0) def problem(cat: String, pos: Position, msg: String, sev: Severity): Problem = new ConcreteProblem(cat, pos, msg, sev) @@ -99,7 +107,11 @@ object InterfaceUtil { sourcePath0: Option[String], sourceFile0: Option[File], startOffset0: Option[Integer], - endOffset0: Option[Integer] + endOffset0: Option[Integer], + startLine0: Option[Integer], + startColumn0: Option[Integer], + endLine0: Option[Integer], + endColumn0: Option[Integer] ) extends Position { val line = o2jo(line0) val lineContent = content @@ -110,6 +122,10 @@ object InterfaceUtil { val sourceFile = o2jo(sourceFile0) override val startOffset = o2jo(startOffset0) override val endOffset = o2jo(endOffset0) + override val startLine = o2jo(startLine0) + override val startColumn = o2jo(startColumn0) + override val endLine = o2jo(endLine0) + override val endColumn = o2jo(endColumn0) } private final class ConcreteProblem(