diff --git a/src/vs/workbench/contrib/notebook/browser/notebook.contribution.ts b/src/vs/workbench/contrib/notebook/browser/notebook.contribution.ts index 96fa760072eb77334c2b8f67a1568e4c408de229..1fc97f379b9a9e90dd9a6f2dd43d852ec27a314c 100644 --- a/src/vs/workbench/contrib/notebook/browser/notebook.contribution.ts +++ b/src/vs/workbench/contrib/notebook/browser/notebook.contribution.ts @@ -87,7 +87,7 @@ Registry.as(EditorInputExtensions.EditorInputFactor if (!data || !URI.isUri(resource) || typeof name !== 'string' || typeof viewType !== 'string') { return undefined; } - return instantiationService.createInstance(NotebookEditorInput, resource, name, viewType); + return NotebookEditorInput.getOrCreate(instantiationService, resource, name, viewType); } } ); @@ -190,7 +190,7 @@ export class NotebookContribution implements IWorkbenchContribution { const info = id === undefined ? infos[0] : (infos.find(info => info.id === id) || infos[0]); // cell-uri -> open (container) notebook const name = basename(data.notebook); - const input = this.instantiationService.createInstance(NotebookEditorInput, data.notebook, name, info.id); + const input = NotebookEditorInput.getOrCreate(this.instantiationService, data.notebook, name, info.id); this._resourceMapping.set(resource, input); return { override: this.editorService.openEditor(input, new NotebookEditorOptions({ ...options, forceReload: true, cellOptions: { resource, options } }), group) }; } @@ -203,7 +203,7 @@ export class NotebookContribution implements IWorkbenchContribution { return undefined; } - const input = this.instantiationService.createInstance(NotebookEditorInput, resource, originalInput.getName(), info.id); + const input = NotebookEditorInput.getOrCreate(this.instantiationService, resource, originalInput.getName(), info.id); this._resourceMapping.set(resource, input); return { override: this.editorService.openEditor(input, options, group) }; diff --git a/src/vs/workbench/contrib/notebook/browser/notebookEditorInput.ts b/src/vs/workbench/contrib/notebook/browser/notebookEditorInput.ts index 001a1bc33fa69b287da30bf8303f3cef39ebddef..abc3dfd2f7755db3effde58b7c506c2e09c308f1 100644 --- a/src/vs/workbench/contrib/notebook/browser/notebookEditorInput.ts +++ b/src/vs/workbench/contrib/notebook/browser/notebookEditorInput.ts @@ -12,6 +12,7 @@ import { NotebookTextModel } from 'vs/workbench/contrib/notebook/common/model/no import { NotebookCellTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookCellTextModel'; import { isEqual } from 'vs/base/common/resources'; import { IWorkingCopyService, IWorkingCopy, WorkingCopyCapabilities, IWorkingCopyBackup } from 'vs/workbench/services/workingCopy/common/workingCopyService'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; export class NotebookEditorModel extends EditorModel { private _dirty = false; @@ -91,6 +92,25 @@ export class NotebookEditorModel extends EditorModel { } export class NotebookEditorInput extends EditorInput { + + private static readonly _instances = new Map(); + + static getOrCreate(instantiationService: IInstantiationService, resource: URI, name: string, viewType: string | undefined) { + const key = name + viewType; + let input = NotebookEditorInput._instances.get(key); + if (!input) { + input = instantiationService.createInstance(class extends NotebookEditorInput { + dispose() { + NotebookEditorInput._instances.delete(key); + super.dispose(); + } + }, resource, name, viewType); + + NotebookEditorInput._instances.set(key, input); + } + return input; + } + static readonly ID: string = 'workbench.input.notebook'; private promise: Promise | null = null; private textModel: NotebookEditorModel | null = null;