{"record":{"id":"b410a370675d3eb2","repo":"denoland/deno","slug":"unable-to-convert-implementation-info","errorCode":null,"errorMessage":"Unable to convert implementation info: {:#}","messagePattern":"Unable to convert implementation info: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"cli/lsp/ts_server.rs","lineNumber":763,"sourceCode":"                  module.scope.as_ref().map(|s| s.as_str()).unwrap_or(\"null\"),\n                );\n              }\n            })\n            .unwrap_or_default();\n          if let Some(implementations) = implementations {\n            implementations_with_modules\n              .extend(implementations.into_iter().map(|i| (i, module.clone())))\n          }\n        }\n        super::tsc::DocumentSpan::collect_into_goto_definition_response(\n          implementations_with_modules\n            .iter()\n            .map(|(i, m)| (&i.document_span, m.as_ref())),\n          snapshot,\n          token,\n        )\n        .map_err(|err| {\n          anyhow!(\"Unable to convert implementation info: {:#}\", err)\n        })\n      }\n    }\n  }\n\n  pub async fn provide_folding_range(\n    &self,\n    module: &DocumentModule,\n    snapshot: Arc<StateSnapshot>,\n    token: &CancellationToken,\n  ) -> Result<Option<Vec<lsp::FoldingRange>>, AnyError> {\n    match self {\n      Self::Js(ts_server) => {\n        let outlining_spans = ts_server\n          .get_outlining_spans(snapshot.clone(), module, token)\n          .await?;\n        if !outlining_spans.is_empty() {\n          let folding_ranges = outlining_spans","sourceCodeStart":745,"sourceCodeEnd":781,"githubUrl":"https://github.com/denoland/deno/blob/9ad36f7a2cce60488e6ec52283efb32efddaf93a/cli/lsp/ts_server.rs#L745-L781","documentation":"Results of textDocument/implementation (find implementations of an interface or class member) are converted through DocumentSpan::collect_into_goto_definition_response; this wraps a conversion failure. Like the definition providers, the failure usually happens while converting spans in the TARGET documents where the implementations live, rather than in the file the request was made from.","triggerScenarios":"An implementations request where one implementation location fails to convert — a target file changed or closed after locations were computed, or a span that no longer maps to its document's content.","commonSituations":"Invoking Find Implementations right after editing implementing classes; implementations spread across many recently-modified files.","solutions":["Save the files involved and retry the implementations request.","Run \"Deno: Restart Language Server\" if it persists.","Update Deno; inspect the wrapped error after the colon in the language server output."],"exampleFix":null,"handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":"// Implementations conversion: retry once after saving targets.\nasync function implementationsSafe(client, params) {\n  try {\n    return await client.sendRequest('textDocument/implementation', params);\n  } catch (err) {\n    if (String(err?.message).includes('Unable to convert implementation info')) {\n      await sleep(250);\n      return await client.sendRequest('textDocument/implementation', params);\n    }\n    throw err;\n  }\n}","preventionTips":["Save implementing classes before running Find Implementations","Retry after edits settle — target-document snapshot races are transient","Restart the language server and update Deno if it persists"],"tags":["lsp","implementations","tsc","navigation"],"backgroundTag":"lsp-tsc-conversion-failed","analyzedSha":"9ad36f7a2cce60488e6ec52283efb32efddaf93a","analyzedAt":"2026-08-20T13:07:44.778Z","contentChangedAt":"2026-08-20T13:07:44.778Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}