diff --git a/crates/copilot/src/copilot.rs b/crates/copilot/src/copilot.rs index 18ffb08867..d36d5456be 100644 --- a/crates/copilot/src/copilot.rs +++ b/crates/copilot/src/copilot.rs @@ -11,8 +11,8 @@ use gpui::{ }; use language::{ language_settings::{all_language_settings, language_settings}, - point_from_lsp, point_to_lsp, Anchor, Bias, Buffer, BufferSnapshot, Language, PointUtf16, - ToPointUtf16, + point_from_lsp, point_to_lsp, Anchor, Bias, Buffer, BufferSnapshot, Language, + LanguageServerName, PointUtf16, ToPointUtf16, }; use log::{debug, error}; use lsp::{LanguageServer, LanguageServerBinary, LanguageServerId}; @@ -130,6 +130,7 @@ impl CopilotServer { } struct RunningCopilotServer { + name: LanguageServerName, lsp: Arc, sign_in_status: SignInStatus, registered_buffers: HashMap, @@ -361,6 +362,7 @@ impl Copilot { http: http.clone(), node_runtime, server: CopilotServer::Running(RunningCopilotServer { + name: LanguageServerName(Arc::from("copilot")), lsp: Arc::new(server), sign_in_status: SignInStatus::Authorized, registered_buffers: Default::default(), @@ -439,6 +441,7 @@ impl Copilot { match server { Ok((server, status)) => { this.server = CopilotServer::Running(RunningCopilotServer { + name: LanguageServerName(Arc::from("copilot")), lsp: server, sign_in_status: SignInStatus::SignedOut, registered_buffers: Default::default(), @@ -576,9 +579,9 @@ impl Copilot { cx.foreground().spawn(start_task) } - pub fn language_server(&self) -> Option<&Arc> { + pub fn language_server(&self) -> Option<(&LanguageServerName, &Arc)> { if let CopilotServer::Running(server) = &self.server { - Some(&server.lsp) + Some((&server.name, &server.lsp)) } else { None } diff --git a/crates/language_tools/src/lsp_log.rs b/crates/language_tools/src/lsp_log.rs index 95b1bbd55f..d0a76610e4 100644 --- a/crates/language_tools/src/lsp_log.rs +++ b/crates/language_tools/src/lsp_log.rs @@ -13,7 +13,7 @@ use gpui::{ }; use language::{Buffer, LanguageServerId, LanguageServerName}; use lsp::IoKind; -use project::{search::SearchQuery, Project, Worktree}; +use project::{search::SearchQuery, Project}; use std::{borrow::Cow, sync::Arc}; use theme::{ui, Theme}; use workspace::{ @@ -70,7 +70,7 @@ enum MessageKind { pub(crate) struct LogMenuItem { pub server_id: LanguageServerId, pub server_name: LanguageServerName, - pub worktree: ModelHandle, + pub worktree_root_name: String, pub rpc_trace_enabled: bool, pub rpc_trace_selected: bool, pub logs_selected: bool, @@ -203,7 +203,6 @@ impl LogStore { } }) }); - Some(server_state.log_buffer.clone()) } @@ -410,7 +409,7 @@ impl LspLogView { Some(LogMenuItem { server_id, server_name: language_server_name, - worktree, + worktree_root_name: worktree.read(cx).root_name().to_string(), rpc_trace_enabled: state.rpc_state.is_some(), rpc_trace_selected: self.is_showing_rpc_trace && self.current_server_id == Some(server_id), @@ -418,6 +417,24 @@ impl LspLogView { && self.current_server_id == Some(server_id), }) }) + .chain( + self.project + .read(cx) + .supplementary_language_servers() + .filter_map(|(&server_id, (name, _))| { + let state = state.servers.get(&server_id)?; + Some(LogMenuItem { + server_id, + server_name: name.clone(), + worktree_root_name: "supplementary".to_string(), + rpc_trace_enabled: state.rpc_state.is_some(), + rpc_trace_selected: self.is_showing_rpc_trace + && self.current_server_id == Some(server_id), + logs_selected: !self.is_showing_rpc_trace + && self.current_server_id == Some(server_id), + }) + }), + ) .collect::>(); rows.sort_by_key(|row| row.server_id); rows.dedup_by_key(|row| row.server_id); @@ -635,7 +652,7 @@ impl View for LspLogToolbarItemView { Self::render_language_server_menu_item( row.server_id, row.server_name, - row.worktree, + &row.worktree_root_name, row.rpc_trace_enabled, row.logs_selected, row.rpc_trace_selected, @@ -767,15 +784,14 @@ impl LspLogToolbarItemView { cx: &mut ViewContext, ) -> impl Element { enum ToggleMenu {} - MouseEventHandler::new::(0, cx, move |state, cx| { + MouseEventHandler::new::(0, cx, move |state, _| { let label: Cow = current_server .and_then(|row| { - let worktree = row.worktree.read(cx); Some( format!( "{} ({}) - {}", row.server_name.0, - worktree.root_name(), + row.worktree_root_name, if row.rpc_trace_selected { RPC_MESSAGES } else { @@ -800,7 +816,7 @@ impl LspLogToolbarItemView { fn render_language_server_menu_item( id: LanguageServerId, name: LanguageServerName, - worktree: ModelHandle, + worktree_root_name: &str, rpc_trace_enabled: bool, logs_selected: bool, rpc_trace_selected: bool, @@ -814,7 +830,7 @@ impl LspLogToolbarItemView { .with_child({ let style = &theme.toolbar_dropdown_menu.section_header; Label::new( - format!("{} ({})", name.0, worktree.read(cx).root_name()), + format!("{} ({})", name.0, worktree_root_name), style.text.clone(), ) .contained() diff --git a/crates/language_tools/src/lsp_log_tests.rs b/crates/language_tools/src/lsp_log_tests.rs index d26000ebc7..0830c3dac9 100644 --- a/crates/language_tools/src/lsp_log_tests.rs +++ b/crates/language_tools/src/lsp_log_tests.rs @@ -77,7 +77,14 @@ async fn test_lsp_logs(cx: &mut TestAppContext) { &[LogMenuItem { server_id: language_server.server.server_id(), server_name: LanguageServerName("the-rust-language-server".into()), - worktree: project.read(cx).worktrees(cx).next().unwrap(), + worktree_root_name: project + .read(cx) + .worktrees(cx) + .next() + .unwrap() + .read(cx) + .root_name() + .to_string(), rpc_trace_enabled: false, rpc_trace_selected: false, logs_selected: true, diff --git a/crates/project/src/project.rs b/crates/project/src/project.rs index c1c5e41dba..b54296ee2a 100644 --- a/crates/project/src/project.rs +++ b/crates/project/src/project.rs @@ -108,7 +108,8 @@ pub struct Project { active_entry: Option, buffer_ordered_messages_tx: mpsc::UnboundedSender, languages: Arc, - supplementary_language_servers: HashMap>, + supplementary_language_servers: + HashMap)>, language_servers: HashMap, language_server_ids: HashMap<(WorktreeId, LanguageServerName), LanguageServerId>, language_server_statuses: BTreeMap, @@ -7951,10 +7952,22 @@ impl Project { }) } + pub fn supplementary_language_servers( + &self, + ) -> impl '_ + + Iterator< + Item = ( + &LanguageServerId, + &(LanguageServerName, Arc), + ), + > { + self.supplementary_language_servers.iter() + } + pub fn language_server_for_id(&self, id: LanguageServerId) -> Option> { if let LanguageServerState::Running { server, .. } = self.language_servers.get(&id)? { Some(server.clone()) - } else if let Some(server) = self.supplementary_language_servers.get(&id) { + } else if let Some((_, server)) = self.supplementary_language_servers.get(&id) { Some(Arc::clone(server)) } else { None @@ -8023,13 +8036,13 @@ fn subscribe_for_copilot_events( copilot, |project, copilot, copilot_event, cx| match copilot_event { copilot::Event::CopilotReady => { - if let Some(copilot_server) = copilot.read(cx).language_server() { + if let Some((name, copilot_server)) = copilot.read(cx).language_server() { let new_server_id = copilot_server.server_id(); if let hash_map::Entry::Vacant(v) = project.supplementary_language_servers.entry(new_server_id) { - v.insert(Arc::clone(copilot_server)); - cx.emit(Event::LanguageServerAdded(new_server_id)) + v.insert((name.clone(), Arc::clone(copilot_server))); + cx.emit(Event::LanguageServerAdded(new_server_id)); } } }