diff --git a/src/vs/editor/common/services/editorSimpleWorker.ts b/src/vs/editor/common/services/editorSimpleWorker.ts index a8dac0c97c1..79d81f47cf3 100644 --- a/src/vs/editor/common/services/editorSimpleWorker.ts +++ b/src/vs/editor/common/services/editorSimpleWorker.ts @@ -343,6 +343,11 @@ export abstract class BaseEditorSimpleWorker { lastEol = eol; } + if (!range) { + // eol-change only + continue; + } + const original = model.getValueInRange(range); text = text.replace(/\r\n|\n|\r/g, model.eol); @@ -376,7 +381,7 @@ export abstract class BaseEditorSimpleWorker { } if (typeof lastEol === 'number') { - result[result.length - 1].eol = lastEol; + result.push({ eol: lastEol, text: undefined, range: undefined }); } return TPromise.as(result); diff --git a/src/vs/editor/contrib/format/browser/formatActions.ts b/src/vs/editor/contrib/format/browser/formatActions.ts index a476cd1891d..e162886c4a0 100644 --- a/src/vs/editor/contrib/format/browser/formatActions.ts +++ b/src/vs/editor/contrib/format/browser/formatActions.ts @@ -28,6 +28,11 @@ import EditorContextKeys = editorCommon.EditorContextKeys; function alertFormattingEdits(edits: editorCommon.ISingleEditOperation[]): void { + edits = edits.filter(edit => edit.range); + if (!edits) { + return; + } + let { range } = edits[0]; for (let i = 1; i < edits.length; i++) { range = Range.plusRange(range, edits[i].range); diff --git a/src/vs/editor/contrib/format/common/formatCommand.ts b/src/vs/editor/contrib/format/common/formatCommand.ts index 48130bb6be7..59512778500 100644 --- a/src/vs/editor/contrib/format/common/formatCommand.ts +++ b/src/vs/editor/contrib/format/common/formatCommand.ts @@ -28,8 +28,18 @@ export class EditOperationsCommand implements editorCommon.ICommand { private _selectionId: string; constructor(edits: TextEdit[], initialSelection: Selection) { - this._edits = edits; this._initialSelection = initialSelection; + this._edits = []; + this._newEol = undefined; + + for (let edit of edits) { + if (typeof edit.eol === 'number') { + this._newEol = edit.eol; + } + if (edit.range && edit.text) { + this._edits.push(edit); + } + } } public getEditOperations(model: editorCommon.ITokenizedModel, builder: editorCommon.IEditOperationBuilder): void { @@ -40,7 +50,6 @@ export class EditOperationsCommand implements editorCommon.ICommand { if (trimEdit !== null) { // produced above in case the edit.text is identical to the existing text builder.addEditOperation(Range.lift(edit.range), edit.text); } - this._newEol = edit.eol; } var selectionIsSet = false; diff --git a/src/vs/workbench/api/node/mainThreadSaveParticipant.ts b/src/vs/workbench/api/node/mainThreadSaveParticipant.ts index dbf970cbc76..cfc30fcb15d 100644 --- a/src/vs/workbench/api/node/mainThreadSaveParticipant.ts +++ b/src/vs/workbench/api/node/mainThreadSaveParticipant.ts @@ -147,7 +147,7 @@ class FormatOnSaveParticipant implements INamedSaveParticpant { } const versionNow = model.getVersionId(); - const {tabSize, insertSpaces} = model.getOptions(); + const { tabSize, insertSpaces } = model.getOptions(); return new TPromise((resolve, reject) => { setTimeout(reject, 750); @@ -166,16 +166,16 @@ class FormatOnSaveParticipant implements INamedSaveParticpant { } private _editsWithEditor(editor: ICommonCodeEditor, edits: ISingleEditOperation[]): void { - editor.executeCommand('files.formatOnSave', new EditOperationsCommand(edits, editor.getSelection())); + EditOperationsCommand.execute(editor, edits); } private _editWithModel(model: IModel, edits: ISingleEditOperation[]): void { - const [{range}] = edits; + const [{ range }] = edits; const initialSelection = new Selection(range.startLineNumber, range.startColumn, range.endLineNumber, range.endColumn); model.pushEditOperations([initialSelection], edits.map(FormatOnSaveParticipant._asIdentEdit), undoEdits => { - for (const {range} of undoEdits) { + for (const { range } of undoEdits) { if (Range.areIntersectingOrTouching(range, initialSelection)) { return [new Selection(range.startLineNumber, range.startColumn, range.endLineNumber, range.endColumn)]; } @@ -184,7 +184,7 @@ class FormatOnSaveParticipant implements INamedSaveParticpant { }); } - private static _asIdentEdit({text, range}: ISingleEditOperation): IIdentifiedSingleEditOperation { + private static _asIdentEdit({ text, range }: ISingleEditOperation): IIdentifiedSingleEditOperation { return { text, range: Range.lift(range), @@ -246,7 +246,7 @@ export class SaveParticipant implements ISaveParticipant { const promiseFactory = this._saveParticipants.map(p => () => { - const {name} = p; + const { name } = p; const t1 = Date.now(); return TPromise.as(p.participate(model, env)).then(() => {