Skip to content

Commit 860a687

Browse files
committed
WorkspaceEdit#replaceCells|CellOutput|CellMetadata, microsoft#105283
1 parent f4d92fc commit 860a687

9 files changed

Lines changed: 72 additions & 21 deletions

File tree

src/vs/vscode.proposed.d.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1335,6 +1335,12 @@ declare module 'vscode' {
13351335
contains(uri: Uri): boolean
13361336
}
13371337

1338+
export interface WorkspaceEdit {
1339+
replaceCells(uri: Uri, start: number, end: number, cells: NotebookCellData[], metadata?: WorkspaceEditEntryMetadata): void;
1340+
replaceCellOutput(uri: Uri, index: number, outputs: CellOutput[], metadata?: WorkspaceEditEntryMetadata): void;
1341+
replaceCellMetadata(uri: Uri, index: number, cellMetadata: NotebookCellMetadata, metadata?: WorkspaceEditEntryMetadata): void;
1342+
}
1343+
13381344
export interface NotebookEditorCellEdit {
13391345

13401346
replaceCells(from: number, to: number, cells: NotebookCellData[]): void;

src/vs/workbench/api/browser/mainThreadEditors.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import { openEditorWith } from 'vs/workbench/services/editor/common/editorOpenWi
3030
import { IEnvironmentService } from 'vs/platform/environment/common/environment';
3131
import { IWorkingCopyService } from 'vs/workbench/services/workingCopy/common/workingCopyService';
3232
import { revive } from 'vs/base/common/marshalling';
33+
import { ResourceNotebookCellEdit } from 'vs/workbench/contrib/bulkEdit/browser/bulkCellEdits';
3334

3435
function reviveWorkspaceEditDto2(data: IWorkspaceEditDto | undefined): ResourceEdit[] {
3536
if (!data?.edits) {
@@ -42,6 +43,8 @@ function reviveWorkspaceEditDto2(data: IWorkspaceEditDto | undefined): ResourceE
4243
result.push(new ResourceFileEdit(edit.oldUri, edit.newUri, edit.options, edit.metadata));
4344
} else if (edit._type === WorkspaceEditType.Text) {
4445
result.push(new ResourceTextEdit(edit.resource, edit.edit, edit.modelVersionId, edit.metadata));
46+
} else if (edit._type === WorkspaceEditType.Cell) {
47+
result.push(new ResourceNotebookCellEdit(edit.resource, edit.edit, edit.modelVersionId, edit.metadata));
4548
}
4649
}
4750
return result;

src/vs/workbench/api/common/extHost.protocol.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1243,6 +1243,7 @@ export interface IWorkspaceEditEntryMetadataDto {
12431243
export const enum WorkspaceEditType {
12441244
File = 1,
12451245
Text = 2,
1246+
Cell = 3,
12461247
}
12471248

12481249
export interface IWorkspaceFileEditDto {
@@ -1261,8 +1262,16 @@ export interface IWorkspaceTextEditDto {
12611262
metadata?: IWorkspaceEditEntryMetadataDto;
12621263
}
12631264

1265+
export interface IWorkspaceCellEditDto {
1266+
_type: WorkspaceEditType.Cell;
1267+
resource: UriComponents;
1268+
edit: ICellEditOperation;
1269+
modelVersionId?: number;
1270+
metadata?: IWorkspaceEditEntryMetadataDto;
1271+
}
1272+
12641273
export interface IWorkspaceEditDto {
1265-
edits: Array<IWorkspaceFileEditDto | IWorkspaceTextEditDto>;
1274+
edits: Array<IWorkspaceFileEditDto | IWorkspaceTextEditDto | IWorkspaceCellEditDto>;
12661275

12671276
// todo@joh reject should go into rename
12681277
rejectReason?: string;

src/vs/workbench/api/common/extHostFileSystemEventService.ts

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,11 @@ import { IRelativePattern, parse } from 'vs/base/common/glob';
88
import { URI } from 'vs/base/common/uri';
99
import { ExtHostDocumentsAndEditors } from 'vs/workbench/api/common/extHostDocumentsAndEditors';
1010
import type * as vscode from 'vscode';
11-
import { ExtHostFileSystemEventServiceShape, FileSystemEvents, IMainContext, MainContext, MainThreadTextEditorsShape, IWorkspaceFileEditDto, IWorkspaceTextEditDto, SourceTargetPair } from './extHost.protocol';
11+
import { ExtHostFileSystemEventServiceShape, FileSystemEvents, IMainContext, MainContext, MainThreadTextEditorsShape, SourceTargetPair, IWorkspaceEditDto } from './extHost.protocol';
1212
import * as typeConverter from './extHostTypeConverters';
1313
import { Disposable, WorkspaceEdit } from './extHostTypes';
1414
import { IExtensionDescription } from 'vs/platform/extensions/common/extensions';
1515
import { FileOperation } from 'vs/platform/files/common/files';
16-
import { flatten } from 'vs/base/common/arrays';
1716
import { CancellationToken } from 'vs/base/common/cancellation';
1817
import { ILogService } from 'vs/platform/log/common/log';
1918

@@ -217,14 +216,13 @@ export class ExtHostFileSystemEventService implements ExtHostFileSystemEventServ
217216
}
218217

219218
if (edits.length > 0) {
220-
// flatten all WorkspaceEdits collected via waitUntil-call
221-
// and apply them in one go.
222-
const allEdits = new Array<Array<IWorkspaceFileEditDto | IWorkspaceTextEditDto>>();
219+
// concat all WorkspaceEdits collected via waitUntil-call and apply them in one go.
220+
const dto: IWorkspaceEditDto = { edits: [] };
223221
for (let edit of edits) {
224222
let { edits } = typeConverter.WorkspaceEdit.from(edit, this._extHostDocumentsAndEditors);
225-
allEdits.push(edits);
223+
dto.edits = dto.edits.concat(edits);
226224
}
227-
return this._mainThreadTextEditors.$tryApplyWorkspaceEdit({ edits: flatten(allEdits) });
225+
return this._mainThreadTextEditors.$tryApplyWorkspaceEdit(dto);
228226
}
229227
}
230228
}

src/vs/workbench/api/common/extHostNotebook.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import { IExtensionStoragePaths } from 'vs/workbench/api/common/extHostStoragePa
2222
import * as typeConverters from 'vs/workbench/api/common/extHostTypeConverters';
2323
import * as extHostTypes from 'vs/workbench/api/common/extHostTypes';
2424
import { asWebviewUri, WebviewInitData } from 'vs/workbench/api/common/shared/webview';
25-
import { CellEditType, CellOutputKind, CellStatusbarAlignment, CellUri, diff, ICellDeleteEdit, ICellDto2, ICellEditOperation, ICellInsertEdit, IMainCellDto, INotebookCellStatusBarEntry, INotebookDisplayOrder, INotebookEditData, INotebookKernelInfoDto2, IProcessedOutput, IRawOutput, NotebookCellMetadata, NotebookCellsChangedEvent, NotebookCellsChangeType, NotebookCellsSplice2, NotebookDataDto, notebookDocumentMetadataDefaults } from 'vs/workbench/contrib/notebook/common/notebookCommon';
25+
import { addIdToOutput, CellEditType, CellOutputKind, CellStatusbarAlignment, CellUri, diff, ICellDeleteEdit, ICellDto2, ICellEditOperation, ICellInsertEdit, IMainCellDto, INotebookCellStatusBarEntry, INotebookDisplayOrder, INotebookEditData, INotebookKernelInfoDto2, IProcessedOutput, NotebookCellMetadata, NotebookCellsChangedEvent, NotebookCellsChangeType, NotebookCellsSplice2, NotebookDataDto, notebookDocumentMetadataDefaults } from 'vs/workbench/contrib/notebook/common/notebookCommon';
2626
import * as vscode from 'vscode';
2727
import { Cache } from './cache';
2828
import { ResourceMap } from 'vs/base/common/map';
@@ -55,9 +55,6 @@ interface INotebookEventEmitter {
5555
emitCellMetadataChange(event: vscode.NotebookCellMetadataChangeEvent): void;
5656
}
5757

58-
const addIdToOutput = (output: IRawOutput, id = UUID.generateUuid()): IProcessedOutput => output.outputKind === CellOutputKind.Rich
59-
? ({ ...output, outputId: id }) : output;
60-
6158
export class ExtHostCell extends Disposable {
6259

6360
public static asModelAddData(notebook: vscode.NotebookDocument, cell: IMainCellDto): IExtHostModelAddedData {

src/vs/workbench/api/common/extHostTypeConverters.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -511,7 +511,7 @@ export namespace WorkspaceEdit {
511511
};
512512

513513
if (value instanceof types.WorkspaceEdit) {
514-
for (let entry of value.allEntries()) {
514+
for (let entry of value._allEntries()) {
515515

516516
if (entry._type === types.FileEditType.File) {
517517
// file operation
@@ -523,7 +523,7 @@ export namespace WorkspaceEdit {
523523
metadata: entry.metadata
524524
});
525525

526-
} else {
526+
} else if (entry._type === types.FileEditType.Text) {
527527
// text edits
528528
const doc = documents?.getDocument(entry.uri);
529529
result.edits.push(<extHostProtocol.IWorkspaceTextEditDto>{
@@ -533,6 +533,14 @@ export namespace WorkspaceEdit {
533533
modelVersionId: doc?.version,
534534
metadata: entry.metadata
535535
});
536+
} else if (entry._type === types.FileEditType.Cell) {
537+
result.edits.push(<extHostProtocol.IWorkspaceCellEditDto>{
538+
_type: extHostProtocol.WorkspaceEditType.Cell,
539+
resource: entry.uri,
540+
edit: entry.edit,
541+
metadata: entry.metadata,
542+
modelVersionId: undefined, // todo@jrieken
543+
});
536544
}
537545
}
538546
}

src/vs/workbench/api/common/extHostTypes.ts

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import { URI } from 'vs/base/common/uri';
1515
import { generateUuid } from 'vs/base/common/uuid';
1616
import { FileSystemProviderErrorCode, markAsFileSystemProviderError } from 'vs/platform/files/common/files';
1717
import { RemoteAuthorityResolverErrorCode } from 'vs/platform/remote/common/remoteAuthorityResolver';
18+
import { addIdToOutput, CellEditType, ICellEditOperation } from 'vs/workbench/contrib/notebook/common/notebookCommon';
1819
import type * as vscode from 'vscode';
1920

2021
function es5ClassCompat(target: Function): any {
@@ -578,7 +579,8 @@ export interface IFileOperationOptions {
578579

579580
export const enum FileEditType {
580581
File = 1,
581-
Text = 2
582+
Text = 2,
583+
Cell = 3
582584
}
583585

584586
export interface IFileOperation {
@@ -596,13 +598,20 @@ export interface IFileTextEdit {
596598
metadata?: vscode.WorkspaceEditEntryMetadata;
597599
}
598600

601+
export interface IFileCellEdit {
602+
_type: FileEditType.Cell;
603+
uri: URI;
604+
edit: ICellEditOperation;
605+
metadata?: vscode.WorkspaceEditEntryMetadata;
606+
}
607+
599608
@es5ClassCompat
600609
export class WorkspaceEdit implements vscode.WorkspaceEdit {
601610

602-
private readonly _edits = new Array<IFileOperation | IFileTextEdit>();
611+
private readonly _edits = new Array<IFileOperation | IFileTextEdit | IFileCellEdit>();
603612

604613

605-
allEntries(): ReadonlyArray<IFileTextEdit | IFileOperation> {
614+
_allEntries(): ReadonlyArray<IFileTextEdit | IFileOperation | IFileCellEdit> {
606615
return this._edits;
607616
}
608617

@@ -620,6 +629,21 @@ export class WorkspaceEdit implements vscode.WorkspaceEdit {
620629
this._edits.push({ _type: FileEditType.File, from: uri, to: undefined, options, metadata });
621630
}
622631

632+
// --- cell
633+
634+
replaceCells(uri: URI, start: number, end: number, cells: vscode.NotebookCellData[], metadata?: vscode.WorkspaceEditEntryMetadata): void {
635+
this._edits.push({ _type: FileEditType.Cell, metadata, uri, edit: { editType: CellEditType.Delete, index: start, count: end - start } });
636+
this._edits.push({ _type: FileEditType.Cell, metadata, uri, edit: { editType: CellEditType.Insert, index: start, cells: cells.map(cell => ({ ...cell, outputs: cell.outputs.map(output => addIdToOutput(output)) })) } });
637+
}
638+
639+
replaceCellOutput(uri: URI, index: number, outputs: vscode.CellOutput[], metadata?: vscode.WorkspaceEditEntryMetadata): void {
640+
this._edits.push({ _type: FileEditType.Cell, metadata, uri, edit: { editType: CellEditType.Output, index, outputs: outputs.map(output => addIdToOutput(output)) } });
641+
}
642+
643+
replaceCellMetadata(uri: URI, index: number, cellMetadata: vscode.NotebookCellMetadata, metadata?: vscode.WorkspaceEditEntryMetadata): void {
644+
this._edits.push({ _type: FileEditType.Cell, metadata, uri, edit: { editType: CellEditType.Metadata, index, metadata: cellMetadata } });
645+
}
646+
623647
// --- text
624648

625649
replace(uri: URI, range: Range, newText: string, metadata?: vscode.WorkspaceEditEntryMetadata): void {

src/vs/workbench/contrib/notebook/common/notebookCommon.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { CancellationToken } from 'vs/base/common/cancellation';
77
import { IDiffResult, ISequence } from 'vs/base/common/diff/diff';
88
import { Event } from 'vs/base/common/event';
99
import * as glob from 'vs/base/common/glob';
10-
import { IDisposable } from 'vs/base/common/lifecycle';
10+
import * as UUID from 'vs/base/common/uuid';
1111
import { Schemas } from 'vs/base/common/network';
1212
import { basename } from 'vs/base/common/path';
1313
import { isWindows } from 'vs/base/common/platform';
@@ -21,6 +21,7 @@ import { IEditorModel } from 'vs/platform/editor/common/editor';
2121
import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions';
2222
import { IRevertOptions } from 'vs/workbench/common/editor';
2323
import { NotebookTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookTextModel';
24+
import { IDisposable } from 'vs/base/common/lifecycle';
2425

2526
export enum CellKind {
2627
Markdown = 1,
@@ -221,6 +222,11 @@ export interface IGenericOutput {
221222
transformedOutput?: { [key: string]: IDisplayOutput };
222223
}
223224

225+
226+
export const addIdToOutput = (output: IRawOutput, id = UUID.generateUuid()): IProcessedOutput => output.outputKind === CellOutputKind.Rich
227+
? ({ ...output, outputId: id }) : output;
228+
229+
224230
export type IProcessedOutput = ITransformedDisplayOutputDto | IStreamOutput | IErrorOutput;
225231

226232
export type IRawOutput = IDisplayOutput | IStreamOutput | IErrorOutput;

src/vs/workbench/test/browser/api/extHostTypes.test.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -384,7 +384,7 @@ suite('ExtHostTypes', function () {
384384
edit.replace(URI.parse('foo:a'), new types.Range(2, 1, 2, 1), 'bar');
385385
edit.replace(URI.parse('foo:b'), new types.Range(3, 1, 3, 1), 'bazz');
386386

387-
const all = edit.allEntries();
387+
const all = edit._allEntries();
388388
assert.equal(all.length, 4);
389389

390390
const [first, second, third, fourth] = all;
@@ -408,8 +408,8 @@ suite('ExtHostTypes', function () {
408408
edit.insert(uri, new types.Position(0, 0), 'Hello');
409409
edit.insert(uri, new types.Position(0, 0), 'Foo');
410410

411-
assert.equal(edit.allEntries().length, 2);
412-
let [first, second] = edit.allEntries();
411+
assert.equal(edit._allEntries().length, 2);
412+
let [first, second] = edit._allEntries();
413413

414414
assertType(first._type === types.FileEditType.Text);
415415
assertType(second._type === types.FileEditType.Text);

0 commit comments

Comments
 (0)