Add support for rename with language servers that lack prepareRename (#23000)

This adds support for LSPs that use the old rename flow which does not
first ask the LSP for the rename range and check that it is a valid
range to rename.

Closes #16663

Release Notes:

* Fixed rename symbols action when the language server does not have the
capability to prepare renames - such as `luau-lsp`.
This commit is contained in:
Michael Sloan 2025-01-11 14:22:17 -07:00 committed by GitHub
parent b65dc8c566
commit bda0c67ece
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 268 additions and 66 deletions

View file

@ -3500,24 +3500,26 @@ impl LspStore {
};
let file = File::from_dyn(buffer.file()).and_then(File::as_local);
if let (Some(file), Some(language_server)) = (file, language_server) {
let lsp_params = match request.to_lsp(&file.abs_path(cx), buffer, &language_server, cx)
{
Ok(lsp_params) => lsp_params,
let lsp_params = match request.to_lsp_params_or_response(
&file.abs_path(cx),
buffer,
&language_server,
cx,
) {
Ok(LspParamsOrResponse::Params(lsp_params)) => lsp_params,
Ok(LspParamsOrResponse::Response(response)) => return Task::ready(Ok(response)),
Err(err) => {
log::error!(
"Preparing LSP request to {} failed: {}",
language_server.name(),
err
);
return Task::ready(Err(err));
let message =
format!("LSP request to {} failed: {}", language_server.name(), err);
log::error!("{}", message);
return Task::ready(Err(anyhow!(message)));
}
};
let status = request.status();
if !request.check_capabilities(language_server.adapter_server_capabilities()) {
return Task::ready(Ok(Default::default()));
}
return cx.spawn(move |this, cx| async move {
if !request.check_capabilities(language_server.adapter_server_capabilities()) {
return Ok(Default::default());
}
let lsp_request = language_server.request::<R::LspRequest>(lsp_params);
let id = lsp_request.id();