add ISuggestion#extraEdits, #6874

This commit is contained in:
Johannes Rieken 2016-08-18 17:48:34 +02:00
parent 5f53f7c741
commit 66bb8ff968
3 changed files with 22 additions and 12 deletions

View file

@ -5,12 +5,11 @@
'use strict'; 'use strict';
import {Range} from 'vs/editor/common/core/range'; import {Range} from 'vs/editor/common/core/range';
import {IIdentifiedSingleEditOperation} from 'vs/editor/common/editorCommon'; import {IIdentifiedSingleEditOperation, IRange, IPosition} from 'vs/editor/common/editorCommon';
import {Position} from 'vs/editor/common/core/position';
export class EditOperation { export class EditOperation {
public static insert(position:Position, text:string): IIdentifiedSingleEditOperation { public static insert(position:IPosition, text:string): IIdentifiedSingleEditOperation {
return { return {
identifier: null, identifier: null,
range: new Range(position.lineNumber, position.column, position.lineNumber, position.column), 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 { return {
identifier: null, identifier: null,
range: range, range: Range.lift(range),
text: null, text: null,
forceMoveMarkers: true forceMoveMarkers: true
}; };
} }
public static replace(range:Range, text:string): IIdentifiedSingleEditOperation { public static replace(range:IRange, text:string): IIdentifiedSingleEditOperation {
return { return {
identifier: null, identifier: null,
range: range, range: Range.lift(range),
text: text, text: text,
forceMoveMarkers: false forceMoveMarkers: false
}; };
} }
public static replaceMove(range:Range, text:string): IIdentifiedSingleEditOperation { public static replaceMove(range:IRange, text:string): IIdentifiedSingleEditOperation {
return { return {
identifier: null, identifier: null,
range: range, range: Range.lift(range),
text: text, text: text,
forceMoveMarkers: true forceMoveMarkers: true
}; };

View file

@ -367,6 +367,7 @@ export interface ISuggestion {
noAutoAccept?: boolean; noAutoAccept?: boolean;
overwriteBefore?: number; overwriteBefore?: number;
overwriteAfter?: number; overwriteAfter?: number;
extraEdits?: editorCommon.ISingleEditOperation[];
} }
/** /**

View file

@ -13,6 +13,7 @@ import { ICommonCodeEditor, IEditorContribution, EditorContextKeys, ModeContextK
import { editorAction, ServicesAccessor, EditorAction, EditorCommand, CommonEditorRegistry } from 'vs/editor/common/editorCommonExtensions'; import { editorAction, ServicesAccessor, EditorAction, EditorCommand, CommonEditorRegistry } from 'vs/editor/common/editorCommonExtensions';
import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser';
import { EditorBrowserRegistry } from 'vs/editor/browser/editorBrowserExtensions'; 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 { getSnippetController, CodeSnippet } from 'vs/editor/contrib/snippet/common/snippet';
import { Context as SuggestContext } from 'vs/editor/contrib/suggest/common/suggest'; import { Context as SuggestContext } from 'vs/editor/contrib/suggest/common/suggest';
import { SuggestModel } from '../common/suggestModel'; import { SuggestModel } from '../common/suggestModel';
@ -61,12 +62,21 @@ export class SuggestController implements IEditorContribution {
private onDidSelectItem(item: CompletionItem): void { private onDidSelectItem(item: CompletionItem): void {
if (item) { 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; 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, overwriteBefore + columnDelta,
overwriteAfter); overwriteAfter,
undefined
);
} }
this.model.cancel(); this.model.cancel();