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

  1. Retry the refactor; transient server failures are common.
  2. Inspect server logs (`:CocCommand workspace.showOutput`) for the rename request error and fix/report it.
  3. Update the language server to a newer version.
  4. 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

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


AI-assisted analysis of neoclide/coc.nvim@50e974d969 (2026-08-31). Data as JSON: /api/errors/8a462a9ef8916a9e. Report an issue: GitHub.