Skip to content

Commit 4fc25c2

Browse files
committed
Maintain version id across model disposing
1 parent c2bac14 commit 4fc25c2

3 files changed

Lines changed: 26 additions & 1 deletion

File tree

src/vs/editor/common/model/textModel.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -705,6 +705,10 @@ export class TextModel extends Disposable implements model.ITextModel {
705705
this._alternativeVersionId = this._versionId;
706706
}
707707

708+
public _overwriteVersionId(versionId: number): void {
709+
this._versionId = versionId;
710+
}
711+
708712
public _overwriteAlternativeVersionId(newAlternativeVersionId: number): void {
709713
this._alternativeVersionId = newAlternativeVersionId;
710714
}

src/vs/editor/common/services/modelServiceImpl.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,7 @@ class DisposedModelInfo {
140140
constructor(
141141
public readonly uri: URI,
142142
public readonly sha1: string,
143+
public readonly versionId: number,
143144
public readonly alternativeVersionId: number,
144145
) { }
145146
}
@@ -346,6 +347,7 @@ export class ModelServiceImpl extends Disposable implements IModelService {
346347
element.setModel(model);
347348
}
348349
this._undoRedoService.setElementsIsValid(resource, true);
350+
model._overwriteVersionId(disposedModelData.versionId);
349351
model._overwriteAlternativeVersionId(disposedModelData.alternativeVersionId);
350352
} else {
351353
this._undoRedoService.removeElements(resource);
@@ -481,7 +483,7 @@ export class ModelServiceImpl extends Disposable implements IModelService {
481483
if (maintainUndoRedoStack) {
482484
// We only invalidate the elements, but they remain in the undo-redo service.
483485
this._undoRedoService.setElementsIsValid(resource, false);
484-
this._disposedModels.set(MODEL_ID(resource), new DisposedModelInfo(resource, computeModelSha1(model), model.getAlternativeVersionId()));
486+
this._disposedModels.set(MODEL_ID(resource), new DisposedModelInfo(resource, computeModelSha1(model), model.getVersionId(), model.getAlternativeVersionId()));
485487
} else {
486488
this._undoRedoService.removeElements(resource);
487489
}

src/vs/editor/test/common/services/modelService.test.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -327,6 +327,25 @@ suite('ModelService', () => {
327327
model2.undo();
328328
assert.equal(model2.getValue(), 'text');
329329
});
330+
331+
test('maintains version id and alternative version id for same resource and same content', () => {
332+
const resource = URI.parse('file://test.txt');
333+
334+
// create a model
335+
const model1 = modelService.createModel('text', null, resource);
336+
// make an edit
337+
model1.pushEditOperations(null, [{ range: new Range(1, 5, 1, 5), text: '1' }], () => [new Selection(1, 5, 1, 5)]);
338+
assert.equal(model1.getValue(), 'text1');
339+
const versionId = model1.getVersionId();
340+
const alternativeVersionId = model1.getAlternativeVersionId();
341+
// dispose it
342+
modelService.destroyModel(resource);
343+
344+
// create a new model with the same content
345+
const model2 = modelService.createModel('text1', null, resource);
346+
assert.equal(model2.getVersionId(), versionId);
347+
assert.equal(model2.getAlternativeVersionId(), alternativeVersionId);
348+
});
330349
}
331350

332351
test('does not maintain undo for same resource and different content', () => {

0 commit comments

Comments
 (0)