Skip to content

Commit

Permalink
Fixes #41573: Allow cursor to recover from markers even if the view m…
Browse files Browse the repository at this point in the history
…odel line mapping changes
  • Loading branch information
alexdima committed Jan 18, 2018
1 parent b7588a8 commit 4d3b04f
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 3 deletions.
19 changes: 16 additions & 3 deletions src/vs/editor/common/controller/cursor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,7 @@ export class Cursor extends viewEvents.ViewEventEmitter implements ICursors {

private readonly _configuration: editorCommon.IConfiguration;
private readonly _model: ITextModel;
private _knownModelVersionId: number;
private readonly _viewModel: IViewModel;
public context: CursorContext;
private _cursors: CursorCollection;
Expand All @@ -105,6 +106,7 @@ export class Cursor extends viewEvents.ViewEventEmitter implements ICursors {
super();
this._configuration = configuration;
this._model = model;
this._knownModelVersionId = this._model.getVersionId();
this._viewModel = viewModel;
this.context = new CursorContext(this._configuration, this._model, this._viewModel);
this._cursors = new CursorCollection(this.context);
Expand All @@ -115,6 +117,7 @@ export class Cursor extends viewEvents.ViewEventEmitter implements ICursors {
this._prevEditOperationType = EditOperationType.Other;

this._register(this._model.onDidChangeRawContent((e) => {
this._knownModelVersionId = e.versionId;
if (this._isHandling) {
return;
}
Expand All @@ -128,6 +131,16 @@ export class Cursor extends viewEvents.ViewEventEmitter implements ICursors {
return;
}

if (this._knownModelVersionId !== this._model.getVersionId()) {
// There are model change events that I didn't yet receive.
//
// This can happen when editing the model, and the view model receives the change events first,
// and the view model emits line mapping changed events, all before the cursor gets a chance to
// recover from markers.
//
// The model change listener above will be called soon and we'll ensure a valid cursor state there.
return;
}
// Ensure valid state
this.setStates('viewModel', CursorChangeReason.NotSet, this.getAll());
}));
Expand All @@ -136,13 +149,13 @@ export class Cursor extends viewEvents.ViewEventEmitter implements ICursors {
this.context = new CursorContext(this._configuration, this._model, this._viewModel);
this._cursors.updateContext(this.context);
};
this._register(model.onDidChangeLanguage((e) => {
this._register(this._model.onDidChangeLanguage((e) => {
updateCursorContext();
}));
this._register(model.onDidChangeLanguageConfiguration(() => {
this._register(this._model.onDidChangeLanguageConfiguration(() => {
updateCursorContext();
}));
this._register(model.onDidChangeOptions(() => {
this._register(this._model.onDidChangeOptions(() => {
updateCursorContext();
}));
this._register(this._configuration.onDidChange((e) => {
Expand Down
30 changes: 30 additions & 0 deletions src/vs/editor/test/browser/controller/cursor.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1852,6 +1852,36 @@ suite('Editor Controller - Regression tests', () => {
assertCursor(cursor, new Selection(1, 12, 1, 12));
});
});

test('issue #41573 - delete across multiple lines does not shrink the selection when word wraps', () => {
const model = TextModel.createFromString([
'Authorization: \'Bearer pHKRfCTFSnGxs6akKlb9ddIXcca0sIUSZJutPHYqz7vEeHdMTMh0SGN0IGU3a0n59DXjTLRsj5EJ2u33qLNIFi9fk5XF8pK39PndLYUZhPt4QvHGLScgSkK0L4gwzkzMloTQPpKhqiikiIOvyNNSpd2o8j29NnOmdTUOKi9DVt74PD2ohKxyOrWZ6oZprTkb3eKajcpnS0LABKfaw2rmv4\','
].join('\n'));
const config = new TestConfiguration({
wordWrap: 'wordWrapColumn',
wordWrapColumn: 100
});
const viewModel = new ViewModel(0, config, model, null);
const cursor = new Cursor(config, model, viewModel);

console.log(viewModel.getLineCount());

moveTo(cursor, 1, 43, false);
moveTo(cursor, 1, 147, true);
assertCursor(cursor, new Selection(1, 43, 1, 147));

model.applyEdits([{
range: new Range(1, 1, 1, 43),
text: ''
}]);

assertCursor(cursor, new Selection(1, 1, 1, 105));

cursor.dispose();
viewModel.dispose();
config.dispose();
model.dispose();
});
});

suite('Editor Controller - Cursor Configuration', () => {
Expand Down

0 comments on commit 4d3b04f

Please sign in to comment.