Skip to content

Commit a9f40e3

Browse files
authored
(fix) adjust end of range mapping (#781)
If a range is in the same line, and the mapped range has one character more than the original range, add +1 to the end character of the original range. Assumption is that we never alter the length of a mapped token. This "one character short" mapping happens because a range's end is exclusive, so the character at the range's end is not part of the range. That means the end character can be on a character which was added as part of the transformation and is not present in the original output. The mapper rightfully maps this to the first mapped character before it - which means that the range then is one character short. #762
1 parent 6331ccb commit a9f40e3

File tree

4 files changed

+27
-15
lines changed

4 files changed

+27
-15
lines changed

packages/language-server/src/lib/documents/DocumentMapper.ts

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -212,10 +212,22 @@ export function mapRangeToOriginal(
212212
// and therefore return negative numbers, which makes Range.create throw.
213213
// These invalid position need to be handled
214214
// on a case-by-case basis in the calling functions.
215-
return {
215+
const originalRange = {
216216
start: fragment.getOriginalPosition(range.start),
217217
end: fragment.getOriginalPosition(range.end)
218218
};
219+
220+
// Range may be mapped one character short - reverse that for "in the same line" cases
221+
if (
222+
originalRange.start.line === originalRange.end.line &&
223+
range.start.line === range.end.line &&
224+
originalRange.end.character - originalRange.start.character ===
225+
range.end.character - range.start.character - 1
226+
) {
227+
originalRange.end.character += 1;
228+
}
229+
230+
return originalRange;
219231
}
220232

221233
export function mapRangeToGenerated(fragment: DocumentMapper, range: Range): Range {

packages/language-server/test/plugins/typescript/TypescriptPlugin.test.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -258,28 +258,28 @@ describe('TypescriptPlugin', () => {
258258
it('(within script simple)', async () => {
259259
await test$StoreDef(
260260
Position.create(7, 1),
261-
Range.create(Position.create(7, 1), Position.create(7, 5))
261+
Range.create(Position.create(7, 1), Position.create(7, 6))
262262
);
263263
});
264264

265265
it('(within script if)', async () => {
266266
await test$StoreDef(
267267
Position.create(8, 7),
268-
Range.create(Position.create(8, 5), Position.create(8, 9))
268+
Range.create(Position.create(8, 5), Position.create(8, 10))
269269
);
270270
});
271271

272272
it('(within template simple)', async () => {
273273
await test$StoreDef(
274274
Position.create(13, 3),
275-
Range.create(Position.create(13, 2), Position.create(13, 6))
275+
Range.create(Position.create(13, 2), Position.create(13, 7))
276276
);
277277
});
278278

279279
it('(within template if)', async () => {
280280
await test$StoreDef(
281281
Position.create(14, 7),
282-
Range.create(Position.create(14, 6), Position.create(14, 10))
282+
Range.create(Position.create(14, 6), Position.create(14, 11))
283283
);
284284
});
285285
});
@@ -321,28 +321,28 @@ describe('TypescriptPlugin', () => {
321321
it('(within script simple)', async () => {
322322
await test$StoreDef(
323323
Position.create(9, 1),
324-
Range.create(Position.create(9, 1), Position.create(9, 5))
324+
Range.create(Position.create(9, 1), Position.create(9, 6))
325325
);
326326
});
327327

328328
it('(within script if)', async () => {
329329
await test$StoreDef(
330330
Position.create(10, 7),
331-
Range.create(Position.create(10, 5), Position.create(10, 9))
331+
Range.create(Position.create(10, 5), Position.create(10, 10))
332332
);
333333
});
334334

335335
it('(within template simple)', async () => {
336336
await test$StoreDef(
337337
Position.create(16, 3),
338-
Range.create(Position.create(16, 2), Position.create(16, 6))
338+
Range.create(Position.create(16, 2), Position.create(16, 7))
339339
);
340340
});
341341

342342
it('(within template if)', async () => {
343343
await test$StoreDef(
344344
Position.create(17, 7),
345-
Range.create(Position.create(17, 6), Position.create(17, 10))
345+
Range.create(Position.create(17, 6), Position.create(17, 11))
346346
);
347347
});
348348
});

packages/language-server/test/plugins/typescript/features/CodeActionsProvider.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ describe('CodeActionsProvider', () => {
152152
line: 3
153153
},
154154
end: {
155-
character: 22,
155+
character: 23,
156156
line: 3
157157
}
158158
}
@@ -228,7 +228,7 @@ describe('CodeActionsProvider', () => {
228228
},
229229
end: {
230230
line: 7,
231-
character: 22
231+
character: 23
232232
}
233233
}
234234
}

packages/language-server/test/plugins/typescript/features/DiagnosticsProvider.test.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ describe('DiagnosticsProvider', () => {
104104
"Argument of type 'string' is not assignable to parameter of type 'SvelteStore<any>'.",
105105
range: {
106106
end: {
107-
character: 5,
107+
character: 6,
108108
line: 2
109109
},
110110
start: {
@@ -122,7 +122,7 @@ describe('DiagnosticsProvider', () => {
122122
"Argument of type 'string' is not assignable to parameter of type 'SvelteStore<any>'.",
123123
range: {
124124
end: {
125-
character: 8,
125+
character: 9,
126126
line: 3
127127
},
128128
start: {
@@ -140,7 +140,7 @@ describe('DiagnosticsProvider', () => {
140140
"Argument of type 'string' is not assignable to parameter of type 'SvelteStore<any>'.",
141141
range: {
142142
end: {
143-
character: 6,
143+
character: 7,
144144
line: 6
145145
},
146146
start: {
@@ -158,7 +158,7 @@ describe('DiagnosticsProvider', () => {
158158
"Argument of type 'string' is not assignable to parameter of type 'SvelteStore<any>'.",
159159
range: {
160160
end: {
161-
character: 10,
161+
character: 11,
162162
line: 7
163163
},
164164
start: {

0 commit comments

Comments
 (0)