mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-02-11 02:32:35 -05:00
Merge from vscode 7eaf220cafb9d9e901370ffce02229171cbf3ea6
This commit is contained in:
committed by
Anthony Dresser
parent
39d9eed585
commit
a63578e6f7
@@ -6,10 +6,9 @@
|
||||
import { flatten } from 'vs/base/common/arrays';
|
||||
import { CancellationToken } from 'vs/base/common/cancellation';
|
||||
import { Emitter, Event } from 'vs/base/common/event';
|
||||
import * as glob from 'vs/base/common/glob';
|
||||
import { Iterable } from 'vs/base/common/iterator';
|
||||
import { Disposable, DisposableStore, IDisposable, toDisposable } from 'vs/base/common/lifecycle';
|
||||
import { basename } from 'vs/base/common/path';
|
||||
import { ResourceMap } from 'vs/base/common/map';
|
||||
import { URI } from 'vs/base/common/uri';
|
||||
import { RedoCommand, UndoCommand } from 'vs/editor/browser/editorExtensions';
|
||||
import { CopyAction, CutAction, PasteAction } from 'vs/editor/contrib/clipboard/clipboard';
|
||||
@@ -27,7 +26,7 @@ import { NotebookKernelProviderAssociationRegistry, NotebookViewTypesExtensionRe
|
||||
import { CellViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/notebookViewModel';
|
||||
import { NotebookCellTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookCellTextModel';
|
||||
import { NotebookTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookTextModel';
|
||||
import { ACCESSIBLE_NOTEBOOK_DISPLAY_ORDER, BUILTIN_RENDERER_ID, CellEditType, CellOutputKind, CellUri, DisplayOrderKey, ICellEditOperation, IDisplayOutput, INotebookKernelInfo, INotebookKernelInfo2, INotebookKernelProvider, INotebookRendererInfo, INotebookTextModel, IOrderedMimeType, ITransformedDisplayOutputDto, mimeTypeSupportedByCore, NotebookCellOutputsSplice, notebookDocumentFilterMatch, NotebookEditorPriority, NOTEBOOK_DISPLAY_ORDER, sortMimeTypes } from 'vs/workbench/contrib/notebook/common/notebookCommon';
|
||||
import { ACCESSIBLE_NOTEBOOK_DISPLAY_ORDER, BUILTIN_RENDERER_ID, CellEditType, CellOutputKind, CellUri, DisplayOrderKey, ICellEditOperation, IDisplayOutput, INotebookKernelInfo2, INotebookKernelProvider, INotebookRendererInfo, INotebookTextModel, IOrderedMimeType, ITransformedDisplayOutputDto, mimeTypeSupportedByCore, NotebookCellOutputsSplice, notebookDocumentFilterMatch, NotebookEditorPriority, NOTEBOOK_DISPLAY_ORDER, sortMimeTypes } from 'vs/workbench/contrib/notebook/common/notebookCommon';
|
||||
import { NotebookOutputRendererInfo } from 'vs/workbench/contrib/notebook/common/notebookOutputRenderer';
|
||||
import { NotebookEditorDescriptor, NotebookProviderInfo } from 'vs/workbench/contrib/notebook/common/notebookProvider';
|
||||
import { IMainNotebookController, INotebookService } from 'vs/workbench/contrib/notebook/common/notebookService';
|
||||
@@ -35,10 +34,6 @@ import { ICustomEditorInfo, ICustomEditorViewTypesHandler, IEditorService } from
|
||||
import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions';
|
||||
import { IExtensionPointUser } from 'vs/workbench/services/extensions/common/extensionsRegistry';
|
||||
|
||||
function MODEL_ID(resource: URI): string {
|
||||
return resource.toString();
|
||||
}
|
||||
|
||||
export class NotebookKernelProviderInfoStore extends Disposable {
|
||||
private readonly _notebookKernelProviders: INotebookKernelProvider[] = [];
|
||||
|
||||
@@ -232,11 +227,10 @@ export class NotebookService extends Disposable implements INotebookService, ICu
|
||||
declare readonly _serviceBrand: undefined;
|
||||
static mainthreadNotebookDocumentHandle: number = 0;
|
||||
private readonly _notebookProviders = new Map<string, { controller: IMainNotebookController, extensionData: NotebookExtensionDescription }>();
|
||||
private readonly _notebookKernels = new Map<string, INotebookKernelInfo>();
|
||||
notebookProviderInfoStore: NotebookProviderInfoStore;
|
||||
notebookRenderersInfoStore: NotebookOutputRendererInfoStore = new NotebookOutputRendererInfoStore();
|
||||
notebookKernelProviderInfoStore: NotebookKernelProviderInfoStore = new NotebookKernelProviderInfoStore();
|
||||
private readonly _models = new Map<string, ModelData>();
|
||||
private readonly _models = new ResourceMap<ModelData>();
|
||||
private _onDidChangeActiveEditor = new Emitter<string | null>();
|
||||
onDidChangeActiveEditor: Event<string | null> = this._onDidChangeActiveEditor.event;
|
||||
private _activeEditorDisposables = new DisposableStore();
|
||||
@@ -257,8 +251,8 @@ export class NotebookService extends Disposable implements INotebookService, ICu
|
||||
private readonly _onDidChangeViewTypes = new Emitter<void>();
|
||||
onDidChangeViewTypes: Event<void> = this._onDidChangeViewTypes.event;
|
||||
|
||||
private readonly _onDidChangeKernels = new Emitter<void>();
|
||||
onDidChangeKernels: Event<void> = this._onDidChangeKernels.event;
|
||||
private readonly _onDidChangeKernels = new Emitter<URI | undefined>();
|
||||
onDidChangeKernels: Event<URI | undefined> = this._onDidChangeKernels.event;
|
||||
private readonly _onDidChangeNotebookActiveKernel = new Emitter<{ uri: URI, providerHandle: number | undefined, kernelId: string | undefined }>();
|
||||
onDidChangeNotebookActiveKernel: Event<{ uri: URI, providerHandle: number | undefined, kernelId: string | undefined }> = this._onDidChangeNotebookActiveKernel.event;
|
||||
private cutItems: NotebookCellTextModel[] | undefined;
|
||||
@@ -541,6 +535,9 @@ export class NotebookService extends Disposable implements INotebookService, ICu
|
||||
// notebook providers/kernels/renderers might use `*` as activation event.
|
||||
await this._extensionService.activateByEvent(`*`);
|
||||
// this awaits full activation of all matching extensions
|
||||
await this._extensionService.activateByEvent(`onNotebook:${viewType}`);
|
||||
|
||||
// TODO@jrieken deprecated, remove this
|
||||
await this._extensionService.activateByEvent(`onNotebookEditor:${viewType}`);
|
||||
}
|
||||
return this._notebookProviders.has(viewType);
|
||||
@@ -548,7 +545,6 @@ export class NotebookService extends Disposable implements INotebookService, ICu
|
||||
|
||||
registerNotebookController(viewType: string, extensionData: NotebookExtensionDescription, controller: IMainNotebookController) {
|
||||
this._notebookProviders.set(viewType, { extensionData, controller });
|
||||
this.notebookProviderInfoStore.get(viewType)!.kernel = controller.kernel;
|
||||
this._onDidChangeViewTypes.fire();
|
||||
}
|
||||
|
||||
@@ -557,23 +553,13 @@ export class NotebookService extends Disposable implements INotebookService, ICu
|
||||
this._onDidChangeViewTypes.fire();
|
||||
}
|
||||
|
||||
registerNotebookKernel(notebook: INotebookKernelInfo): void {
|
||||
this._notebookKernels.set(notebook.id, notebook);
|
||||
this._onDidChangeKernels.fire();
|
||||
}
|
||||
|
||||
unregisterNotebookKernel(id: string): void {
|
||||
this._notebookKernels.delete(id);
|
||||
this._onDidChangeKernels.fire();
|
||||
}
|
||||
|
||||
registerNotebookKernelProvider(provider: INotebookKernelProvider): IDisposable {
|
||||
const d = this.notebookKernelProviderInfoStore.add(provider);
|
||||
const kernelChangeEventListener = provider.onDidChangeKernels(() => {
|
||||
this._onDidChangeKernels.fire();
|
||||
const kernelChangeEventListener = provider.onDidChangeKernels((e) => {
|
||||
this._onDidChangeKernels.fire(e);
|
||||
});
|
||||
|
||||
this._onDidChangeKernels.fire();
|
||||
this._onDidChangeKernels.fire(undefined);
|
||||
return toDisposable(() => {
|
||||
kernelChangeEventListener.dispose();
|
||||
d.dispose();
|
||||
@@ -593,6 +579,7 @@ export class NotebookService extends Disposable implements INotebookService, ICu
|
||||
id: dto.id,
|
||||
label: dto.label,
|
||||
description: dto.description,
|
||||
detail: dto.detail,
|
||||
isPreferred: dto.isPreferred,
|
||||
preloads: dto.preloads,
|
||||
providerHandle: dto.providerHandle,
|
||||
@@ -614,86 +601,41 @@ export class NotebookService extends Disposable implements INotebookService, ICu
|
||||
return flatten(result);
|
||||
}
|
||||
|
||||
getContributedNotebookKernels(viewType: string, resource: URI): INotebookKernelInfo[] {
|
||||
let kernelInfos: INotebookKernelInfo[] = [];
|
||||
this._notebookKernels.forEach(kernel => {
|
||||
if (this._notebookKernelMatch(resource, kernel!.selectors)) {
|
||||
kernelInfos.push(kernel!);
|
||||
}
|
||||
});
|
||||
|
||||
// sort by extensions
|
||||
|
||||
const notebookContentProvider = this._notebookProviders.get(viewType);
|
||||
|
||||
if (!notebookContentProvider) {
|
||||
return kernelInfos;
|
||||
}
|
||||
|
||||
kernelInfos = kernelInfos.sort((a, b) => {
|
||||
if (a.extension.value === notebookContentProvider!.extensionData.id.value) {
|
||||
return -1;
|
||||
} else if (b.extension.value === notebookContentProvider!.extensionData.id.value) {
|
||||
return 1;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
});
|
||||
|
||||
return kernelInfos;
|
||||
}
|
||||
|
||||
private _notebookKernelMatch(resource: URI, selectors: (string | glob.IRelativePattern)[]): boolean {
|
||||
for (let i = 0; i < selectors.length; i++) {
|
||||
const pattern = typeof selectors[i] !== 'string' ? selectors[i] : selectors[i].toString();
|
||||
if (glob.match(pattern, basename(resource.fsPath).toLowerCase())) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
getRendererInfo(id: string): INotebookRendererInfo | undefined {
|
||||
return this.notebookRenderersInfoStore.get(id);
|
||||
}
|
||||
|
||||
async resolveNotebook(viewType: string, uri: URI, forceReload: boolean, editorId?: string, backupId?: string): Promise<NotebookTextModel | undefined> {
|
||||
const provider = this._notebookProviders.get(viewType);
|
||||
if (!provider) {
|
||||
return undefined;
|
||||
async resolveNotebook(viewType: string, uri: URI, forceReload: boolean, editorId?: string, backupId?: string): Promise<NotebookTextModel> {
|
||||
|
||||
if (!await this.canResolve(viewType)) {
|
||||
throw new Error(`CANNOT load notebook, no provider for '${viewType}'`);
|
||||
}
|
||||
|
||||
const modelId = MODEL_ID(uri);
|
||||
|
||||
let notebookModel: NotebookTextModel | undefined = undefined;
|
||||
if (this._models.has(modelId)) {
|
||||
const provider = this._notebookProviders.get(viewType)!;
|
||||
let notebookModel: NotebookTextModel;
|
||||
if (this._models.has(uri)) {
|
||||
// the model already exists
|
||||
notebookModel = this._models.get(modelId)!.model;
|
||||
notebookModel = this._models.get(uri)!.model;
|
||||
if (forceReload) {
|
||||
await provider.controller.reloadNotebook(notebookModel);
|
||||
}
|
||||
|
||||
return notebookModel;
|
||||
|
||||
} else {
|
||||
notebookModel = this._instantiationService.createInstance(NotebookTextModel, NotebookService.mainthreadNotebookDocumentHandle++, viewType, provider.controller.supportBackup, uri);
|
||||
await provider.controller.createNotebook(notebookModel, backupId);
|
||||
|
||||
if (!notebookModel) {
|
||||
return undefined;
|
||||
}
|
||||
}
|
||||
|
||||
// new notebook model created
|
||||
const modelData = new ModelData(
|
||||
notebookModel!,
|
||||
notebookModel,
|
||||
(model) => this._onWillDisposeDocument(model),
|
||||
);
|
||||
|
||||
this._models.set(modelId, modelData);
|
||||
this._onNotebookDocumentAdd.fire([notebookModel!.uri]);
|
||||
this._models.set(uri, modelData);
|
||||
this._onNotebookDocumentAdd.fire([notebookModel.uri]);
|
||||
// after the document is added to the store and sent to ext host, we transform the ouputs
|
||||
await this.transformTextModelOutputs(notebookModel!);
|
||||
await this.transformTextModelOutputs(notebookModel);
|
||||
|
||||
if (editorId) {
|
||||
await provider.controller.resolveNotebookEditor(viewType, uri, editorId);
|
||||
@@ -703,9 +645,11 @@ export class NotebookService extends Disposable implements INotebookService, ICu
|
||||
}
|
||||
|
||||
getNotebookTextModel(uri: URI): NotebookTextModel | undefined {
|
||||
const modelId = MODEL_ID(uri);
|
||||
return this._models.get(uri)?.model;
|
||||
}
|
||||
|
||||
return this._models.get(modelId)?.model;
|
||||
getNotebookTextModels(): Iterable<NotebookTextModel> {
|
||||
return Iterable.map(this._models.values(), data => data.model);
|
||||
}
|
||||
|
||||
private async transformTextModelOutputs(textModel: NotebookTextModel) {
|
||||
@@ -727,7 +671,7 @@ export class NotebookService extends Disposable implements INotebookService, ICu
|
||||
|
||||
transformEditsOutputs(textModel: NotebookTextModel, edits: ICellEditOperation[]) {
|
||||
edits.forEach((edit) => {
|
||||
if (edit.editType === CellEditType.Insert) {
|
||||
if (edit.editType === CellEditType.Replace) {
|
||||
edit.cells.forEach((cell) => {
|
||||
const outputs = cell.outputs;
|
||||
outputs.map((output) => {
|
||||
@@ -740,6 +684,16 @@ export class NotebookService extends Disposable implements INotebookService, ICu
|
||||
}
|
||||
});
|
||||
});
|
||||
} else if (edit.editType === CellEditType.Output) {
|
||||
edit.outputs.map((output) => {
|
||||
if (output.outputKind === CellOutputKind.Rich) {
|
||||
const ret = this._transformMimeTypes(output, output.outputId, textModel.metadata.displayOrder as string[] || []);
|
||||
const orderedMimeTypes = ret.orderedMimeTypes!;
|
||||
const pickedMimeTypeIndex = ret.pickedMimeTypeIndex!;
|
||||
output.pickedMimeTypeIndex = pickedMimeTypeIndex;
|
||||
output.orderedMimeTypes = orderedMimeTypes;
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -811,54 +765,6 @@ export class NotebookService extends Disposable implements INotebookService, ICu
|
||||
return this.notebookRenderersInfoStore.getContributedRenderer(mimeType);
|
||||
}
|
||||
|
||||
async executeNotebook(viewType: string, uri: URI): Promise<void> {
|
||||
const provider = this._notebookProviders.get(viewType);
|
||||
|
||||
if (provider) {
|
||||
return provider.controller.executeNotebookByAttachedKernel(viewType, uri);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
async executeNotebookCell(viewType: string, uri: URI, handle: number): Promise<void> {
|
||||
const provider = this._notebookProviders.get(viewType);
|
||||
if (provider) {
|
||||
await provider.controller.executeNotebookCell(uri, handle);
|
||||
}
|
||||
}
|
||||
|
||||
async cancelNotebook(viewType: string, uri: URI): Promise<void> {
|
||||
const provider = this._notebookProviders.get(viewType);
|
||||
|
||||
if (provider) {
|
||||
return provider.controller.cancelNotebookByAttachedKernel(viewType, uri);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
async cancelNotebookCell(viewType: string, uri: URI, handle: number): Promise<void> {
|
||||
const provider = this._notebookProviders.get(viewType);
|
||||
if (provider) {
|
||||
await provider.controller.cancelNotebookCell(uri, handle);
|
||||
}
|
||||
}
|
||||
|
||||
async executeNotebook2(viewType: string, uri: URI, kernelId: string): Promise<void> {
|
||||
const kernel = this._notebookKernels.get(kernelId);
|
||||
if (kernel) {
|
||||
await kernel.executeNotebook(viewType, uri, undefined);
|
||||
}
|
||||
}
|
||||
|
||||
async executeNotebookCell2(viewType: string, uri: URI, handle: number, kernelId: string): Promise<void> {
|
||||
const kernel = this._notebookKernels.get(kernelId);
|
||||
if (kernel) {
|
||||
await kernel.executeNotebook(viewType, uri, handle);
|
||||
}
|
||||
}
|
||||
|
||||
getContributedNotebookProviders(resource: URI): readonly NotebookProviderInfo[] {
|
||||
return this.notebookProviderInfoStore.getContributedNotebook(resource);
|
||||
}
|
||||
@@ -1000,10 +906,9 @@ export class NotebookService extends Disposable implements INotebookService, ICu
|
||||
}
|
||||
|
||||
private _onWillDisposeDocument(model: INotebookTextModel): void {
|
||||
const modelId = MODEL_ID(model.uri);
|
||||
|
||||
const modelData = this._models.get(modelId);
|
||||
this._models.delete(modelId);
|
||||
const modelData = this._models.get(model.uri);
|
||||
this._models.delete(model.uri);
|
||||
|
||||
if (modelData) {
|
||||
// delete editors and documents
|
||||
|
||||
Reference in New Issue
Block a user