From 66bb8ff9686da36c89f834f51041ae535ea218bc Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 18 Aug 2016 17:48:34 +0200 Subject: [PATCH] add ISuggestion#extraEdits, #6874 --- src/vs/editor/common/core/editOperation.ts | 17 ++++++++--------- src/vs/editor/common/modes.ts | 1 + .../suggest/browser/suggestController.ts | 16 +++++++++++++--- 3 files changed, 22 insertions(+), 12 deletions(-) diff --git a/src/vs/editor/common/core/editOperation.ts b/src/vs/editor/common/core/editOperation.ts index d04c9adf585..937e942500b 100644 --- a/src/vs/editor/common/core/editOperation.ts +++ b/src/vs/editor/common/core/editOperation.ts @@ -5,12 +5,11 @@ 'use strict'; import {Range} from 'vs/editor/common/core/range'; -import {IIdentifiedSingleEditOperation} from 'vs/editor/common/editorCommon'; -import {Position} from 'vs/editor/common/core/position'; +import {IIdentifiedSingleEditOperation, IRange, IPosition} from 'vs/editor/common/editorCommon'; export class EditOperation { - public static insert(position:Position, text:string): IIdentifiedSingleEditOperation { + public static insert(position:IPosition, text:string): IIdentifiedSingleEditOperation { return { identifier: null, range: new Range(position.lineNumber, position.column, position.lineNumber, position.column), @@ -19,28 +18,28 @@ export class EditOperation { }; } - public static delete(range:Range): IIdentifiedSingleEditOperation { + public static delete(range:IRange): IIdentifiedSingleEditOperation { return { identifier: null, - range: range, + range: Range.lift(range), text: null, forceMoveMarkers: true }; } - public static replace(range:Range, text:string): IIdentifiedSingleEditOperation { + public static replace(range:IRange, text:string): IIdentifiedSingleEditOperation { return { identifier: null, - range: range, + range: Range.lift(range), text: text, forceMoveMarkers: false }; } - public static replaceMove(range:Range, text:string): IIdentifiedSingleEditOperation { + public static replaceMove(range:IRange, text:string): IIdentifiedSingleEditOperation { return { identifier: null, - range: range, + range: Range.lift(range), text: text, forceMoveMarkers: true }; diff --git a/src/vs/editor/common/modes.ts b/src/vs/editor/common/modes.ts index 1cef590a080..251e0c47722 100644 --- a/src/vs/editor/common/modes.ts +++ b/src/vs/editor/common/modes.ts @@ -367,6 +367,7 @@ export interface ISuggestion { noAutoAccept?: boolean; overwriteBefore?: number; overwriteAfter?: number; + extraEdits?: editorCommon.ISingleEditOperation[]; } /** diff --git a/src/vs/editor/contrib/suggest/browser/suggestController.ts b/src/vs/editor/contrib/suggest/browser/suggestController.ts index f9733009bf5..f93dadb47e6 100644 --- a/src/vs/editor/contrib/suggest/browser/suggestController.ts +++ b/src/vs/editor/contrib/suggest/browser/suggestController.ts @@ -13,6 +13,7 @@ import { ICommonCodeEditor, IEditorContribution, EditorContextKeys, ModeContextK import { editorAction, ServicesAccessor, EditorAction, EditorCommand, CommonEditorRegistry } from 'vs/editor/common/editorCommonExtensions'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { EditorBrowserRegistry } from 'vs/editor/browser/editorBrowserExtensions'; +import { EditOperation } from 'vs/editor/common/core/editOperation'; import { getSnippetController, CodeSnippet } from 'vs/editor/contrib/snippet/common/snippet'; import { Context as SuggestContext } from 'vs/editor/contrib/suggest/common/suggest'; import { SuggestModel } from '../common/suggestModel'; @@ -61,12 +62,21 @@ export class SuggestController implements IEditorContribution { private onDidSelectItem(item: CompletionItem): void { if (item) { - const {insertText, overwriteBefore, overwriteAfter} = item.suggestion; + const {insertText, overwriteBefore, overwriteAfter, extraEdits} = item.suggestion; const columnDelta = this.editor.getPosition().column - this.model.getTriggerPosition().column; - getSnippetController(this.editor).run(new CodeSnippet(insertText), + if (Array.isArray(extraEdits)) { + this.editor.pushUndoStop(); + this.editor.executeEdits('suggestController.extraEdits', extraEdits.map(edit => EditOperation.replace(edit.range, edit.text))); + this.editor.pushUndoStop(); + } + + getSnippetController(this.editor).run( + new CodeSnippet(insertText), overwriteBefore + columnDelta, - overwriteAfter); + overwriteAfter, + undefined + ); } this.model.cancel();