From d9db07db2a377f8cfcf43b42ad9a35074b77173f Mon Sep 17 00:00:00 2001 From: Simon Hausmann Date: Tue, 6 Apr 2021 11:10:30 +0200 Subject: [PATCH] Try to gracefully terminate the LSP server when requested --- tools/lsp/main.rs | 58 ++++++++++++++++++++++++-------------------- tools/lsp/preview.rs | 6 +++++ 2 files changed, 38 insertions(+), 26 deletions(-) diff --git a/tools/lsp/main.rs b/tools/lsp/main.rs index 58a7978bc..93acf707a 100644 --- a/tools/lsp/main.rs +++ b/tools/lsp/main.rs @@ -45,7 +45,15 @@ impl<'a> DocumentCache<'a> { } fn main() { - start_lsp_thread(); + std::thread::spawn(|| { + match run_lsp_server() { + Ok(_) => {} + Err(error) => { + eprintln!("Error running LSP server: {}", error); + } + } + preview::quit_ui_event_loop(); + }); // TODO: Don't terminate the event loop when the window is closed with Qt // TODO: There's a race condition where theoretically the LSP could receive a preview // request before the gui event loop has started, which would cause post_event to panic. @@ -54,32 +62,30 @@ fn main() { preview::start_ui_event_loop(); } -fn start_lsp_thread() { - std::thread::spawn(|| { - let (connection, io_threads) = Connection::stdio(); - let capabilities = ServerCapabilities { - completion_provider: Some(CompletionOptions { - resolve_provider: Some(true), - trigger_characters: None, - work_done_progress_options: WorkDoneProgressOptions::default(), - }), - hover_provider: Some(HoverProviderCapability::Simple(true)), - document_highlight_provider: Some(OneOf::Left(true)), - document_symbol_provider: Some(OneOf::Left(true)), - workspace_symbol_provider: Some(OneOf::Left(true)), - definition_provider: Some(OneOf::Left(true)), - text_document_sync: Some(TextDocumentSyncCapability::Kind( - lsp_types::TextDocumentSyncKind::Full, - )), +fn run_lsp_server() -> Result<(), Error> { + let (connection, io_threads) = Connection::stdio(); + let capabilities = ServerCapabilities { + completion_provider: Some(CompletionOptions { + resolve_provider: Some(true), + trigger_characters: None, + work_done_progress_options: WorkDoneProgressOptions::default(), + }), + hover_provider: Some(HoverProviderCapability::Simple(true)), + document_highlight_provider: Some(OneOf::Left(true)), + document_symbol_provider: Some(OneOf::Left(true)), + workspace_symbol_provider: Some(OneOf::Left(true)), + definition_provider: Some(OneOf::Left(true)), + text_document_sync: Some(TextDocumentSyncCapability::Kind( + lsp_types::TextDocumentSyncKind::Full, + )), - ..ServerCapabilities::default() - }; - let server_capabilities = serde_json::to_value(&capabilities).unwrap(); - let initialization_params = connection.initialize(server_capabilities).unwrap(); - main_loop(&connection, initialization_params).unwrap(); - io_threads.join().unwrap(); - // TODO: notify the gui thread to gracefully terminate the event loop - }); + ..ServerCapabilities::default() + }; + let server_capabilities = serde_json::to_value(&capabilities).unwrap(); + let initialization_params = connection.initialize(server_capabilities)?; + main_loop(&connection, initialization_params)?; + io_threads.join()?; + Ok(()) } fn main_loop(connection: &Connection, params: serde_json::Value) -> Result<(), Error> { diff --git a/tools/lsp/preview.rs b/tools/lsp/preview.rs index 74600e6c4..24071dfad 100644 --- a/tools/lsp/preview.rs +++ b/tools/lsp/preview.rs @@ -49,6 +49,12 @@ pub fn start_ui_event_loop() { sixtyfps_interpreter::run_event_loop(); } +pub fn quit_ui_event_loop() { + sixtyfps_rendering_backend_default::backend().post_event(Box::new(|| { + sixtyfps_rendering_backend_default::backend().quit_event_loop(); + })); +} + pub fn load_preview(path: std::path::PathBuf) { run_in_ui_thread(Box::pin(async move { reload_preview(&path).await })); }