diff --git a/src/vs/workbench/browser/parts/editor/baseEditor.ts b/src/vs/workbench/browser/parts/editor/baseEditor.ts index 9977c276ea68d..d1da50573984c 100644 --- a/src/vs/workbench/browser/parts/editor/baseEditor.ts +++ b/src/vs/workbench/browser/parts/editor/baseEditor.ts @@ -147,7 +147,7 @@ export abstract class BaseEditor extends Panel implements IEditor { let editorMemento = BaseEditor.EDITOR_MEMENTOS.get(mementoKey); if (!editorMemento) { - editorMemento = new EditorMemento(editorGroupService, this.getMemento(storageService), key, limit); + editorMemento = new EditorMemento(this.getId(), key, this.getMemento(storageService), limit, editorGroupService); BaseEditor.EDITOR_MEMENTOS.set(mementoKey, editorMemento); } @@ -156,8 +156,12 @@ export abstract class BaseEditor extends Panel implements IEditor { shutdown(): void { - // Save all editor mementos - BaseEditor.EDITOR_MEMENTOS.forEach(editorMemento => editorMemento.shutdown()); + // Shutdown all editor memento for this editor type + BaseEditor.EDITOR_MEMENTOS.forEach(editorMemento => { + if (editorMemento.id === this.getId()) { + editorMemento.shutdown(); + } + }); super.shutdown(); } @@ -177,15 +181,20 @@ interface MapGroupToMemento { export class EditorMemento implements IEditorMemento { private cache: LRUCache>; - private isShutdown: boolean; + private cleanedUp = false; constructor( - private editorGroupService: IEditorGroupsService, - private memento: object, + private _id: string, private key: string, - private limit: number + private memento: object, + private limit: number, + private editorGroupService: IEditorGroupsService ) { } + get id(): string { + return this._id; + } + saveState(group: IEditorGroup, resource: URI, state: T): void; saveState(group: IEditorGroup, editor: EditorInput, state: T): void; saveState(group: IEditorGroup, resourceOrEditor: URI | EditorInput, state: T): void { @@ -263,10 +272,18 @@ export class EditorMemento implements IEditorMemento { } shutdown(): void { - if (this.isShutdown) { - return; // only shutdown once + const cache = this.doLoad(); + + // Cleanup once during shutdown + if (!this.cleanedUp) { + this.cleanUp(); + this.cleanedUp = true; } + this.memento[this.key] = cache.toJSON(); + } + + private cleanUp(): void { const cache = this.doLoad(); // Remove groups from states that no longer exist @@ -282,8 +299,5 @@ export class EditorMemento implements IEditorMemento { } }); }); - - this.memento[this.key] = cache.toJSON(); - this.isShutdown = true; } } \ No newline at end of file diff --git a/src/vs/workbench/browser/parts/editor/textDiffEditor.ts b/src/vs/workbench/browser/parts/editor/textDiffEditor.ts index 0088c70a1df32..22c0a7008c31e 100644 --- a/src/vs/workbench/browser/parts/editor/textDiffEditor.ts +++ b/src/vs/workbench/browser/parts/editor/textDiffEditor.ts @@ -72,7 +72,7 @@ export class TextDiffEditor extends BaseTextEditor implements ITextDiffEditor { } protected getEditorMemento(storageService: IStorageService, editorGroupService: IEditorGroupsService, key: string, limit: number = 10): IEditorMemento { - return new EditorMemento(editorGroupService, Object.create(null), key, limit); // do not persist in storage as diff editors are never persisted + return new EditorMemento(this.getId(), key, Object.create(null), limit, editorGroupService); // do not persist in storage as diff editors are never persisted } public getTitle(): string { diff --git a/src/vs/workbench/test/browser/parts/editor/baseEditor.test.ts b/src/vs/workbench/test/browser/parts/editor/baseEditor.test.ts index deed03fdfed0e..7cbde0bb8c97c 100644 --- a/src/vs/workbench/test/browser/parts/editor/baseEditor.test.ts +++ b/src/vs/workbench/test/browser/parts/editor/baseEditor.test.ts @@ -206,7 +206,7 @@ suite('Workbench base editor', () => { } const rawMemento = Object.create(null); - let memento = new EditorMemento(editorGroupService, rawMemento, 'key', 3); + let memento = new EditorMemento('id', 'key', rawMemento, 3, editorGroupService); let res = memento.loadState(testGroup0, URI.file('/A')); assert.ok(!res); @@ -241,7 +241,7 @@ suite('Workbench base editor', () => { memento.shutdown(); - memento = new EditorMemento(editorGroupService, rawMemento, 'key', 3); + memento = new EditorMemento('id', 'key', rawMemento, 3, editorGroupService); assert.ok(memento.loadState(testGroup0, URI.file('/C'))); assert.ok(memento.loadState(testGroup0, URI.file('/D'))); assert.ok(memento.loadState(testGroup0, URI.file('/E'))); @@ -282,7 +282,7 @@ suite('Workbench base editor', () => { } const rawMemento = Object.create(null); - let memento = new EditorMemento(new TestEditorGroupsService(), rawMemento, 'key', 3); + let memento = new EditorMemento('id', 'key', rawMemento, 3, new TestEditorGroupsService()); const testInputA = new TestEditorInput(URI.file('/A'));