ssh remoting: Do not double-register LspAdapters (#18132)
This fixes the bug with hover tooltips appearing multiple times. Turns out everytime we receive the `CreateLanguageServer` message we'd add a new adapter but only have a single server running for all of them. And we send a `CreateLanguageServer` message everytime you open a buffer. What this does is to only add a new adapter if it hasn't already been registered, which is also what we do locally. Release Notes: - N/A
This commit is contained in:
parent
ca033e6475
commit
90a12f5564
2 changed files with 54 additions and 24 deletions
|
@ -326,13 +326,43 @@ impl LanguageRegistry {
|
|||
Some(load_lsp_adapter())
|
||||
}
|
||||
|
||||
pub fn register_lsp_adapter(&self, language_name: LanguageName, adapter: Arc<dyn LspAdapter>) {
|
||||
pub fn register_lsp_adapter(
|
||||
&self,
|
||||
language_name: LanguageName,
|
||||
adapter: Arc<dyn LspAdapter>,
|
||||
) -> Arc<CachedLspAdapter> {
|
||||
let cached = CachedLspAdapter::new(adapter);
|
||||
self.state
|
||||
.write()
|
||||
.lsp_adapters
|
||||
.entry(language_name)
|
||||
.or_default()
|
||||
.push(CachedLspAdapter::new(adapter));
|
||||
.push(cached.clone());
|
||||
cached
|
||||
}
|
||||
|
||||
pub fn get_or_register_lsp_adapter(
|
||||
&self,
|
||||
language_name: LanguageName,
|
||||
server_name: LanguageServerName,
|
||||
build_adapter: impl FnOnce() -> Arc<dyn LspAdapter> + 'static,
|
||||
) -> Arc<CachedLspAdapter> {
|
||||
let registered = self
|
||||
.state
|
||||
.write()
|
||||
.lsp_adapters
|
||||
.entry(language_name.clone())
|
||||
.or_default()
|
||||
.iter()
|
||||
.find(|cached_adapter| cached_adapter.name == server_name)
|
||||
.cloned();
|
||||
|
||||
if let Some(found) = registered {
|
||||
found
|
||||
} else {
|
||||
let adapter = build_adapter();
|
||||
self.register_lsp_adapter(language_name, adapter)
|
||||
}
|
||||
}
|
||||
|
||||
/// Register a fake language server and adapter
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue