提交 8b04cae3 编写于 作者: J Johannes Rieken

fix #31619

上级 140c1c74
......@@ -106,18 +106,21 @@ export class OneSnippet {
}
}
let skipThisPlaceholder = false;
if (fwd === true && this._placeholderGroupsIdx < this._placeholderGroups.length - 1) {
this._placeholderGroupsIdx += 1;
skipThisPlaceholder = true;
} else if (fwd === false && this._placeholderGroupsIdx > 0) {
this._placeholderGroupsIdx -= 1;
skipThisPlaceholder = true;
} else {
// the selection of the current placeholder might
// not acurate any more -> simply restore it
}
return this._editor.getModel().changeDecorations(accessor => {
const newSelections = this._editor.getModel().changeDecorations(accessor => {
const activePlaceholders = new Set<Placeholder>();
......@@ -132,6 +135,11 @@ export class OneSnippet {
const range = this._editor.getModel().getDecorationRange(id);
selections.push(new Selection(range.startLineNumber, range.startColumn, range.endLineNumber, range.endColumn));
// consider to skip this placeholder index when the decoration
// range is empty but when the placeholder wasn't. that's a strong
// hint that the placeholder has been deleted. (all placeholder must match this)
skipThisPlaceholder = skipThisPlaceholder && (range.isEmpty() && placeholder.toString().length > 0);
accessor.changeDecorationOptions(id, placeholder.isFinalTabstop ? OneSnippet._decor.activeFinal : OneSnippet._decor.active);
activePlaceholders.add(placeholder);
......@@ -152,6 +160,8 @@ export class OneSnippet {
return selections;
});
return !skipThisPlaceholder ? newSelections : this.move(fwd);
}
get isAtFirstPlaceholder() {
......
......@@ -12,6 +12,7 @@ import { TextModel } from 'vs/editor/common/model/textModel';
import { MockContextKeyService } from 'vs/platform/keybinding/test/common/mockKeybindingService';
import { ICodeEditor } from 'vs/editor/browser/editorBrowser';
import { NullLogService } from 'vs/platform/log/common/log';
import { Handler } from 'vs/editor/common/editorCommon';
suite('SnippetController2', function () {
......@@ -347,4 +348,19 @@ suite('SnippetController2', function () {
assertSelections(editor, new Selection(1, 49, 1, 49));
assertContextKeys(contextKeys, false, false, false);
});
test('Must tab through deleted tab stops in snippets #31619', function () {
const ctrl = new SnippetController2(editor, logService, contextKeys);
model.setValue('');
editor.setSelection(new Selection(1, 1, 1, 1));
ctrl.insert('foo${1:a${2:bar}baz}end$0');
assertSelections(editor, new Selection(1, 4, 1, 11));
editor.trigger('test', Handler.Cut, null);
assertSelections(editor, new Selection(1, 4, 1, 4));
ctrl.next();
assertSelections(editor, new Selection(1, 7, 1, 7));
assertContextKeys(contextKeys, false, false, false);
});
});
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册