fix(lsp): close server on exit notification (#28232)

This commit is contained in:
Nayeem Rahman 2025-02-21 20:02:56 +00:00 committed by GitHub
parent a9f404e479
commit 876bac445a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 19 additions and 35 deletions

View file

@ -137,7 +137,6 @@ pub struct LanguageServer {
/// https://github.com/Microsoft/language-server-protocol/issues/567#issuecomment-2085131917
init_flag: AsyncFlag,
performance: Arc<Performance>,
shutdown_flag: AsyncFlag,
}
/// Snapshot of the state used by TSC.
@ -227,7 +226,7 @@ pub struct Inner {
}
impl LanguageServer {
pub fn new(client: Client, shutdown_flag: AsyncFlag) -> Self {
pub fn new(client: Client) -> Self {
let performance = Arc::new(Performance::default());
Self {
client: client.clone(),
@ -237,7 +236,6 @@ impl LanguageServer {
))),
init_flag: Default::default(),
performance,
shutdown_flag,
}
}
@ -3566,7 +3564,6 @@ impl tower_lsp::LanguageServer for LanguageServer {
}
async fn shutdown(&self) -> LspResult<()> {
self.shutdown_flag.raise();
Ok(())
}

View file

@ -1,7 +1,6 @@
// Copyright 2018-2025 the Deno authors. MIT license.
use deno_core::error::AnyError;
use deno_core::unsync::spawn;
pub use repl::ReplCompletionItem;
pub use repl::ReplLanguageServer;
use tower_lsp::LspService;
@ -9,7 +8,6 @@ use tower_lsp::Server;
use self::diagnostics::should_send_diagnostic_batch_index_notifications;
use crate::lsp::language_server::LanguageServer;
use crate::util::sync::AsyncFlag;
mod analysis;
mod cache;
@ -44,12 +42,8 @@ pub async fn start() -> Result<(), AnyError> {
let stdin = tokio::io::stdin();
let stdout = tokio::io::stdout();
let shutdown_flag = AsyncFlag::default();
let builder = LspService::build(|client| {
language_server::LanguageServer::new(
client::Client::from_tower(client),
shutdown_flag.clone(),
)
language_server::LanguageServer::new(client::Client::from_tower(client))
})
.custom_method(
lsp_custom::PERFORMANCE_REQUEST,
@ -76,19 +70,9 @@ pub async fn start() -> Result<(), AnyError> {
};
let (service, socket, pending) = builder.finish();
// TODO(nayeemrmn): This shutdown flag is a workaround for
// https://github.com/denoland/deno/issues/20700. Remove when
// https://github.com/ebkalderon/tower-lsp/issues/399 is fixed.
// Force end the server 8 seconds after receiving a shutdown request.
tokio::select! {
biased;
_ = Server::new(stdin, stdout, socket, pending).concurrency_level(32).serve(service) => {}
_ = spawn(async move {
shutdown_flag.wait_raised().await;
tokio::time::sleep(std::time::Duration::from_secs(8)).await;
}) => {}
}
Server::new(stdin, stdout, socket, pending)
.concurrency_level(32)
.serve(service)
.await;
Ok(())
}

View file

@ -65,10 +65,8 @@ impl ReplLanguageServer {
super::logging::set_lsp_log_level(log::Level::Debug);
super::logging::set_lsp_warn_level(log::Level::Debug);
let language_server = super::language_server::LanguageServer::new(
Client::new_for_repl(),
Default::default(),
);
let language_server =
super::language_server::LanguageServer::new(Client::new_for_repl());
let cwd_uri = get_cwd_uri()?;