diff --git a/src/vs/workbench/contrib/interactive/browser/interactiveEditorInput.ts b/src/vs/workbench/contrib/interactive/browser/interactiveEditorInput.ts index 534443553ba..f7db01de920 100644 --- a/src/vs/workbench/contrib/interactive/browser/interactiveEditorInput.ts +++ b/src/vs/workbench/contrib/interactive/browser/interactiveEditorInput.ts @@ -95,7 +95,7 @@ export class InteractiveEditorInput extends EditorInput implements ICompositeNot @INotebookService private readonly _notebookService: INotebookService, @IFileDialogService private readonly _fileDialogService: IFileDialogService ) { - const input = NotebookEditorInput.create(instantiationService, resource, 'interactive', {}); + const input = NotebookEditorInput.create(instantiationService, resource, undefined, 'interactive', {}); super(); this._notebookEditorInput = input; this._register(this._notebookEditorInput); diff --git a/src/vs/workbench/contrib/notebook/browser/notebook.contribution.ts b/src/vs/workbench/contrib/notebook/browser/notebook.contribution.ts index c1dcf42d739..307677480ae 100644 --- a/src/vs/workbench/contrib/notebook/browser/notebook.contribution.ts +++ b/src/vs/workbench/contrib/notebook/browser/notebook.contribution.ts @@ -204,7 +204,7 @@ class NotebookEditorSerializer implements IEditorSerializer { return undefined; } - const input = NotebookEditorInput.create(instantiationService, resource, viewType, options); + const input = NotebookEditorInput.create(instantiationService, resource, undefined, viewType, options); return input; } } @@ -639,7 +639,7 @@ class SimpleNotebookWorkingCopyEditorHandler extends Disposable implements IWork } createEditor(workingCopy: IWorkingCopyIdentifier): EditorInput { - return NotebookEditorInput.create(this._instantiationService, workingCopy.resource, this._getViewType(workingCopy)!); + return NotebookEditorInput.create(this._instantiationService, workingCopy.resource, undefined, this._getViewType(workingCopy)!); } private async _installHandler(): Promise { diff --git a/src/vs/workbench/contrib/notebook/browser/services/notebookServiceImpl.ts b/src/vs/workbench/contrib/notebook/browser/services/notebookServiceImpl.ts index c01228ddc92..d25e02d446d 100644 --- a/src/vs/workbench/contrib/notebook/browser/services/notebookServiceImpl.ts +++ b/src/vs/workbench/contrib/notebook/browser/services/notebookServiceImpl.ts @@ -42,6 +42,7 @@ import { DiffEditorInputFactoryFunction, EditorInputFactoryFunction, EditorInput import { IExtensionService, isProposedApiEnabled } from 'vs/workbench/services/extensions/common/extensions'; import { IExtensionPointUser } from 'vs/workbench/services/extensions/common/extensionsRegistry'; import { InstallRecommendedExtensionAction } from 'vs/workbench/contrib/extensions/browser/extensionsActions'; +import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity'; export class NotebookProviderInfoStore extends Disposable { @@ -62,7 +63,8 @@ export class NotebookProviderInfoStore extends Disposable { @IAccessibilityService private readonly _accessibilityService: IAccessibilityService, @IInstantiationService private readonly _instantiationService: IInstantiationService, @IFileService private readonly _fileService: IFileService, - @INotebookEditorModelResolverService private readonly _notebookEditorModelResolverService: INotebookEditorModelResolverService + @INotebookEditorModelResolverService private readonly _notebookEditorModelResolverService: INotebookEditorModelResolverService, + @IUriIdentityService private readonly uriIdentService: IUriIdentityService, ) { super(); @@ -178,12 +180,18 @@ export class NotebookProviderInfoStore extends Disposable { }; const notebookEditorInputFactory: EditorInputFactoryFunction = ({ resource, options }) => { const data = CellUri.parse(resource); - let notebookUri: URI = resource; + let notebookUri: URI; + let cellOptions: IResourceEditorInput | undefined; + let preferredResource = resource; if (data) { - notebookUri = data.notebook; - cellOptions = { resource, options }; + // resource is a notebook cell + notebookUri = this.uriIdentService.asCanonicalUri(data.notebook); + preferredResource = data.notebook; + cellOptions = { resource: notebookUri, options }; + } else { + notebookUri = this.uriIdentService.asCanonicalUri(resource); } if (!cellOptions) { @@ -191,8 +199,10 @@ export class NotebookProviderInfoStore extends Disposable { } const notebookOptions = { ...options, cellOptions } as INotebookEditorOptions; - return { editor: NotebookEditorInput.create(this._instantiationService, notebookUri, notebookProviderInfo.id), options: notebookOptions }; + const editor = NotebookEditorInput.create(this._instantiationService, notebookUri, preferredResource, notebookProviderInfo.id); + return { editor, options: notebookOptions }; }; + const notebookUntitledEditorFactory: UntitledEditorInputFactoryFunction = async ({ resource, options }) => { const ref = await this._notebookEditorModelResolverService.resolve({ untitledResource: resource }, notebookProviderInfo.id); @@ -202,7 +212,7 @@ export class NotebookProviderInfoStore extends Disposable { ref!.dispose(); }); - return { editor: NotebookEditorInput.create(this._instantiationService, ref.object.resource, notebookProviderInfo.id), options }; + return { editor: NotebookEditorInput.create(this._instantiationService, ref.object.resource, undefined, notebookProviderInfo.id), options }; }; const notebookDiffEditorInputFactory: DiffEditorInputFactoryFunction = ({ modified, original, label, description }) => { return { editor: NotebookDiffEditorInput.create(this._instantiationService, modified.resource!, label, description, original.resource!, notebookProviderInfo.id) }; diff --git a/src/vs/workbench/contrib/notebook/common/notebookDiffEditorInput.ts b/src/vs/workbench/contrib/notebook/common/notebookDiffEditorInput.ts index 1b6a2db5743..cced57f69cc 100644 --- a/src/vs/workbench/contrib/notebook/common/notebookDiffEditorInput.ts +++ b/src/vs/workbench/contrib/notebook/common/notebookDiffEditorInput.ts @@ -24,8 +24,8 @@ class NotebookDiffEditorModel extends EditorModel implements INotebookDiffEditor export class NotebookDiffEditorInput extends DiffEditorInput { static create(instantiationService: IInstantiationService, resource: URI, name: string | undefined, description: string | undefined, originalResource: URI, viewType: string) { - const original = NotebookEditorInput.create(instantiationService, originalResource, viewType); - const modified = NotebookEditorInput.create(instantiationService, resource, viewType); + const original = NotebookEditorInput.create(instantiationService, originalResource, undefined, viewType); + const modified = NotebookEditorInput.create(instantiationService, resource, undefined, viewType); return instantiationService.createInstance(NotebookDiffEditorInput, name, description, original, modified, viewType); } diff --git a/src/vs/workbench/contrib/notebook/common/notebookEditorInput.ts b/src/vs/workbench/contrib/notebook/common/notebookEditorInput.ts index 1ac7010369c..8edeea2be9a 100644 --- a/src/vs/workbench/contrib/notebook/common/notebookEditorInput.ts +++ b/src/vs/workbench/contrib/notebook/common/notebookEditorInput.ts @@ -41,8 +41,8 @@ export interface NotebookEditorInputOptions { export class NotebookEditorInput extends AbstractResourceEditorInput { - static create(instantiationService: IInstantiationService, resource: URI, viewType: string, options: NotebookEditorInputOptions = {}) { - return instantiationService.createInstance(NotebookEditorInput, resource, viewType, options); + static create(instantiationService: IInstantiationService, resource: URI, preferredResource: URI | undefined, viewType: string, options: NotebookEditorInputOptions = {}) { + return instantiationService.createInstance(NotebookEditorInput, resource, preferredResource, viewType, options); } static readonly ID: string = 'workbench.input.notebook'; @@ -51,23 +51,27 @@ export class NotebookEditorInput extends AbstractResourceEditorInput { private _sideLoadedListener: IDisposable; private _defaultDirtyState: boolean = false; + static counter = 1; + private debugId = NotebookEditorInput.counter++; + constructor( resource: URI, + preferredResource: URI | undefined, public readonly viewType: string, public readonly options: NotebookEditorInputOptions, @INotebookService private readonly _notebookService: INotebookService, @INotebookEditorModelResolverService private readonly _notebookModelResolverService: INotebookEditorModelResolverService, @IFileDialogService private readonly _fileDialogService: IFileDialogService, - @IInstantiationService private readonly _instantiationService: IInstantiationService, @ILabelService labelService: ILabelService, @IFileService fileService: IFileService, @IFilesConfigurationService filesConfigurationService: IFilesConfigurationService, @IExtensionService extensionService: IExtensionService, @IEditorService editorService: IEditorService ) { - super(resource, undefined, labelService, fileService, filesConfigurationService); + super(resource, preferredResource, labelService, fileService, filesConfigurationService); this._defaultDirtyState = !!options.startDirty; + console.log(`Creating notebookEditorInput ${this.debugId}`); // Automatically resolve this input when the "wanted" model comes to life via // some other way. This happens only once per input and resolve disposes // this listener @@ -96,6 +100,7 @@ export class NotebookEditorInput extends AbstractResourceEditorInput { } override dispose() { + console.log(`Disposing notebokEditorInput ${this.debugId}`); this._sideLoadedListener.dispose(); this._editorModelReference?.dispose(); this._editorModelReference = null; @@ -253,20 +258,12 @@ export class NotebookEditorInput extends AbstractResourceEditorInput { // called when users rename a notebook document override async rename(group: GroupIdentifier, target: URI): Promise { if (this._editorModelReference) { - const contributedNotebookProviders = this._notebookService.getContributedNotebookTypes(target); + return { editor: { resource: target }, options: { override: this.viewType } }; - if (contributedNotebookProviders.find(provider => provider.id === this._editorModelReference!.object.viewType)) { - return this._move(group, target); - } } return undefined; } - private _move(_group: GroupIdentifier, newResource: URI): { editor: EditorInput } { - const editorInput = NotebookEditorInput.create(this._instantiationService, newResource, this.viewType); - return { editor: editorInput }; - } - override async revert(_group: GroupIdentifier, options?: IRevertOptions): Promise { if (this._editorModelReference && this._editorModelReference.object.isDirty()) { await this._editorModelReference.object.revert(options); @@ -336,7 +333,7 @@ export class NotebookEditorInput extends AbstractResourceEditorInput { override toUntyped(): IResourceEditorInput { return { - resource: this.preferredResource, + resource: this.resource, options: { override: this.viewType } diff --git a/src/vs/workbench/contrib/notebook/test/browser/notebookServiceImpl.test.ts b/src/vs/workbench/contrib/notebook/test/browser/notebookServiceImpl.test.ts index f8e70728176..c204630f49d 100644 --- a/src/vs/workbench/contrib/notebook/test/browser/notebookServiceImpl.test.ts +++ b/src/vs/workbench/contrib/notebook/test/browser/notebookServiceImpl.test.ts @@ -13,6 +13,7 @@ import { IAccessibilityService } from 'vs/platform/accessibility/common/accessib import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; import { IFileService } from 'vs/platform/files/common/files'; import { IStorageService } from 'vs/platform/storage/common/storage'; +import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity'; import { NotebookProviderInfoStore } from 'vs/workbench/contrib/notebook/browser/services/notebookServiceImpl'; import { INotebookEditorModelResolverService } from 'vs/workbench/contrib/notebook/common/notebookEditorModelResolverService'; import { NotebookProviderInfo } from 'vs/workbench/contrib/notebook/common/notebookProvider'; @@ -43,7 +44,8 @@ suite('NotebookProviderInfoStore', function () { new class extends mock() { override hasProvider() { return true; } }, - new class extends mock() { } + new class extends mock() { }, + new class extends mock() { } ); disposables.add(store);