Skip to content

Commit e573b30

Browse files
committed
Fix issue where stale model change events were interpreted
1 parent 491f1ba commit e573b30

2 files changed

Lines changed: 29 additions & 13 deletions

File tree

src/vs/editor/common/viewModel/splitLinesCollection.ts

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -562,7 +562,13 @@ export class SplitLinesCollection {
562562
eventsCollector.emit(new viewEvents.ViewFlushedEvent());
563563
}
564564

565-
public onModelLinesDeleted(eventsCollector: ViewEventsCollector, fromLineNumber: number, toLineNumber: number): void {
565+
public onModelLinesDeleted(eventsCollector: ViewEventsCollector, versionId: number, fromLineNumber: number, toLineNumber: number): void {
566+
if (versionId <= this._validModelVersionId) {
567+
// Here we check for versionId in case the lines were reconstructed in the meantime.
568+
// We don't want to apply stale change events on top of a newer read model state.
569+
return;
570+
}
571+
566572
let outputFromLineNumber = (fromLineNumber === 1 ? 1 : this.prefixSumComputer.getAccumulatedValue(fromLineNumber - 2) + 1);
567573
let outputToLineNumber = this.prefixSumComputer.getAccumulatedValue(toLineNumber - 1);
568574

@@ -572,7 +578,13 @@ export class SplitLinesCollection {
572578
eventsCollector.emit(new viewEvents.ViewLinesDeletedEvent(outputFromLineNumber, outputToLineNumber));
573579
}
574580

575-
public onModelLinesInserted(eventsCollector: ViewEventsCollector, fromLineNumber: number, toLineNumber: number, text: string[]): void {
581+
public onModelLinesInserted(eventsCollector: ViewEventsCollector, versionId: number, fromLineNumber: number, toLineNumber: number, text: string[]): void {
582+
if (versionId <= this._validModelVersionId) {
583+
// Here we check for versionId in case the lines were reconstructed in the meantime.
584+
// We don't want to apply stale change events on top of a newer read model state.
585+
return;
586+
}
587+
576588
let hiddenAreas = this.getHiddenAreas();
577589
let isInHiddenArea = false;
578590
let testPosition = new Position(fromLineNumber, 1);
@@ -605,7 +617,13 @@ export class SplitLinesCollection {
605617
eventsCollector.emit(new viewEvents.ViewLinesInsertedEvent(outputFromLineNumber, outputFromLineNumber + totalOutputLineCount - 1));
606618
}
607619

608-
public onModelLineChanged(eventsCollector: ViewEventsCollector, lineNumber: number, newText: string): boolean {
620+
public onModelLineChanged(eventsCollector: ViewEventsCollector, versionId: number, lineNumber: number, newText: string): boolean {
621+
if (versionId <= this._validModelVersionId) {
622+
// Here we check for versionId in case the lines were reconstructed in the meantime.
623+
// We don't want to apply stale change events on top of a newer read model state.
624+
return false;
625+
}
626+
609627
let lineIndex = lineNumber - 1;
610628

611629
let oldOutputLineCount = this.lines[lineIndex].getViewLineCount();

src/vs/editor/common/viewModel/viewModelImpl.ts

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -303,9 +303,11 @@ export class ViewModel extends Disposable implements IViewModel {
303303

304304
case textModelEvents.TextModelEventType.ModelRawContentChanged2: {
305305
const e = <textModelEvents.ModelRawContentChangedEvent>data;
306+
const changes = e.changes;
307+
const versionId = e.versionId;
306308

307-
for (let j = 0, lenJ = e.changes.length; j < lenJ; j++) {
308-
const change = e.changes[j];
309+
for (let j = 0, lenJ = changes.length; j < lenJ; j++) {
310+
const change = changes[j];
309311

310312
switch (change.changeType) {
311313
case textModelEvents.RawContentChangedType.Flush:
@@ -315,25 +317,21 @@ export class ViewModel extends Disposable implements IViewModel {
315317
break;
316318

317319
case textModelEvents.RawContentChangedType.LinesDeleted:
318-
this.lines.onModelLinesDeleted(eventsCollector, change.fromLineNumber, change.toLineNumber);
320+
this.lines.onModelLinesDeleted(eventsCollector, versionId, change.fromLineNumber, change.toLineNumber);
319321
hadOtherModelChange = true;
320322
break;
321323

322324
case textModelEvents.RawContentChangedType.LinesInserted:
323-
this.lines.onModelLinesInserted(eventsCollector, change.fromLineNumber, change.toLineNumber, change.detail.split('\n'));
325+
this.lines.onModelLinesInserted(eventsCollector, versionId, change.fromLineNumber, change.toLineNumber, change.detail.split('\n'));
324326
hadOtherModelChange = true;
325327
break;
326328

327329
case textModelEvents.RawContentChangedType.LineChanged:
328-
hadModelLineChangeThatChangedLineMapping = this.lines.onModelLineChanged(eventsCollector, change.lineNumber, change.detail);
330+
hadModelLineChangeThatChangedLineMapping = this.lines.onModelLineChanged(eventsCollector, versionId, change.lineNumber, change.detail);
329331
break;
330-
331-
default:
332-
console.info('ViewModel received unknown event: ');
333-
console.info(_e);
334332
}
335333
}
336-
this.lines.acceptVersionId(e.versionId);
334+
this.lines.acceptVersionId(versionId);
337335

338336
break;
339337
}

0 commit comments

Comments
 (0)