From b81f7485aaded55c1d05212aeeb63b1a13c115b5 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 9 May 2017 17:56:23 +0200 Subject: [PATCH] add overwrite[Before|After] to SnippetSession --- .../contrib/snippet/browser/editorSnippets.ts | 30 ++++++++++++++++--- .../snippet/browser/snippetController2.ts | 2 +- .../test/browser/editorSnippets.test.ts | 14 +++++++++ 3 files changed, 41 insertions(+), 5 deletions(-) diff --git a/src/vs/editor/contrib/snippet/browser/editorSnippets.ts b/src/vs/editor/contrib/snippet/browser/editorSnippets.ts index e126e1fea75..efaba9a24c5 100644 --- a/src/vs/editor/contrib/snippet/browser/editorSnippets.ts +++ b/src/vs/editor/contrib/snippet/browser/editorSnippets.ts @@ -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 diff --git a/src/vs/editor/contrib/snippet/browser/snippetController2.ts b/src/vs/editor/contrib/snippet/browser/snippetController2.ts index 7e9eaae9e10..84ce4e1e637 100644 --- a/src/vs/editor/contrib/snippet/browser/snippetController2.ts +++ b/src/vs/editor/contrib/snippet/browser/snippetController2.ts @@ -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); diff --git a/src/vs/editor/contrib/snippet/test/browser/editorSnippets.test.ts b/src/vs/editor/contrib/snippet/test/browser/editorSnippets.test.ts index 9e6ea7b1b23..0da0cbbf467 100644 --- a/src/vs/editor/contrib/snippet/test/browser/editorSnippets.test.ts +++ b/src/vs/editor/contrib/snippet/test/browser/editorSnippets.test.ts @@ -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(); -- GitLab