Try to gracefully terminate the LSP server when requested

This commit is contained in:
Simon Hausmann 2021-04-06 11:10:30 +02:00
parent 121a098f74
commit d9db07db2a
2 changed files with 38 additions and 26 deletions

View file

@ -45,7 +45,15 @@ impl<'a> DocumentCache<'a> {
} }
fn main() { 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: 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 // 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. // request before the gui event loop has started, which would cause post_event to panic.
@ -54,8 +62,7 @@ fn main() {
preview::start_ui_event_loop(); preview::start_ui_event_loop();
} }
fn start_lsp_thread() { fn run_lsp_server() -> Result<(), Error> {
std::thread::spawn(|| {
let (connection, io_threads) = Connection::stdio(); let (connection, io_threads) = Connection::stdio();
let capabilities = ServerCapabilities { let capabilities = ServerCapabilities {
completion_provider: Some(CompletionOptions { completion_provider: Some(CompletionOptions {
@ -75,11 +82,10 @@ fn start_lsp_thread() {
..ServerCapabilities::default() ..ServerCapabilities::default()
}; };
let server_capabilities = serde_json::to_value(&capabilities).unwrap(); let server_capabilities = serde_json::to_value(&capabilities).unwrap();
let initialization_params = connection.initialize(server_capabilities).unwrap(); let initialization_params = connection.initialize(server_capabilities)?;
main_loop(&connection, initialization_params).unwrap(); main_loop(&connection, initialization_params)?;
io_threads.join().unwrap(); io_threads.join()?;
// TODO: notify the gui thread to gracefully terminate the event loop Ok(())
});
} }
fn main_loop(connection: &Connection, params: serde_json::Value) -> Result<(), Error> { fn main_loop(connection: &Connection, params: serde_json::Value) -> Result<(), Error> {

View file

@ -49,6 +49,12 @@ pub fn start_ui_event_loop() {
sixtyfps_interpreter::run_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) { pub fn load_preview(path: std::path::PathBuf) {
run_in_ui_thread(Box::pin(async move { reload_preview(&path).await })); run_in_ui_thread(Box::pin(async move { reload_preview(&path).await }));
} }