From 420aa32929e2087969a9e4d005fe0137fd49a913 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 9 Sep 2020 10:38:11 +0200 Subject: [PATCH] add `replaceNotebookMetadata`, https://github.com/microsoft/vscode/issues/105283 --- src/vs/vscode.proposed.d.ts | 1 + .../api/browser/mainThreadEditors.ts | 2 +- .../workbench/api/common/extHost.protocol.ts | 5 ++-- .../api/common/extHostTypeConverters.ts | 5 ++-- src/vs/workbench/api/common/extHostTypes.ts | 9 ++++++-- .../contrib/bulkEdit/browser/bulkCellEdits.ts | 23 +++++++++++++++---- 6 files changed, 33 insertions(+), 12 deletions(-) diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 1a0d137e32b..5741ff5aa85 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -1350,6 +1350,7 @@ declare module 'vscode' { } export interface WorkspaceEdit { + replaceNotebookMetadata(uri: Uri, value: NotebookDocumentMetadata): void; replaceCells(uri: Uri, start: number, end: number, cells: NotebookCellData[], metadata?: WorkspaceEditEntryMetadata): void; replaceCellOutput(uri: Uri, index: number, outputs: CellOutput[], metadata?: WorkspaceEditEntryMetadata): void; replaceCellMetadata(uri: Uri, index: number, cellMetadata: NotebookCellMetadata, metadata?: WorkspaceEditEntryMetadata): void; diff --git a/src/vs/workbench/api/browser/mainThreadEditors.ts b/src/vs/workbench/api/browser/mainThreadEditors.ts index d8e199ac0ad..71d1e940085 100644 --- a/src/vs/workbench/api/browser/mainThreadEditors.ts +++ b/src/vs/workbench/api/browser/mainThreadEditors.ts @@ -44,7 +44,7 @@ function reviveWorkspaceEditDto2(data: IWorkspaceEditDto | undefined): ResourceE } else if (edit._type === WorkspaceEditType.Text) { result.push(new ResourceTextEdit(edit.resource, edit.edit, edit.modelVersionId, edit.metadata)); } else if (edit._type === WorkspaceEditType.Cell) { - result.push(new ResourceNotebookCellEdit(edit.resource, edit.edit, edit.modelVersionId, edit.metadata)); + result.push(new ResourceNotebookCellEdit(edit.resource, edit.edit, edit.notebookMetadata, edit.notebookVersionId, edit.metadata)); } } return result; diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index 94cbcab2a90..172c3111ff7 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -1274,8 +1274,9 @@ export interface IWorkspaceTextEditDto { export interface IWorkspaceCellEditDto { _type: WorkspaceEditType.Cell; resource: UriComponents; - edit: ICellEditOperation; - modelVersionId?: number; + edit?: ICellEditOperation; + notebookMetadata?: NotebookDocumentMetadata; + notebookVersionId?: number; metadata?: IWorkspaceEditEntryMetadataDto; } diff --git a/src/vs/workbench/api/common/extHostTypeConverters.ts b/src/vs/workbench/api/common/extHostTypeConverters.ts index e5df10e69f8..da9bd09b20a 100644 --- a/src/vs/workbench/api/common/extHostTypeConverters.ts +++ b/src/vs/workbench/api/common/extHostTypeConverters.ts @@ -537,10 +537,11 @@ export namespace WorkspaceEdit { } else if (entry._type === types.FileEditType.Cell) { result.edits.push({ _type: extHostProtocol.WorkspaceEditType.Cell, + metadata: entry.metadata, resource: entry.uri, edit: entry.edit, - metadata: entry.metadata, - modelVersionId: notebooks?.lookupNotebookDocument(entry.uri)?.notebookDocument.version + notebookMetadata: entry.notebookMetadata, + notebookVersionId: notebooks?.lookupNotebookDocument(entry.uri)?.notebookDocument.version }); } } diff --git a/src/vs/workbench/api/common/extHostTypes.ts b/src/vs/workbench/api/common/extHostTypes.ts index d832779db22..94638701e4f 100644 --- a/src/vs/workbench/api/common/extHostTypes.ts +++ b/src/vs/workbench/api/common/extHostTypes.ts @@ -601,7 +601,8 @@ export interface IFileTextEdit { export interface IFileCellEdit { _type: FileEditType.Cell; uri: URI; - edit: ICellEditOperation; + edit?: ICellEditOperation; + notebookMetadata?: vscode.NotebookDocumentMetadata; metadata?: vscode.WorkspaceEditEntryMetadata; } @@ -629,7 +630,11 @@ export class WorkspaceEdit implements vscode.WorkspaceEdit { this._edits.push({ _type: FileEditType.File, from: uri, to: undefined, options, metadata }); } - // --- cell + // --- notebook + + replaceNotebookMetadata(uri: URI, value: vscode.NotebookDocumentMetadata, metadata?: vscode.WorkspaceEditEntryMetadata): void { + this._edits.push({ _type: FileEditType.Cell, metadata, uri, notebookMetadata: value }); + } replaceCells(uri: URI, start: number, end: number, cells: vscode.NotebookCellData[], metadata?: vscode.WorkspaceEditEntryMetadata): void { this._edits.push({ _type: FileEditType.Cell, metadata, uri, edit: { editType: CellEditType.Replace, index: start, count: end - start, cells: cells.map(cell => ({ ...cell, outputs: cell.outputs.map(output => addIdToOutput(output)) })) } }); diff --git a/src/vs/workbench/contrib/bulkEdit/browser/bulkCellEdits.ts b/src/vs/workbench/contrib/bulkEdit/browser/bulkCellEdits.ts index 5def1d910c2..41ab95fd25e 100644 --- a/src/vs/workbench/contrib/bulkEdit/browser/bulkCellEdits.ts +++ b/src/vs/workbench/contrib/bulkEdit/browser/bulkCellEdits.ts @@ -9,7 +9,7 @@ import { URI } from 'vs/base/common/uri'; import { ResourceEdit } from 'vs/editor/browser/services/bulkEditService'; import { WorkspaceEditMetadata } from 'vs/editor/common/modes'; import { IProgress } from 'vs/platform/progress/common/progress'; -import { ICellEditOperation } from 'vs/workbench/contrib/notebook/common/notebookCommon'; +import { ICellEditOperation, NotebookDocumentMetadata } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { INotebookEditorModelResolverService } from 'vs/workbench/contrib/notebook/common/notebookEditorModelResolverService'; import { INotebookService } from 'vs/workbench/contrib/notebook/common/notebookService'; @@ -17,7 +17,8 @@ export class ResourceNotebookCellEdit extends ResourceEdit { constructor( readonly resource: URI, - readonly cellEdit: ICellEditOperation, + readonly cellEdit?: ICellEditOperation, + readonly notebookMetadata?: NotebookDocumentMetadata, readonly versionId?: number, readonly metadata?: WorkspaceEditMetadata ) { @@ -48,10 +49,22 @@ export class BulkCellEdits { // throw new Error(`Notebook '${first.resource}' has changed in the meantime`); // } + const edits: ICellEditOperation[] = []; + let newMetadata: NotebookDocumentMetadata | undefined; + for (let edit of group) { + if (edit.cellEdit) { + edits.push(edit.cellEdit); + } + newMetadata = edit.notebookMetadata ?? newMetadata; + } + + // set metadata + if (newMetadata) { + ref.object.notebook.updateNotebookMetadata(newMetadata); + } // apply edits - const cellEdits = group.map(edit => edit.cellEdit); - this._notebookService.transformEditsOutputs(ref.object.notebook, cellEdits); - ref.object.notebook.applyEdit(ref.object.notebook.versionId, cellEdits, true); + this._notebookService.transformEditsOutputs(ref.object.notebook, edits); + ref.object.notebook.applyEdit(ref.object.notebook.versionId, edits, true); ref.dispose(); this._progress.report(undefined); -- GitLab