{"record":{"id":"8a462a9ef8916a9e","repo":"neoclide/coc.nvim","slug":"provider-returns-null-for-rename-edits","errorCode":null,"errorMessage":"Provider returns null for rename edits.","messagePattern":"Provider returns null for rename edits\\.","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"src/handler/refactor/index.ts","lineNumber":78,"sourceCode":"    })\n  }\n\n  /**\n   * Refactor of current symbol\n   */\n  public async doRefactor(): Promise<void> {\n    let { doc, position } = await this.handler.getCurrentState()\n    if (!languages.hasProvider(ProviderName.Rename, doc.textDocument)) {\n      throw new Error(`Rename provider not found for current buffer`)\n    }\n    await doc.synchronize()\n    let edit = await this.handler.withRequestToken('refactor', async token => {\n      let res = await languages.prepareRename(doc.textDocument, position, token)\n      if (token.isCancellationRequested) return null\n      if (res === false) throw new Error(`Provider returns null on prepare, unable to rename at current position`)\n      let edit = await languages.provideRenameEdits(doc.textDocument, position, 'NewName', token)\n      if (token.isCancellationRequested) return null\n      if (!edit) throw new Error('Provider returns null for rename edits.')\n      return edit\n    })\n    if (edit) {\n      await this.fromWorkspaceEdit(edit, doc.filetype)\n    }\n  }\n\n  /**\n   * Search by rg\n   */\n  public async search(args: string[]): Promise<void> {\n    let buf = await this.createRefactorBuffer()\n    let cwd = await this.nvim.call('getcwd', []) as string\n    let search = new Search(this.nvim)\n    await search.run(args, cwd, buf)\n  }\n\n  public async save(bufnr: number): Promise<boolean> {","sourceCodeStart":60,"sourceCodeEnd":96,"githubUrl":"https://github.com/neoclide/coc.nvim/blob/50e974d9692461a69147d5cab146a8d3e439abe4/src/handler/refactor/index.ts#L60-L96","documentation":"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.","triggerScenarios":"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.","commonSituations":"Language server crashing or erroring internally during rename computation; renaming symbols whose usages span unopenable/external files; flaky server state after long sessions.","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."],"exampleFix":null,"handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":"try {\n  await coc.commands.executeCommand('document.renameRefactor')\n} catch (e) {\n  if (String(e?.message).includes('Provider returns null for rename edits')) {\n    await sleep(500)\n    return retryOnce(() => coc.commands.executeCommand('document.renameRefactor'))\n  }\n  throw e\n}","preventionTips":["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"],"tags":["lsp","rename","workspace-edit","coc-nvim"],"backgroundTag":"empty-rename-edits-response","analyzedSha":"50e974d9692461a69147d5cab146a8d3e439abe4","analyzedAt":"2026-08-31T11:17:23.966Z","schemaVersion":2},"datasetVersion":"2026-09-01T08:17:40.651Z"}