mirror of
https://github.com/microsoft/vscode.git
synced 2026-04-21 00:59:03 +01:00
remove NotebookKernelProvider API and its implementation
This commit is contained in:
@@ -7,17 +7,15 @@ import { CancellationToken, CancellationTokenSource } from 'vs/base/common/cance
|
||||
import { Emitter, Event } from 'vs/base/common/event';
|
||||
import { Disposable, DisposableStore, IDisposable, toDisposable } from 'vs/base/common/lifecycle';
|
||||
import { URI, UriComponents } from 'vs/base/common/uri';
|
||||
import * as UUID from 'vs/base/common/uuid';
|
||||
import { IExtensionDescription } from 'vs/platform/extensions/common/extensions';
|
||||
import { ExtHostNotebookShape, IMainContext, IModelAddedData, INotebookCellStatusBarListDto, INotebookDocumentPropertiesChangeData, INotebookDocumentsAndEditorsDelta, INotebookDocumentShowOptions, INotebookEditorAddData, INotebookEditorPropertiesChangeData, INotebookEditorViewColumnInfo, INotebookKernelInfoDto2, MainContext, MainThreadNotebookDocumentsShape, MainThreadNotebookEditorsShape, MainThreadNotebookShape } from 'vs/workbench/api/common/extHost.protocol';
|
||||
import { ExtHostNotebookShape, IMainContext, IModelAddedData, INotebookCellStatusBarListDto, INotebookDocumentPropertiesChangeData, INotebookDocumentsAndEditorsDelta, INotebookDocumentShowOptions, INotebookEditorAddData, INotebookEditorPropertiesChangeData, INotebookEditorViewColumnInfo, MainContext, MainThreadNotebookDocumentsShape, MainThreadNotebookEditorsShape, MainThreadNotebookShape } from 'vs/workbench/api/common/extHost.protocol';
|
||||
import { ILogService } from 'vs/platform/log/common/log';
|
||||
import { CommandsConverter, ExtHostCommands } from 'vs/workbench/api/common/extHostCommands';
|
||||
import { ExtHostDocumentsAndEditors } from 'vs/workbench/api/common/extHostDocumentsAndEditors';
|
||||
import { IExtensionStoragePaths } from 'vs/workbench/api/common/extHostStoragePaths';
|
||||
import * as typeConverters from 'vs/workbench/api/common/extHostTypeConverters';
|
||||
import * as extHostTypes from 'vs/workbench/api/common/extHostTypes';
|
||||
import { asWebviewUri, WebviewInitData } from 'vs/workbench/api/common/shared/webview';
|
||||
import { CellEditType, ICellRange, INotebookExclusiveDocumentFilter, NotebookCellsChangedEventDto, NotebookCellsChangeType, NotebookDataDto, NullablePartialNotebookCellMetadata, IImmediateCellEditOperation } from 'vs/workbench/contrib/notebook/common/notebookCommon';
|
||||
import { CellEditType, INotebookExclusiveDocumentFilter, NotebookCellsChangedEventDto, NotebookCellsChangeType, NotebookDataDto, NullablePartialNotebookCellMetadata, IImmediateCellEditOperation } from 'vs/workbench/contrib/notebook/common/notebookCommon';
|
||||
import type * as vscode from 'vscode';
|
||||
import { ResourceMap } from 'vs/base/common/map';
|
||||
import { ExtHostCell, ExtHostNotebookDocument } from './extHostNotebookDocument';
|
||||
@@ -30,162 +28,6 @@ import { hash } from 'vs/base/common/hash';
|
||||
import { ExtHostDocuments } from 'vs/workbench/api/common/extHostDocuments';
|
||||
import { Cache } from 'vs/workbench/api/common/cache';
|
||||
|
||||
class ExtHostWebviewCommWrapper extends Disposable {
|
||||
private readonly _onDidReceiveDocumentMessage = new Emitter<any>();
|
||||
private readonly _rendererIdToEmitters = new Map<string, Emitter<any>>();
|
||||
|
||||
constructor(
|
||||
private _editorId: string,
|
||||
public uri: URI,
|
||||
private _proxy: MainThreadNotebookShape,
|
||||
private _webviewInitData: WebviewInitData,
|
||||
public document: ExtHostNotebookDocument,
|
||||
) {
|
||||
super();
|
||||
}
|
||||
|
||||
public onDidReceiveMessage(forRendererId: string | undefined, message: any) {
|
||||
this._onDidReceiveDocumentMessage.fire(message);
|
||||
if (forRendererId !== undefined) {
|
||||
this._rendererIdToEmitters.get(forRendererId)?.fire(message);
|
||||
}
|
||||
}
|
||||
|
||||
public readonly contentProviderComm: vscode.NotebookCommunication = {
|
||||
editorId: this._editorId,
|
||||
onDidReceiveMessage: this._onDidReceiveDocumentMessage.event,
|
||||
postMessage: (message: any) => this._proxy.$postMessage(this._editorId, undefined, message),
|
||||
asWebviewUri: (uri: vscode.Uri) => this._asWebviewUri(uri),
|
||||
};
|
||||
|
||||
public getRendererComm(rendererId: string): vscode.NotebookCommunication {
|
||||
const emitter = new Emitter<any>();
|
||||
this._rendererIdToEmitters.set(rendererId, emitter);
|
||||
return {
|
||||
editorId: this._editorId,
|
||||
onDidReceiveMessage: emitter.event,
|
||||
postMessage: (message: any) => this._proxy.$postMessage(this._editorId, rendererId, message),
|
||||
asWebviewUri: (uri: vscode.Uri) => this._asWebviewUri(uri),
|
||||
};
|
||||
}
|
||||
|
||||
private _asWebviewUri(localResource: vscode.Uri): vscode.Uri {
|
||||
return asWebviewUri(this._webviewInitData, this._editorId, localResource);
|
||||
}
|
||||
}
|
||||
|
||||
export class ExtHostNotebookKernelProviderAdapter extends Disposable {
|
||||
private _kernelToFriendlyId = new ResourceMap<Map<vscode.NotebookKernel, string>>();
|
||||
private _friendlyIdToKernel = new ResourceMap<Map<string, vscode.NotebookKernel>>();
|
||||
constructor(
|
||||
private readonly _proxy: MainThreadNotebookShape,
|
||||
private readonly _handle: number,
|
||||
private readonly _extension: IExtensionDescription,
|
||||
private readonly _provider: vscode.NotebookKernelProvider
|
||||
) {
|
||||
super();
|
||||
|
||||
if (this._provider.onDidChangeKernels) {
|
||||
this._register(this._provider.onDidChangeKernels((e: vscode.NotebookDocument | undefined) => {
|
||||
const uri = e?.uri;
|
||||
this._proxy.$onNotebookKernelChange(this._handle, uri);
|
||||
}));
|
||||
}
|
||||
}
|
||||
|
||||
async provideKernels(document: ExtHostNotebookDocument, token: vscode.CancellationToken): Promise<INotebookKernelInfoDto2[]> {
|
||||
const data = await this._provider.provideKernels(document.notebookDocument, token) || [];
|
||||
|
||||
const newMap = new Map<vscode.NotebookKernel, string>();
|
||||
let kernel_unique_pool = 0;
|
||||
const kernelFriendlyIdCache = new Set<string>();
|
||||
|
||||
const kernelToFriendlyId = this._kernelToFriendlyId.get(document.uri);
|
||||
|
||||
const transformedData: INotebookKernelInfoDto2[] = data.map(kernel => {
|
||||
let friendlyId = kernelToFriendlyId?.get(kernel);
|
||||
if (friendlyId === undefined) {
|
||||
if (kernel.id && kernelFriendlyIdCache.has(kernel.id)) {
|
||||
friendlyId = `${this._extension.identifier.value}_${kernel.id}_${kernel_unique_pool++}`;
|
||||
} else {
|
||||
friendlyId = `${this._extension.identifier.value}_${kernel.id || UUID.generateUuid()}`;
|
||||
}
|
||||
}
|
||||
|
||||
newMap.set(kernel, friendlyId);
|
||||
|
||||
return {
|
||||
id: kernel.id,
|
||||
friendlyId: friendlyId,
|
||||
label: kernel.label,
|
||||
extension: this._extension.identifier,
|
||||
extensionLocation: this._extension.extensionLocation,
|
||||
providerHandle: this._handle,
|
||||
description: kernel.description,
|
||||
detail: kernel.detail,
|
||||
isPreferred: kernel.isPreferred,
|
||||
preloads: kernel.preloads?.map(preload => {
|
||||
// todo@connor4312: back compat on 2020-04-12, remove after transition
|
||||
if (URI.isUri(preload)) {
|
||||
preload = { uri: preload, provides: [] };
|
||||
}
|
||||
|
||||
return {
|
||||
uri: preload.uri, provides: typeof preload.provides === 'string'
|
||||
? [preload.provides]
|
||||
: preload.provides === undefined
|
||||
? []
|
||||
: preload.provides
|
||||
};
|
||||
}),
|
||||
supportedLanguages: kernel.supportedLanguages,
|
||||
implementsInterrupt: !!kernel.interrupt
|
||||
};
|
||||
});
|
||||
|
||||
this._kernelToFriendlyId.set(document.uri, newMap);
|
||||
const friendlyIdToKernel = new Map<string, vscode.NotebookKernel>();
|
||||
newMap.forEach((value, key) => {
|
||||
friendlyIdToKernel.set(value, key);
|
||||
});
|
||||
|
||||
this._friendlyIdToKernel.set(document.uri, friendlyIdToKernel);
|
||||
return transformedData;
|
||||
}
|
||||
|
||||
getKernelByFriendlyId(uri: URI, kernelId: string) {
|
||||
return this._friendlyIdToKernel.get(uri)?.get(kernelId);
|
||||
}
|
||||
|
||||
async resolveNotebook(kernelId: string, document: ExtHostNotebookDocument, webview: vscode.NotebookCommunication, token: CancellationToken) {
|
||||
const kernel = this._friendlyIdToKernel.get(document.uri)?.get(kernelId);
|
||||
|
||||
if (kernel && this._provider.resolveKernel) {
|
||||
return this._provider.resolveKernel(kernel, document.notebookDocument, webview, token);
|
||||
}
|
||||
}
|
||||
|
||||
async executeNotebook(kernelId: string, document: ExtHostNotebookDocument, cellRange: ICellRange[]): Promise<void> {
|
||||
const kernel = this._friendlyIdToKernel.get(document.uri)?.get(kernelId);
|
||||
|
||||
if (!kernel) {
|
||||
return;
|
||||
}
|
||||
|
||||
const extCellRange = cellRange.map(c => typeConverters.NotebookRange.to(c));
|
||||
return kernel.executeCellsRequest(document.notebookDocument, extCellRange);
|
||||
}
|
||||
|
||||
async interruptNotebookExecution(kernelId: string, document: ExtHostNotebookDocument): Promise<void> {
|
||||
const kernel = this._friendlyIdToKernel.get(document.uri)?.get(kernelId);
|
||||
|
||||
if (!kernel || !kernel.interrupt) {
|
||||
return;
|
||||
}
|
||||
|
||||
return kernel.interrupt(document.notebookDocument);
|
||||
}
|
||||
}
|
||||
|
||||
export class NotebookEditorDecorationType {
|
||||
|
||||
@@ -213,7 +55,6 @@ type NotebookContentProviderData = {
|
||||
};
|
||||
|
||||
export class ExtHostNotebookController implements ExtHostNotebookShape {
|
||||
private static _notebookKernelProviderHandlePool: number = 0;
|
||||
private static _notebookStatusBarItemProviderHandlePool: number = 0;
|
||||
|
||||
private readonly _notebookProxy: MainThreadNotebookShape;
|
||||
@@ -221,11 +62,9 @@ export class ExtHostNotebookController implements ExtHostNotebookShape {
|
||||
private readonly _notebookEditorsProxy: MainThreadNotebookEditorsShape;
|
||||
|
||||
private readonly _notebookContentProviders = new Map<string, NotebookContentProviderData>();
|
||||
private readonly _notebookKernelProviders = new Map<number, ExtHostNotebookKernelProviderAdapter>();
|
||||
private readonly _notebookStatusBarItemProviders = new Map<number, vscode.NotebookCellStatusBarItemProvider>();
|
||||
private readonly _documents = new ResourceMap<ExtHostNotebookDocument>();
|
||||
private readonly _editors = new Map<string, ExtHostNotebookEditor>();
|
||||
private readonly _webviewComm = new Map<string, ExtHostWebviewCommWrapper>();
|
||||
private readonly _commandsConverter: CommandsConverter;
|
||||
private readonly _onDidChangeNotebookEditorSelection = new Emitter<vscode.NotebookEditorSelectionChangeEvent>();
|
||||
readonly onDidChangeNotebookEditorSelection = this._onDidChangeNotebookEditorSelection.event;
|
||||
@@ -259,8 +98,6 @@ export class ExtHostNotebookController implements ExtHostNotebookShape {
|
||||
onDidCloseNotebookDocument: Event<vscode.NotebookDocument> = this._onDidCloseNotebookDocument.event;
|
||||
private _onDidSaveNotebookDocument = new Emitter<vscode.NotebookDocument>();
|
||||
onDidSaveNotebookDocument: Event<vscode.NotebookDocument> = this._onDidSaveNotebookDocument.event;
|
||||
private _onDidChangeActiveNotebookKernel = new Emitter<{ document: vscode.NotebookDocument, kernel: vscode.NotebookKernel | undefined; }>();
|
||||
onDidChangeActiveNotebookKernel = this._onDidChangeActiveNotebookKernel.event;
|
||||
private _onDidChangeVisibleNotebookEditors = new Emitter<vscode.NotebookEditor[]>();
|
||||
onDidChangeVisibleNotebookEditors = this._onDidChangeVisibleNotebookEditors.event;
|
||||
|
||||
@@ -273,7 +110,6 @@ export class ExtHostNotebookController implements ExtHostNotebookShape {
|
||||
commands: ExtHostCommands,
|
||||
private _textDocumentsAndEditors: ExtHostDocumentsAndEditors,
|
||||
private _textDocuments: ExtHostDocuments,
|
||||
private readonly _webviewInitData: WebviewInitData,
|
||||
private readonly logService: ILogService,
|
||||
private readonly _extensionStoragePaths: IExtensionStoragePaths,
|
||||
) {
|
||||
@@ -388,22 +224,6 @@ export class ExtHostNotebookController implements ExtHostNotebookShape {
|
||||
});
|
||||
}
|
||||
|
||||
registerNotebookKernelProvider(extension: IExtensionDescription, selector: vscode.NotebookDocumentFilter, provider: vscode.NotebookKernelProvider) {
|
||||
const handle = ExtHostNotebookController._notebookKernelProviderHandlePool++;
|
||||
const adapter = new ExtHostNotebookKernelProviderAdapter(this._notebookProxy, handle, extension, provider);
|
||||
this._notebookKernelProviders.set(handle, adapter);
|
||||
this._notebookProxy.$registerNotebookKernelProvider({ id: extension.identifier, location: extension.extensionLocation, description: extension.description }, handle, {
|
||||
viewType: selector.viewType,
|
||||
filenamePattern: selector.filenamePattern ? typeConverters.NotebookExclusiveDocumentPattern.from(selector.filenamePattern) : undefined
|
||||
});
|
||||
|
||||
return new extHostTypes.Disposable(() => {
|
||||
adapter.dispose();
|
||||
this._notebookKernelProviders.delete(handle);
|
||||
this._notebookProxy.$unregisterNotebookKernelProvider(handle);
|
||||
});
|
||||
}
|
||||
|
||||
registerNotebookCellStatusBarItemProvider(extension: IExtensionDescription, selector: vscode.NotebookDocumentFilter, provider: vscode.NotebookCellStatusBarItemProvider) {
|
||||
const handle = ExtHostNotebookController._notebookStatusBarItemProviderHandlePool++;
|
||||
const eventHandle = typeof provider.onDidChangeCellStatusBarItems === 'function' ? ExtHostNotebookController._notebookStatusBarItemProviderHandlePool++ : undefined;
|
||||
@@ -442,21 +262,6 @@ export class ExtHostNotebookController implements ExtHostNotebookShape {
|
||||
return assertIsDefined(document?.notebookDocument);
|
||||
}
|
||||
|
||||
private _withAdapter<T>(handle: number, uri: UriComponents, callback: (adapter: ExtHostNotebookKernelProviderAdapter, document: ExtHostNotebookDocument) => Promise<T>) {
|
||||
const document = this._documents.get(URI.revive(uri));
|
||||
|
||||
if (!document) {
|
||||
return [];
|
||||
}
|
||||
|
||||
const provider = this._notebookKernelProviders.get(handle);
|
||||
|
||||
if (!provider) {
|
||||
return [];
|
||||
}
|
||||
|
||||
return callback(provider, document);
|
||||
}
|
||||
|
||||
async showNotebookDocument(notebookOrUri: vscode.NotebookDocument | URI, options?: vscode.NotebookDocumentShowOptions): Promise<vscode.NotebookEditor> {
|
||||
|
||||
@@ -492,22 +297,6 @@ export class ExtHostNotebookController implements ExtHostNotebookShape {
|
||||
}
|
||||
}
|
||||
|
||||
async $provideNotebookKernels(handle: number, uri: UriComponents, token: CancellationToken): Promise<INotebookKernelInfoDto2[]> {
|
||||
return this._withAdapter<INotebookKernelInfoDto2[]>(handle, uri, (adapter, document) => {
|
||||
return adapter.provideKernels(document, token);
|
||||
});
|
||||
}
|
||||
|
||||
async $resolveNotebookKernel(handle: number, editorId: string, uri: UriComponents, kernelId: string, token: CancellationToken): Promise<void> {
|
||||
await this._withAdapter<void>(handle, uri, async (adapter, document) => {
|
||||
const webComm = this._webviewComm.get(editorId);
|
||||
|
||||
if (webComm) {
|
||||
await adapter.resolveNotebook(kernelId, document, webComm.contentProviderComm, token);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
async $provideNotebookCellStatusBarItems(handle: number, uri: UriComponents, index: number, token: CancellationToken): Promise<INotebookCellStatusBarListDto | undefined> {
|
||||
const provider = this._notebookStatusBarItemProviders.get(handle);
|
||||
const revivedUri = URI.revive(uri);
|
||||
@@ -539,27 +328,6 @@ export class ExtHostNotebookController implements ExtHostNotebookShape {
|
||||
this._statusBarCache.delete(cacheId);
|
||||
}
|
||||
|
||||
async $resolveNotebookEditor(viewType: string, uri: UriComponents, editorId: string): Promise<void> {
|
||||
const provider = this._notebookContentProviders.get(viewType);
|
||||
const revivedUri = URI.revive(uri);
|
||||
const document = this._documents.get(revivedUri);
|
||||
if (!document || !provider) {
|
||||
return;
|
||||
}
|
||||
|
||||
let webComm = this._webviewComm.get(editorId);
|
||||
if (!webComm) {
|
||||
webComm = new ExtHostWebviewCommWrapper(editorId, revivedUri, this._notebookProxy, this._webviewInitData, document);
|
||||
this._webviewComm.set(editorId, webComm);
|
||||
}
|
||||
}
|
||||
|
||||
async $executeNotebookKernelFromProvider(handle: number, uri: UriComponents, kernelId: string, cellRange: ICellRange[]): Promise<void> {
|
||||
await this._withAdapter(handle, uri, async (adapter, document) => {
|
||||
return adapter.executeNotebook(kernelId, document, cellRange);
|
||||
});
|
||||
}
|
||||
|
||||
// --- serialize/deserialize
|
||||
|
||||
private _handlePool = 0;
|
||||
@@ -604,26 +372,6 @@ export class ExtHostNotebookController implements ExtHostNotebookShape {
|
||||
return VSBuffer.wrap(bytes);
|
||||
}
|
||||
|
||||
async $cancelNotebookCellExecution(handle: number, uri: UriComponents, kernelId: string, cellRange: ICellRange[]): Promise<void> {
|
||||
await this._withAdapter(handle, uri, async (adapter, document) => {
|
||||
return adapter.interruptNotebookExecution(kernelId, document);
|
||||
});
|
||||
|
||||
const document = this._documents.get(URI.revive(uri));
|
||||
if (!document) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (let range of cellRange) {
|
||||
for (let i = range.start; i < range.end; i++) {
|
||||
const cell = document.getCellFromIndex(i);
|
||||
if (cell) {
|
||||
this.cancelOneNotebookCellExecution(cell);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
cancelOneNotebookCellExecution(cell: ExtHostCell): void {
|
||||
const execution = this._activeExecutions.get(cell.uri);
|
||||
execution?.cancel();
|
||||
@@ -669,24 +417,6 @@ export class ExtHostNotebookController implements ExtHostNotebookShape {
|
||||
return backup.id;
|
||||
}
|
||||
|
||||
$acceptNotebookActiveKernelChange(event: { uri: UriComponents, providerHandle: number | undefined, kernelFriendlyId: string | undefined; }) {
|
||||
if (event.providerHandle !== undefined) {
|
||||
this._withAdapter(event.providerHandle, event.uri, async (adapter, document) => {
|
||||
const kernel = event.kernelFriendlyId ? adapter.getKernelByFriendlyId(URI.revive(event.uri), event.kernelFriendlyId) : undefined;
|
||||
this._editors.forEach(editor => {
|
||||
if (editor.notebookData === document) {
|
||||
editor._acceptKernel(kernel);
|
||||
}
|
||||
});
|
||||
this._onDidChangeActiveNotebookKernel.fire({ document: document.notebookDocument, kernel });
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
$onDidReceiveMessage(editorId: string, forRendererType: string | undefined, message: any): void {
|
||||
this._webviewComm.get(editorId)?.onDidReceiveMessage(forRendererType, message);
|
||||
}
|
||||
|
||||
$acceptModelChanged(uri: UriComponents, event: NotebookCellsChangedEventDto, isDirty: boolean): void {
|
||||
const document = this._getNotebookDocument(URI.revive(uri));
|
||||
document.acceptModelChanged(event, isDirty);
|
||||
@@ -758,14 +488,6 @@ export class ExtHostNotebookController implements ExtHostNotebookShape {
|
||||
throw new Error(`editor with id ALREADY EXSIST: ${editorId}`);
|
||||
}
|
||||
|
||||
const revivedUri = document.uri;
|
||||
let webComm = this._webviewComm.get(editorId);
|
||||
|
||||
if (!webComm) {
|
||||
webComm = new ExtHostWebviewCommWrapper(editorId, revivedUri, this._notebookProxy, this._webviewInitData, document);
|
||||
this._webviewComm.set(editorId, webComm);
|
||||
}
|
||||
|
||||
const editor = new ExtHostNotebookEditor(
|
||||
editorId,
|
||||
this._notebookEditorsProxy,
|
||||
|
||||
Reference in New Issue
Block a user