diff --git a/src/vs/workbench/api/browser/mainThreadNotebook.ts b/src/vs/workbench/api/browser/mainThreadNotebook.ts index 2c3105e5481..b0ab3866d5c 100644 --- a/src/vs/workbench/api/browser/mainThreadNotebook.ts +++ b/src/vs/workbench/api/browser/mainThreadNotebook.ts @@ -469,8 +469,8 @@ export class MainThreadNotebooks extends Disposable implements MainThreadNoteboo resolveKernel: (editorId: string, uri: URI, kernelId: string, token: CancellationToken) => { return that._proxy.$resolveNotebookKernel(handle, editorId, uri, kernelId, token); }, - executeNotebook: (viewType: string, uri: URI, kernelId: string, handle: number | undefined, token: CancellationToken) => { - return that._proxy.$executeNotebook2(kernelId, viewType, uri, handle, token); + executeNotebook: (uri: URI, kernelId: string, cellHandle: number | undefined, token: CancellationToken) => { + return that._proxy.$executeNotebookKernelFromProvider(handle, uri, kernelId, cellHandle, token); } }); this._notebookKernelProviders.set(handle, { @@ -527,8 +527,8 @@ export class MainThreadNotebooks extends Disposable implements MainThreadNoteboo await controller?.spliceNotebookCellOutputs(resource, cellHandle, splices, renderers); } - async executeNotebook(viewType: string, uri: URI, useAttachedKernel: boolean, token: CancellationToken): Promise { - return this._proxy.$executeNotebook(viewType, uri, undefined, useAttachedKernel, token); + async executeNotebookByAttachedKernel(viewType: string, uri: URI, token: CancellationToken): Promise { + return this._proxy.$executeNotebookByAttachedKernel(viewType, uri, undefined, token); } async $postMessage(editorId: string, forRendererId: string | undefined, value: any): Promise { @@ -691,8 +691,8 @@ export class MainThreadNotebookController implements IMainNotebookController { await mainthreadNotebook?.spliceNotebookCellOutputs(cellHandle, splices); } - async executeNotebook(viewType: string, uri: URI, useAttachedKernel: boolean, token: CancellationToken): Promise { - return this._mainThreadNotebook.executeNotebook(viewType, uri, useAttachedKernel, token); + async executeNotebookByAttachedKernel(viewType: string, uri: URI, token: CancellationToken): Promise { + return this._mainThreadNotebook.executeNotebookByAttachedKernel(viewType, uri, token); } onDidReceiveMessage(editorId: string, rendererType: string | undefined, message: unknown): void { @@ -739,8 +739,8 @@ export class MainThreadNotebookController implements IMainNotebookController { document?.textModel.updateNotebookCellMetadata(handle, metadata); } - async executeNotebookCell(uri: URI, handle: number, useAttachedKernel: boolean, token: CancellationToken): Promise { - return this._proxy.$executeNotebook(this._viewType, uri, handle, useAttachedKernel, token); + async executeNotebookCell(uri: URI, handle: number, token: CancellationToken): Promise { + return this._proxy.$executeNotebookByAttachedKernel(this._viewType, uri, handle, token); } async save(uri: URI, token: CancellationToken): Promise { diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index f374721483f..b004b04eb5f 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -1616,7 +1616,8 @@ export interface ExtHostNotebookShape { $resolveNotebookEditor(viewType: string, uri: UriComponents, editorId: string): Promise; $provideNotebookKernels(handle: number, uri: UriComponents, token: CancellationToken): Promise; $resolveNotebookKernel(handle: number, editorId: string, uri: UriComponents, kernelId: string, token: CancellationToken): Promise; - $executeNotebook(viewType: string, uri: UriComponents, cellHandle: number | undefined, useAttachedKernel: boolean, token: CancellationToken): Promise; + $executeNotebookByAttachedKernel(viewType: string, uri: UriComponents, cellHandle: number | undefined, token: CancellationToken): Promise; + $executeNotebookKernelFromProvider(handle: number, uri: UriComponents, kernelId: string, cellHandle: number | undefined, token: CancellationToken): Promise; $executeNotebook2(kernelId: string, viewType: string, uri: UriComponents, cellHandle: number | undefined, token: CancellationToken): Promise; $saveNotebook(viewType: string, uri: UriComponents, token: CancellationToken): Promise; $saveNotebookAs(viewType: string, uri: UriComponents, target: UriComponents, token: CancellationToken): Promise; diff --git a/src/vs/workbench/api/common/extHostNotebook.ts b/src/vs/workbench/api/common/extHostNotebook.ts index 207ced9580f..afbee0f057e 100644 --- a/src/vs/workbench/api/common/extHostNotebook.ts +++ b/src/vs/workbench/api/common/extHostNotebook.ts @@ -131,7 +131,7 @@ export class ExtHostCell extends Disposable implements vscode.NotebookCell { start: diff.start, toInsert: diff.toInsert.map((output): IProcessedOutput => { if (output.outputKind === CellOutputKind.Rich) { - const uuid = generateUuid(); + const uuid = UUID.generateUuid(); this._outputMapping.set(output, uuid); return { ...output, outputId: uuid }; } @@ -816,6 +816,7 @@ export class ExtHostNotebookKernelProviderAdapter extends Disposable { id, label: kernel.label, extension: this._extension.identifier, + extensionLocation: this._extension.extensionLocation, description: kernel.description, isPreferred: kernel.isPreferred, preloads: kernel.preloads @@ -839,6 +840,20 @@ export class ExtHostNotebookKernelProviderAdapter extends Disposable { return this._provider.resolveKernel(kernel, document, webview, token); } } + + async executeNotebook(kernelId: string, document: ExtHostNotebookDocument, cell: ExtHostCell | undefined, token: CancellationToken) { + const kernel = this._idToKernel.get(kernelId); + + if (!kernel) { + return; + } + + if (cell) { + return kernel.executeCell(document, cell, token); + } else { + return kernel.executeAllCells(document, token); + } + } } export class ExtHostNotebookController implements ExtHostNotebookShape, ExtHostNotebookOutputRenderingHandler { @@ -1214,7 +1229,7 @@ export class ExtHostNotebookController implements ExtHostNotebookShape, ExtHostN } } - async $executeNotebook(viewType: string, uri: UriComponents, cellHandle: number | undefined, useAttachedKernel: boolean, token: CancellationToken): Promise { + async $executeNotebookByAttachedKernel(viewType: string, uri: UriComponents, cellHandle: number | undefined, token: CancellationToken): Promise { let document = this._documents.get(URI.revive(uri).toString()); if (!document) { @@ -1225,7 +1240,7 @@ export class ExtHostNotebookController implements ExtHostNotebookShape, ExtHostN const cell = cellHandle !== undefined ? document.getCell(cellHandle) : undefined; const provider = this._notebookContentProviders.get(viewType)!.provider; - if (provider.kernel && useAttachedKernel) { + if (provider.kernel) { if (cell) { return provider.kernel.executeCell(document, cell, token); } else { @@ -1235,6 +1250,14 @@ export class ExtHostNotebookController implements ExtHostNotebookShape, ExtHostN } } + async $executeNotebookKernelFromProvider(handle: number, uri: UriComponents, kernelId: string, cellHandle: number | undefined, token: CancellationToken): Promise { + await this._withAdapter(handle, uri, async (adapter, document) => { + let cell = cellHandle !== undefined ? document.getCell(cellHandle) : undefined; + + return adapter.executeNotebook(kernelId, document, cell, token); + }); + } + async $executeNotebook2(kernelId: string, viewType: string, uri: UriComponents, cellHandle: number | undefined, token: CancellationToken): Promise { let document = this._documents.get(URI.revive(uri).toString()); diff --git a/src/vs/workbench/contrib/notebook/browser/notebookEditorWidget.ts b/src/vs/workbench/contrib/notebook/browser/notebookEditorWidget.ts index 455292d7f76..4c40d8acdf5 100644 --- a/src/vs/workbench/contrib/notebook/browser/notebookEditorWidget.ts +++ b/src/vs/workbench/contrib/notebook/browser/notebookEditorWidget.ts @@ -577,7 +577,7 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditor if (kernelsFromSameExtension.length) { const preferedKernel = kernelsFromSameExtension.find(kernel => kernel.isPreferred) || kernelsFromSameExtension[0]; this.activeKernel = preferedKernel; - await this.notebookService.resolveNotebookKernel(this.viewModel!.viewType, this.viewModel!.uri, this.getId(), preferedKernel.id); + await preferedKernel.resolve(this.viewModel!.uri, this.getId()); return; } @@ -1152,14 +1152,12 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditor if (this._activeKernel) { // TODO@rebornix temp any cast, should be removed once we remove legacy kernel support if ((this._activeKernel as any).executeNotebook) { - await (this._activeKernel as INotebookKernelInfo2).executeNotebook(this._notebookViewModel!.viewType, this._notebookViewModel!.uri, undefined, tokenSource.token); + await (this._activeKernel as INotebookKernelInfo2).executeNotebook(this._notebookViewModel!.uri, undefined, tokenSource.token); } else { await this.notebookService.executeNotebook2(this._notebookViewModel!.viewType, this._notebookViewModel!.uri, this._activeKernel.id, tokenSource.token); } } else if (provider.kernel) { - return await this.notebookService.executeNotebook(viewType, notebookUri, true, tokenSource.token); - } else { - return await this.notebookService.executeNotebook(viewType, notebookUri, false, tokenSource.token); + return await this.notebookService.executeNotebook(viewType, notebookUri, tokenSource.token); } } @@ -1207,11 +1205,15 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditor const notebookUri = this._notebookViewModel!.uri; if (this._activeKernel) { - return await this.notebookService.executeNotebookCell2(viewType, notebookUri, cell.handle, this._activeKernel.id, tokenSource.token); + // TODO@rebornix temp any cast, should be removed once we remove legacy kernel support + if ((this._activeKernel as any).executeNotebook) { + await (this._activeKernel as INotebookKernelInfo2).executeNotebook(this._notebookViewModel!.uri, cell.handle, tokenSource.token); + } else { + + return await this.notebookService.executeNotebookCell2(viewType, notebookUri, cell.handle, this._activeKernel.id, tokenSource.token); + } } else if (provider.kernel) { - return await this.notebookService.executeNotebookCell(viewType, notebookUri, cell.handle, true, tokenSource.token); - } else { - return await this.notebookService.executeNotebookCell(viewType, notebookUri, cell.handle, false, tokenSource.token); + return await this.notebookService.executeNotebookCell(viewType, notebookUri, cell.handle, tokenSource.token); } } } finally { diff --git a/src/vs/workbench/contrib/notebook/browser/notebookServiceImpl.ts b/src/vs/workbench/contrib/notebook/browser/notebookServiceImpl.ts index de10434e01f..20ec35b2b6e 100644 --- a/src/vs/workbench/contrib/notebook/browser/notebookServiceImpl.ts +++ b/src/vs/workbench/contrib/notebook/browser/notebookServiceImpl.ts @@ -10,7 +10,7 @@ import { notebookProviderExtensionPoint, notebookRendererExtensionPoint, INotebo import { NotebookProviderInfo, NotebookEditorDescriptor } from 'vs/workbench/contrib/notebook/common/notebookProvider'; import { NotebookExtensionDescription } from 'vs/workbench/api/common/extHost.protocol'; import { Emitter, Event } from 'vs/base/common/event'; -import { INotebookTextModel, INotebookRendererInfo, NotebookDocumentMetadata, ICellDto2, INotebookKernelInfo, CellOutputKind, ITransformedDisplayOutputDto, IDisplayOutput, ACCESSIBLE_NOTEBOOK_DISPLAY_ORDER, NOTEBOOK_DISPLAY_ORDER, sortMimeTypes, IOrderedMimeType, mimeTypeSupportedByCore, IOutputRenderRequestOutputInfo, IOutputRenderRequestCellInfo, NotebookCellOutputsSplice, ICellEditOperation, CellEditType, ICellInsertEdit, IOutputRenderResponse, IProcessedOutput, BUILTIN_RENDERER_ID, NotebookEditorPriority, INotebookKernelProvider, INotebookKernelInfoDto2, notebookDocumentFilterMatch, INotebookKernelInfo2 } from 'vs/workbench/contrib/notebook/common/notebookCommon'; +import { INotebookTextModel, INotebookRendererInfo, NotebookDocumentMetadata, ICellDto2, INotebookKernelInfo, CellOutputKind, ITransformedDisplayOutputDto, IDisplayOutput, ACCESSIBLE_NOTEBOOK_DISPLAY_ORDER, NOTEBOOK_DISPLAY_ORDER, sortMimeTypes, IOrderedMimeType, mimeTypeSupportedByCore, IOutputRenderRequestOutputInfo, IOutputRenderRequestCellInfo, NotebookCellOutputsSplice, ICellEditOperation, CellEditType, ICellInsertEdit, IOutputRenderResponse, IProcessedOutput, BUILTIN_RENDERER_ID, NotebookEditorPriority, INotebookKernelProvider, notebookDocumentFilterMatch, INotebookKernelInfo2 } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; import { NotebookOutputRendererInfo } from 'vs/workbench/contrib/notebook/common/notebookOutputRenderer'; import { Iterable } from 'vs/base/common/iterator'; @@ -329,8 +329,8 @@ export class NotebookService extends Disposable implements INotebookService, ICu const tokenSource = new CancellationTokenSource(); return provider.resolveKernel(editorId, uri, dto.id, tokenSource.token); }, - executeNotebook: async (viewType: string, uri: URI, handle: number | undefined, token: CancellationToken) => { - return provider.executeNotebook(viewType, uri, dto.id, handle, token); + executeNotebook: async (uri: URI, handle: number | undefined, token: CancellationToken) => { + return provider.executeNotebook(uri, dto.id, handle, token); } }; }); @@ -674,20 +674,20 @@ export class NotebookService extends Disposable implements INotebookService, ICu return this.notebookRenderersInfoStore.getContributedRenderer(mimeType); } - async executeNotebook(viewType: string, uri: URI, useAttachedKernel: boolean, token: CancellationToken): Promise { + async executeNotebook(viewType: string, uri: URI, token: CancellationToken): Promise { let provider = this._notebookProviders.get(viewType); if (provider) { - return provider.controller.executeNotebook(viewType, uri, useAttachedKernel, token); + return provider.controller.executeNotebookByAttachedKernel(viewType, uri, token); } return; } - async executeNotebookCell(viewType: string, uri: URI, handle: number, useAttachedKernel: boolean, token: CancellationToken): Promise { + async executeNotebookCell(viewType: string, uri: URI, handle: number, token: CancellationToken): Promise { const provider = this._notebookProviders.get(viewType); if (provider) { - await provider.controller.executeNotebookCell(uri, handle, useAttachedKernel, token); + await provider.controller.executeNotebookCell(uri, handle, token); } } diff --git a/src/vs/workbench/contrib/notebook/common/notebookCommon.ts b/src/vs/workbench/contrib/notebook/common/notebookCommon.ts index af897bdda94..5d335272c7f 100644 --- a/src/vs/workbench/contrib/notebook/common/notebookCommon.ts +++ b/src/vs/workbench/contrib/notebook/common/notebookCommon.ts @@ -648,7 +648,7 @@ export interface INotebookKernelInfoDto2 { export interface INotebookKernelInfo2 extends INotebookKernelInfoDto2 { resolve(uri: URI, editorId: string): Promise; - executeNotebook(viewType: string, uri: URI, handle: number | undefined, token: CancellationToken): Promise; + executeNotebook(uri: URI, handle: number | undefined, token: CancellationToken): Promise; } export interface INotebookKernelProvider { @@ -656,5 +656,5 @@ export interface INotebookKernelProvider { onDidChangeKernels: Event; provideKernels(uri: URI, token: CancellationToken): Promise; resolveKernel(editorId: string, uri: UriComponents, kernelId: string, token: CancellationToken): Promise; - executeNotebook(viewType: string, uri: URI, kernelId: string, handle: number | undefined, token: CancellationToken): Promise; + executeNotebook(uri: URI, kernelId: string, handle: number | undefined, token: CancellationToken): Promise; } diff --git a/src/vs/workbench/contrib/notebook/common/notebookService.ts b/src/vs/workbench/contrib/notebook/common/notebookService.ts index 104d3459086..4ca02503000 100644 --- a/src/vs/workbench/contrib/notebook/common/notebookService.ts +++ b/src/vs/workbench/contrib/notebook/common/notebookService.ts @@ -8,7 +8,10 @@ import { URI } from 'vs/base/common/uri'; import { NotebookProviderInfo } from 'vs/workbench/contrib/notebook/common/notebookProvider'; import { NotebookExtensionDescription } from 'vs/workbench/api/common/extHost.protocol'; import { Event } from 'vs/base/common/event'; -import { INotebookTextModel, INotebookRendererInfo, NotebookDocumentMetadata, ICellDto2, INotebookKernelInfo, INotebookKernelInfoDto, INotebookTextModelBackup, IEditor, ICellEditOperation, NotebookCellOutputsSplice, IOrderedMimeType, IProcessedOutput, INotebookKernelProvider, INotebookKernelInfoDto2 } from 'vs/workbench/contrib/notebook/common/notebookCommon'; +import { + INotebookTextModel, INotebookRendererInfo, NotebookDocumentMetadata, ICellDto2, INotebookKernelInfo, INotebookKernelInfoDto, INotebookTextModelBackup, + IEditor, ICellEditOperation, NotebookCellOutputsSplice, IOrderedMimeType, IProcessedOutput, INotebookKernelProvider, INotebookKernelInfo2 +} from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { NotebookTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookTextModel'; import { CancellationToken } from 'vs/base/common/cancellation'; import { NotebookCellTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookCellTextModel'; @@ -21,9 +24,9 @@ export interface IMainNotebookController { kernel: INotebookKernelInfoDto | undefined; createNotebook(viewType: string, uri: URI, backup: INotebookTextModelBackup | undefined, forceReload: boolean, editorId?: string, backupId?: string): Promise; resolveNotebookEditor(viewType: string, uri: URI, editorId: string): Promise; - executeNotebook(viewType: string, uri: URI, useAttachedKernel: boolean, token: CancellationToken): Promise; + executeNotebookByAttachedKernel(viewType: string, uri: URI, token: CancellationToken): Promise; onDidReceiveMessage(editorId: string, rendererType: string | undefined, message: any): void; - executeNotebookCell(uri: URI, handle: number, useAttachedKernel: boolean, token: CancellationToken): Promise; + executeNotebookCell(uri: URI, handle: number, token: CancellationToken): Promise; removeNotebookDocument(notebook: INotebookTextModel): Promise; save(uri: URI, token: CancellationToken): Promise; saveAs(uri: URI, target: URI, token: CancellationToken): Promise; @@ -51,12 +54,12 @@ export interface INotebookService { unregisterNotebookKernel(id: string): void; registerNotebookKernelProvider(provider: INotebookKernelProvider): IDisposable; getContributedNotebookKernels(viewType: string, resource: URI): readonly INotebookKernelInfo[]; - getContributedNotebookKernels2(viewType: string, resource: URI, token: CancellationToken): Promise; + getContributedNotebookKernels2(viewType: string, resource: URI, token: CancellationToken): Promise; getRendererInfo(id: string): INotebookRendererInfo | undefined; resolveNotebook(viewType: string, uri: URI, forceReload: boolean, editorId?: string, backupId?: string): Promise; createNotebookFromBackup(viewType: string, uri: URI, metadata: NotebookDocumentMetadata, languages: string[], cells: ICellDto2[], editorId?: string): Promise; - executeNotebook(viewType: string, uri: URI, useAttachedKernel: boolean, token: CancellationToken): Promise; - executeNotebookCell(viewType: string, uri: URI, handle: number, useAttachedKernel: boolean, token: CancellationToken): Promise; + executeNotebook(viewType: string, uri: URI, token: CancellationToken): Promise; + executeNotebookCell(viewType: string, uri: URI, handle: number, token: CancellationToken): Promise; executeNotebook2(viewType: string, uri: URI, kernelId: string, token: CancellationToken): Promise; executeNotebookCell2(viewType: string, uri: URI, handle: number, kernelId: string, token: CancellationToken): Promise; getContributedNotebookProviders(resource: URI): readonly NotebookProviderInfo[];