提交 51f49f12 编写于 作者: J Johannes Rieken

properly handle reversed selections

上级 cf9a174b
......@@ -208,7 +208,15 @@ export class SnippetSession {
let edits: IIdentifiedSingleEditOperation[] = [];
let model = this._editor.getModel();
for (const selection of this._editor.getSelections()) {
// sort selections by their start position but remeber
// the original index. that allows you to create correct
// offset-based selection logic without changing the
// primary selection
const indexedSelection = this._editor.getSelections()
.map((selection, idx) => ({ selection, idx }))
.sort((a, b) => Range.compareRangesUsingStarts(a.selection, b.selection));
for (const { selection, idx } of indexedSelection) {
const range = SnippetSession.adjustRange(model, selection, this._overwriteBefore, this._overwriteAfter);
const start = range.getStartPosition();
const adjustedTemplate = SnippetSession.normalizeWhitespace(model, start, this._template);
......@@ -216,8 +224,8 @@ export class SnippetSession {
const snippet = SnippetParser.parse(adjustedTemplate);
const offset = model.getOffsetAt(start) + delta;
edits.push(EditOperation.replaceMove(range, snippet.text));
this._snippets.push(new OneSnippet(this._editor, snippet, offset));
edits[idx] = EditOperation.replaceMove(range, snippet.text);
this._snippets[idx] = new OneSnippet(this._editor, snippet, offset);
delta += snippet.text.length - model.getValueLengthInRange(range);
}
......
......@@ -75,6 +75,16 @@ suite('SnippetSession', function () {
assertSelections(editor, new Selection(1, 10, 1, 10), new Selection(2, 14, 2, 14));
});
test('text edit with reversed selection', function () {
const session = new SnippetSession(editor, '${1:bar}$0');
editor.setSelections([new Selection(2, 5, 2, 5), new Selection(1, 1, 1, 1)]);
session.insert();
assert.equal(model.getValue(), 'barfunction foo() {\n barconsole.log(a);\n}');
assertSelections(editor, new Selection(2, 5, 2, 8), new Selection(1, 1, 1, 4));
});
test('snippets, repeated tabstops', function () {
const session = new SnippetSession(editor, '${1:abc}foo${1:abc}$0');
session.insert();
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册