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

@@ -50,7 +50,6 @@ import { throwProposedApiError, checkProposedApiEnabled } from 'vs/workbench/ser
import { ProxyIdentifier } from 'vs/workbench/services/extensions/common/proxyIdentifier';
import { ExtensionDescriptionRegistry } from 'vs/workbench/services/extensions/common/extensionDescriptionRegistry';
import type * as vscode from 'vscode';
import type * as azdata from 'azdata';
import { IExtensionDescription } from 'vs/platform/extensions/common/extensions';
import { values } from 'vs/base/common/collections';
import { ExtHostEditorInsets } from 'vs/workbench/api/common/extHostCodeInsets';
@@ -93,12 +92,12 @@ import { matchesScheme } from 'vs/platform/opener/common/opener';
// import { ExtHostNotebookDocuments } from 'vs/workbench/api/common/extHostNotebookDocuments'; {{SQL CARBON EDIT}} Disable VS Code notebooks
// import { ExtHostInteractive } from 'vs/workbench/api/common/extHostInteractive'; {{SQL CARBON EDIT}} Remove until we need it
import { ExtHostNotebook } from 'sql/workbench/api/common/extHostNotebook';
import { functionalityNotSupportedError, invalidArgumentsError } from 'sql/base/common/locConstants';
import { docCreationFailedError, functionalityNotSupportedError, invalidArgumentsError } from 'sql/base/common/locConstants';
import { ExtHostNotebookDocumentsAndEditors } from 'sql/workbench/api/common/extHostNotebookDocumentsAndEditors';
import { VSCodeNotebookDocument } from 'sql/workbench/api/common/notebooks/vscodeNotebookDocument';
import { VSCodeNotebookEditor } from 'sql/workbench/api/common/notebooks/vscodeNotebookEditor';
import { convertToADSNotebookContents } from 'sql/workbench/api/common/notebooks/notebookUtils';
import { IdGenerator } from 'vs/base/common/idGenerator';
import { convertToADSNotebookContents } from 'sql/workbench/api/common/notebooks/notebookUtils';
export interface IExtensionApiFactory {
(extension: IExtensionDescription, registry: ExtensionDescriptionRegistry, configProvider: ExtHostConfigProvider): typeof vscode;
@@ -893,16 +892,19 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor, ex
},
async openNotebookDocument(uriOrType?: URI | string, content?: vscode.NotebookData): Promise<vscode.NotebookDocument> {
// {{SQL CARBON EDIT}} Use our own notebooks
let doc: azdata.nb.NotebookDocument;
let uri: URI;
if (URI.isUri(uriOrType)) {
let editor = await extHostNotebookDocumentsAndEditors.showNotebookDocument(uriOrType, {});
doc = editor.document;
uri = uriOrType;
await extHostNotebookDocumentsAndEditors.openNotebookDocument(uriOrType);
} else if (typeof uriOrType === 'string') {
let convertedContents = convertToADSNotebookContents(content);
doc = await extHostNotebookDocumentsAndEditors.createNotebookDocument(uriOrType, convertedContents);
uri = URI.revive(await extHostNotebookDocumentsAndEditors.createNotebookDocument(uriOrType, convertToADSNotebookContents(content)));
} else {
throw new Error(invalidArgumentsError);
}
let doc = extHostNotebookDocumentsAndEditors.getDocument(uri.toString())?.document;
if (!doc) {
throw new Error(docCreationFailedError);
}
return new VSCodeNotebookDocument(doc);
},
get onDidOpenNotebookDocument(): Event<vscode.NotebookDocument> {

View File

@@ -3,9 +3,9 @@
* Licensed under the Source EULA. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import { groupBy } from 'vs/base/common/arrays';
// import { groupBy } from 'vs/base/common/arrays'; {{SQL CARBON EDIT}}
import { CancellationToken } from 'vs/base/common/cancellation';
import { compare } from 'vs/base/common/strings';
// import { compare } from 'vs/base/common/strings'; {{SQL CARBON EDIT}}
import { URI } from 'vs/base/common/uri';
import { ResourceEdit } from 'vs/editor/browser/services/bulkEditService';
import { WorkspaceEditMetadata } from 'vs/editor/common/modes';
@@ -28,38 +28,40 @@ export class ResourceNotebookCellEdit extends ResourceEdit {
export class BulkCellEdits {
// {{SQL CARBON EDIT}} Remove private modifiers to fix value-not-read build errors
constructor(
private readonly _undoRedoGroup: UndoRedoGroup,
_undoRedoGroup: UndoRedoGroup,
undoRedoSource: UndoRedoSource | undefined,
private readonly _progress: IProgress<void>,
private readonly _token: CancellationToken,
private readonly _edits: ResourceNotebookCellEdit[],
@INotebookEditorModelResolverService private readonly _notebookModelService: INotebookEditorModelResolverService,
_progress: IProgress<void>,
_token: CancellationToken,
_edits: ResourceNotebookCellEdit[],
@INotebookEditorModelResolverService _notebookModelService: INotebookEditorModelResolverService,
) { }
async apply(): Promise<void> {
const editsByNotebook = groupBy(this._edits, (a, b) => compare(a.resource.toString(), b.resource.toString()));
// {{SQL CARBON EDIT}} Use our own notebooks
// const editsByNotebook = groupBy(this._edits, (a, b) => compare(a.resource.toString(), b.resource.toString()));
for (let group of editsByNotebook) {
if (this._token.isCancellationRequested) {
break;
}
const [first] = group;
const ref = await this._notebookModelService.resolve(first.resource);
// for (let group of editsByNotebook) {
// if (this._token.isCancellationRequested) {
// break;
// }
// const [first] = group;
// const ref = await this._notebookModelService.resolve(first.resource);
// check state
if (typeof first.versionId === 'number' && ref.object.notebook.versionId !== first.versionId) {
ref.dispose();
throw new Error(`Notebook '${first.resource}' has changed in the meantime`);
}
// // check state
// if (typeof first.versionId === 'number' && ref.object.notebook.versionId !== first.versionId) {
// ref.dispose();
// throw new Error(`Notebook '${first.resource}' has changed in the meantime`);
// }
// apply edits
const edits = group.map(entry => entry.cellEdit);
ref.object.notebook.applyEdits(edits, true, undefined, () => undefined, this._undoRedoGroup);
ref.dispose();
// // apply edits
// const edits = group.map(entry => entry.cellEdit);
// ref.object.notebook.applyEdits(edits, true, undefined, () => undefined, this._undoRedoGroup);
// ref.dispose();
this._progress.report(undefined);
}
// this._progress.report(undefined);
// }
}
}

View File

@@ -205,7 +205,7 @@ notebooksExtensionPoint.setHandler(extensions => {
let adsProvider: ProviderDescriptionRegistration = {
provider: notebookContribution.type,
fileExtensions: extensions ?? [],
standardKernels: [] // Kernels get added later when a NotebookController is created for this provider
standardKernels: [] // The actual Kernels are the NotebookControllers that are contributed later
};
adsNotebookRegistry.registerProviderDescription(adsProvider);
}