Split language server initialization from construction

This gives clients a chance to register to notifications.
This commit is contained in:
Antonio Scandurra 2022-03-09 12:29:28 +01:00
parent ef1ec88523
commit 7546ede288
4 changed files with 277 additions and 287 deletions

View file

@ -245,7 +245,7 @@ impl LanguageRegistry {
root_path: Arc<Path>,
http_client: Arc<dyn HttpClient>,
cx: &mut MutableAppContext,
) -> Option<Task<Result<Arc<lsp::LanguageServer>>>> {
) -> Option<Task<Result<lsp::LanguageServer>>> {
#[cfg(any(test, feature = "test-support"))]
if language
.config
@ -264,23 +264,26 @@ impl LanguageRegistry {
.fake_config
.as_ref()
.unwrap();
let (server, mut fake_server) = cx
.update(|cx| {
lsp::LanguageServer::fake_with_capabilities(
fake_config.capabilities.clone(),
cx,
)
})
.await;
if let Some(initalizer) = &fake_config.initializer {
initalizer(&mut fake_server);
let (server, mut fake_server) = cx.update(|cx| {
lsp::LanguageServer::fake_with_capabilities(
fake_config.capabilities.clone(),
cx,
)
});
if let Some(initializer) = &fake_config.initializer {
initializer(&mut fake_server);
}
fake_config
.servers_tx
.clone()
.unbounded_send(fake_server)
.ok();
Ok(server.clone())
let servers_tx = fake_config.servers_tx.clone();
cx.background()
.spawn(async move {
fake_server
.receive_notification::<lsp::notification::Initialized>()
.await;
servers_tx.unbounded_send(fake_server).ok();
})
.detach();
Ok(server)
}));
}
@ -316,15 +319,13 @@ impl LanguageRegistry {
let server_binary_path = server_binary_path.await?;
let server_args = adapter.server_args();
let server = lsp::LanguageServer::new(
lsp::LanguageServer::new(
&server_binary_path,
server_args,
adapter.initialization_options(),
&root_path,
adapter.initialization_options(),
background,
)
.await?;
Ok(server)
}))
}