diff --git a/extensions/typescript-language-features/package.json b/extensions/typescript-language-features/package.json index 15a9645693485..e01a71963773b 100644 --- a/extensions/typescript-language-features/package.json +++ b/extensions/typescript-language-features/package.json @@ -9,7 +9,8 @@ "aiKey": "0c6ae279ed8443289764825290e4f9e2-1a736e7c-1324-4338-be46-fc2a58ae4d14-7255", "enabledApiProposals": [ "resolvers", - "workspaceTrust" + "workspaceTrust", + "workspaceEditIsRefactoring" ], "capabilities": { "virtualWorkspaces": { diff --git a/extensions/typescript-language-features/src/languageFeatures/updatePathsOnRename.ts b/extensions/typescript-language-features/src/languageFeatures/updatePathsOnRename.ts index 1df1c1e13ed4a..4882ae3ca59bb 100644 --- a/extensions/typescript-language-features/src/languageFeatures/updatePathsOnRename.ts +++ b/extensions/typescript-language-features/src/languageFeatures/updatePathsOnRename.ts @@ -114,7 +114,7 @@ class UpdateImportsOnFileRenameHandler extends Disposable { if (edits.size) { if (await this.confirmActionWithUser(resourcesBeingRenamed)) { - await vscode.workspace.applyEdit(edits); + await vscode.workspace.applyEdit(edits, { isRefactoring: true }); } } } diff --git a/extensions/typescript-language-features/tsconfig.json b/extensions/typescript-language-features/tsconfig.json index 07d4066f89b33..957544992c2c2 100644 --- a/extensions/typescript-language-features/tsconfig.json +++ b/extensions/typescript-language-features/tsconfig.json @@ -11,6 +11,7 @@ "src/**/*", "../../src/vscode-dts/vscode.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.resolvers.d.ts", "../../src/vscode-dts/vscode.proposed.workspaceTrust.d.ts", diff --git a/src/vs/workbench/api/common/extHost.api.impl.ts b/src/vs/workbench/api/common/extHost.api.impl.ts index 3b49d968ab89e..00fabf7976e1d 100644 --- a/src/vs/workbench/api/common/extHost.api.impl.ts +++ b/src/vs/workbench/api/common/extHost.api.impl.ts @@ -865,8 +865,8 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I saveAll: (includeUntitled?) => { return extHostWorkspace.saveAll(includeUntitled); }, - applyEdit(edit: vscode.WorkspaceEdit, isRefactoring?: boolean): Thenable { - return extHostBulkEdits.applyWorkspaceEdit(edit, extension, isRefactoring); + applyEdit(edit: vscode.WorkspaceEdit, metadata?: vscode.WorkspaceEditMetadata): Thenable { + return extHostBulkEdits.applyWorkspaceEdit(edit, extension, metadata); }, createFileSystemWatcher: (pattern, ignoreCreate, ignoreChange, ignoreDelete): vscode.FileSystemWatcher => { return extHostFileSystemEvent.createFileSystemWatcher(extHostWorkspace, extension, pattern, ignoreCreate, ignoreChange, ignoreDelete); diff --git a/src/vs/workbench/api/common/extHostBulkEdits.ts b/src/vs/workbench/api/common/extHostBulkEdits.ts index e60b2ba116793..59e0bbc2426bd 100644 --- a/src/vs/workbench/api/common/extHostBulkEdits.ts +++ b/src/vs/workbench/api/common/extHostBulkEdits.ts @@ -28,13 +28,13 @@ export class ExtHostBulkEdits { }; } - applyWorkspaceEdit(edit: vscode.WorkspaceEdit, extension: IExtensionDescription, isRefactoring?: boolean): Promise { + applyWorkspaceEdit(edit: vscode.WorkspaceEdit, extension: IExtensionDescription, metadata: vscode.WorkspaceEditMetadata | undefined): Promise { 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`); - isRefactoring = undefined; + metadata = undefined; } const dto = WorkspaceEdit.from(edit, this._versionInformationProvider); - return this._proxy.$tryApplyWorkspaceEdit(dto, undefined, isRefactoring); + return this._proxy.$tryApplyWorkspaceEdit(dto, undefined, metadata?.isRefactoring ?? false); } } diff --git a/src/vs/workbench/api/test/browser/extHostBulkEdits.test.ts b/src/vs/workbench/api/test/browser/extHostBulkEdits.test.ts index 906405cd6b7bc..f1f18d641e85d 100644 --- a/src/vs/workbench/api/test/browser/extHostBulkEdits.test.ts +++ b/src/vs/workbench/api/test/browser/extHostBulkEdits.test.ts @@ -46,7 +46,7 @@ suite('ExtHostBulkEdits.applyWorkspaceEdit', () => { test('uses version id if document available', async () => { const edit = new extHostTypes.WorkspaceEdit(); 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); const [first] = workspaceResourceEdits.edits; assert.strictEqual((first).versionId, 1337); @@ -55,7 +55,7 @@ suite('ExtHostBulkEdits.applyWorkspaceEdit', () => { test('does not use version id if document is not available', async () => { const edit = new extHostTypes.WorkspaceEdit(); 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); const [first] = workspaceResourceEdits.edits; assert.ok(typeof (first).versionId === 'undefined'); diff --git a/src/vscode-dts/vscode.proposed.workspaceEditIsRefactoring.d.ts b/src/vscode-dts/vscode.proposed.workspaceEditIsRefactoring.d.ts index d485c7c85d3cc..2589a016e4ce6 100644 --- a/src/vscode-dts/vscode.proposed.workspaceEditIsRefactoring.d.ts +++ b/src/vscode-dts/vscode.proposed.workspaceEditIsRefactoring.d.ts @@ -7,12 +7,21 @@ declare module 'vscode' { // 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 { /** - * - * @param isRefactoring Signal to the editor that this edit is a refactoring. + * @param metadata Optional {@link WorkspaceEditMetadata metadata} for the edit. */ - export function applyEdit(edit: WorkspaceEdit, isRefactoring?: boolean): Thenable; + export function applyEdit(edit: WorkspaceEdit, metadata?: WorkspaceEditMetadata): Thenable; } }