diff --git a/src/languageFeatures/fileRename.ts b/src/languageFeatures/fileRename.ts index 5c727e3..6094f1c 100644 --- a/src/languageFeatures/fileRename.ts +++ b/src/languageFeatures/fileRename.ts @@ -172,6 +172,11 @@ export class MdFileRenameProvider extends Disposable { if (link.href.kind !== HrefKind.Internal) { return false; } + + if (link.source.hrefText.startsWith('#')) { + // No rewrite needed as we are referencing the current doc implicitly + return false; + } if (link.source.hrefText.startsWith('/')) { // We likely don't need to update anything since an absolute path is used diff --git a/src/test/fileRename.test.ts b/src/test/fileRename.test.ts index 402b5b4..2545b93 100644 --- a/src/test/fileRename.test.ts +++ b/src/test/fileRename.test.ts @@ -490,6 +490,9 @@ suite('File Rename', () => { `[abc](../old)`, `[abc](/old)`, `[abc](/old/)`, + ``, // Own header links should not get rewritten here + `# header`, + `[text](#header)`, )); const workspace = store.add(new InMemoryWorkspace([ @@ -516,4 +519,38 @@ suite('File Rename', () => { ] }); })); + + test('Should not rewrite fragment links to self', withStore(async (store) => { + // Create workspace state after the rename + const newDocUri = workspacePath('sub', 'newReadme.md'); + const newDoc = new InMemoryDocument(newDocUri, joinLines( + `# Header`, + `[abc](#header)`, // No change + `[abc](oldReadme.md#header)`, // Needs rewrite + `[abc](./oldReadme.md#header)`, // Needs rewrite + ``, + `[def1]: #header`, // No change + `[def2]: oldReadme.md#header`, // Needs rewrite + `[def3]: ./oldReadme.md#header`, // Needs rewrite + )); + + const workspace = store.add(new InMemoryWorkspace([ + newDoc, + ])); + + const response = await getFileRenameEdits(store, [ + { oldUri: workspacePath('oldReadme.md'), newUri: newDocUri }, + ], workspace); + + assertEditsEqual(response!.edit, { + // Here we need to be using the new path to 'doc' + uri: newDocUri, edits: [ + lsp.TextEdit.replace(makeRange(2, 6, 2, 18), 'newReadme.md'), + lsp.TextEdit.replace(makeRange(3, 6, 3, 20), './newReadme.md'), + + lsp.TextEdit.replace(makeRange(6, 8, 6, 20), 'newReadme.md'), + lsp.TextEdit.replace(makeRange(7, 8, 7, 22), './newReadme.md'), + ] + }); + })); }); \ No newline at end of file