diff --git a/src/vs/editor/common/services/editorSimpleWorker.ts b/src/vs/editor/common/services/editorSimpleWorker.ts index bbef60f8ff9de7327975e0802fff1a4601b73269..0575dc251668ec8bc24de5b10d0d101f678579f7 100644 --- a/src/vs/editor/common/services/editorSimpleWorker.ts +++ b/src/vs/editor/common/services/editorSimpleWorker.ts @@ -162,6 +162,8 @@ class MirrorModel extends MirrorModel2 implements ICommonModel { } public getValueInRange(range: editorCommon.IRange): string { + range = this._validateRange(range); + if (range.startLineNumber === range.endLineNumber) { return this._lines[range.startLineNumber - 1].substring(range.startColumn - 1, range.endColumn - 1); } @@ -201,6 +203,27 @@ class MirrorModel extends MirrorModel2 implements ICommonModel { }; } + private _validateRange(range: editorCommon.IRange): editorCommon.IRange { + + const start = this._validatePosition({ lineNumber: range.startLineNumber, column: range.startColumn }); + const end = this._validatePosition({ lineNumber: range.endLineNumber, column: range.endColumn }); + + if (start.lineNumber !== range.startLineNumber + || start.column !== range.startColumn + || end.lineNumber !== range.endLineNumber + || end.column !== range.endColumn) { + + return { + startLineNumber: start.lineNumber, + startColumn: start.column, + endLineNumber: end.lineNumber, + endColumn: end.column + }; + } + + return range; + } + private _validatePosition(position: editorCommon.IPosition): editorCommon.IPosition { if (!Position.isIPosition(position)) { throw new Error('bad position'); diff --git a/src/vs/editor/test/common/services/editorSimpleWorker.test.ts b/src/vs/editor/test/common/services/editorSimpleWorker.test.ts index 33bc2a36022ea0b5780dbaea4bfe1d337c007483..ba3588a57fdeaf91eeceb519cfc180e70b8bd408 100644 --- a/src/vs/editor/test/common/services/editorSimpleWorker.test.ts +++ b/src/vs/editor/test/common/services/editorSimpleWorker.test.ts @@ -130,4 +130,34 @@ suite('EditorSimpleWorker', () => { assert.deepEqual(first.range, { startLineNumber: 2, startColumn: 3, endLineNumber: 2, endColumn: 4 }); }); }); + + test('MoreMinimal, issue #15385 newline changes and other', function () { + + let model = worker.addModel([ + 'package main', // 1 + 'func foo() {', // 2 + '}' // 3 + ]); + + return worker.computeMoreMinimalEdits(model.uri.toString(), [{ text: '\n', range: new Range(3, 2, 4, 1000) }], []).then(edits => { + assert.equal(edits.length, 1); + const [first] = edits; + assert.equal(first.text, '\n'); + assert.deepEqual(first.range, { startLineNumber: 3, startColumn: 2, endLineNumber: 3, endColumn: 2 }); + }); + }); + + + test('ICommonModel#getValueInRange, issue #17424', function () { + + let model = worker.addModel([ + 'package main', // 1 + 'func foo() {', // 2 + '}' // 3 + ]); + + const value = model.getValueInRange({ startLineNumber: 3, startColumn: 1, endLineNumber: 4, endColumn: 1 }); + assert.equal(value, '}'); + }); + });