add WorkspaceEditMetadata and use it for applyEdit, (#160996)

* add `WorkspaceEditMetadata` and use it for `applyEdit`,

https://github.com/microsoft/vscode/issues/112109

* fix compilo in tests

* workspace edits from updating paths are marked as refactoring fyi @mjbvz
This commit is contained in:
Johannes Rieken
2022-09-16 09:44:19 +02:00
committed by GitHub
parent ec56dddd9f
commit 77309b33d4
7 changed files with 24 additions and 13 deletions

View File

@@ -9,7 +9,8 @@
"aiKey": "0c6ae279ed8443289764825290e4f9e2-1a736e7c-1324-4338-be46-fc2a58ae4d14-7255", "aiKey": "0c6ae279ed8443289764825290e4f9e2-1a736e7c-1324-4338-be46-fc2a58ae4d14-7255",
"enabledApiProposals": [ "enabledApiProposals": [
"resolvers", "resolvers",
"workspaceTrust" "workspaceTrust",
"workspaceEditIsRefactoring"
], ],
"capabilities": { "capabilities": {
"virtualWorkspaces": { "virtualWorkspaces": {

View File

@@ -114,7 +114,7 @@ class UpdateImportsOnFileRenameHandler extends Disposable {
if (edits.size) { if (edits.size) {
if (await this.confirmActionWithUser(resourcesBeingRenamed)) { if (await this.confirmActionWithUser(resourcesBeingRenamed)) {
await vscode.workspace.applyEdit(edits); await vscode.workspace.applyEdit(edits, { isRefactoring: true });
} }
} }
} }

View File

@@ -11,6 +11,7 @@
"src/**/*", "src/**/*",
"../../src/vscode-dts/vscode.d.ts", "../../src/vscode-dts/vscode.d.ts",
"../../src/vscode-dts/vscode.proposed.inlayHints.d.ts", "../../src/vscode-dts/vscode.proposed.inlayHints.d.ts",
"../../src/vscode-dts/vscode.proposed.workspaceEditIsRefactoring.d.ts",
"../../src/vscode-dts/vscode.proposed.languageStatus.d.ts", "../../src/vscode-dts/vscode.proposed.languageStatus.d.ts",
"../../src/vscode-dts/vscode.proposed.resolvers.d.ts", "../../src/vscode-dts/vscode.proposed.resolvers.d.ts",
"../../src/vscode-dts/vscode.proposed.workspaceTrust.d.ts", "../../src/vscode-dts/vscode.proposed.workspaceTrust.d.ts",

View File

@@ -865,8 +865,8 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I
saveAll: (includeUntitled?) => { saveAll: (includeUntitled?) => {
return extHostWorkspace.saveAll(includeUntitled); return extHostWorkspace.saveAll(includeUntitled);
}, },
applyEdit(edit: vscode.WorkspaceEdit, isRefactoring?: boolean): Thenable<boolean> { applyEdit(edit: vscode.WorkspaceEdit, metadata?: vscode.WorkspaceEditMetadata): Thenable<boolean> {
return extHostBulkEdits.applyWorkspaceEdit(edit, extension, isRefactoring); return extHostBulkEdits.applyWorkspaceEdit(edit, extension, metadata);
}, },
createFileSystemWatcher: (pattern, ignoreCreate, ignoreChange, ignoreDelete): vscode.FileSystemWatcher => { createFileSystemWatcher: (pattern, ignoreCreate, ignoreChange, ignoreDelete): vscode.FileSystemWatcher => {
return extHostFileSystemEvent.createFileSystemWatcher(extHostWorkspace, extension, pattern, ignoreCreate, ignoreChange, ignoreDelete); return extHostFileSystemEvent.createFileSystemWatcher(extHostWorkspace, extension, pattern, ignoreCreate, ignoreChange, ignoreDelete);

View File

@@ -28,13 +28,13 @@ export class ExtHostBulkEdits {
}; };
} }
applyWorkspaceEdit(edit: vscode.WorkspaceEdit, extension: IExtensionDescription, isRefactoring?: boolean): Promise<boolean> { applyWorkspaceEdit(edit: vscode.WorkspaceEdit, extension: IExtensionDescription, metadata: vscode.WorkspaceEditMetadata | undefined): Promise<boolean> {
const allowIsRefactoring = isProposedApiEnabled(extension, 'workspaceEditIsRefactoring'); const allowIsRefactoring = isProposedApiEnabled(extension, 'workspaceEditIsRefactoring');
if (isRefactoring && !allowIsRefactoring) { if (metadata && !allowIsRefactoring) {
console.warn(`Extension '${extension.identifier.value}' uses a proposed API 'workspaceEditIsRefactoring' which is NOT enabled for it`); console.warn(`Extension '${extension.identifier.value}' uses a proposed API 'workspaceEditIsRefactoring' which is NOT enabled for it`);
isRefactoring = undefined; metadata = undefined;
} }
const dto = WorkspaceEdit.from(edit, this._versionInformationProvider); const dto = WorkspaceEdit.from(edit, this._versionInformationProvider);
return this._proxy.$tryApplyWorkspaceEdit(dto, undefined, isRefactoring); return this._proxy.$tryApplyWorkspaceEdit(dto, undefined, metadata?.isRefactoring ?? false);
} }
} }

View File

@@ -46,7 +46,7 @@ suite('ExtHostBulkEdits.applyWorkspaceEdit', () => {
test('uses version id if document available', async () => { test('uses version id if document available', async () => {
const edit = new extHostTypes.WorkspaceEdit(); const edit = new extHostTypes.WorkspaceEdit();
edit.replace(resource, new extHostTypes.Range(0, 0, 0, 0), 'hello'); edit.replace(resource, new extHostTypes.Range(0, 0, 0, 0), 'hello');
await bulkEdits.applyWorkspaceEdit(edit, nullExtensionDescription); await bulkEdits.applyWorkspaceEdit(edit, nullExtensionDescription, undefined);
assert.strictEqual(workspaceResourceEdits.edits.length, 1); assert.strictEqual(workspaceResourceEdits.edits.length, 1);
const [first] = workspaceResourceEdits.edits; const [first] = workspaceResourceEdits.edits;
assert.strictEqual((<IWorkspaceTextEditDto>first).versionId, 1337); assert.strictEqual((<IWorkspaceTextEditDto>first).versionId, 1337);
@@ -55,7 +55,7 @@ suite('ExtHostBulkEdits.applyWorkspaceEdit', () => {
test('does not use version id if document is not available', async () => { test('does not use version id if document is not available', async () => {
const edit = new extHostTypes.WorkspaceEdit(); const edit = new extHostTypes.WorkspaceEdit();
edit.replace(URI.parse('foo:bar2'), new extHostTypes.Range(0, 0, 0, 0), 'hello'); edit.replace(URI.parse('foo:bar2'), new extHostTypes.Range(0, 0, 0, 0), 'hello');
await bulkEdits.applyWorkspaceEdit(edit, nullExtensionDescription); await bulkEdits.applyWorkspaceEdit(edit, nullExtensionDescription, undefined);
assert.strictEqual(workspaceResourceEdits.edits.length, 1); assert.strictEqual(workspaceResourceEdits.edits.length, 1);
const [first] = workspaceResourceEdits.edits; const [first] = workspaceResourceEdits.edits;
assert.ok(typeof (<IWorkspaceTextEditDto>first).versionId === 'undefined'); assert.ok(typeof (<IWorkspaceTextEditDto>first).versionId === 'undefined');

View File

@@ -7,12 +7,21 @@ declare module 'vscode' {
// https://github.com/microsoft/vscode/issues/112109 // https://github.com/microsoft/vscode/issues/112109
/**
* Additional data about a workspace edit.
*/
export interface WorkspaceEditMetadata {
/**
* Signal to the editor that this edit is a refactoring.
*/
isRefactoring?: boolean;
}
export namespace workspace { export namespace workspace {
/** /**
* * @param metadata Optional {@link WorkspaceEditMetadata metadata} for the edit.
* @param isRefactoring Signal to the editor that this edit is a refactoring.
*/ */
export function applyEdit(edit: WorkspaceEdit, isRefactoring?: boolean): Thenable<boolean>; export function applyEdit(edit: WorkspaceEdit, metadata?: WorkspaceEditMetadata): Thenable<boolean>;
} }
} }