Johannes Rieken
2023-12-05 14:55:59 +01:00
committed by GitHub
parent 0ccae8afbd
commit bb2a74bc73
2 changed files with 63 additions and 1 deletions
@@ -353,7 +353,17 @@ export class SuggestController implements IEditorContribution {
const scrollState = StableEditorScrollState.capture(this.editor);
this.editor.executeEdits(
'suggestController.additionalTextEdits.sync',
item.completion.additionalTextEdits.map(edit => EditOperation.replaceMove(Range.lift(edit.range), edit.text))
item.completion.additionalTextEdits.map(edit => {
let range = Range.lift(edit.range);
if (range.startLineNumber === item.position.lineNumber && range.startColumn > item.position.column) {
// shift additional edit when it is "after" the completion insertion position
const columnDelta = this.editor.getPosition()!.column - item.position.column;
const startColumnDelta = columnDelta;
const endColumnDelta = Range.spansMultipleLines(range) ? 0 : columnDelta;
range = new Range(range.startLineNumber, range.startColumn + startColumnDelta, range.endLineNumber, range.endColumn + endColumnDelta);
}
return EditOperation.replaceMove(range, edit.text);
})
);
scrollState.restoreRelativeVerticalPositionOfCursor(this.editor);
@@ -616,4 +616,56 @@ suite('SuggestController', function () {
await p2;
});
test('Ranges where additionalTextEdits are applied are not appropriate when characters are typed #177591', async function () {
disposables.add(languageFeaturesService.completionProvider.register({ scheme: 'test-ctrl' }, {
_debugDisplayName: 'test',
provideCompletionItems(doc, pos) {
return {
suggestions: [{
kind: CompletionItemKind.Snippet,
label: 'aaa',
insertText: 'aaa',
range: Range.fromPositions(pos),
additionalTextEdits: [{
range: Range.fromPositions(pos.delta(0, 10)),
text: 'aaa'
}]
}]
};
}
}));
{ // PART1 - no typing
editor.setValue(`123456789123456789`);
editor.setSelection(new Selection(1, 1, 1, 1));
const p1 = Event.toPromise(controller.model.onDidSuggest);
controller.triggerSuggest();
const e = await p1;
assert.strictEqual(e.completionModel.items.length, 1);
assert.strictEqual(e.completionModel.items[0].textLabel, 'aaa');
controller.acceptSelectedSuggestion(false, false);
assert.strictEqual(editor.getValue(), 'aaa1234567891aaa23456789');
}
{ // PART2 - typing
editor.setValue(`123456789123456789`);
editor.setSelection(new Selection(1, 1, 1, 1));
const p1 = Event.toPromise(controller.model.onDidSuggest);
controller.triggerSuggest();
const e = await p1;
assert.strictEqual(e.completionModel.items.length, 1);
assert.strictEqual(e.completionModel.items[0].textLabel, 'aaa');
editor.trigger('keyboard', 'type', { text: 'aa' });
controller.acceptSelectedSuggestion(false, false);
assert.strictEqual(editor.getValue(), 'aaa1234567891aaa23456789');
}
});
});