From 91fac2aa76578da874338e7097c0383b27cb7465 Mon Sep 17 00:00:00 2001 From: Kirill Bulatov Date: Tue, 19 Sep 2023 11:47:27 +0300 Subject: [PATCH] Automatically subscribe for lsp logs of every server added Avoid re-adding the server on new logs events. --- crates/language_tools/src/lsp_log.rs | 40 +++++++++++++++++++++------- crates/project/src/project.rs | 12 --------- 2 files changed, 31 insertions(+), 21 deletions(-) diff --git a/crates/language_tools/src/lsp_log.rs b/crates/language_tools/src/lsp_log.rs index 587e6ed25aba2c5603ca700cf8e61e8391926705..95b1bbd55fea670be2d23870728b40cbcc841f01 100644 --- a/crates/language_tools/src/lsp_log.rs +++ b/crates/language_tools/src/lsp_log.rs @@ -38,7 +38,8 @@ struct ProjectState { struct LanguageServerState { log_buffer: ModelHandle, rpc_state: Option, - _subscription: Option, + _io_logs_subscription: Option, + _lsp_logs_subscription: Option, } struct LanguageServerRpcState { @@ -134,8 +135,6 @@ impl LogStore { } pub fn add_project(&mut self, project: &ModelHandle, cx: &mut ModelContext) { - use project::Event::*; - let weak_project = project.downgrade(); self.projects.insert( weak_project, @@ -146,13 +145,13 @@ impl LogStore { this.projects.remove(&weak_project); }), cx.subscribe(project, |this, project, event, cx| match event { - LanguageServerAdded(id) => { + project::Event::LanguageServerAdded(id) => { this.add_language_server(&project, *id, cx); } - LanguageServerRemoved(id) => { + project::Event::LanguageServerRemoved(id) => { this.remove_language_server(&project, *id, cx); } - LanguageServerLog(id, message) => { + project::Event::LanguageServerLog(id, message) => { this.add_language_server_log(&project, *id, message, cx); } _ => {} @@ -176,20 +175,34 @@ impl LogStore { log_buffer: cx .add_model(|cx| Buffer::new(0, cx.model_id() as u64, "")) .clone(), - _subscription: None, + _io_logs_subscription: None, + _lsp_logs_subscription: None, } }); let server = project.read(cx).language_server_for_id(id); let weak_project = project.downgrade(); let io_tx = self.io_tx.clone(); - server_state._subscription = server.map(|server| { + server_state._io_logs_subscription = server.as_ref().map(|server| { server.on_io(move |io_kind, message| { io_tx .unbounded_send((weak_project, id, io_kind, message.to_string())) .ok(); }) }); + let weak_project = project.downgrade(); + server_state._lsp_logs_subscription = server.map(|server| { + let server_id = server.server_id(); + server.on_notification::({ + move |params, mut cx| { + if let Some(project) = weak_project.upgrade(&cx) { + project.update(&mut cx, |_, cx| { + cx.emit(project::Event::LanguageServerLog(server_id, params.message)) + }); + } + } + }) + }); Some(server_state.log_buffer.clone()) } @@ -201,7 +214,16 @@ impl LogStore { message: &str, cx: &mut ModelContext, ) -> Option<()> { - let buffer = self.add_language_server(&project, id, cx)?; + let buffer = match self + .projects + .get_mut(&project.downgrade())? + .servers + .get(&id) + .map(|state| state.log_buffer.clone()) + { + Some(existing_buffer) => existing_buffer, + None => self.add_language_server(&project, id, cx)?, + }; buffer.update(cx, |buffer, cx| { let len = buffer.len(); let has_newline = message.ends_with("\n"); diff --git a/crates/project/src/project.rs b/crates/project/src/project.rs index b4e698e08a3ba427b0c48582f774434ad1012d1c..27f3e45a05668933f4a616e9446297e82a2031c2 100644 --- a/crates/project/src/project.rs +++ b/crates/project/src/project.rs @@ -2789,18 +2789,6 @@ impl Project { None => return Ok(None), }; - language_server - .on_notification::({ - move |params, mut cx| { - if let Some(this) = this.upgrade(&cx) { - this.update(&mut cx, |_, cx| { - cx.emit(Event::LanguageServerLog(server_id, params.message)) - }); - } - } - }) - .detach(); - language_server .on_notification::({ let adapter = adapter.clone();