@@ -408,6 +408,12 @@ impl LanguageRegistry {
Some(load_lsp_adapter())
}
+ /// Checks if a language server adapter with the given name is available to be loaded.
+ pub fn is_lsp_adapter_available(&self, name: &LanguageServerName) -> bool {
+ let state = self.state.read();
+ state.available_lsp_adapters.contains_key(name)
+ }
+
pub fn register_lsp_adapter(&self, language_name: LanguageName, adapter: Arc<dyn LspAdapter>) {
let mut state = self.state.write();
@@ -4665,7 +4665,7 @@ impl LspStore {
let Some(language) = buffer.read(cx).language().cloned() else {
return false;
};
- let relevant_language_servers = self
+ let registered_language_servers = self
.languages
.lsp_adapters(&language.name())
.into_iter()
@@ -4674,9 +4674,13 @@ impl LspStore {
self.language_server_statuses
.iter()
.filter_map(|(server_id, server_status)| {
- relevant_language_servers- .contains(&server_status.name)- .then_some(server_id)
+ // Include servers that are either registered for this language OR
+ // available to be loaded (for SSH remote mode where adapters like
+ // ty/pylsp/pyright are registered via register_available_lsp_adapter
+ // but only loaded on the server side)
+ let is_relevant = registered_language_servers.contains(&server_status.name)
+ || self.languages.is_lsp_adapter_available(&server_status.name);
+ is_relevant.then_some(server_id)
})
.filter_map(|server_id| self.lsp_server_capabilities.get(server_id))
.any(check)
@@ -4694,7 +4698,7 @@ impl LspStore {
let Some(language) = buffer.read(cx).language().cloned() else {
return Vec::default();
};
- let relevant_language_servers = self
+ let registered_language_servers = self
.languages
.lsp_adapters(&language.name())
.into_iter()
@@ -4703,9 +4707,13 @@ impl LspStore {
self.language_server_statuses
.iter()
.filter_map(|(server_id, server_status)| {
- relevant_language_servers- .contains(&server_status.name)- .then_some((server_id, &server_status.name))
+ // Include servers that are either registered for this language OR
+ // available to be loaded (for SSH remote mode where adapters like
+ // ty/pylsp/pyright are registered via register_available_lsp_adapter
+ // but only loaded on the server side)
+ let is_relevant = registered_language_servers.contains(&server_status.name)
+ || self.languages.is_lsp_adapter_available(&server_status.name);
+ is_relevant.then_some((server_id, &server_status.name))
})
.filter_map(|(server_id, server_name)| {
self.lsp_server_capabilities