Use new language server info on remote servers (#35682)
* Straightens out the `*_ext.rs` workflow for clangd and rust-analyzer: no need to asynchronously query for the language server, as we sync that information already. * Fixes inlay hints editor menu toggle not being shown in the remote sessions Release Notes: - Fixed inlay hints editor menu toggle not being shown in the remote sessions
This commit is contained in:
parent
cc93175256
commit
9caa9d042a
14 changed files with 176 additions and 291 deletions
|
@ -5002,63 +5002,53 @@ impl Project {
|
|||
}
|
||||
|
||||
pub fn any_language_server_supports_inlay_hints(&self, buffer: &Buffer, cx: &mut App) -> bool {
|
||||
self.lsp_store.update(cx, |this, cx| {
|
||||
this.language_servers_for_local_buffer(buffer, cx)
|
||||
.any(
|
||||
|(_, server)| match server.capabilities().inlay_hint_provider {
|
||||
Some(lsp::OneOf::Left(enabled)) => enabled,
|
||||
Some(lsp::OneOf::Right(_)) => true,
|
||||
None => false,
|
||||
},
|
||||
)
|
||||
let Some(language) = buffer.language().cloned() else {
|
||||
return false;
|
||||
};
|
||||
self.lsp_store.update(cx, |lsp_store, _| {
|
||||
let relevant_language_servers = lsp_store
|
||||
.languages
|
||||
.lsp_adapters(&language.name())
|
||||
.into_iter()
|
||||
.map(|lsp_adapter| lsp_adapter.name())
|
||||
.collect::<HashSet<_>>();
|
||||
lsp_store
|
||||
.language_server_statuses()
|
||||
.filter_map(|(server_id, server_status)| {
|
||||
relevant_language_servers
|
||||
.contains(&server_status.name)
|
||||
.then_some(server_id)
|
||||
})
|
||||
.filter_map(|server_id| lsp_store.lsp_server_capabilities.get(&server_id))
|
||||
.any(InlayHints::check_capabilities)
|
||||
})
|
||||
}
|
||||
|
||||
pub fn language_server_id_for_name(
|
||||
&self,
|
||||
buffer: &Buffer,
|
||||
name: &str,
|
||||
cx: &mut App,
|
||||
) -> Task<Option<LanguageServerId>> {
|
||||
if self.is_local() {
|
||||
Task::ready(self.lsp_store.update(cx, |lsp_store, cx| {
|
||||
lsp_store
|
||||
.language_servers_for_local_buffer(buffer, cx)
|
||||
.find_map(|(adapter, server)| {
|
||||
if adapter.name.0 == name {
|
||||
Some(server.server_id())
|
||||
} else {
|
||||
None
|
||||
}
|
||||
})
|
||||
}))
|
||||
} else if let Some(project_id) = self.remote_id() {
|
||||
let request = self.client.request(proto::LanguageServerIdForName {
|
||||
project_id,
|
||||
buffer_id: buffer.remote_id().to_proto(),
|
||||
name: name.to_string(),
|
||||
});
|
||||
cx.background_spawn(async move {
|
||||
let response = request.await.log_err()?;
|
||||
response.server_id.map(LanguageServerId::from_proto)
|
||||
})
|
||||
} else if let Some(ssh_client) = self.ssh_client.as_ref() {
|
||||
let request =
|
||||
ssh_client
|
||||
.read(cx)
|
||||
.proto_client()
|
||||
.request(proto::LanguageServerIdForName {
|
||||
project_id: SSH_PROJECT_ID,
|
||||
buffer_id: buffer.remote_id().to_proto(),
|
||||
name: name.to_string(),
|
||||
});
|
||||
cx.background_spawn(async move {
|
||||
let response = request.await.log_err()?;
|
||||
response.server_id.map(LanguageServerId::from_proto)
|
||||
})
|
||||
} else {
|
||||
Task::ready(None)
|
||||
name: &LanguageServerName,
|
||||
cx: &App,
|
||||
) -> Option<LanguageServerId> {
|
||||
let language = buffer.language()?;
|
||||
let relevant_language_servers = self
|
||||
.languages
|
||||
.lsp_adapters(&language.name())
|
||||
.into_iter()
|
||||
.map(|lsp_adapter| lsp_adapter.name())
|
||||
.collect::<HashSet<_>>();
|
||||
if !relevant_language_servers.contains(name) {
|
||||
return None;
|
||||
}
|
||||
self.language_server_statuses(cx)
|
||||
.filter(|(_, server_status)| relevant_language_servers.contains(&server_status.name))
|
||||
.find_map(|(server_id, server_status)| {
|
||||
if &server_status.name == name {
|
||||
Some(server_id)
|
||||
} else {
|
||||
None
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
pub fn has_language_servers_for(&self, buffer: &Buffer, cx: &mut App) -> bool {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue