Skip to content

Commit 63142fc

Browse files
committed
add API proposal for workspace edit metadata, microsoft#77728
1 parent 1bafcbe commit 63142fc

4 files changed

Lines changed: 91 additions & 58 deletions

File tree

src/vs/vscode.proposed.d.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1550,4 +1550,26 @@ declare module 'vscode' {
15501550

15511551
//#endregion
15521552

1553+
1554+
//#region https://github.com/microsoft/vscode/issues/77728
1555+
1556+
export interface WorkspaceEditMetadata {
1557+
needsConfirmation: boolean;
1558+
label: string;
1559+
description?: string;
1560+
iconPath?: Uri | { light: Uri; dark: Uri } | ThemeIcon;
1561+
}
1562+
1563+
export interface WorkspaceEdit {
1564+
1565+
insert(uri: Uri, position: Position, newText: string, metadata?: WorkspaceEditMetadata): void;
1566+
delete(uri: Uri, range: Range, metadata?: WorkspaceEditMetadata): void;
1567+
replace(uri: Uri, range: Range, newText: string, metadata?: WorkspaceEditMetadata): void;
1568+
1569+
createFile(uri: Uri, options?: { overwrite?: boolean, ignoreIfExists?: boolean }, metadata?: WorkspaceEditMetadata): void;
1570+
deleteFile(uri: Uri, options?: { recursive?: boolean, ignoreIfNotExists?: boolean }, metadata?: WorkspaceEditMetadata): void;
1571+
renameFile(oldUri: Uri, newUri: Uri, options?: { overwrite?: boolean, ignoreIfExists?: boolean }, metadata?: WorkspaceEditMetadata): void;
1572+
}
1573+
1574+
//#endregion
15531575
}

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

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -483,15 +483,29 @@ export namespace WorkspaceEdit {
483483
const result: extHostProtocol.IWorkspaceEditDto = {
484484
edits: []
485485
};
486-
for (const entry of (value as types.WorkspaceEdit)._allEntries()) {
487-
const [uri, uriOrEdits] = entry;
488-
if (URI.isUri(uriOrEdits) || uriOrEdits === undefined) {
489-
// resource edits
490-
result.edits.push(<extHostProtocol.IWorkspaceFileEditDto>{ oldUri: uri, newUri: uriOrEdits, options: entry[2] });
491-
} else {
492-
// text edits
493-
const doc = documents && uri ? documents.getDocument(uri) : undefined;
494-
result.edits.push(<extHostProtocol.IWorkspaceTextEditDto>{ resource: uri, modelVersionId: doc && doc.version, edit: TextEdit.from(uriOrEdits) });
486+
487+
if (value instanceof types.WorkspaceEdit) {
488+
for (let entry of value.allEntries()) {
489+
490+
if (entry._type === 1) {
491+
// file operation
492+
result.edits.push(<extHostProtocol.IWorkspaceFileEditDto>{
493+
oldUri: entry.from,
494+
newUri: entry.to,
495+
options: entry.options,
496+
metadata: entry.metadata
497+
});
498+
499+
} else {
500+
// text edits
501+
const doc = documents?.getDocument(entry.uri);
502+
result.edits.push(<extHostProtocol.IWorkspaceTextEditDto>{
503+
resource: entry.uri,
504+
edit: TextEdit.from(entry.edit),
505+
modelVersionId: doc?.version,
506+
metadata: entry.metadata
507+
});
508+
}
495509
}
496510
}
497511
return result;

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

Lines changed: 28 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -564,7 +564,6 @@ export class TextEdit {
564564
}
565565
}
566566

567-
568567
export interface IFileOperationOptions {
569568
overwrite?: boolean;
570569
ignoreIfExists?: boolean;
@@ -577,41 +576,43 @@ export interface IFileOperation {
577576
from?: URI;
578577
to?: URI;
579578
options?: IFileOperationOptions;
579+
metadata?: vscode.WorkspaceEditMetadata;
580580
}
581581

582582
export interface IFileTextEdit {
583583
_type: 2;
584584
uri: URI;
585585
edit: TextEdit;
586+
metadata?: vscode.WorkspaceEditMetadata;
586587
}
587588

588589
@es5ClassCompat
589590
export class WorkspaceEdit implements vscode.WorkspaceEdit {
590591

591592
private _edits = new Array<IFileOperation | IFileTextEdit>();
592593

593-
renameFile(from: vscode.Uri, to: vscode.Uri, options?: { overwrite?: boolean, ignoreIfExists?: boolean; }): void {
594-
this._edits.push({ _type: 1, from, to, options });
594+
renameFile(from: vscode.Uri, to: vscode.Uri, options?: { overwrite?: boolean, ignoreIfExists?: boolean; }, metadata?: vscode.WorkspaceEditMetadata): void {
595+
this._edits.push({ _type: 1, from, to, options, metadata });
595596
}
596597

597-
createFile(uri: vscode.Uri, options?: { overwrite?: boolean, ignoreIfExists?: boolean; }): void {
598-
this._edits.push({ _type: 1, from: undefined, to: uri, options });
598+
createFile(uri: vscode.Uri, options?: { overwrite?: boolean, ignoreIfExists?: boolean; }, metadata?: vscode.WorkspaceEditMetadata): void {
599+
this._edits.push({ _type: 1, from: undefined, to: uri, options, metadata });
599600
}
600601

601-
deleteFile(uri: vscode.Uri, options?: { recursive?: boolean, ignoreIfNotExists?: boolean; }): void {
602-
this._edits.push({ _type: 1, from: uri, to: undefined, options });
602+
deleteFile(uri: vscode.Uri, options?: { recursive?: boolean, ignoreIfNotExists?: boolean; }, metadata?: vscode.WorkspaceEditMetadata): void {
603+
this._edits.push({ _type: 1, from: uri, to: undefined, options, metadata });
603604
}
604605

605-
replace(uri: URI, range: Range, newText: string): void {
606-
this._edits.push({ _type: 2, uri, edit: new TextEdit(range, newText) });
606+
replace(uri: URI, range: Range, newText: string, metadata?: vscode.WorkspaceEditMetadata): void {
607+
this._edits.push({ _type: 2, uri, edit: new TextEdit(range, newText), metadata });
607608
}
608609

609-
insert(resource: URI, position: Position, newText: string): void {
610-
this.replace(resource, new Range(position, position), newText);
610+
insert(resource: URI, position: Position, newText: string, metadata?: vscode.WorkspaceEditMetadata): void {
611+
this.replace(resource, new Range(position, position), newText, metadata);
611612
}
612613

613-
delete(resource: URI, range: Range): void {
614-
this.replace(resource, range, '');
614+
delete(resource: URI, range: Range, metadata?: vscode.WorkspaceEditMetadata): void {
615+
this.replace(resource, range, '', metadata);
615616
}
616617

617618
has(uri: URI): boolean {
@@ -663,18 +664,22 @@ export class WorkspaceEdit implements vscode.WorkspaceEdit {
663664
return values(textEdits);
664665
}
665666

666-
_allEntries(): ([URI, TextEdit] | [URI?, URI?, IFileOperationOptions?])[] {
667-
const res: ([URI, TextEdit] | [URI?, URI?, IFileOperationOptions?])[] = [];
668-
for (let edit of this._edits) {
669-
if (edit._type === 1) {
670-
res.push([edit.from, edit.to, edit.options]);
671-
} else {
672-
res.push([edit.uri, edit.edit]);
673-
}
674-
}
675-
return res;
667+
allEntries(): ReadonlyArray<IFileTextEdit | IFileOperation> {
668+
return this._edits;
676669
}
677670

671+
// _allEntries(): ([URI, TextEdit] | [URI?, URI?, IFileOperationOptions?])[] {
672+
// const res: ([URI, TextEdit] | [URI?, URI?, IFileOperationOptions?])[] = [];
673+
// for (let edit of this._edits) {
674+
// if (edit._type === 1) {
675+
// res.push([edit.from, edit.to, edit.options]);
676+
// } else {
677+
// res.push([edit.uri, edit.edit]);
678+
// }
679+
// }
680+
// return res;
681+
// }
682+
678683
get size(): number {
679684
return this.entries().length;
680685
}

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

Lines changed: 18 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import * as assert from 'assert';
77
import { URI } from 'vs/base/common/uri';
88
import * as types from 'vs/workbench/api/common/extHostTypes';
99
import { isWindows } from 'vs/base/common/platform';
10-
import { isObject } from 'vs/base/common/types';
10+
import { assertType } from 'vs/base/common/types';
1111

1212
function assertToJSON(a: any, expected: any) {
1313
const raw = JSON.stringify(a);
@@ -384,33 +384,22 @@ 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

390-
function isFileChange(thing: [URI, types.TextEdit] | [URI?, URI?, { overwrite?: boolean }?]): thing is [URI?, URI?, { overwrite?: boolean }?] {
391-
const [f, s] = thing;
392-
return URI.isUri(f) && URI.isUri(s);
393-
}
394-
395-
function isTextChange(thing: [URI, types.TextEdit] | [URI?, URI?, { overwrite?: boolean }?]): thing is [URI, types.TextEdit] {
396-
const [f, s] = thing;
397-
return URI.isUri(f) && isObject(s);
398-
}
399-
400390
const [first, second, third, fourth] = all;
401-
assert.equal(first[0]!.toString(), 'foo:a');
402-
assert.ok(!isFileChange(first));
403-
assert.ok(isTextChange(first));
391+
assertType(first._type === 2);
392+
assert.equal(first.uri.toString(), 'foo:a');
404393

405-
assert.equal(second[0]!.toString(), 'foo:a');
406-
assert.ok(isFileChange(second));
394+
assertType(second._type === 1);
395+
assert.equal(second.from!.toString(), 'foo:a');
396+
assert.equal(second.to!.toString(), 'foo:b');
407397

408-
assert.equal(third[0]!.toString(), 'foo:a');
409-
assert.ok(isTextChange(third));
398+
assertType(third._type === 2);
399+
assert.equal(third.uri.toString(), 'foo:a');
410400

411-
assert.equal(fourth[0]!.toString(), 'foo:b');
412-
assert.ok(!isFileChange(fourth));
413-
assert.ok(isTextChange(fourth));
401+
assertType(fourth._type === 2);
402+
assert.equal(fourth.uri.toString(), 'foo:b');
414403
});
415404

416405
test('WorkspaceEdit - two edits for one resource', function () {
@@ -419,10 +408,13 @@ suite('ExtHostTypes', function () {
419408
edit.insert(uri, new types.Position(0, 0), 'Hello');
420409
edit.insert(uri, new types.Position(0, 0), 'Foo');
421410

422-
assert.equal(edit._allEntries().length, 2);
423-
let [first, second] = edit._allEntries();
424-
assert.equal((first as [URI, types.TextEdit])[1].newText, 'Hello');
425-
assert.equal((second as [URI, types.TextEdit])[1].newText, 'Foo');
411+
assert.equal(edit.allEntries().length, 2);
412+
let [first, second] = edit.allEntries();
413+
414+
assertType(first._type === 2);
415+
assertType(second._type === 2);
416+
assert.equal(first.edit.newText, 'Hello');
417+
assert.equal(second.edit.newText, 'Foo');
426418
});
427419

428420
test('DocumentLink', () => {

0 commit comments

Comments
 (0)