From 94ffa6fc39cd347b8ff1f298cf18f89bde58f077 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 23 Sep 2021 16:25:21 +0200 Subject: [PATCH] fix https://github.com/microsoft/vscode/issues/126172 --- src/vs/editor/contrib/rename/rename.ts | 9 ++++++ .../api/common/extHostApiCommands.ts | 13 ++++++++ .../browser/api/extHostApiCommands.test.ts | 30 +++++++++++++++++++ 3 files changed, 52 insertions(+) diff --git a/src/vs/editor/contrib/rename/rename.ts b/src/vs/editor/contrib/rename/rename.ts index 45f79dbbc20..c007633ed27 100644 --- a/src/vs/editor/contrib/rename/rename.ts +++ b/src/vs/editor/contrib/rename/rename.ts @@ -357,6 +357,15 @@ registerModelAndPositionCommand('_executeDocumentRenameProvider', function (mode return rename(model, position, newName); }); +registerModelAndPositionCommand('_executePrepareRename', async function (model, position) { + const skeleton = new RenameSkeleton(model, position); + const loc = await skeleton.resolveRenameLocation(CancellationToken.None); + if (loc?.rejectReason) { + throw new Error(loc.rejectReason); + } + return loc; +}); + //todo@jrieken use editor options world Registry.as(Extensions.Configuration).registerConfiguration({ diff --git a/src/vs/workbench/api/common/extHostApiCommands.ts b/src/vs/workbench/api/common/extHostApiCommands.ts index ad731aed4cf..cbe2410a71e 100644 --- a/src/vs/workbench/api/common/extHostApiCommands.ts +++ b/src/vs/workbench/api/common/extHostApiCommands.ts @@ -156,6 +156,19 @@ const newCommands: ApiCommand[] = [ new ApiCommandResult('A CallHierarchyItem or undefined', v => v.map(typeConverters.CallHierarchyOutgoingCall.to)) ), // --- rename + new ApiCommand( + 'vscode.prepareRename', '_executePrepareRename', 'Execute the prepareRename of rename provider.', + [ApiCommandArgument.Uri, ApiCommandArgument.Position], + new ApiCommandResult('A promise that resolves to a range and placeholder text.', value => { + if (!value) { + return undefined; + } + return { + range: typeConverters.Range.to(value.range), + placeholder: value.text + }; + }) + ), new ApiCommand( 'vscode.executeDocumentRenameProvider', '_executeDocumentRenameProvider', 'Execute rename provider.', [ApiCommandArgument.Uri, ApiCommandArgument.Position, ApiCommandArgument.String.with('newName', 'The new symbol name')], diff --git a/src/vs/workbench/test/browser/api/extHostApiCommands.test.ts b/src/vs/workbench/test/browser/api/extHostApiCommands.test.ts index a96bb2d7776..542b052856d 100644 --- a/src/vs/workbench/test/browser/api/extHostApiCommands.test.ts +++ b/src/vs/workbench/test/browser/api/extHostApiCommands.test.ts @@ -245,6 +245,36 @@ suite('ExtHostLanguageFeatureCommands', function () { // --- rename + test('vscode.prepareRename', async function () { + disposables.push(extHost.registerRenameProvider(nullExtensionDescription, defaultSelector, new class implements vscode.RenameProvider { + + prepareRename(document: vscode.TextDocument, position: vscode.Position) { + return { + range: new types.Range(0, 12, 0, 24), + placeholder: 'foooPlaceholder' + }; + } + + provideRenameEdits(document: vscode.TextDocument, position: vscode.Position, newName: string) { + const edit = new types.WorkspaceEdit(); + edit.insert(document.uri, position, newName); + return edit; + } + })); + + await rpcProtocol.sync(); + + const data = await commands.executeCommand<{ range: vscode.Range, placeholder: string }>('vscode.prepareRename', model.uri, new types.Position(0, 12)); + + assert.ok(data); + assert.strictEqual(data.placeholder, 'foooPlaceholder'); + assert.strictEqual(data.range.start.line, 0); + assert.strictEqual(data.range.start.character, 12); + assert.strictEqual(data.range.end.line, 0); + assert.strictEqual(data.range.end.character, 24); + + }); + test('vscode.executeDocumentRenameProvider', async function () { disposables.push(extHost.registerRenameProvider(nullExtensionDescription, defaultSelector, new class implements vscode.RenameProvider { provideRenameEdits(document: vscode.TextDocument, position: vscode.Position, newName: string) {