提交 b81f7485 编写于 作者: J Johannes Rieken

add overwrite[Before|After] to SnippetSession

上级 b7499af7
......@@ -166,13 +166,34 @@ export class SnippetSession {
return templateLines.join(model.getEOL());
}
static adjustRange(model: IModel, range: Range, overwriteBefore: number, overwriteAfter: number): Range {
if (overwriteBefore !== 0 || overwriteAfter !== 0) {
let { startLineNumber, startColumn, endLineNumber, endColumn } = range;
startColumn -= overwriteBefore;
endColumn += overwriteAfter;
range = Range.plusRange(range, {
startLineNumber,
startColumn,
endLineNumber,
endColumn,
});
range = model.validateRange(range);
}
return range;
}
private readonly _editor: ICommonCodeEditor;
private readonly _template: string;
private readonly _overwriteBefore: number;
private readonly _overwriteAfter: number;
private readonly _snippets: OneSnippet[];
constructor(editor: ICommonCodeEditor, template: string) {
constructor(editor: ICommonCodeEditor, template: string, overwriteBefore: number = 0, overwriteAfter: number = 0) {
this._editor = editor;
this._template = template;
this._overwriteBefore = overwriteBefore;
this._overwriteAfter = overwriteAfter;
this._snippets = [];
}
......@@ -186,16 +207,17 @@ export class SnippetSession {
let model = this._editor.getModel();
for (const selection of this._editor.getSelections()) {
const start = selection.getStartPosition();
const range = SnippetSession.adjustRange(model, selection, this._overwriteBefore, this._overwriteAfter);
const start = range.getStartPosition();
const adjustedTemplate = SnippetSession.normalizeWhitespace(model, start, this._template);
const snippet = SnippetParser.parse(adjustedTemplate);
const offset = model.getOffsetAt(start) + delta;
edits.push(EditOperation.replaceMove(selection, snippet.text));
edits.push(EditOperation.replaceMove(range, snippet.text));
this._snippets.push(new OneSnippet(this._editor, snippet, offset));
delta += snippet.text.length - model.getValueLengthInRange(selection);
delta += snippet.text.length - model.getValueLengthInRange(range);
}
// make insert edit and start with first selections
......
......@@ -45,7 +45,7 @@ export class SnippetController2 {
}
insert(template: string, overwriteBefore: number = 0, overwriteAfter: number = 0): void {
const session = new SnippetSession(this._editor, template);
const session = new SnippetSession(this._editor, template, overwriteBefore, overwriteAfter);
const newLen = this._snippetStack.unshift(session);
if (newLen === 1) {
this._inSnippet.set(true);
......
......@@ -6,6 +6,7 @@
import * as assert from 'assert';
import { Selection } from 'vs/editor/common/core/selection';
import { Range } from 'vs/editor/common/core/range';
import { IPosition, Position } from 'vs/editor/common/core/position';
import { SnippetSession } from 'vs/editor/contrib/snippet/browser/editorSnippets';
import { ICommonCodeEditor } from 'vs/editor/common/editorCommon';
......@@ -51,6 +52,19 @@ suite('SnippetSession', function () {
assertNormalized(new Position(2, 3), 'foo\r\tbar', 'foo\n bar');
});
test('adjust selection (overwrite[Before|After]', function () {
let range = SnippetSession.adjustRange(model, new Range(1, 2, 1, 2), 1, 0);
assert.ok(range.equalsRange(new Range(1, 1, 1, 2)));
range = SnippetSession.adjustRange(model, new Range(1, 2, 1, 2), 1111, 0);
assert.ok(range.equalsRange(new Range(1, 1, 1, 2)));
range = SnippetSession.adjustRange(model, new Range(1, 2, 1, 2), 0, 10);
assert.ok(range.equalsRange(new Range(1, 2, 1, 12)));
range = SnippetSession.adjustRange(model, new Range(1, 2, 1, 2), 0, 10111);
assert.ok(range.equalsRange(new Range(1, 2, 1, 17)));
});
test('text edits & selection', function () {
const session = new SnippetSession(editor, 'foo${1:bar}foo$0');
session.insert();
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册