diff --git a/src/vs/editor/contrib/find/common/findModel.ts b/src/vs/editor/contrib/find/common/findModel.ts index 89ae0cc9c54007191d26a7b07c56d47d22adc8db..c53088792341781ae911f740b708eeb6a7b7e73c 100644 --- a/src/vs/editor/contrib/find/common/findModel.ts +++ b/src/vs/editor/contrib/find/common/findModel.ts @@ -350,7 +350,7 @@ export class FindModelBoundToEditorModel { replaceStrings.push(this.getReplaceString(model.getValueInRange(ranges[i]))); } - let command = new ReplaceAllCommand(ranges, replaceStrings); + let command = new ReplaceAllCommand(this._editor.getSelection(), ranges, replaceStrings); this._executeEditorCommand('replaceAll', command); this.research(false); diff --git a/src/vs/editor/contrib/find/common/replaceAllCommand.ts b/src/vs/editor/contrib/find/common/replaceAllCommand.ts index 9fc5648509b96818d5a9f9e4db6552055400a179..dce29f4074f9ae5e46ca346438e08f7abbe14cee 100644 --- a/src/vs/editor/contrib/find/common/replaceAllCommand.ts +++ b/src/vs/editor/contrib/find/common/replaceAllCommand.ts @@ -15,10 +15,13 @@ interface IEditOperation { export class ReplaceAllCommand implements editorCommon.ICommand { + private _editorSelection: Selection; + private _trackedEditorSelectionId: string; private _ranges: Range[]; private _replaceStrings: string[]; - constructor(ranges: Range[], replaceStrings:string[]) { + constructor(editorSelection:Selection, ranges: Range[], replaceStrings:string[]) { + this._editorSelection = editorSelection; this._ranges = ranges; this._replaceStrings = replaceStrings; } @@ -58,16 +61,11 @@ export class ReplaceAllCommand implements editorCommon.ICommand { builder.addEditOperation(resultOps[i].range, resultOps[i].text); } } + + this._trackedEditorSelectionId = builder.trackSelection(this._editorSelection); } public computeCursorState(model:editorCommon.ITokenizedModel, helper: editorCommon.ICursorStateComputerData): Selection { - var inverseEditOperations = helper.getInverseEditOperations(); - var srcRange = inverseEditOperations[inverseEditOperations.length - 1].range; - return Selection.createSelection( - srcRange.endLineNumber, - srcRange.endColumn, - srcRange.endLineNumber, - srcRange.endColumn - ); + return helper.getTrackedSelection(this._trackedEditorSelectionId); } } diff --git a/src/vs/editor/contrib/find/test/common/findModel.test.ts b/src/vs/editor/contrib/find/test/common/findModel.test.ts index 0411a09189e69e121252e4d17ee5e0069eb156bd..0b27dc7893303c7b793d2f7bbedea7cf9d9b9f4f 100644 --- a/src/vs/editor/contrib/find/test/common/findModel.test.ts +++ b/src/vs/editor/contrib/find/test/common/findModel.test.ts @@ -1212,7 +1212,7 @@ suite('FindModel', () => { findModel.replaceAll(); assertFindState( editor, - [8, 16, 8, 16], + [6, 17, 6, 17], null, [ ] ); @@ -1248,7 +1248,7 @@ suite('FindModel', () => { findModel.replaceAll(); assertFindState( editor, - [9, 3, 9, 3], + [1, 1, 1, 1], null, [ [6, 1, 6, 3], @@ -1285,7 +1285,7 @@ suite('FindModel', () => { findModel.replaceAll(); assertFindState( editor, - [11, 16, 11, 16], + [1, 1, 1, 1], null, [] ); @@ -1314,7 +1314,7 @@ suite('FindModel', () => { findModel.replaceAll(); assertFindState( editor, - [14, 3, 14, 3], + [1, 1, 1, 1], null, [] ); @@ -1327,6 +1327,36 @@ suite('FindModel', () => { findState.dispose(); }); + findTest('issue #3516: "replace all" moves page/cursor/focus/scroll to the place of the last replacement', (editor, cursor) => { + let findState = new FindReplaceState(); + findState.change({ searchString: 'include', replaceString: 'bar' }, false); + let findModel = new FindModelBoundToEditorModel(editor, findState); + + assertFindState( + editor, + [1, 1, 1, 1], + null, + [ + [2, 2, 2, 9], + [3, 2, 3, 9] + ] + ); + + findModel.replaceAll(); + assertFindState( + editor, + [1, 1, 1, 1], + null, + [] + ); + + assert.equal(editor.getModel().getLineContent(2), '#bar "cool.h"'); + assert.equal(editor.getModel().getLineContent(3), '#bar '); + + findModel.dispose(); + findState.dispose(); + }); + findTest('finds only in editable range if replace is shown', (editor, cursor) => { editor.getModel().setEditableRange({ startLineNumber: 6,