neoclide/coc.nvim · error · Error
Provider returns null for rename edits.
Error message
Provider returns null for rename edits.
What it means
After prepareRename succeeds, doRefactor requests `textDocument/rename` (provideRenameEdits with placeholder 'NewName'); if the server returns null/undefined edits, coc.nvim throws. The server agreed the position is renameable but failed to produce a WorkspaceEdit.
Source
Thrown at src/handler/refactor/index.ts:78
})
}
/**
* Refactor of current symbol
*/
public async doRefactor(): Promise<void> {
let { doc, position } = await this.handler.getCurrentState()
if (!languages.hasProvider(ProviderName.Rename, doc.textDocument)) {
throw new Error(`Rename provider not found for current buffer`)
}
await doc.synchronize()
let edit = await this.handler.withRequestToken('refactor', async token => {
let res = await languages.prepareRename(doc.textDocument, position, token)
if (token.isCancellationRequested) return null
if (res === false) throw new Error(`Provider returns null on prepare, unable to rename at current position`)
let edit = await languages.provideRenameEdits(doc.textDocument, position, 'NewName', token)
if (token.isCancellationRequested) return null
if (!edit) throw new Error('Provider returns null for rename edits.')
return edit
})
if (edit) {
await this.fromWorkspaceEdit(edit, doc.filetype)
}
}
/**
* Search by rg
*/
public async search(args: string[]): Promise<void> {
let buf = await this.createRefactorBuffer()
let cwd = await this.nvim.call('getcwd', []) as string
let search = new Search(this.nvim)
await search.run(args, cwd, buf)
}
public async save(bufnr: number): Promise<boolean> {View on GitHub (pinned to 50e974d969)
Solutions
- Retry the refactor; transient server failures are common.
- Inspect server logs (`:CocCommand workspace.showOutput`) for the rename request error and fix/report it.
- Update the language server to a newer version.
- Try a smaller rename target (local symbol) or use `:CocRename` to compare behavior.
Defensive patterns
Strategy: retry
Try / catch
try {
await coc.commands.executeCommand('document.renameRefactor')
} catch (e) {
if (String(e?.message).includes('Provider returns null for rename edits')) {
await sleep(500)
return retryOnce(() => coc.commands.executeCommand('document.renameRefactor'))
}
throw e
} Prevention
- Retry once before reporting; rename-edit computation can fail transiently
- Update the language server when null edits recur for valid symbols
- Capture server output logs to attach when filing upstream bugs
When it happens
Trigger: provideRenameEdits returns null or an empty result — server bug, cancelled-but-unreported request, or server that cannot compute edits across the workspace at that moment.
Common situations: Language server crashing or erroring internally during rename computation; renaming symbols whose usages span unopenable/external files; flaky server state after long sessions.
Related errors
- Rename provider not found for current buffer
- Provider returns null on prepare, unable to rename at curren
- Inlay hint provider not found for current document
- Filetype "${this.doc.filetype}" not enabled by inlayHint con
- Failed to resolve link target
AI-assisted analysis of neoclide/coc.nvim@50e974d969 (2026-08-31).
Data as JSON: /api/errors/8a462a9ef8916a9e.
Report an issue: GitHub.