Skip to content

Commit

Permalink
Add edit stack element before and after accepting a completion
Browse files Browse the repository at this point in the history
  • Loading branch information
alexdima committed Jan 13, 2016
1 parent 008867f commit 2cdf977
Showing 1 changed file with 25 additions and 10 deletions.
35 changes: 25 additions & 10 deletions src/vs/editor/contrib/snippet/common/snippet.ts
Original file line number Diff line number Diff line change
Expand Up @@ -775,18 +775,29 @@ class SnippetController implements ISnippetController {
return snippet.bind(model.getLineContent(typeRange.startLineNumber), typeRange.startLineNumber - 1, typeRange.startColumn - 1, editor);
}

private static _getCommandForSnippet(adaptedSnippet:ICodeSnippet, typeRange:EditorCommon.IEditorRange): EditorCommon.IIdentifiedSingleEditOperation {
var insertText = adaptedSnippet.lines.join('\n');
return EditOperation.replaceMove(typeRange, insertText);
private static _addCommandForSnippet(model:EditorCommon.ITextModel, adaptedSnippet:ICodeSnippet, typeRange:EditorCommon.IEditorRange, out:EditorCommon.IIdentifiedSingleEditOperation[]): void {
let insertText = adaptedSnippet.lines.join('\n');
let currentText = model.getValueInRange(typeRange, EditorCommon.EndOfLinePreference.LF);
if (insertText !== currentText) {
out.push(EditOperation.replaceMove(typeRange, insertText));
}
}

private _runForPrimarySelection(snippet: CodeSnippet, overwriteBefore: number, overwriteAfter: number): void {
var initialAlternativeVersionId = this._editor.getModel().getAlternativeVersionId();
let initialAlternativeVersionId = this._editor.getModel().getAlternativeVersionId();

let edits: EditorCommon.IIdentifiedSingleEditOperation[] = [];

var prepared = SnippetController._prepareSnippet(this._editor, this._editor.getSelection(), snippet, overwriteBefore, overwriteAfter);
this._editor.executeEdits('editor.contrib.insertSnippetHelper', [SnippetController._getCommandForSnippet(prepared.adaptedSnippet, prepared.typeRange)]);
let prepared = SnippetController._prepareSnippet(this._editor, this._editor.getSelection(), snippet, overwriteBefore, overwriteAfter);
SnippetController._addCommandForSnippet(this._editor.getModel(), prepared.adaptedSnippet, prepared.typeRange, edits);

var cursorOnly = SnippetController._getSnippetCursorOnly(prepared.adaptedSnippet);
if (edits.length > 0) {
this._editor.getModel().pushStackElement();
this._editor.executeEdits('editor.contrib.insertSnippetHelper', edits);
this._editor.getModel().pushStackElement();
}

let cursorOnly = SnippetController._getSnippetCursorOnly(prepared.adaptedSnippet);
if (cursorOnly) {
this._editor.setSelection(Selection.createSelection(cursorOnly.lineNumber, cursorOnly.column, cursorOnly.lineNumber, cursorOnly.column));
} else if (prepared.adaptedSnippet.placeHolders.length > 0) {
Expand All @@ -802,11 +813,15 @@ class SnippetController implements ISnippetController {
edits:EditorCommon.IIdentifiedSingleEditOperation[] = [];

for (let i = 0; i < selections.length; i++) {
var prepared = SnippetController._prepareSnippet(this._editor, selections[i], snippet, overwriteBefore, overwriteAfter);
edits.push(SnippetController._getCommandForSnippet(prepared.adaptedSnippet, prepared.typeRange));
let prepared = SnippetController._prepareSnippet(this._editor, selections[i], snippet, overwriteBefore, overwriteAfter);
SnippetController._addCommandForSnippet(this._editor.getModel(), prepared.adaptedSnippet, prepared.typeRange, edits);
}

this._editor.executeEdits('editor.contrib.insertSnippetHelper', edits);
if (edits.length > 0) {
this._editor.getModel().pushStackElement();
this._editor.executeEdits('editor.contrib.insertSnippetHelper', edits);
this._editor.getModel().pushStackElement();
}
}

private static _prepareSnippet(editor:EditorCommon.ICommonCodeEditor, selection:EditorCommon.IEditorSelection, snippet:CodeSnippet, overwriteBefore:number, overwriteAfter:number): { typeRange: EditorCommon.IEditorRange; adaptedSnippet: ICodeSnippet; } {
Expand Down

0 comments on commit 2cdf977

Please sign in to comment.