Skip to content

Commit c627ce0

Browse files
authored
fix(source-map): fixes wrong source end offset (#296)
1 parent 574c2ce commit c627ce0

File tree

3 files changed

+33
-4
lines changed

3 files changed

+33
-4
lines changed

packages/source-map/lib/sourceMap.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,12 @@ export class SourceMap<Data = unknown> {
4848
return this.findMatchingOffsets(sourceOffset, 'sourceOffsets', filter);
4949
}
5050

51-
*findMatchingOffsets(offset: number, fromRange: CodeRangeKey, filter?: (data: Data) => boolean) {
51+
*findMatchingOffsets(
52+
offset: number,
53+
fromRange: CodeRangeKey,
54+
filter?: (data: Data) => boolean,
55+
preferEnd: boolean = false,
56+
) {
5257
const memo = this.getMemoBasedOnRange(fromRange);
5358
if (memo.offsets.length === 0) {
5459
return;
@@ -75,6 +80,7 @@ export class SourceMap<Data = unknown> {
7580
mapping[toRange],
7681
getLengths(mapping, fromRange),
7782
getLengths(mapping, toRange),
83+
preferEnd,
7884
);
7985
if (mapped !== undefined) {
8086
yield [mapped, mapping] as const;
@@ -91,6 +97,7 @@ export class SourceMap<Data = unknown> {
9197
filter?: (data: Data) => boolean,
9298
): Generator<[mappedStart: number, mappedEnd: number, startMapping: Mapping<Data>, endMapping: Mapping<Data>]> {
9399
const toRange: CodeRangeKey = fromRange === 'sourceOffsets' ? 'generatedOffsets' : 'sourceOffsets';
100+
const preferEnd = toRange === 'sourceOffsets';
94101
const mappedStarts: [number, Mapping<Data>][] = [];
95102
let hadMatch = false;
96103
for (const [mappedStart, mapping] of this.findMatchingOffsets(start, fromRange)) {
@@ -104,6 +111,7 @@ export class SourceMap<Data = unknown> {
104111
mapping[toRange],
105112
getLengths(mapping, fromRange),
106113
getLengths(mapping, toRange),
114+
preferEnd,
107115
);
108116
if (mappedEnd !== undefined) {
109117
hadMatch = true;
@@ -112,7 +120,7 @@ export class SourceMap<Data = unknown> {
112120
}
113121
if (!hadMatch && fallbackToAnyMatch) {
114122
for (const [mappedStart, mappingStart] of mappedStarts) {
115-
for (const [mappedEnd, mappingEnd] of this.findMatchingOffsets(end, fromRange)) {
123+
for (const [mappedEnd, mappingEnd] of this.findMatchingOffsets(end, fromRange, undefined, preferEnd)) {
116124
if (filter && !filter(mappingEnd.data) || mappedEnd < mappedStart) {
117125
continue;
118126
}

packages/source-map/lib/translateOffset.ts

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ export function translateOffset(
66
toOffsets: number[],
77
fromLengths: number[],
88
toLengths: number[] = fromLengths,
9+
preferEnd: boolean = false,
910
): number | undefined {
1011
const isSorted = fromOffsets.every((value, index) => index === 0 || fromOffsets[index - 1] <= value);
1112
if (!isSorted) {
@@ -15,7 +16,14 @@ export function translateOffset(
1516
if (start >= fromOffset && start <= fromOffset + fromLength) {
1617
const toLength = toLengths[i];
1718
const toOffset = toOffsets[i];
18-
let rangeOffset = Math.min(start - fromOffset, toLength);
19+
let rangeOffset: number;
20+
const relativePos = start - fromOffset;
21+
if (preferEnd && toLength > fromLength && relativePos === fromLength) {
22+
rangeOffset = toLength;
23+
}
24+
else {
25+
rangeOffset = Math.min(relativePos, toLength);
26+
}
1927
return toOffset + rangeOffset;
2028
}
2129
}
@@ -36,7 +44,14 @@ export function translateOffset(
3644
if (start >= fromOffset && start <= fromOffset + fromLength) {
3745
const toLength = toLengths[mid];
3846
const toOffset = toOffsets[mid];
39-
let rangeOffset = Math.min(start - fromOffset, toLength);
47+
let rangeOffset: number;
48+
const relativePos = start - fromOffset;
49+
if (preferEnd && toLength > fromLength && relativePos === fromLength) {
50+
rangeOffset = toLength;
51+
}
52+
else {
53+
rangeOffset = Math.min(relativePos, toLength);
54+
}
4055
return toOffset + rangeOffset;
4156
}
4257
else if (start < fromOffset) {

packages/source-map/tests/translateOffset.spec.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,10 @@ describe('translateOffset', () => {
2424
test('start at the end of fromRange with shorter toLength', () => {
2525
expect(translateOffset(10, [1], [11], [9], [7])).toEqual(18);
2626
});
27+
test('start at the end of fromRange with longer toLength and preferEnd true', () => {
28+
expect(translateOffset(10, [1], [11], [9], [11], true)).toEqual(22);
29+
});
30+
test('start at the end of fromRange with longer toLength and preferEnd set to false by default', () => {
31+
expect(translateOffset(10, [1], [11], [9], [11])).toEqual(20);
32+
});
2733
});

0 commit comments

Comments
 (0)