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:
Cory Rivera
2022-02-25 11:58:59 -08:00
committed by GitHub
parent 02341088eb
commit ffdefd3b52
41 changed files with 649 additions and 278 deletions

View File

@@ -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
}

View File

@@ -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
});
}
}

View File

@@ -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;
}

View File

@@ -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
}

View File

@@ -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();
}

View File

@@ -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;
}

View File

@@ -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);

View File

@@ -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; }

View File

@@ -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 {

View File

@@ -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;