Skip to content

Commit 523c2fe

Browse files
committed
Fix offset&length computation.
1 parent 8662706 commit 523c2fe

File tree

2 files changed

+25
-6
lines changed

2 files changed

+25
-6
lines changed

rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/util/locations/impl/ArrayLineOffsetMap.java

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -78,8 +78,9 @@ public int translateInverseColumn(int line, int column, boolean isEnd) {
7878

7979
@Override
8080
public Pair<Integer, Integer> translateInverseOffsetLength(int beginLine, int beginColumn, int endLine, int endColumn, int offset, int length) {
81-
int offsetOffset = 0;
82-
int lengthOffset = 0;
81+
assert beginLine <= endLine : "beginLine cannot be larger than endLine";
82+
int startOffset = 0;
83+
int endOffset = 0;
8384

8485
for (int line = 0; line <= endLine; line++) {
8586
int lineIndex = lines.search(line);
@@ -88,13 +89,23 @@ public Pair<Integer, Integer> translateInverseOffsetLength(int beginLine, int be
8889
continue;
8990
}
9091
var lineOffsets = wideColumnOffsetsInverse.get(lineIndex);
91-
if (line < beginLine) {
92-
offsetOffset += (translateColumnForLine(lineOffsets, beginColumn, false) - beginColumn);
92+
if (line <= beginLine) {
93+
// offset counts characters up until the beginning of the range
94+
startOffset += translateColumnForLine(lineOffsets, beginColumn, false);
95+
}
96+
97+
if (line >= beginLine) {
98+
if (line < endLine) {
99+
// offset of full line
100+
endOffset += translateColumnForLine(lineOffsets, Integer.MAX_VALUE, true);
101+
} else {
102+
// offset until end column
103+
endOffset += translateColumnForLine(lineOffsets, endColumn, true);
104+
}
93105
}
94-
lengthOffset += (translateColumnForLine(lineOffsets, endColumn, true) - endColumn);
95106
}
96107

97-
return Pair.of(offset - offsetOffset, length - lengthOffset);
108+
return Pair.of(offset - startOffset, length + startOffset - endOffset);
98109
}
99110

100111
@SuppressWarnings("java:S3776") // parsing tends to be complex

rascal-lsp/src/test/java/engineering/swat/rascal/lsp/util/LineColumnOffsetMapTests.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828

2929
import static org.junit.Assert.assertEquals;
3030

31+
import org.apache.commons.lang3.tuple.Pair;
3132
import org.junit.Test;
3233
import org.rascalmpl.vscode.lsp.util.locations.LineColumnOffsetMap;
3334
import org.rascalmpl.vscode.lsp.util.locations.impl.ArrayLineOffsetMap;
@@ -60,6 +61,8 @@ public void doubleChars() {
6061
public void noUnicodeCharsInverse() {
6162
LineColumnOffsetMap map = ArrayLineOffsetMap.build("1234\n1234");
6263
assertEquals(2, map.translateInverseColumn(0, 2, false));
64+
assertEquals(Pair.of(0, 2), map.translateInverseOffsetLength(0, 0, 0, 2, 0, 2));
65+
assertEquals(Pair.of(0, 8), map.translateInverseOffsetLength(0, 0, 1, 4, 0, 8));
6366
}
6467

6568
@Test
@@ -68,6 +71,9 @@ public void singleWideCharInverse() {
6871
assertEquals(3, map.translateInverseColumn(0, 3, false));
6972
assertEquals(3, map.translateInverseColumn(0, 4, false));
7073
assertEquals(4, map.translateInverseColumn(0, 5, false));
74+
assertEquals(Pair.of(3, 1), map.translateInverseOffsetLength(0, 2, 0, 4, 3, 2));
75+
assertEquals(Pair.of(3, 1), map.translateInverseOffsetLength(0, 4, 0, 5, 4, 1));
76+
assertEquals(Pair.of(0, 10), map.translateInverseOffsetLength(0, 0, 1, 6, 0, 12));
7177
}
7278

7379

@@ -77,6 +83,8 @@ public void doubleCharsInverse() {
7783
assertEquals(5, map.translateInverseColumn(0, 6, false));
7884
assertEquals(5, map.translateInverseColumn(0, 7, true));
7985
assertEquals(6, map.translateInverseColumn(0, 8, false));
86+
assertEquals(Pair.of(2, 1), map.translateInverseOffsetLength(0, 2, 0, 4, 2, 2));
87+
assertEquals(Pair.of(2, 3), map.translateInverseOffsetLength(0, 2, 0, 7, 2, 5));
8088
}
8189

8290
}

0 commit comments

Comments
 (0)