mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-01-17 01:25:36 -05:00
Add notebook extension support for .NET Interactive. (#18334)
* Also updated kernel dropdown to only include SQL aliased kernels when using SQL notebook provider.
This commit is contained in:
@@ -102,8 +102,12 @@ export class MainThreadNotebook extends Disposable implements MainThreadNotebook
|
||||
}
|
||||
}
|
||||
|
||||
public $updateProviderDescriptionLanguages(providerId: string, languages: string[]): void {
|
||||
notebookRegistry.updateProviderDescriptionLanguages(providerId, languages);
|
||||
public $updateProviderKernels(providerId: string, languages: azdata.nb.IStandardKernel[]): void {
|
||||
notebookRegistry.updateProviderKernels(providerId, languages);
|
||||
}
|
||||
|
||||
public $updateKernelLanguages(providerId: string, kernelName: string, languages: string[]): void {
|
||||
notebookRegistry.updateKernelLanguages(providerId, kernelName, languages);
|
||||
}
|
||||
//#endregion
|
||||
}
|
||||
|
||||
@@ -27,8 +27,6 @@ import { localize } from 'vs/nls';
|
||||
import { IFileService } from 'vs/platform/files/common/files';
|
||||
import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles';
|
||||
import { NotebookEditor } from 'sql/workbench/contrib/notebook/browser/notebookEditor';
|
||||
import { ICommandService } from 'vs/platform/commands/common/commands';
|
||||
import { NewNotebookAction } from 'sql/workbench/contrib/notebook/browser/notebookActions';
|
||||
|
||||
class MainThreadNotebookEditor extends Disposable {
|
||||
private _contentChangedEmitter = new Emitter<NotebookContentChange>();
|
||||
@@ -322,8 +320,7 @@ export class MainThreadNotebookDocumentsAndEditors extends Disposable implements
|
||||
@IInstantiationService private _instantiationService: IInstantiationService,
|
||||
@INotebookService private readonly _notebookService: INotebookService,
|
||||
@IFileService private readonly _fileService: IFileService,
|
||||
@ITextFileService private readonly _textFileService: ITextFileService,
|
||||
@ICommandService private readonly _commandService: ICommandService
|
||||
@ITextFileService private readonly _textFileService: ITextFileService
|
||||
) {
|
||||
super();
|
||||
if (extHostContext) {
|
||||
@@ -345,6 +342,11 @@ export class MainThreadNotebookDocumentsAndEditors extends Disposable implements
|
||||
}
|
||||
}
|
||||
|
||||
async $tryCreateNotebookDocument(options: INotebookShowOptions): Promise<UriComponents> {
|
||||
let input = await this._notebookService.createNotebookInput(options);
|
||||
return input.resource;
|
||||
}
|
||||
|
||||
$tryShowNotebookDocument(resource: UriComponents, options: INotebookShowOptions): Promise<string> {
|
||||
return Promise.resolve(this.doOpenEditor(resource, options));
|
||||
}
|
||||
@@ -712,12 +714,4 @@ export class MainThreadNotebookDocumentsAndEditors extends Disposable implements
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
$createNotebookDocument(providerId: string, contents: azdata.nb.INotebookContents): Promise<azdata.nb.NotebookDocument> {
|
||||
return this._commandService.executeCommand(NewNotebookAction.INTERNAL_NEW_NOTEBOOK_CMD_ID, {
|
||||
providerId: providerId,
|
||||
initialContent: contents,
|
||||
initialDirtyState: false
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -35,13 +35,9 @@ export class ExtHostNotebook implements ExtHostNotebookShape {
|
||||
//#region APIs called by main thread
|
||||
async $getSerializationManagerDetails(providerHandle: number, notebookUri: UriComponents): Promise<ISerializationManagerDetails> {
|
||||
let uri = URI.revive(notebookUri);
|
||||
let uriString = uri.toString();
|
||||
let adapter = this.findSerializationManagerForUri(uriString);
|
||||
if (!adapter) {
|
||||
adapter = await this._withSerializationProvider(providerHandle, (provider) => {
|
||||
return this.getOrCreateSerializationManager(provider, uri);
|
||||
});
|
||||
}
|
||||
let adapter = await this._withSerializationProvider(providerHandle, (provider) => {
|
||||
return this.getOrCreateSerializationManager(provider, uri);
|
||||
});
|
||||
|
||||
return {
|
||||
handle: adapter.handle,
|
||||
@@ -50,13 +46,9 @@ export class ExtHostNotebook implements ExtHostNotebookShape {
|
||||
}
|
||||
async $getExecuteManagerDetails(providerHandle: number, notebookUri: UriComponents): Promise<IExecuteManagerDetails> {
|
||||
let uri = URI.revive(notebookUri);
|
||||
let uriString = uri.toString();
|
||||
let adapter = this.findExecuteManagerForUri(uriString);
|
||||
if (!adapter) {
|
||||
adapter = await this._withExecuteProvider(providerHandle, (provider) => {
|
||||
return this.getOrCreateExecuteManager(provider, uri);
|
||||
});
|
||||
}
|
||||
let adapter = await this._withExecuteProvider(providerHandle, (provider) => {
|
||||
return this.getOrCreateExecuteManager(provider, uri);
|
||||
});
|
||||
|
||||
return {
|
||||
handle: adapter.handle,
|
||||
@@ -66,11 +58,10 @@ export class ExtHostNotebook implements ExtHostNotebookShape {
|
||||
$handleNotebookClosed(notebookUri: UriComponents): void {
|
||||
let uri = URI.revive(notebookUri);
|
||||
let uriString = uri.toString();
|
||||
let manager = this.findExecuteManagerForUri(uriString);
|
||||
if (manager) {
|
||||
this.findExecuteManagersForUri(uriString).forEach(manager => {
|
||||
manager.provider.handleNotebookClosed(uri);
|
||||
this._adapters.delete(manager.handle);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
$doStartServer(managerHandle: number, kernelSpec: azdata.nb.IKernelSpec): Thenable<void> {
|
||||
@@ -264,8 +255,16 @@ export class ExtHostNotebook implements ExtHostNotebookShape {
|
||||
}
|
||||
|
||||
createNotebookController(extension: IExtensionDescription, id: string, viewType: string, label: string, handler?: (cells: vscode.NotebookCell[], notebook: vscode.NotebookDocument, controller: vscode.NotebookController) => void | Thenable<void>, rendererScripts?: vscode.NotebookRendererScript[]): vscode.NotebookController {
|
||||
let addLanguagesHandler = (id, languages) => this._proxy.$updateProviderDescriptionLanguages(id, languages);
|
||||
let controller = new ADSNotebookController(extension, id, viewType, label, addLanguagesHandler, this._extHostNotebookDocumentsAndEditors, handler, extension.enableProposedApi ? rendererScripts : undefined);
|
||||
let languagesHandler = (languages: string[]) => this._proxy.$updateKernelLanguages(viewType, viewType, languages);
|
||||
let controller = new ADSNotebookController(extension, id, viewType, label, this._extHostNotebookDocumentsAndEditors, languagesHandler, handler, extension.enableProposedApi ? rendererScripts : undefined);
|
||||
let newKernel: azdata.nb.IStandardKernel = {
|
||||
name: viewType,
|
||||
displayName: controller.label,
|
||||
connectionProviderIds: [],
|
||||
supportedLanguages: [] // These will get set later from the controller
|
||||
};
|
||||
this._proxy.$updateProviderKernels(viewType, [newKernel]);
|
||||
|
||||
let executeProvider = new VSCodeExecuteProvider(controller);
|
||||
this.registerExecuteProvider(executeProvider);
|
||||
return controller;
|
||||
@@ -283,37 +282,29 @@ export class ExtHostNotebook implements ExtHostNotebookShape {
|
||||
return matchingAdapters;
|
||||
}
|
||||
|
||||
private findSerializationManagerForUri(uriString: string): SerializationManagerAdapter {
|
||||
for (let manager of this.getAdapters(SerializationManagerAdapter)) {
|
||||
if (manager.uriString === uriString) {
|
||||
return manager;
|
||||
}
|
||||
}
|
||||
return undefined;
|
||||
}
|
||||
|
||||
private findExecuteManagerForUri(uriString: string): ExecuteManagerAdapter {
|
||||
for (let manager of this.getAdapters(ExecuteManagerAdapter)) {
|
||||
if (manager.uriString === uriString) {
|
||||
return manager;
|
||||
}
|
||||
}
|
||||
return undefined;
|
||||
private findExecuteManagersForUri(uriString: string): ExecuteManagerAdapter[] {
|
||||
return this.getAdapters(ExecuteManagerAdapter).filter(adapter => adapter.uriString === uriString);
|
||||
}
|
||||
|
||||
private async getOrCreateSerializationManager(provider: azdata.nb.NotebookSerializationProvider, notebookUri: URI): Promise<SerializationManagerAdapter> {
|
||||
let manager = await provider.getSerializationManager(notebookUri);
|
||||
let uriString = notebookUri.toString();
|
||||
let adapter = new SerializationManagerAdapter(provider, manager, uriString);
|
||||
adapter.handle = this._addNewAdapter(adapter);
|
||||
let adapter = this.getAdapters(SerializationManagerAdapter).find(a => a.uriString === uriString && a.provider.providerId === provider.providerId);
|
||||
if (!adapter) {
|
||||
let manager = await provider.getSerializationManager(notebookUri);
|
||||
adapter = new SerializationManagerAdapter(provider, manager, uriString);
|
||||
adapter.handle = this._addNewAdapter(adapter);
|
||||
}
|
||||
return adapter;
|
||||
}
|
||||
|
||||
private async getOrCreateExecuteManager(provider: azdata.nb.NotebookExecuteProvider, notebookUri: URI): Promise<ExecuteManagerAdapter> {
|
||||
let manager = await provider.getExecuteManager(notebookUri);
|
||||
let uriString = notebookUri.toString();
|
||||
let adapter = new ExecuteManagerAdapter(provider, manager, uriString);
|
||||
adapter.handle = this._addNewAdapter(adapter);
|
||||
let adapter = this.getAdapters(ExecuteManagerAdapter).find(a => a.uriString === uriString && a.provider.providerId === provider.providerId);
|
||||
if (!adapter) {
|
||||
let manager = await provider.getExecuteManager(notebookUri);
|
||||
adapter = new ExecuteManagerAdapter(provider, manager, uriString);
|
||||
adapter.handle = this._addNewAdapter(adapter);
|
||||
}
|
||||
return adapter;
|
||||
}
|
||||
|
||||
|
||||
@@ -23,6 +23,7 @@ import { ExtHostNotebookDocumentData } from 'sql/workbench/api/common/extHostNot
|
||||
import { ExtHostNotebookEditor } from 'sql/workbench/api/common/extHostNotebookEditor';
|
||||
import { VSCodeNotebookDocument } from 'sql/workbench/api/common/notebooks/vscodeNotebookDocument';
|
||||
import { VSCodeNotebookEditor } from 'sql/workbench/api/common/notebooks/vscodeNotebookEditor';
|
||||
import { docNotFoundForUriError } from 'sql/base/common/locConstants';
|
||||
|
||||
type Adapter = azdata.nb.NavigationProvider;
|
||||
|
||||
@@ -113,17 +114,19 @@ export class ExtHostNotebookDocumentsAndEditors implements ExtHostNotebookDocume
|
||||
if (delta.addedDocuments) {
|
||||
for (const data of delta.addedDocuments) {
|
||||
const resource = URI.revive(data.uri);
|
||||
ok(!this._documents.has(resource.toString()), `document '${resource} already exists!'`);
|
||||
|
||||
const documentData = new ExtHostNotebookDocumentData(
|
||||
this._proxy,
|
||||
resource,
|
||||
data.providerId,
|
||||
data.isDirty,
|
||||
data.cells
|
||||
);
|
||||
this._documents.set(resource.toString(), documentData);
|
||||
addedDocuments.push(documentData);
|
||||
// Can potentially have a document with this URI already if it was created
|
||||
// separately from the notebook editor.
|
||||
if (!this._documents.has(resource.toString())) {
|
||||
const documentData = new ExtHostNotebookDocumentData(
|
||||
this._proxy,
|
||||
resource,
|
||||
data.providerId,
|
||||
data.isDirty,
|
||||
data.cells
|
||||
);
|
||||
this._documents.set(resource.toString(), documentData);
|
||||
addedDocuments.push(documentData);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -220,6 +223,42 @@ export class ExtHostNotebookDocumentsAndEditors implements ExtHostNotebookDocume
|
||||
//#endregion
|
||||
|
||||
//#region Extension accessible methods
|
||||
async createNotebookDocument(providerId: string, contents?: azdata.nb.INotebookContents): Promise<URI> {
|
||||
let options: INotebookShowOptions = {};
|
||||
if (contents) {
|
||||
options.providerId = providerId;
|
||||
options.initialContent = JSON.stringify(contents);
|
||||
}
|
||||
let uriComps = await this._proxy.$tryCreateNotebookDocument(options);
|
||||
let uri = URI.revive(uriComps);
|
||||
let notebookCells = contents?.cells?.map<azdata.nb.NotebookCell>(cellContents => {
|
||||
return {
|
||||
contents: cellContents,
|
||||
uri: undefined
|
||||
};
|
||||
});
|
||||
|
||||
let documentData = new ExtHostNotebookDocumentData(
|
||||
this._proxy,
|
||||
uri,
|
||||
providerId,
|
||||
false,
|
||||
notebookCells ?? []
|
||||
);
|
||||
this._documents.set(uri.toString(), documentData);
|
||||
this._onDidOpenNotebook.fire(documentData.document);
|
||||
|
||||
return uri;
|
||||
}
|
||||
|
||||
async openNotebookDocument(uri: vscode.Uri): Promise<azdata.nb.NotebookDocument> {
|
||||
let docData = this._documents.get(uri.toString());
|
||||
if (!docData) {
|
||||
throw new Error(docNotFoundForUriError);
|
||||
}
|
||||
return docData.document;
|
||||
}
|
||||
|
||||
showNotebookDocument(uri: vscode.Uri, showOptions: azdata.nb.NotebookShowOptions): Thenable<azdata.nb.NotebookEditor> {
|
||||
return this.doShowNotebookDocument(uri, showOptions);
|
||||
}
|
||||
@@ -289,9 +328,5 @@ export class ExtHostNotebookDocumentsAndEditors implements ExtHostNotebookDocume
|
||||
this._adapters.delete(handle);
|
||||
});
|
||||
}
|
||||
|
||||
createNotebookDocument(providerId: string, contents: azdata.nb.INotebookContents): Promise<azdata.nb.NotebookDocument> {
|
||||
return this._proxy.$createNotebookDocument(providerId, contents);
|
||||
}
|
||||
//#endregion
|
||||
}
|
||||
|
||||
@@ -19,6 +19,7 @@ import { CancellationToken } from 'vs/base/common/cancellation';
|
||||
type SelectionChangedEvent = { selected: boolean, notebook: vscode.NotebookDocument; };
|
||||
type MessageReceivedEvent = { editor: vscode.NotebookEditor, message: any; };
|
||||
type ExecutionHandler = (cells: vscode.NotebookCell[], notebook: vscode.NotebookDocument, controller: vscode.NotebookController) => void | Thenable<void>;
|
||||
type LanguagesHandler = (languages: string[]) => void;
|
||||
type InterruptHandler = (notebook: vscode.NotebookDocument) => void | Promise<void>;
|
||||
|
||||
/**
|
||||
@@ -39,8 +40,8 @@ export class ADSNotebookController implements vscode.NotebookController {
|
||||
private _id: string,
|
||||
private _viewType: string,
|
||||
private _label: string,
|
||||
private _addLanguagesHandler: (providerId, languages) => void,
|
||||
private _extHostNotebookDocumentsAndEditors: ExtHostNotebookDocumentsAndEditors,
|
||||
private _languagesHandler: LanguagesHandler,
|
||||
private _handler?: ExecutionHandler,
|
||||
preloads?: vscode.NotebookRendererScript[]
|
||||
) {
|
||||
@@ -107,7 +108,7 @@ export class ADSNotebookController implements vscode.NotebookController {
|
||||
|
||||
public set supportedLanguages(value: string[]) {
|
||||
this._kernelData.supportedLanguages = value;
|
||||
this._addLanguagesHandler(this._viewType, value);
|
||||
this._languagesHandler(value);
|
||||
this._languagesAdded.resolve();
|
||||
}
|
||||
|
||||
|
||||
@@ -8,21 +8,30 @@ import type * as azdata from 'azdata';
|
||||
import { URI } from 'vs/base/common/uri';
|
||||
import { asArray } from 'vs/base/common/arrays';
|
||||
import { VSBuffer } from 'vs/base/common/buffer';
|
||||
import { OutputTypes } from 'sql/workbench/services/notebook/common/contracts';
|
||||
import { CellTypes, MimeTypes, OutputTypes } from 'sql/workbench/services/notebook/common/contracts';
|
||||
import { NBFORMAT, NBFORMAT_MINOR } from 'sql/workbench/common/constants';
|
||||
import { NotebookCellKind } from 'vs/workbench/api/common/extHostTypes';
|
||||
|
||||
export function convertToVSCodeNotebookCell(cellSource: string | string[], index: number, uri: URI, language: string): vscode.NotebookCell {
|
||||
export const DotnetInteractiveJupyterLanguagePrefix = '.net-';
|
||||
export const DotnetInteractiveLanguagePrefix = 'dotnet-interactive.';
|
||||
export const DotnetInteractiveJupyterLabelPrefix = '.NET (';
|
||||
export const DotnetInteractiveLabel = '.NET Interactive';
|
||||
|
||||
export function convertToVSCodeNotebookCell(cellKind: azdata.nb.CellType, cellIndex: number, cellUri: URI, docUri: URI, cellLanguage: string, cellSource?: string | string[]): vscode.NotebookCell {
|
||||
return <vscode.NotebookCell>{
|
||||
index: index,
|
||||
kind: cellKind === CellTypes.Code ? NotebookCellKind.Code : NotebookCellKind.Markup,
|
||||
index: cellIndex,
|
||||
document: <vscode.TextDocument>{
|
||||
uri: uri,
|
||||
languageId: language,
|
||||
getText: () => Array.isArray(cellSource) ? cellSource.join('') : cellSource,
|
||||
uri: cellUri,
|
||||
languageId: cellLanguage,
|
||||
getText: () => Array.isArray(cellSource) ? cellSource.join('') : (cellSource ?? ''),
|
||||
},
|
||||
notebook: <vscode.NotebookDocument>{
|
||||
uri: uri
|
||||
}
|
||||
uri: docUri
|
||||
},
|
||||
outputs: [],
|
||||
metadata: {},
|
||||
mime: undefined
|
||||
};
|
||||
}
|
||||
|
||||
@@ -33,7 +42,7 @@ export function convertToADSCellOutput(outputs: vscode.NotebookCellOutput | vsco
|
||||
outputData[item.mime] = VSBuffer.wrap(item.data).toString();
|
||||
}
|
||||
return {
|
||||
output_type: 'execute_result',
|
||||
output_type: OutputTypes.ExecuteResult,
|
||||
data: outputData,
|
||||
execution_count: executionOrder,
|
||||
metadata: output.metadata,
|
||||
@@ -59,7 +68,7 @@ export function convertToVSCodeCellOutput(output: azdata.nb.ICellOutput): vscode
|
||||
case OutputTypes.Stream:
|
||||
let streamOutput = output as azdata.nb.IStreamResult;
|
||||
convertedOutputItems = [{
|
||||
mime: 'text/html',
|
||||
mime: MimeTypes.HTML,
|
||||
data: VSBuffer.fromString(Array.isArray(streamOutput.text) ? streamOutput.text.join('') : streamOutput.text).buffer
|
||||
}];
|
||||
break;
|
||||
@@ -67,7 +76,7 @@ export function convertToVSCodeCellOutput(output: azdata.nb.ICellOutput): vscode
|
||||
let errorOutput = output as azdata.nb.IErrorResult;
|
||||
let errorString = errorOutput.ename + ': ' + errorOutput.evalue + (errorOutput.traceback ? '\n' + errorOutput.traceback?.join('\n') : '');
|
||||
convertedOutputItems = [{
|
||||
mime: 'text/html',
|
||||
mime: MimeTypes.HTML,
|
||||
data: VSBuffer.fromString(errorString).buffer
|
||||
}];
|
||||
break;
|
||||
@@ -79,28 +88,26 @@ export function convertToVSCodeCellOutput(output: azdata.nb.ICellOutput): vscode
|
||||
};
|
||||
}
|
||||
|
||||
export function convertToADSNotebookContents(notebookData: vscode.NotebookData): azdata.nb.INotebookContents {
|
||||
export function convertToADSNotebookContents(notebookData: vscode.NotebookData | undefined): azdata.nb.INotebookContents {
|
||||
let result = {
|
||||
cells: notebookData.cells?.map<azdata.nb.ICellContents>(cell => {
|
||||
cells: notebookData?.cells?.map<azdata.nb.ICellContents>(cell => {
|
||||
let executionOrder = cell.executionSummary?.executionOrder;
|
||||
return {
|
||||
cell_type: cell.kind === NotebookCellKind.Code ? 'code' : 'markdown',
|
||||
let convertedCell: azdata.nb.ICellContents = {
|
||||
cell_type: cell.kind === NotebookCellKind.Code ? CellTypes.Code : CellTypes.Markdown,
|
||||
source: cell.value,
|
||||
metadata: {
|
||||
language: cell.languageId
|
||||
},
|
||||
execution_count: executionOrder,
|
||||
outputs: cell.outputs ? convertToADSCellOutput(cell.outputs, executionOrder) : undefined
|
||||
};
|
||||
convertedCell.metadata = cell.metadata?.custom?.metadata ?? {};
|
||||
if (!convertedCell.metadata.language) {
|
||||
convertedCell.metadata.language = cell.languageId;
|
||||
}
|
||||
return convertedCell;
|
||||
}),
|
||||
metadata: notebookData.metadata ?? {},
|
||||
nbformat: notebookData.metadata?.custom?.nbformat ?? NBFORMAT,
|
||||
nbformat_minor: notebookData.metadata?.custom?.nbformat_minor ?? NBFORMAT_MINOR
|
||||
metadata: notebookData?.metadata?.custom?.metadata ?? {},
|
||||
nbformat: notebookData?.metadata?.custom?.nbformat ?? NBFORMAT,
|
||||
nbformat_minor: notebookData?.metadata?.custom?.nbformat_minor ?? NBFORMAT_MINOR
|
||||
};
|
||||
|
||||
// Clear out extra lingering vscode custom metadata
|
||||
delete result.metadata.custom;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -108,20 +115,27 @@ export function convertToVSCodeNotebookData(notebook: azdata.nb.INotebookContent
|
||||
let result: vscode.NotebookData = {
|
||||
cells: notebook.cells?.map<vscode.NotebookCellData>(cell => {
|
||||
return {
|
||||
kind: cell.cell_type === 'code' ? NotebookCellKind.Code : NotebookCellKind.Markup,
|
||||
value: Array.isArray(cell.source) ? cell.source.join('\n') : cell.source,
|
||||
languageId: cell.metadata?.language,
|
||||
kind: cell.cell_type === CellTypes.Code ? NotebookCellKind.Code : NotebookCellKind.Markup,
|
||||
value: Array.isArray(cell.source) ? cell.source.join('') : cell.source,
|
||||
languageId: cell.metadata?.language ?? notebook.metadata.language_info?.name,
|
||||
outputs: cell.outputs?.map<vscode.NotebookCellOutput>(output => convertToVSCodeCellOutput(output)),
|
||||
executionSummary: {
|
||||
executionOrder: cell.execution_count
|
||||
},
|
||||
metadata: {
|
||||
custom: {
|
||||
metadata: cell.metadata
|
||||
}
|
||||
}
|
||||
};
|
||||
}),
|
||||
metadata: notebook.metadata
|
||||
};
|
||||
result.metadata.custom = {
|
||||
nbformat: notebook.nbformat,
|
||||
nbformat_minor: notebook.nbformat_minor
|
||||
metadata: {
|
||||
custom: {
|
||||
metadata: notebook.metadata,
|
||||
nbformat: notebook.nbformat,
|
||||
nbformat_minor: notebook.nbformat_minor
|
||||
}
|
||||
}
|
||||
};
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -8,6 +8,7 @@ import type * as azdata from 'azdata';
|
||||
import { ADSNotebookController } from 'sql/workbench/api/common/notebooks/adsNotebookController';
|
||||
import * as nls from 'vs/nls';
|
||||
import { convertToVSCodeNotebookCell } from 'sql/workbench/api/common/notebooks/notebookUtils';
|
||||
import { CellTypes } from 'sql/workbench/services/notebook/common/contracts';
|
||||
|
||||
class VSCodeFuture implements azdata.nb.IFuture {
|
||||
private _inProgress = true;
|
||||
@@ -71,16 +72,25 @@ class VSCodeKernel implements azdata.nb.IKernel {
|
||||
private readonly _info: azdata.nb.IInfoReply;
|
||||
private readonly _kernelSpec: azdata.nb.IKernelSpec;
|
||||
|
||||
constructor(private readonly _controller: ADSNotebookController, private readonly _options: azdata.nb.ISessionOptions, language: string) {
|
||||
constructor(private readonly _controller: ADSNotebookController, private readonly _options: azdata.nb.ISessionOptions) {
|
||||
this._id = this._options.kernelId ?? (VSCodeKernel.kernelId++).toString();
|
||||
this._name = this._options.kernelName ?? this._controller.notebookType;
|
||||
this._kernelSpec = this._options.kernelSpec ?? {
|
||||
name: this._controller.notebookType,
|
||||
display_name: this._controller.label,
|
||||
};
|
||||
if (!this._kernelSpec.language) {
|
||||
this._kernelSpec.language = this._controller.supportedLanguages[0];
|
||||
this._kernelSpec.supportedLanguages = this._controller.supportedLanguages;
|
||||
}
|
||||
|
||||
this._name = this._kernelSpec.name;
|
||||
this._info = {
|
||||
protocol_version: '',
|
||||
implementation: '',
|
||||
implementation_version: '',
|
||||
language_info: {
|
||||
name: language,
|
||||
version: '',
|
||||
name: this._kernelSpec.language,
|
||||
oldName: this._kernelSpec.oldLanguage
|
||||
},
|
||||
banner: '',
|
||||
help_links: [{
|
||||
@@ -88,11 +98,6 @@ class VSCodeKernel implements azdata.nb.IKernel {
|
||||
url: ''
|
||||
}]
|
||||
};
|
||||
this._kernelSpec = {
|
||||
name: this._name,
|
||||
language: language,
|
||||
display_name: this._name
|
||||
};
|
||||
}
|
||||
|
||||
public get id(): string {
|
||||
@@ -123,17 +128,20 @@ class VSCodeKernel implements azdata.nb.IKernel {
|
||||
return this._info;
|
||||
}
|
||||
|
||||
public get spec(): azdata.nb.IKernelSpec {
|
||||
return this._kernelSpec;
|
||||
}
|
||||
|
||||
getSpec(): Thenable<azdata.nb.IKernelSpec> {
|
||||
return Promise.resolve(this._kernelSpec);
|
||||
return Promise.resolve(this.spec);
|
||||
}
|
||||
|
||||
requestExecute(content: azdata.nb.IExecuteRequest, disposeOnDone?: boolean): azdata.nb.IFuture {
|
||||
let executePromise: Promise<void>;
|
||||
if (this._controller.executeHandler) {
|
||||
let cell = convertToVSCodeNotebookCell(content.code, content.cellIndex, content.notebookUri, this._kernelSpec.language);
|
||||
let cell = convertToVSCodeNotebookCell(CellTypes.Code, content.cellIndex, content.cellUri, content.notebookUri, content.language ?? this._kernelSpec.language, content.code);
|
||||
executePromise = Promise.resolve(this._controller.executeHandler([cell], cell.notebook, this._controller));
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
executePromise = Promise.resolve();
|
||||
}
|
||||
|
||||
@@ -153,8 +161,8 @@ class VSCodeKernel implements azdata.nb.IKernel {
|
||||
class VSCodeSession implements azdata.nb.ISession {
|
||||
private _kernel: VSCodeKernel;
|
||||
private _defaultKernelLoaded = false;
|
||||
constructor(controller: ADSNotebookController, private readonly _options: azdata.nb.ISessionOptions, language: string) {
|
||||
this._kernel = new VSCodeKernel(controller, this._options, language);
|
||||
constructor(controller: ADSNotebookController, private readonly _options: azdata.nb.ISessionOptions) {
|
||||
this._kernel = new VSCodeKernel(controller, this._options);
|
||||
}
|
||||
|
||||
public set defaultKernelLoaded(value) {
|
||||
@@ -189,10 +197,14 @@ class VSCodeSession implements azdata.nb.ISession {
|
||||
return 'connected';
|
||||
}
|
||||
|
||||
public get kernel(): azdata.nb.IKernel {
|
||||
public get vsKernel(): VSCodeKernel {
|
||||
return this._kernel;
|
||||
}
|
||||
|
||||
public get kernel(): azdata.nb.IKernel {
|
||||
return this.vsKernel;
|
||||
}
|
||||
|
||||
changeKernel(kernelInfo: azdata.nb.IKernelSpec): Thenable<azdata.nb.IKernel> {
|
||||
return Promise.resolve(this._kernel);
|
||||
}
|
||||
@@ -207,7 +219,7 @@ class VSCodeSession implements azdata.nb.ISession {
|
||||
}
|
||||
|
||||
class VSCodeSessionManager implements azdata.nb.SessionManager {
|
||||
private _sessions: azdata.nb.ISession[] = [];
|
||||
private _sessions: VSCodeSession[] = [];
|
||||
|
||||
constructor(private readonly _controller: ADSNotebookController) {
|
||||
}
|
||||
@@ -221,16 +233,16 @@ class VSCodeSessionManager implements azdata.nb.SessionManager {
|
||||
}
|
||||
|
||||
public get specs(): azdata.nb.IAllKernels {
|
||||
let languages = this._controller.supportedLanguages?.length > 0 ? this._controller.supportedLanguages : [this._controller.label];
|
||||
// Have to return the default kernel here, since the manager specs are accessed before kernels get added
|
||||
let defaultKernel: azdata.nb.IKernelSpec = {
|
||||
name: this._controller.notebookType,
|
||||
language: this._controller.supportedLanguages[0],
|
||||
display_name: this._controller.label,
|
||||
supportedLanguages: this._controller.supportedLanguages ?? []
|
||||
};
|
||||
return {
|
||||
defaultKernel: languages[0],
|
||||
kernels: languages.map<azdata.nb.IKernelSpec>(language => {
|
||||
return {
|
||||
name: language,
|
||||
language: language,
|
||||
display_name: language
|
||||
};
|
||||
})
|
||||
defaultKernel: defaultKernel.name,
|
||||
kernels: [defaultKernel]
|
||||
};
|
||||
}
|
||||
|
||||
@@ -238,8 +250,7 @@ class VSCodeSessionManager implements azdata.nb.SessionManager {
|
||||
if (!this.isReady) {
|
||||
return Promise.reject(new Error(nls.localize('errorStartBeforeReady', "Cannot start a session, the manager is not yet initialized")));
|
||||
}
|
||||
|
||||
let session: azdata.nb.ISession = new VSCodeSession(this._controller, options, this.specs.defaultKernel);
|
||||
let session = new VSCodeSession(this._controller, options);
|
||||
let index = this._sessions.findIndex(session => session.path === options.path);
|
||||
if (index > -1) {
|
||||
this._sessions.splice(index);
|
||||
|
||||
@@ -11,7 +11,7 @@ export class VSCodeNotebookDocument implements vscode.NotebookDocument {
|
||||
private readonly _convertedCells: vscode.NotebookCell[];
|
||||
|
||||
constructor(private readonly _notebookDoc: azdata.nb.NotebookDocument) {
|
||||
this._convertedCells = this._notebookDoc.cells?.map((cell, index) => convertToVSCodeNotebookCell(cell.contents.source, index, this._notebookDoc.uri, this._notebookDoc.kernelSpec?.language));
|
||||
this._convertedCells = this._notebookDoc.cells?.map((cell, index) => convertToVSCodeNotebookCell(cell.contents.cell_type, index, cell.uri, this._notebookDoc.uri, cell.contents.metadata?.language, cell.contents.source));
|
||||
}
|
||||
|
||||
public get uri() { return this._notebookDoc.uri; }
|
||||
|
||||
@@ -956,7 +956,8 @@ export interface MainThreadNotebookShape extends IDisposable {
|
||||
$unregisterExecuteProvider(handle: number): void;
|
||||
$onFutureMessage(futureId: number, type: FutureMessageType, payload: azdata.nb.IMessage): void;
|
||||
$onFutureDone(futureId: number, done: INotebookFutureDone): void;
|
||||
$updateProviderDescriptionLanguages(providerId: string, languages: string[]): void;
|
||||
$updateProviderKernels(providerId: string, languages: azdata.nb.IStandardKernel[]): void;
|
||||
$updateKernelLanguages(providerId: string, kernelName: string, languages: string[]): void;
|
||||
}
|
||||
|
||||
export interface INotebookDocumentsAndEditorsDelta {
|
||||
@@ -1011,6 +1012,7 @@ export interface ExtHostNotebookDocumentsAndEditorsShape {
|
||||
export interface MainThreadNotebookDocumentsAndEditorsShape extends IDisposable {
|
||||
$trySetTrusted(_uri: UriComponents, isTrusted: boolean): Thenable<boolean>;
|
||||
$trySaveDocument(uri: UriComponents): Thenable<boolean>;
|
||||
$tryCreateNotebookDocument(options: INotebookShowOptions): Promise<UriComponents>;
|
||||
$tryShowNotebookDocument(resource: UriComponents, options: INotebookShowOptions): Promise<string>;
|
||||
$tryApplyEdits(id: string, modelVersionId: number, edits: INotebookEditOperation[], opts: IUndoStopOptions): Promise<boolean>;
|
||||
$runCell(id: string, cellUri: UriComponents): Promise<boolean>;
|
||||
@@ -1019,7 +1021,6 @@ export interface MainThreadNotebookDocumentsAndEditorsShape extends IDisposable
|
||||
$clearAllOutputs(id: string): Promise<boolean>;
|
||||
$changeKernel(id: string, kernel: azdata.nb.IKernelSpec): Promise<boolean>;
|
||||
$registerNavigationProvider(providerId: string, handle: number);
|
||||
$createNotebookDocument(providerId: string, contents: azdata.nb.INotebookContents): Promise<azdata.nb.NotebookDocument>;
|
||||
}
|
||||
|
||||
export interface ExtHostExtensionManagementShape {
|
||||
|
||||
@@ -552,6 +552,19 @@ export class SqlThemeIcon {
|
||||
}
|
||||
}
|
||||
|
||||
export interface ICellMetadata {
|
||||
language?: string | undefined;
|
||||
tags?: string[] | undefined;
|
||||
azdata_cell_guid?: string | undefined;
|
||||
connection_name?: string;
|
||||
/**
|
||||
* .NET Interactive metadata. This is only required for compatibility with the .NET Interactive extension.
|
||||
*/
|
||||
dotnet_interactive?: {
|
||||
language: string;
|
||||
}
|
||||
}
|
||||
|
||||
export interface ISerializationManagerDetails {
|
||||
handle: number;
|
||||
hasContentManager: boolean;
|
||||
|
||||
Reference in New Issue
Block a user