diff --git a/extensions/markdown-language-features/src/languageFeatures/rename.ts b/extensions/markdown-language-features/src/languageFeatures/rename.ts index 8a80906fbad..4184741a411 100644 --- a/extensions/markdown-language-features/src/languageFeatures/rename.ts +++ b/extensions/markdown-language-features/src/languageFeatures/rename.ts @@ -37,6 +37,14 @@ export interface MdWorkspaceEdit { readonly fileRenames?: ReadonlyArray; } +function tryDecodeUri(str: string): string { + try { + return decodeURI(str); + } catch { + return str; + } +} + export class MdRenameProvider extends Disposable implements vscode.RenameProvider { private cachedRefs?: { @@ -98,7 +106,7 @@ export class MdRenameProvider extends Disposable implements vscode.RenameProvide if (!range) { throw new Error(this.renameNotSupportedText); } - return { range, placeholder: document.getText(range) }; + return { range, placeholder: tryDecodeUri(document.getText(range)) }; } } } diff --git a/extensions/markdown-language-features/src/test/rename.test.ts b/extensions/markdown-language-features/src/test/rename.test.ts index e937c76574b..057e734131a 100644 --- a/extensions/markdown-language-features/src/test/rename.test.ts +++ b/extensions/markdown-language-features/src/test/rename.test.ts @@ -412,6 +412,16 @@ suite('markdown: rename', () => { }); }); + test('Path rename should use un-encoded paths as placeholder', async () => { + const uri = workspacePath('sub', 'doc with spaces.md'); + const doc = new InMemoryDocument(uri, joinLines( + `[text](/sub/doc%20with%20spaces.md)`, + )); + + const info = await prepareRename(doc, new vscode.Position(0, 10), new InMemoryWorkspaceMarkdownDocuments([doc])); + assert.strictEqual(info!.placeholder, '/sub/doc with spaces.md'); + }); + test('Path rename should encode paths', async () => { const uri = workspacePath('sub', 'doc.md'); const doc = new InMemoryDocument(uri, joinLines(