refactor: dupe cursors

This commit is contained in:
Jason Poon 2019-02-04 11:58:54 -08:00
parent ad983feda7
commit ce1129d26d
3 changed files with 56 additions and 25 deletions

View File

@ -642,30 +642,6 @@ export class ModeHandler implements vscode.Disposable {
this.vimState.lastVisualSelectionEnd = this.vimState.cursorStopPosition;
}
// Make sure no two cursors are at the same location.
// This is a consequence of the fact that allCursors is not a Set.
// TODO: It should be a set.
const resultingList: Range[] = [];
for (const cursor of vimState.cursors) {
let shouldAddToList = true;
for (const alreadyAddedCursor of resultingList) {
if (cursor.equals(alreadyAddedCursor)) {
shouldAddToList = false;
break;
}
}
if (shouldAddToList) {
resultingList.push(cursor);
}
}
vimState.cursors = resultingList;
return vimState;
}

View File

@ -152,13 +152,17 @@ export class VimState implements vscode.Disposable {
return this._cursors;
}
public set cursors(value: Range[]) {
const map = new Map<string, Range>();
for (const cursor of value) {
if (!cursor.isValid(this.editor)) {
this.logger.warn(`invalid cursor position. ${cursor.toString()}.`);
}
// use a map to ensure no two cursors are at the same location.
map.set(cursor.toString(), cursor);
}
this._cursors = value;
this._cursors = Array.from(map.values());
this.isMultiCursor = this._cursors.length > 1;
}

View File

@ -0,0 +1,51 @@
import * as assert from 'assert';
import * as vscode from 'vscode';
import { Position } from '../../src/common/motion/position';
import { Range } from '../../src/common/motion/range';
import { VimState } from '../../src/state/vimState';
import { setupWorkspace, cleanUpWorkspace } from '../testUtils';
suite('VimState', () => {
setup(async () => {
await setupWorkspace();
});
teardown(cleanUpWorkspace);
test('de-dupes cursors', () => {
// setup
const vimState = new VimState(vscode.window.activeTextEditor!);
const cursorStart = new Position(0, 0);
const cursorStop = new Position(0, 1);
const initialCursors = [
new Range(cursorStart, cursorStop),
new Range(cursorStart, cursorStop)
];
// test
vimState.cursors = initialCursors;
// assert
assert.equal(vimState.cursors.length, 1);
});
test('cursorStart/cursorStop should be first cursor in cursors', () => {
// setup
const vimState = new VimState(vscode.window.activeTextEditor!);
const cursorStart = new Position(0, 0);
const cursorStop = new Position(0, 1);
const initialCursors = [
new Range(cursorStart, cursorStop),
new Range(new Position(1, 0), new Position(1, 1))
];
// test
vimState.cursors = initialCursors;
// assert
assert.equal(vimState.cursors.length, 2);
assert.equal(vimState.isMultiCursor, true);
vimState.cursorStartPosition = cursorStart;
vimState.cursorStopPosition = cursorStop;
});
});