diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 67746bea678..9277de691ec 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -1324,7 +1324,7 @@ declare module 'vscode' { readonly source: string; readonly language: string; // todo@API maybe use a separate data type? - readonly outputs: CellOutput[]; + readonly outputs: (CellOutput | NotebookCellOutput)[]; readonly metadata: NotebookCellMetadata | undefined; } diff --git a/src/vs/workbench/api/common/extHostNotebook.ts b/src/vs/workbench/api/common/extHostNotebook.ts index 49f35f11f9d..cb48c971899 100644 --- a/src/vs/workbench/api/common/extHostNotebook.ts +++ b/src/vs/workbench/api/common/extHostNotebook.ts @@ -17,7 +17,7 @@ import { IExtensionStoragePaths } from 'vs/workbench/api/common/extHostStoragePa import * as typeConverters from 'vs/workbench/api/common/extHostTypeConverters'; import * as extHostTypes from 'vs/workbench/api/common/extHostTypes'; import { asWebviewUri, WebviewInitData } from 'vs/workbench/api/common/shared/webview'; -import { addIdToOutput, CellStatusbarAlignment, CellUri, INotebookCellStatusBarEntry, INotebookDisplayOrder, INotebookExclusiveDocumentFilter, INotebookKernelInfoDto2, NotebookCellMetadata, NotebookCellsChangedEventDto, NotebookCellsChangeType, NotebookDataDto, notebookDocumentMetadataDefaults } from 'vs/workbench/contrib/notebook/common/notebookCommon'; +import { CellStatusbarAlignment, CellUri, INotebookCellStatusBarEntry, INotebookDisplayOrder, INotebookExclusiveDocumentFilter, INotebookKernelInfoDto2, NotebookCellMetadata, NotebookCellsChangedEventDto, NotebookCellsChangeType, NotebookDataDto, notebookDocumentMetadataDefaults } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import * as vscode from 'vscode'; import { ResourceMap } from 'vs/base/common/map'; import { ExtHostCell, ExtHostNotebookDocument } from './extHostNotebookDocument'; @@ -456,10 +456,7 @@ export class ExtHostNotebookController implements ExtHostNotebookShape, ExtHostN ...data.metadata }, languages: data.languages, - cells: data.cells.map(cell => ({ - ...cell, - outputs: cell.outputs.map(o => addIdToOutput(o)) - })), + cells: data.cells.map(typeConverters.NotebookCellData.from), }; } diff --git a/src/vs/workbench/api/common/extHostNotebookEditor.ts b/src/vs/workbench/api/common/extHostNotebookEditor.ts index e881e95c229..75432c619de 100644 --- a/src/vs/workbench/api/common/extHostNotebookEditor.ts +++ b/src/vs/workbench/api/common/extHostNotebookEditor.ts @@ -9,7 +9,7 @@ import { Disposable } from 'vs/base/common/lifecycle'; import { MainThreadNotebookShape } from 'vs/workbench/api/common/extHost.protocol'; import * as extHostTypes from 'vs/workbench/api/common/extHostTypes'; import * as extHostConverter from 'vs/workbench/api/common/extHostTypeConverters'; -import { addIdToOutput, CellEditType, ICellEditOperation, ICellReplaceEdit, INotebookEditData, notebookDocumentMetadataDefaults } from 'vs/workbench/contrib/notebook/common/notebookCommon'; +import { CellEditType, ICellEditOperation, ICellReplaceEdit, INotebookEditData, notebookDocumentMetadataDefaults } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import * as vscode from 'vscode'; import { ExtHostNotebookDocument } from './extHostNotebookDocument'; @@ -78,12 +78,7 @@ class NotebookEditorCellEditBuilder implements vscode.NotebookEditorEdit { editType: CellEditType.Replace, index: from, count: to - from, - cells: cells.map(data => { - return { - ...data, - outputs: data.outputs.map(output => addIdToOutput(output)), - }; - }) + cells: cells.map(extHostConverter.NotebookCellData.from) }); } } diff --git a/src/vs/workbench/api/common/extHostTypeConverters.ts b/src/vs/workbench/api/common/extHostTypeConverters.ts index dc3d18915f6..3eb5a0df6a0 100644 --- a/src/vs/workbench/api/common/extHostTypeConverters.ts +++ b/src/vs/workbench/api/common/extHostTypeConverters.ts @@ -31,7 +31,7 @@ import { coalesce, isNonEmptyArray } from 'vs/base/common/arrays'; import { RenderLineNumbersType } from 'vs/editor/common/config/editorOptions'; import { CommandsConverter } from 'vs/workbench/api/common/extHostCommands'; import { ExtHostNotebookController } from 'vs/workbench/api/common/extHostNotebook'; -import { CellEditType, CellOutputKind, INotebookDecorationRenderOptions, ITransformedDisplayOutputDto } from 'vs/workbench/contrib/notebook/common/notebookCommon'; +import { CellEditType, CellOutputKind, ICellDto2, INotebookDecorationRenderOptions, ITransformedDisplayOutputDto } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { ITestItem, ITestState } from 'vs/workbench/contrib/testing/common/testCollection'; export interface PositionLike { @@ -574,6 +574,19 @@ export namespace WorkspaceEdit { } }); } + } else if (entry._type === types.FileEditType.CellReplace) { + result.edits.push({ + _type: extHostProtocol.WorkspaceEditType.Cell, + metadata: entry.metadata, + resource: entry.uri, + notebookVersionId: notebooks?.lookupNotebookDocument(entry.uri)?.notebookDocument.version, + edit: { + editType: CellEditType.Replace, + index: entry.index, + count: entry.count, + cells: entry.cells.map(NotebookCellData.from) + } + }); } } } @@ -1306,6 +1319,28 @@ export namespace LanguageSelector { } } +export namespace NotebookCellData { + + export function from(data: vscode.NotebookCellData): ICellDto2 { + let outputs: ITransformedDisplayOutputDto[]; + const [first] = data.outputs; + if (!first) { + outputs = []; + } if (first instanceof types.NotebookCellOutput) { + outputs = (data.outputs).map(NotebookCellOutput.from); + } else { + outputs = (data.outputs).map(o => NotebookCellOutput.from(types.NotebookCellOutput._fromOld(o))); + } + return { + cellKind: data.cellKind, + language: data.language, + source: data.source, + metadata: data.metadata, + outputs + }; + } +} + export namespace NotebookCellOutput { export function from(output: types.NotebookCellOutput): ITransformedDisplayOutputDto { diff --git a/src/vs/workbench/api/common/extHostTypes.ts b/src/vs/workbench/api/common/extHostTypes.ts index 7b089f6f1f2..5f634c57fc7 100644 --- a/src/vs/workbench/api/common/extHostTypes.ts +++ b/src/vs/workbench/api/common/extHostTypes.ts @@ -13,7 +13,7 @@ import { URI } from 'vs/base/common/uri'; import { generateUuid } from 'vs/base/common/uuid'; import { FileSystemProviderErrorCode, markAsFileSystemProviderError } from 'vs/platform/files/common/files'; import { RemoteAuthorityResolverErrorCode } from 'vs/platform/remote/common/remoteAuthorityResolver'; -import { addIdToOutput, CellEditType, ICellEditOperation, notebookDocumentMetadataDefaults } from 'vs/workbench/contrib/notebook/common/notebookCommon'; +import { CellEditType, ICellEditOperation, notebookDocumentMetadataDefaults } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import type * as vscode from 'vscode'; function es5ClassCompat(target: Function): any { @@ -587,6 +587,7 @@ export const enum FileEditType { Text = 2, Cell = 3, CellOutput = 4, + CellReplace = 5, } export interface IFileOperation { @@ -612,6 +613,15 @@ export interface IFileCellEdit { metadata?: vscode.WorkspaceEditEntryMetadata; } +export interface ICellEdit { + _type: FileEditType.CellReplace; + metadata?: vscode.WorkspaceEditEntryMetadata; + uri: URI; + index: number; + count: number; + cells: vscode.NotebookCellData[]; +} + export interface ICellOutputEdit { _type: FileEditType.CellOutput; uri: URI; @@ -622,13 +632,16 @@ export interface ICellOutputEdit { metadata?: vscode.WorkspaceEditEntryMetadata; } + +type WorkspaceEditEntry = IFileOperation | IFileTextEdit | IFileCellEdit | ICellEdit | ICellOutputEdit; + @es5ClassCompat export class WorkspaceEdit implements vscode.WorkspaceEdit { - private readonly _edits = new Array(); + private readonly _edits: WorkspaceEditEntry[] = []; - _allEntries(): ReadonlyArray { + _allEntries(): ReadonlyArray { return this._edits; } @@ -654,7 +667,7 @@ export class WorkspaceEdit implements vscode.WorkspaceEdit { replaceNotebookCells(uri: URI, start: number, end: number, cells: vscode.NotebookCellData[], metadata?: vscode.WorkspaceEditEntryMetadata): void { if (start !== end || cells.length > 0) { - 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)) })) } }); + this._edits.push({ _type: FileEditType.CellReplace, uri, index: start, count: end - start, cells, metadata }); } } diff --git a/src/vs/workbench/contrib/notebook/common/notebookCommon.ts b/src/vs/workbench/contrib/notebook/common/notebookCommon.ts index 0aa28c1019b..9a1daaf4a96 100644 --- a/src/vs/workbench/contrib/notebook/common/notebookCommon.ts +++ b/src/vs/workbench/contrib/notebook/common/notebookCommon.ts @@ -7,7 +7,6 @@ import { CancellationToken } from 'vs/base/common/cancellation'; import { IDiffResult, ISequence } from 'vs/base/common/diff/diff'; import { Event } from 'vs/base/common/event'; import * as glob from 'vs/base/common/glob'; -import * as UUID from 'vs/base/common/uuid'; import { Schemas } from 'vs/base/common/network'; import { basename } from 'vs/base/common/path'; import { isWindows } from 'vs/base/common/platform'; @@ -196,8 +195,6 @@ export interface ITransformedErrorOutputDto extends IErrorOutput { outputId: string; } -export const addIdToOutput = (output: IOutputDto, id = UUID.generateUuid()): IOutputDtoWithId => ({ ...output, outputId: id }); - export type IOutputDto = IDisplayOutput | IStreamOutput | IErrorOutput; export type IOutputDtoWithId = ITransformedDisplayOutputDto | ITransformedStreamOutputDto | ITransformedErrorOutputDto;