提交 55d26729 编写于 作者: J Johannes Rieken

have a clear separation between KernelProvider and Kernel

上级 6f1cfdba
......@@ -23,7 +23,7 @@ import { INotebookEditor } from 'vs/workbench/contrib/notebook/browser/notebookB
import { NotebookCellTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookCellTextModel';
import { NotebookTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookTextModel';
import { INotebookCellStatusBarService } from 'vs/workbench/contrib/notebook/common/notebookCellStatusBarService';
import { ACCESSIBLE_NOTEBOOK_DISPLAY_ORDER, CellEditType, DisplayOrderKey, ICellEditOperation, ICellRange, IEditor, IMainCellDto, INotebookDecorationRenderOptions, INotebookDocumentFilter, INotebookEditorModel, INotebookExclusiveDocumentFilter, NotebookCellsChangeType, NOTEBOOK_DISPLAY_ORDER, TransientMetadata } from 'vs/workbench/contrib/notebook/common/notebookCommon';
import { ACCESSIBLE_NOTEBOOK_DISPLAY_ORDER, CellEditType, DisplayOrderKey, ICellEditOperation, ICellRange, IEditor, IMainCellDto, INotebookDecorationRenderOptions, INotebookDocumentFilter, INotebookEditorModel, INotebookExclusiveDocumentFilter, INotebookKernelInfo2, NotebookCellsChangeType, NOTEBOOK_DISPLAY_ORDER, TransientMetadata } from 'vs/workbench/contrib/notebook/common/notebookCommon';
import { INotebookEditorModelResolverService } from 'vs/workbench/contrib/notebook/common/notebookEditorModelResolverService';
import { IMainNotebookController, INotebookService } from 'vs/workbench/contrib/notebook/common/notebookService';
import { IEditorGroup, IEditorGroupsService, preferredSideBySideGroupDirection } from 'vs/workbench/services/editor/common/editorGroupsService';
......@@ -140,6 +140,21 @@ export class MainThreadNotebooks extends Disposable implements MainThreadNoteboo
this.registerListeners();
}
dispose(): void {
super.dispose();
// remove all notebook providers
for (let item of this._notebookProviders.values()) {
item.disposable.dispose();
}
// remove all kernel providers
for (let item of this._notebookKernelProviders.values()) {
item.emitter.dispose();
item.provider.dispose();
}
}
async $tryApplyEdits(_viewType: string, resource: UriComponents, modelVersionId: number, cellEdits: ICellEditOperation[]): Promise<boolean> {
const textModel = this._notebookService.getNotebookTextModel(URI.from(resource));
if (!textModel) {
......@@ -512,38 +527,48 @@ export class MainThreadNotebooks extends Disposable implements MainThreadNoteboo
async $registerNotebookKernelProvider(extension: NotebookExtensionDescription, handle: number, documentFilter: INotebookDocumentFilter): Promise<void> {
const emitter = new Emitter<URI | undefined>();
const that = this;
const provider = this._notebookService.registerNotebookKernelProvider({
providerExtensionId: extension.id.value,
providerDescription: extension.description,
onDidChangeKernels: emitter.event,
selector: documentFilter,
provideKernels: async (uri: URI, token: CancellationToken) => {
const kernels = await that._proxy.$provideNotebookKernels(handle, uri, token);
return kernels.map(kernel => {
return {
...kernel,
providerHandle: handle
};
});
},
resolveKernel: (editorId: string, uri: URI, kernelId: string, token: CancellationToken) => {
return that._proxy.$resolveNotebookKernel(handle, editorId, uri, kernelId, token);
},
executeNotebook: (uri: URI, kernelId: string, cellHandle: number | undefined) => {
this.logService.debug('MainthreadNotebooks.registerNotebookKernelProvider#executeNotebook', uri.path, kernelId, cellHandle);
return that._proxy.$executeNotebookKernelFromProvider(handle, uri, kernelId, cellHandle);
},
cancelNotebook: (uri: URI, kernelId: string, cellHandle: number | undefined) => {
this.logService.debug('MainthreadNotebooks.registerNotebookKernelProvider#cancelNotebook', uri.path, kernelId, cellHandle);
return that._proxy.$cancelNotebookKernelFromProvider(handle, uri, kernelId, cellHandle);
},
});
this._notebookKernelProviders.set(handle, {
extension,
emitter,
provider
provideKernels: async (uri: URI, token: CancellationToken): Promise<INotebookKernelInfo2[]> => {
const result: INotebookKernelInfo2[] = [];
const kernelsDto = await that._proxy.$provideNotebookKernels(handle, uri, token);
for (const dto of kernelsDto) {
result.push({
id: dto.id,
friendlyId: dto.friendlyId,
label: dto.label,
extension: dto.extension,
extensionLocation: dto.extensionLocation,
providerHandle: dto.providerHandle,
description: dto.description,
detail: dto.detail,
isPreferred: dto.isPreferred,
preloads: dto.preloads,
supportedLanguages: dto.supportedLanguages,
resolve: (uri: URI, editorId: string, token: CancellationToken): Promise<void> => {
this.logService.debug('MainthreadNotebooks.resolveNotebookKernel', uri.path, dto.friendlyId);
return this._proxy.$resolveNotebookKernel(handle, editorId, uri, dto.friendlyId, token);
},
executeNotebookCell: (uri: URI, cellHandle: number | undefined): Promise<void> => {
this.logService.debug('MainthreadNotebooks.executeNotebookCell', uri.path, dto.friendlyId, cellHandle);
return this._proxy.$executeNotebookKernelFromProvider(handle, uri, dto.friendlyId, cellHandle);
},
cancelNotebookCell: (uri: URI, cellHandle: number | undefined): Promise<void> => {
this.logService.debug('MainthreadNotebooks.cancelNotebookCell', uri.path, dto.friendlyId, cellHandle);
return this._proxy.$cancelNotebookKernelFromProvider(handle, uri, dto.friendlyId, cellHandle);
}
});
}
return result;
}
});
this._notebookKernelProviders.set(handle, { extension, emitter, provider });
return;
}
......
......@@ -2108,7 +2108,7 @@ CommandsRegistry.registerCommand('_resolveNotebookKernels', async (accessor, arg
const notebookService = accessor.get<INotebookService>(INotebookService);
const uri = URI.revive(args.uri as UriComponents);
const source = new CancellationTokenSource();
const kernels = await notebookService.getContributedNotebookKernels(args.viewType, uri, source.token);
const kernels = await notebookService.getNotebookKernels(args.viewType, uri, source.token);
source.dispose();
return kernels.map(provider => ({
......
......@@ -774,7 +774,7 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditor
}
this._contributedKernelsComputePromise = createCancelablePromise(token => {
return this.notebookService.getContributedNotebookKernels(this.viewModel!.viewType, this.viewModel!.uri, token);
return this.notebookService.getNotebookKernels(this.viewModel!.viewType, this.viewModel!.uri, token);
});
const result = await this._contributedKernelsComputePromise;
......
......@@ -695,39 +695,14 @@ export class NotebookService extends Disposable implements INotebookService, ICu
});
}
async getContributedNotebookKernels(viewType: string, resource: URI, token: CancellationToken): Promise<INotebookKernelInfo2[]> {
async getNotebookKernels(viewType: string, resource: URI, token: CancellationToken): Promise<INotebookKernelInfo2[]> {
const filteredProvider = this.notebookKernelProviderInfoStore.get(viewType, resource);
const result = new Array<INotebookKernelInfo2[]>(filteredProvider.length);
const promises = filteredProvider.map(async (provider, index) => {
const data = await provider.provideKernels(resource, token);
result[index] = data.map(dto => {
return {
id: dto.id,
extension: dto.extension,
extensionLocation: URI.revive(dto.extensionLocation),
friendlyId: dto.friendlyId,
label: dto.label,
description: dto.description,
detail: dto.detail,
isPreferred: dto.isPreferred,
preloads: dto.preloads,
providerHandle: dto.providerHandle,
resolve: async (uri: URI, editorId: string, token: CancellationToken) => {
return provider.resolveKernel(editorId, uri, dto.friendlyId, token);
},
executeNotebookCell: async (uri: URI, handle: number | undefined) => {
return provider.executeNotebook(uri, dto.friendlyId, handle);
},
cancelNotebookCell: (uri: URI, handle: number | undefined): Promise<void> => {
return provider.cancelNotebook(uri, dto.friendlyId, handle);
}
};
});
result[index] = data;
});
await Promise.all(promises);
return flatten(result);
}
......
......@@ -738,10 +738,7 @@ export interface INotebookKernelProvider {
providerDescription?: string;
selector: INotebookDocumentFilter;
onDidChangeKernels: Event<URI | undefined>;
provideKernels(uri: URI, token: CancellationToken): Promise<INotebookKernelInfoDto2[]>;
resolveKernel(editorId: string, uri: UriComponents, kernelId: string, token: CancellationToken): Promise<void>;
executeNotebook(uri: URI, kernelId: string, handle: number | undefined): Promise<void>;
cancelNotebook(uri: URI, kernelId: string, handle: number | undefined): Promise<void>;
provideKernels(uri: URI, token: CancellationToken): Promise<INotebookKernelInfo2[]>;
}
export class CellSequence implements ISequence {
......
......@@ -52,7 +52,7 @@ export interface INotebookService {
getMimeTypeInfo(textModel: NotebookTextModel, output: IOutputDto): readonly IOrderedMimeType[];
registerNotebookKernelProvider(provider: INotebookKernelProvider): IDisposable;
getContributedNotebookKernels(viewType: string, resource: URI, token: CancellationToken): Promise<INotebookKernelInfo2[]>;
getNotebookKernels(viewType: string, resource: URI, token: CancellationToken): Promise<INotebookKernelInfo2[]>;
getContributedNotebookKernelProviders(): Promise<INotebookKernelProvider[]>;
getContributedNotebookOutputRenderers(id: string): NotebookOutputRendererInfo | undefined;
getRendererInfo(id: string): INotebookRendererInfo | undefined;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册