diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index cf59d80bc25..1d4a9cfe523 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -1662,7 +1662,7 @@ declare module 'vscode' { } export interface NotebookKernelProvider { - onDidChangeKernels?: Event; + onDidChangeKernels?: Event; provideKernels(document: NotebookDocument, token: CancellationToken): ProviderResult; resolveKernel?(kernel: T, document: NotebookDocument, webview: NotebookCommunication, token: CancellationToken): ProviderResult; } diff --git a/src/vs/workbench/api/browser/mainThreadNotebook.ts b/src/vs/workbench/api/browser/mainThreadNotebook.ts index 0654a82df22..e076f367810 100644 --- a/src/vs/workbench/api/browser/mainThreadNotebook.ts +++ b/src/vs/workbench/api/browser/mainThreadNotebook.ts @@ -133,7 +133,7 @@ class DocumentAndEditorState { export class MainThreadNotebooks extends Disposable implements MainThreadNotebookShape { private readonly _notebookProviders = new Map(); private readonly _notebookKernels = new Map(); - private readonly _notebookKernelProviders = new Map, provider: IDisposable }>(); + private readonly _notebookKernelProviders = new Map, provider: IDisposable }>(); private readonly _proxy: ExtHostNotebookShape; private _toDisposeOnEditorRemove = new Map(); private _currentState?: DocumentAndEditorState; @@ -504,7 +504,7 @@ export class MainThreadNotebooks extends Disposable implements MainThreadNoteboo } async $registerNotebookKernelProvider(extension: NotebookExtensionDescription, handle: number, documentFilter: INotebookDocumentFilter): Promise { - const emitter = new Emitter(); + const emitter = new Emitter(); const that = this; const provider = this._notebookService.registerNotebookKernelProvider({ providerExtensionId: extension.id.value, @@ -551,10 +551,10 @@ export class MainThreadNotebooks extends Disposable implements MainThreadNoteboo } } - $onNotebookKernelChange(handle: number): void { + $onNotebookKernelChange(handle: number, uriComponents: UriComponents): void { const entry = this._notebookKernelProviders.get(handle); - entry?.emitter.fire(); + entry?.emitter.fire(uriComponents ? URI.revive(uriComponents) : undefined); } async $updateNotebookLanguages(viewType: string, resource: UriComponents, languages: string[]): Promise { diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index 13141f6127d..43cba9960ce 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -735,7 +735,7 @@ export interface MainThreadNotebookShape extends IDisposable { $registerNotebookKernel(extension: NotebookExtensionDescription, id: string, label: string, selectors: (string | IRelativePattern)[], preloads: UriComponents[]): Promise; $registerNotebookKernelProvider(extension: NotebookExtensionDescription, handle: number, documentFilter: INotebookDocumentFilter): Promise; $unregisterNotebookKernelProvider(handle: number): Promise; - $onNotebookKernelChange(handle: number): void; + $onNotebookKernelChange(handle: number, uri: UriComponents | undefined): void; $unregisterNotebookKernel(id: string): Promise; $tryApplyEdits(viewType: string, resource: UriComponents, modelVersionId: number, edits: ICellEditOperation[]): Promise; $updateNotebookLanguages(viewType: string, resource: UriComponents, languages: string[]): Promise; diff --git a/src/vs/workbench/api/common/extHostNotebook.ts b/src/vs/workbench/api/common/extHostNotebook.ts index 15e40912036..bf37804e839 100644 --- a/src/vs/workbench/api/common/extHostNotebook.ts +++ b/src/vs/workbench/api/common/extHostNotebook.ts @@ -795,8 +795,9 @@ export class ExtHostNotebookKernelProviderAdapter extends Disposable { super(); if (this._provider.onDidChangeKernels) { - this._register(this._provider.onDidChangeKernels(() => { - this._proxy.$onNotebookKernelChange(this._handle); + this._register(this._provider.onDidChangeKernels((e: vscode.NotebookDocument | undefined) => { + const uri = e?.uri; + this._proxy.$onNotebookKernelChange(this._handle, uri); })); } } diff --git a/src/vs/workbench/contrib/notebook/browser/notebookEditorWidget.ts b/src/vs/workbench/contrib/notebook/browser/notebookEditorWidget.ts index 547b36d2195..55c58bf796a 100644 --- a/src/vs/workbench/contrib/notebook/browser/notebookEditorWidget.ts +++ b/src/vs/workbench/contrib/notebook/browser/notebookEditorWidget.ts @@ -638,7 +638,11 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditor // we don't await for it, otherwise it will slow down the file opening this._setKernels(textModel, this._currentKernelTokenSource); - this._localStore.add(this.notebookService.onDidChangeKernels(async () => { + this._localStore.add(this.notebookService.onDidChangeKernels(async (e) => { + if (e && e.toString() !== this.textModel?.uri.toString()) { + // kernel update is not for current document. + return; + } this._currentKernelTokenSource?.cancel(); this._currentKernelTokenSource = new CancellationTokenSource(); await this._setKernels(textModel, this._currentKernelTokenSource); diff --git a/src/vs/workbench/contrib/notebook/browser/notebookServiceImpl.ts b/src/vs/workbench/contrib/notebook/browser/notebookServiceImpl.ts index f1c91c4bc24..1d0ec0b42b9 100644 --- a/src/vs/workbench/contrib/notebook/browser/notebookServiceImpl.ts +++ b/src/vs/workbench/contrib/notebook/browser/notebookServiceImpl.ts @@ -254,8 +254,8 @@ export class NotebookService extends Disposable implements INotebookService, ICu private readonly _onDidChangeViewTypes = new Emitter(); onDidChangeViewTypes: Event = this._onDidChangeViewTypes.event; - private readonly _onDidChangeKernels = new Emitter(); - onDidChangeKernels: Event = this._onDidChangeKernels.event; + private readonly _onDidChangeKernels = new Emitter(); + onDidChangeKernels: Event = this._onDidChangeKernels.event; private readonly _onDidChangeNotebookActiveKernel = new Emitter<{ uri: URI, providerHandle: number | undefined, kernelId: string | undefined }>(); onDidChangeNotebookActiveKernel: Event<{ uri: URI, providerHandle: number | undefined, kernelId: string | undefined }> = this._onDidChangeNotebookActiveKernel.event; private cutItems: NotebookCellTextModel[] | undefined; @@ -558,21 +558,21 @@ export class NotebookService extends Disposable implements INotebookService, ICu registerNotebookKernel(notebook: INotebookKernelInfo): void { this._notebookKernels.set(notebook.id, notebook); - this._onDidChangeKernels.fire(); + this._onDidChangeKernels.fire(undefined); } unregisterNotebookKernel(id: string): void { this._notebookKernels.delete(id); - this._onDidChangeKernels.fire(); + this._onDidChangeKernels.fire(undefined); } registerNotebookKernelProvider(provider: INotebookKernelProvider): IDisposable { const d = this.notebookKernelProviderInfoStore.add(provider); - const kernelChangeEventListener = provider.onDidChangeKernels(() => { - this._onDidChangeKernels.fire(); + const kernelChangeEventListener = provider.onDidChangeKernels((e) => { + this._onDidChangeKernels.fire(e); }); - this._onDidChangeKernels.fire(); + this._onDidChangeKernels.fire(undefined); return toDisposable(() => { kernelChangeEventListener.dispose(); d.dispose(); diff --git a/src/vs/workbench/contrib/notebook/common/notebookCommon.ts b/src/vs/workbench/contrib/notebook/common/notebookCommon.ts index b55dc330f3c..05f6d59b48d 100644 --- a/src/vs/workbench/contrib/notebook/common/notebookCommon.ts +++ b/src/vs/workbench/contrib/notebook/common/notebookCommon.ts @@ -799,7 +799,7 @@ export interface INotebookKernelProvider { providerExtensionId: string; providerDescription?: string; selector: INotebookDocumentFilter; - onDidChangeKernels: Event; + onDidChangeKernels: Event; provideKernels(uri: URI, token: CancellationToken): Promise; resolveKernel(editorId: string, uri: UriComponents, kernelId: string, token: CancellationToken): Promise; executeNotebook(uri: URI, kernelId: string, handle: number | undefined): Promise; diff --git a/src/vs/workbench/contrib/notebook/common/notebookService.ts b/src/vs/workbench/contrib/notebook/common/notebookService.ts index 3d560795602..3046b93f6c1 100644 --- a/src/vs/workbench/contrib/notebook/common/notebookService.ts +++ b/src/vs/workbench/contrib/notebook/common/notebookService.ts @@ -44,7 +44,7 @@ export interface INotebookService { onNotebookDocumentRemove: Event; onNotebookDocumentAdd: Event; onNotebookDocumentSaved: Event; - onDidChangeKernels: Event; + onDidChangeKernels: Event; onDidChangeNotebookActiveKernel: Event<{ uri: URI, providerHandle: number | undefined, kernelId: string | undefined }>; registerNotebookController(viewType: string, extensionData: NotebookExtensionDescription, controller: IMainNotebookController): void; unregisterNotebookProvider(viewType: string): void;