From 9ccc2b3b30c122afe45bc6722bef0e3901fb2806 Mon Sep 17 00:00:00 2001 From: Peng Lyu Date: Thu, 19 Jan 2023 17:43:04 -0800 Subject: [PATCH] Support kernel source actions update. (#171781) --- .../api/browser/mainThreadNotebookKernels.ts | 23 +++++++++++++++++-- .../workbench/api/common/extHost.protocol.ts | 5 ++-- .../api/common/extHostNotebookKernels.ts | 11 +++++++-- .../services/notebookKernelServiceImpl.ts | 6 +++++ .../notebook/common/notebookKernelService.ts | 1 + .../vscode.proposed.notebookKernelSource.d.ts | 4 ++++ 6 files changed, 44 insertions(+), 6 deletions(-) diff --git a/src/vs/workbench/api/browser/mainThreadNotebookKernels.ts b/src/vs/workbench/api/browser/mainThreadNotebookKernels.ts index bdbffe8f6c7..a621c71f9d2 100644 --- a/src/vs/workbench/api/browser/mainThreadNotebookKernels.ts +++ b/src/vs/workbench/api/browser/mainThreadNotebookKernels.ts @@ -115,6 +115,8 @@ export class MainThreadNotebookKernels implements MainThreadNotebookKernelsShape private readonly _kernels = new Map(); private readonly _kernelDetectionTasks = new Map(); private readonly _kernelSourceActionProviders = new Map(); + private readonly _kernelSourceActionProvidersEventRegistrations = new Map(); + private readonly _proxy: ExtHostNotebookKernelsShape; private readonly _executions = new Map(); @@ -314,7 +316,7 @@ export class MainThreadNotebookKernels implements MainThreadNotebookKernelsShape // --- notebook kernel source action provider - async $addKernelSourceActionProvider(handle: number, notebookType: string): Promise { + async $addKernelSourceActionProvider(handle: number, eventHandle: number, notebookType: string): Promise { const kernelSourceActionProvider: IKernelSourceActionProvider = { viewType: notebookType, provideKernelSourceActions: async () => { @@ -336,15 +338,32 @@ export class MainThreadNotebookKernels implements MainThreadNotebookKernelsShape }); } }; + + if (typeof eventHandle === 'number') { + const emitter = new Emitter(); + this._kernelSourceActionProvidersEventRegistrations.set(eventHandle, emitter); + kernelSourceActionProvider.onDidChangeSourceActions = emitter.event; + } + const registration = this._notebookKernelService.registerKernelSourceActionProvider(notebookType, kernelSourceActionProvider); this._kernelSourceActionProviders.set(handle, [kernelSourceActionProvider, registration]); } - $removeKernelSourceActionProvider(handle: number): void { + $removeKernelSourceActionProvider(handle: number, eventHandle: number): void { const tuple = this._kernelSourceActionProviders.get(handle); if (tuple) { tuple[1].dispose(); this._kernelSourceActionProviders.delete(handle); } + if (typeof eventHandle === 'number') { + this._kernelSourceActionProvidersEventRegistrations.delete(eventHandle); + } + } + + $emitNotebookKernelSourceActionsChangeEvent(eventHandle: number): void { + const emitter = this._kernelSourceActionProvidersEventRegistrations.get(eventHandle); + if (emitter instanceof Emitter) { + emitter.fire(undefined); + } } } diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index 896a885460f..b5e422ba930 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -1055,8 +1055,9 @@ export interface MainThreadNotebookKernelsShape extends IDisposable { $addKernelDetectionTask(handle: number, notebookType: string): Promise; $removeKernelDetectionTask(handle: number): void; - $addKernelSourceActionProvider(handle: number, notebookType: string): Promise; - $removeKernelSourceActionProvider(handle: number): void; + $addKernelSourceActionProvider(handle: number, eventHandle: number, notebookType: string): Promise; + $removeKernelSourceActionProvider(handle: number, eventHandle: number): void; + $emitNotebookKernelSourceActionsChangeEvent(eventHandle: number): void; } export interface MainThreadNotebookRenderersShape extends IDisposable { diff --git a/src/vs/workbench/api/common/extHostNotebookKernels.ts b/src/vs/workbench/api/common/extHostNotebookKernels.ts index a58f8cec0be..f941f9ba6e4 100644 --- a/src/vs/workbench/api/common/extHostNotebookKernels.ts +++ b/src/vs/workbench/api/common/extHostNotebookKernels.ts @@ -299,16 +299,23 @@ export class ExtHostNotebookKernels implements ExtHostNotebookKernelsShape { registerKernelSourceActionProvider(extension: IExtensionDescription, viewType: string, provider: vscode.NotebookKernelSourceActionProvider) { const handle = this._kernelSourceActionProviderHandlePool++; + const eventHandle = typeof provider.onDidChangeNotebookKernelSourceActions === 'function' ? handle : undefined; const that = this; this._kernelSourceActionProviders.set(handle, provider); this._logService.trace(`NotebookKernelSourceActionProvider[${handle}], CREATED by ${extension.identifier.value}`); - this._proxy.$addKernelSourceActionProvider(handle, viewType); + this._proxy.$addKernelSourceActionProvider(handle, handle, viewType); + + let subscription: vscode.Disposable | undefined; + if (eventHandle !== undefined) { + subscription = provider.onDidChangeNotebookKernelSourceActions!(_ => this._proxy.$emitNotebookKernelSourceActionsChangeEvent(eventHandle)); + } return { dispose: () => { this._kernelSourceActionProviders.delete(handle); - that._proxy.$removeKernelSourceActionProvider(handle); + that._proxy.$removeKernelSourceActionProvider(handle, handle); + subscription?.dispose(); } }; } diff --git a/src/vs/workbench/contrib/notebook/browser/services/notebookKernelServiceImpl.ts b/src/vs/workbench/contrib/notebook/browser/services/notebookKernelServiceImpl.ts index eecb3b53ab6..faadb661ad5 100644 --- a/src/vs/workbench/contrib/notebook/browser/services/notebookKernelServiceImpl.ts +++ b/src/vs/workbench/contrib/notebook/browser/services/notebookKernelServiceImpl.ts @@ -384,6 +384,10 @@ export class NotebookKernelService extends Disposable implements INotebookKernel this._kernelSourceActionProviders.set(viewType, providers); this._onDidChangeSourceActions.fire({ viewType: viewType }); + const eventEmitterDisposable = provider.onDidChangeSourceActions?.(() => { + this._onDidChangeSourceActions.fire({ viewType: viewType }); + }); + return toDisposable(() => { const providers = this._kernelSourceActionProviders.get(viewType) ?? []; const idx = providers.indexOf(provider); @@ -391,6 +395,8 @@ export class NotebookKernelService extends Disposable implements INotebookKernel providers.splice(idx, 1); this._kernelSourceActionProviders.set(viewType, providers); } + + eventEmitterDisposable?.dispose(); }); } diff --git a/src/vs/workbench/contrib/notebook/common/notebookKernelService.ts b/src/vs/workbench/contrib/notebook/common/notebookKernelService.ts index 6775b86e1a7..5786526435f 100644 --- a/src/vs/workbench/contrib/notebook/common/notebookKernelService.ts +++ b/src/vs/workbench/contrib/notebook/common/notebookKernelService.ts @@ -87,6 +87,7 @@ export interface INotebookSourceActionChangeEvent { export interface IKernelSourceActionProvider { readonly viewType: string; + onDidChangeSourceActions?: Event; provideKernelSourceActions(): Promise; } diff --git a/src/vscode-dts/vscode.proposed.notebookKernelSource.d.ts b/src/vscode-dts/vscode.proposed.notebookKernelSource.d.ts index 3cd362a0b15..f20565262a6 100644 --- a/src/vscode-dts/vscode.proposed.notebookKernelSource.d.ts +++ b/src/vscode-dts/vscode.proposed.notebookKernelSource.d.ts @@ -22,6 +22,10 @@ declare module 'vscode' { } export interface NotebookKernelSourceActionProvider { + /** + * An optional event to signal that the kernel source actions have changed. + */ + onDidChangeNotebookKernelSourceActions?: Event; /** * Provide kernel source actions */