提交 496603e4 编写于 作者: J Johannes Rieken

fix #27898

上级 fff2f376
......@@ -331,8 +331,8 @@ export class SnippetParser {
return value.replace(/\$|}|\\/g, '\\$&');
}
static parse(template: string): TextmateSnippet {
const marker = new SnippetParser(true, false).parse(template, true);
static parse(template: string, enforceFinalTabstop?: boolean): TextmateSnippet {
const marker = new SnippetParser(true, false).parse(template, true, enforceFinalTabstop);
return new TextmateSnippet(marker);
}
......@@ -351,7 +351,7 @@ export class SnippetParser {
return Marker.toString(this.parse(value));
}
parse(value: string, insertFinalTabstop?: boolean): Marker[] {
parse(value: string, insertFinalTabstop?: boolean, enforceFinalTabstop?: boolean): Marker[] {
const marker: Marker[] = [];
this._scanner.text(value);
......@@ -395,9 +395,8 @@ export class SnippetParser {
walk(marker, placeholderDefaultValues);
if (
insertFinalTabstop
&& placeholderDefaultValues.size > 0
&& !placeholderDefaultValues.has('0')
!placeholderDefaultValues.has('0') && // there is no final tabstop
(insertFinalTabstop && placeholderDefaultValues.size > 0 || enforceFinalTabstop)
) {
// the snippet uses placeholders but has no
// final tabstop defined -> insert at the end
......
......@@ -243,7 +243,7 @@ export class SnippetSession {
return selection;
}
static createEditsAndSnippets(editor: ICommonCodeEditor, template: string, overwriteBefore: number, overwriteAfter: number): { edits: IIdentifiedSingleEditOperation[], snippets: OneSnippet[] } {
static createEditsAndSnippets(editor: ICommonCodeEditor, template: string, overwriteBefore: number, overwriteAfter: number, enforceFinalTabstop: boolean): { edits: IIdentifiedSingleEditOperation[], snippets: OneSnippet[] } {
const model = editor.getModel();
const edits: IIdentifiedSingleEditOperation[] = [];
......@@ -288,7 +288,7 @@ export class SnippetSession {
const start = snippetSelection.getStartPosition();
const adjustedTemplate = SnippetSession.adjustWhitespace(model, start, template);
const snippet = SnippetParser.parse(adjustedTemplate).resolveVariables(new EditorSnippetVariableResolver(model, selection));
const snippet = SnippetParser.parse(adjustedTemplate, enforceFinalTabstop).resolveVariables(new EditorSnippetVariableResolver(model, selection));
const offset = model.getOffsetAt(start) + delta;
delta += snippet.text.length - model.getValueLengthInRange(snippetSelection);
......@@ -325,7 +325,7 @@ export class SnippetSession {
const model = this._editor.getModel();
// make insert edit and start with first selections
const { edits, snippets } = SnippetSession.createEditsAndSnippets(this._editor, this._template, this._overwriteBefore, this._overwriteAfter);
const { edits, snippets } = SnippetSession.createEditsAndSnippets(this._editor, this._template, this._overwriteBefore, this._overwriteAfter, false);
this._snippets = snippets;
this._editor.setSelections(model.pushEditOperations(this._editor.getSelections(), edits, undoEdits => {
......@@ -338,7 +338,7 @@ export class SnippetSession {
}
merge(template: string, overwriteBefore: number = 0, overwriteAfter: number = 0): void {
const { edits, snippets } = SnippetSession.createEditsAndSnippets(this._editor, template, overwriteBefore, overwriteAfter);
const { edits, snippets } = SnippetSession.createEditsAndSnippets(this._editor, template, overwriteBefore, overwriteAfter, true);
this._editor.setSelections(this._editor.getModel().pushEditOperations(this._editor.getSelections(), edits, undoEdits => {
......
......@@ -175,6 +175,29 @@ suite('SnippetController2', function () {
ctrl.insert('farboo');
assertSelections(editor, new Selection(1, 7, 1, 7), new Selection(2, 11, 2, 11));
assertContextKeys(contextKeys, true, false, true);
ctrl.next();
assertSelections(editor, new Selection(1, 7, 1, 7), new Selection(2, 11, 2, 11));
assertContextKeys(contextKeys, false, false, false);
});
test('Nested snippets without final placeholder jumps to next outer placeholder, #27898', function () {
const ctrl = new SnippetController2(editor, contextKeys);
ctrl.insert('for(const ${1:element} of ${2:array}) {$0}');
assertContextKeys(contextKeys, true, false, true);
assertSelections(editor, new Selection(1, 11, 1, 18), new Selection(2, 15, 2, 22));
ctrl.next();
assertContextKeys(contextKeys, true, true, true);
assertSelections(editor, new Selection(1, 22, 1, 27), new Selection(2, 26, 2, 31));
ctrl.insert('document');
assertContextKeys(contextKeys, true, true, true);
assertSelections(editor, new Selection(1, 30, 1, 30), new Selection(2, 34, 2, 34));
ctrl.next();
assertContextKeys(contextKeys, false, false, false);
});
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册