未验证 提交 b867b319 编写于 作者: A Alex Dima

Remove reference from disposed TextModel when keeping undo-redo elements

上级 f3361680
...@@ -137,7 +137,7 @@ class SingleModelEditStackData { ...@@ -137,7 +137,7 @@ class SingleModelEditStackData {
export class SingleModelEditStackElement implements IResourceUndoRedoElement { export class SingleModelEditStackElement implements IResourceUndoRedoElement {
public model: ITextModel; public model: ITextModel | URI;
private _data: SingleModelEditStackData | ArrayBuffer; private _data: SingleModelEditStackData | ArrayBuffer;
public get type(): UndoRedoElementType.Resource { public get type(): UndoRedoElementType.Resource {
...@@ -145,6 +145,9 @@ export class SingleModelEditStackElement implements IResourceUndoRedoElement { ...@@ -145,6 +145,9 @@ export class SingleModelEditStackElement implements IResourceUndoRedoElement {
} }
public get resource(): URI { public get resource(): URI {
if (URI.isUri(this.model)) {
return this.model;
}
return this.model.uri; return this.model.uri;
} }
...@@ -157,7 +160,7 @@ export class SingleModelEditStackElement implements IResourceUndoRedoElement { ...@@ -157,7 +160,7 @@ export class SingleModelEditStackElement implements IResourceUndoRedoElement {
this._data = SingleModelEditStackData.create(model, beforeCursorState); this._data = SingleModelEditStackData.create(model, beforeCursorState);
} }
public setModel(model: ITextModel): void { public setModel(model: ITextModel | URI): void {
this.model = model; this.model = model;
} }
...@@ -178,6 +181,10 @@ export class SingleModelEditStackElement implements IResourceUndoRedoElement { ...@@ -178,6 +181,10 @@ export class SingleModelEditStackElement implements IResourceUndoRedoElement {
} }
public undo(): void { public undo(): void {
if (URI.isUri(this.model)) {
// don't have a model
throw new Error(`Invalid SingleModelEditStackElement`);
}
if (this._data instanceof SingleModelEditStackData) { if (this._data instanceof SingleModelEditStackData) {
this._data = this._data.serialize(); this._data = this._data.serialize();
} }
...@@ -186,6 +193,10 @@ export class SingleModelEditStackElement implements IResourceUndoRedoElement { ...@@ -186,6 +193,10 @@ export class SingleModelEditStackElement implements IResourceUndoRedoElement {
} }
public redo(): void { public redo(): void {
if (URI.isUri(this.model)) {
// don't have a model
throw new Error(`Invalid SingleModelEditStackElement`);
}
if (this._data instanceof SingleModelEditStackData) { if (this._data instanceof SingleModelEditStackData) {
this._data = this._data.serialize(); this._data = this._data.serialize();
} }
...@@ -211,7 +222,7 @@ export class MultiModelEditStackElement implements IWorkspaceUndoRedoElement { ...@@ -211,7 +222,7 @@ export class MultiModelEditStackElement implements IWorkspaceUndoRedoElement {
private readonly _editStackElementsMap: Map<string, SingleModelEditStackElement>; private readonly _editStackElementsMap: Map<string, SingleModelEditStackElement>;
public get resources(): readonly URI[] { public get resources(): readonly URI[] {
return this._editStackElementsArr.map(editStackElement => editStackElement.model.uri); return this._editStackElementsArr.map(editStackElement => editStackElement.resource);
} }
constructor( constructor(
...@@ -223,13 +234,13 @@ export class MultiModelEditStackElement implements IWorkspaceUndoRedoElement { ...@@ -223,13 +234,13 @@ export class MultiModelEditStackElement implements IWorkspaceUndoRedoElement {
this._editStackElementsArr = editStackElements.slice(0); this._editStackElementsArr = editStackElements.slice(0);
this._editStackElementsMap = new Map<string, SingleModelEditStackElement>(); this._editStackElementsMap = new Map<string, SingleModelEditStackElement>();
for (const editStackElement of this._editStackElementsArr) { for (const editStackElement of this._editStackElementsArr) {
const key = uriGetComparisonKey(editStackElement.model.uri); const key = uriGetComparisonKey(editStackElement.resource);
this._editStackElementsMap.set(key, editStackElement); this._editStackElementsMap.set(key, editStackElement);
} }
} }
public setModel(model: ITextModel): void { public setModel(model: ITextModel | URI): void {
const key = uriGetComparisonKey(model.uri); const key = uriGetComparisonKey(URI.isUri(model) ? model : model.uri);
if (this._editStackElementsMap.has(key)) { if (this._editStackElementsMap.has(key)) {
this._editStackElementsMap.get(key)!.setModel(model); this._editStackElementsMap.get(key)!.setModel(model);
} }
......
...@@ -477,9 +477,11 @@ export class ModelServiceImpl extends Disposable implements IModelService { ...@@ -477,9 +477,11 @@ export class ModelServiceImpl extends Disposable implements IModelService {
maintainUndoRedoStack = true; maintainUndoRedoStack = true;
for (const element of elements.past) { for (const element of elements.past) {
heapSize += element.heapSize(resource); heapSize += element.heapSize(resource);
element.setModel(resource); // remove reference from text buffer instance
} }
for (const element of elements.future) { for (const element of elements.future) {
heapSize += element.heapSize(resource); heapSize += element.heapSize(resource);
element.setModel(resource); // remove reference from text buffer instance
} }
} else { } else {
maintainUndoRedoStack = false; maintainUndoRedoStack = false;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册