mirror of
https://github.com/microsoft/vscode.git
synced 2026-05-08 09:08:48 +01:00
fix #119866.
This commit is contained in:
@@ -15,6 +15,7 @@ import { hash } from 'vs/base/common/hash';
|
||||
import { PieceTreeTextBuffer } from 'vs/editor/common/model/pieceTreeTextBuffer/pieceTreeTextBuffer';
|
||||
import { NotebookCellOutputTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookCellOutputTextModel';
|
||||
import { IModeService } from 'vs/editor/common/services/modeService';
|
||||
import { TextModel } from 'vs/editor/common/model/textModel';
|
||||
|
||||
export class NotebookCellTextModel extends Disposable implements ICell {
|
||||
private _onDidChangeOutputs = new Emitter<NotebookCellOutputsSplice[]>();
|
||||
@@ -88,7 +89,9 @@ export class NotebookCellTextModel extends Disposable implements ICell {
|
||||
|
||||
this._register(this._textBuffer.onDidChangeContent(() => {
|
||||
this._hash = null;
|
||||
this._onDidChangeContent.fire();
|
||||
if (!this._textModel) {
|
||||
this._onDidChangeContent.fire();
|
||||
}
|
||||
}));
|
||||
|
||||
return this._textBuffer;
|
||||
@@ -96,13 +99,19 @@ export class NotebookCellTextModel extends Disposable implements ICell {
|
||||
|
||||
private _hash: number | null = null;
|
||||
|
||||
private _versionId: number = 1;
|
||||
private _alternativeId: number = 1;
|
||||
get alternativeId(): number {
|
||||
return this._alternativeId;
|
||||
}
|
||||
|
||||
private _textModelDisposables = new DisposableStore();
|
||||
private _textModel: model.ITextModel | undefined = undefined;
|
||||
get textModel(): model.ITextModel | undefined {
|
||||
private _textModel: TextModel | undefined = undefined;
|
||||
get textModel(): TextModel | undefined {
|
||||
return this._textModel;
|
||||
}
|
||||
|
||||
set textModel(m: model.ITextModel | undefined) {
|
||||
set textModel(m: TextModel | undefined) {
|
||||
if (this._textModel === m) {
|
||||
return;
|
||||
}
|
||||
@@ -118,6 +127,16 @@ export class NotebookCellTextModel extends Disposable implements ICell {
|
||||
this.language = e.newLanguage;
|
||||
}));
|
||||
this._textModelDisposables.add(this._textModel.onWillDispose(() => this.textModel = undefined));
|
||||
this._textModelDisposables.add(this._textModel.onDidChangeContent(() => {
|
||||
if (this._textModel) {
|
||||
this._versionId = this._textModel.getVersionId();
|
||||
this._alternativeId = this._textModel.getAlternativeVersionId();
|
||||
}
|
||||
this._onDidChangeContent.fire();
|
||||
}));
|
||||
|
||||
this._textModel._overwriteVersionId(this._versionId);
|
||||
this._textModel._overwriteAlternativeVersionId(this._versionId);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -18,6 +18,7 @@ import { Schemas } from 'vs/base/common/network';
|
||||
import { isEqual } from 'vs/base/common/resources';
|
||||
import { IModeService } from 'vs/editor/common/services/modeService';
|
||||
import { ITextModel } from 'vs/editor/common/model';
|
||||
import { TextModel } from 'vs/editor/common/model/textModel';
|
||||
|
||||
|
||||
class StackOperation implements IWorkspaceUndoRedoElement {
|
||||
@@ -26,17 +27,17 @@ class StackOperation implements IWorkspaceUndoRedoElement {
|
||||
private _operations: IUndoRedoElement[] = [];
|
||||
private _beginSelectionState: ISelectionState | undefined = undefined;
|
||||
private _resultSelectionState: ISelectionState | undefined = undefined;
|
||||
private _beginAlternativeVersionId: number;
|
||||
private _resultAlternativeVersionId: number;
|
||||
private _beginAlternativeVersionId: string;
|
||||
private _resultAlternativeVersionId: string;
|
||||
|
||||
constructor(
|
||||
readonly resource: URI,
|
||||
readonly label: string,
|
||||
readonly undoRedoGroup: UndoRedoGroup | undefined,
|
||||
private _delayedEmitter: DelayedEmitter,
|
||||
private _postUndoRedo: (alternativeVersionId: number) => void,
|
||||
private _postUndoRedo: (alternativeVersionId: string) => void,
|
||||
selectionState: ISelectionState | undefined,
|
||||
beginAlternativeVersionId: number
|
||||
beginAlternativeVersionId: string
|
||||
) {
|
||||
this.type = UndoRedoElementType.Workspace;
|
||||
this._beginSelectionState = selectionState;
|
||||
@@ -51,7 +52,7 @@ class StackOperation implements IWorkspaceUndoRedoElement {
|
||||
return this._operations.length === 0;
|
||||
}
|
||||
|
||||
pushEndState(alternativeVersionId: number, selectionState: ISelectionState | undefined) {
|
||||
pushEndState(alternativeVersionId: string, selectionState: ISelectionState | undefined) {
|
||||
this._resultAlternativeVersionId = alternativeVersionId;
|
||||
this._resultSelectionState = selectionState;
|
||||
}
|
||||
@@ -89,11 +90,11 @@ export class NotebookOperationManager {
|
||||
private _undoService: IUndoRedoService,
|
||||
private _resource: URI,
|
||||
private _delayedEmitter: DelayedEmitter,
|
||||
private _postUndoRedo: (alternativeVersionId: number) => void
|
||||
private _postUndoRedo: (alternativeVersionId: string) => void
|
||||
) {
|
||||
}
|
||||
|
||||
pushStackElement(label: string, selectionState: ISelectionState | undefined, undoRedoGroup: UndoRedoGroup | undefined, alternativeVersionId: number) {
|
||||
pushStackElement(label: string, selectionState: ISelectionState | undefined, undoRedoGroup: UndoRedoGroup | undefined, alternativeVersionId: string) {
|
||||
if (this._pendingStackOperation) {
|
||||
this._pendingStackOperation.pushEndState(alternativeVersionId, selectionState);
|
||||
if (!this._pendingStackOperation.isEmpty) {
|
||||
@@ -199,7 +200,7 @@ export class NotebookTextModel extends Disposable implements INotebookTextModel
|
||||
/**
|
||||
* Unlike, versionId, this can go down (via undo) or go to previous values (via redo)
|
||||
*/
|
||||
private _alternativeVersionId: number = 0;
|
||||
private _alternativeVersionId: string = '1';
|
||||
private _operationManager: NotebookOperationManager;
|
||||
private _eventEmitter: DelayedEmitter;
|
||||
|
||||
@@ -215,7 +216,7 @@ export class NotebookTextModel extends Disposable implements INotebookTextModel
|
||||
return this._versionId;
|
||||
}
|
||||
|
||||
get alternativeVersionId(): number {
|
||||
get alternativeVersionId(): string {
|
||||
return this._alternativeVersionId;
|
||||
}
|
||||
|
||||
@@ -235,7 +236,7 @@ export class NotebookTextModel extends Disposable implements INotebookTextModel
|
||||
this._initialize(cells);
|
||||
|
||||
const maybeUpdateCellTextModel = (textModel: ITextModel) => {
|
||||
if (textModel.uri.scheme === Schemas.vscodeNotebookCell) {
|
||||
if (textModel.uri.scheme === Schemas.vscodeNotebookCell && textModel instanceof TextModel) {
|
||||
const cellUri = CellUri.parse(textModel.uri);
|
||||
if (cellUri && isEqual(cellUri.notebook, this.uri)) {
|
||||
const cellIdx = this._getCellIndexByHandle(cellUri.handle);
|
||||
@@ -259,7 +260,7 @@ export class NotebookTextModel extends Disposable implements INotebookTextModel
|
||||
this._undoService,
|
||||
uri,
|
||||
this._eventEmitter,
|
||||
(alternativeVersionId: number) => {
|
||||
(alternativeVersionId: string) => {
|
||||
this._increaseVersionId();
|
||||
this._overwriteAlternativeVersionId(alternativeVersionId);
|
||||
}
|
||||
@@ -287,6 +288,11 @@ export class NotebookTextModel extends Disposable implements INotebookTextModel
|
||||
}
|
||||
|
||||
this._cells.splice(0, 0, ...mainCells);
|
||||
this._alternativeVersionId = this._generateAlternativeId();
|
||||
}
|
||||
|
||||
private _generateAlternativeId() {
|
||||
return this.cells.map(cell => cell.handle + ',' + cell.alternativeId).join(';');
|
||||
}
|
||||
|
||||
override dispose() {
|
||||
@@ -453,7 +459,7 @@ export class NotebookTextModel extends Disposable implements INotebookTextModel
|
||||
this._modeService
|
||||
);
|
||||
const textModel = this._modelService.getModel(cellUri);
|
||||
if (textModel) {
|
||||
if (textModel && textModel instanceof TextModel) {
|
||||
cell.textModel = textModel;
|
||||
cell.language = cellDto.language;
|
||||
}
|
||||
@@ -498,10 +504,10 @@ export class NotebookTextModel extends Disposable implements INotebookTextModel
|
||||
|
||||
private _increaseVersionId(): void {
|
||||
this._versionId = this._versionId + 1;
|
||||
this._alternativeVersionId = this.versionId;
|
||||
this._alternativeVersionId = this._generateAlternativeId();
|
||||
}
|
||||
|
||||
private _overwriteAlternativeVersionId(newAlternativeVersionId: number): void {
|
||||
private _overwriteAlternativeVersionId(newAlternativeVersionId: string): void {
|
||||
this._alternativeVersionId = newAlternativeVersionId;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user