about summary refs log tree commit diff
path: root/crates/rust-analyzer
diff options
context:
space:
mode:
authorLukas Wirth <lukastw97@gmail.com>2024-01-01 14:06:56 +0100
committerLukas Wirth <lukastw97@gmail.com>2024-01-01 14:10:46 +0100
commit3c8dd9e89ef8295241187ddc092d9b675b7db48d (patch)
tree7c60c182a332bee45a5a1d58fcfb13a414829892 /crates/rust-analyzer
parent06be1b1f34ec358594e6d6493876eb7af22c8b47 (diff)
downloadrust-3c8dd9e89ef8295241187ddc092d9b675b7db48d.tar.gz
rust-3c8dd9e89ef8295241187ddc092d9b675b7db48d.zip
Expose whether a channel has been dropped in lsp-server errors
Diffstat (limited to 'crates/rust-analyzer')
-rw-r--r--crates/rust-analyzer/src/bin/main.rs17
1 files changed, 15 insertions, 2 deletions
diff --git a/crates/rust-analyzer/src/bin/main.rs b/crates/rust-analyzer/src/bin/main.rs
index 8472e49de98..6f40a4c88ed 100644
--- a/crates/rust-analyzer/src/bin/main.rs
+++ b/crates/rust-analyzer/src/bin/main.rs
@@ -172,7 +172,15 @@ fn run_server() -> anyhow::Result<()> {
 
     let (connection, io_threads) = Connection::stdio();
 
-    let (initialize_id, initialize_params) = connection.initialize_start()?;
+    let (initialize_id, initialize_params) = match connection.initialize_start() {
+        Ok(it) => it,
+        Err(e) => {
+            if e.channel_is_disconnected() {
+                io_threads.join()?;
+            }
+            return Err(e.into());
+        }
+    };
     tracing::info!("InitializeParams: {}", initialize_params);
     let lsp_types::InitializeParams {
         root_uri,
@@ -240,7 +248,12 @@ fn run_server() -> anyhow::Result<()> {
 
     let initialize_result = serde_json::to_value(initialize_result).unwrap();
 
-    connection.initialize_finish(initialize_id, initialize_result)?;
+    if let Err(e) = connection.initialize_finish(initialize_id, initialize_result) {
+        if e.channel_is_disconnected() {
+            io_threads.join()?;
+        }
+        return Err(e.into());
+    }
 
     if !config.has_linked_projects() && config.detached_files().is_empty() {
         config.rediscover_workspaces();