Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support kernel source actions update. #171781

Merged
merged 1 commit into from Jan 20, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
23 changes: 21 additions & 2 deletions src/vs/workbench/api/browser/mainThreadNotebookKernels.ts
Expand Up @@ -115,6 +115,8 @@ export class MainThreadNotebookKernels implements MainThreadNotebookKernelsShape
private readonly _kernels = new Map<number, [kernel: MainThreadKernel, registraion: IDisposable]>();
private readonly _kernelDetectionTasks = new Map<number, [task: MainThreadKernelDetectionTask, registraion: IDisposable]>();
private readonly _kernelSourceActionProviders = new Map<number, [provider: IKernelSourceActionProvider, registraion: IDisposable]>();
private readonly _kernelSourceActionProvidersEventRegistrations = new Map<number, IDisposable>();

private readonly _proxy: ExtHostNotebookKernelsShape;

private readonly _executions = new Map<number, INotebookCellExecution>();
Expand Down Expand Up @@ -314,7 +316,7 @@ export class MainThreadNotebookKernels implements MainThreadNotebookKernelsShape

// --- notebook kernel source action provider

async $addKernelSourceActionProvider(handle: number, notebookType: string): Promise<void> {
async $addKernelSourceActionProvider(handle: number, eventHandle: number, notebookType: string): Promise<void> {
const kernelSourceActionProvider: IKernelSourceActionProvider = {
viewType: notebookType,
provideKernelSourceActions: async () => {
Expand All @@ -336,15 +338,32 @@ export class MainThreadNotebookKernels implements MainThreadNotebookKernelsShape
});
}
};

if (typeof eventHandle === 'number') {
const emitter = new Emitter<void>();
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);
}
}
}
5 changes: 3 additions & 2 deletions src/vs/workbench/api/common/extHost.protocol.ts
Expand Up @@ -1055,8 +1055,9 @@ export interface MainThreadNotebookKernelsShape extends IDisposable {
$addKernelDetectionTask(handle: number, notebookType: string): Promise<void>;
$removeKernelDetectionTask(handle: number): void;

$addKernelSourceActionProvider(handle: number, notebookType: string): Promise<void>;
$removeKernelSourceActionProvider(handle: number): void;
$addKernelSourceActionProvider(handle: number, eventHandle: number, notebookType: string): Promise<void>;
$removeKernelSourceActionProvider(handle: number, eventHandle: number): void;
$emitNotebookKernelSourceActionsChangeEvent(eventHandle: number): void;
}

export interface MainThreadNotebookRenderersShape extends IDisposable {
Expand Down
11 changes: 9 additions & 2 deletions src/vs/workbench/api/common/extHostNotebookKernels.ts
Expand Up @@ -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();
}
};
}
Expand Down
Expand Up @@ -384,13 +384,19 @@ 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);
if (idx >= 0) {
providers.splice(idx, 1);
this._kernelSourceActionProviders.set(viewType, providers);
}

eventEmitterDisposable?.dispose();
});
}

Expand Down
Expand Up @@ -87,6 +87,7 @@ export interface INotebookSourceActionChangeEvent {

export interface IKernelSourceActionProvider {
readonly viewType: string;
onDidChangeSourceActions?: Event<void>;
provideKernelSourceActions(): Promise<INotebookKernelSourceAction[]>;
}

Expand Down
4 changes: 4 additions & 0 deletions src/vscode-dts/vscode.proposed.notebookKernelSource.d.ts
Expand Up @@ -22,6 +22,10 @@ declare module 'vscode' {
}

export interface NotebookKernelSourceActionProvider {
/**
* An optional event to signal that the kernel source actions have changed.
*/
onDidChangeNotebookKernelSourceActions?: Event<void>;
/**
* Provide kernel source actions
*/
Expand Down