diff --git a/crates/language_tools/src/lsp_button.rs b/crates/language_tools/src/lsp_button.rs index 233aae66b6139c83c48db8a467669fc83c781e98..c5500b57769e22d39e06166e4e0d3fbae0192c9d 100644 --- a/crates/language_tools/src/lsp_button.rs +++ b/crates/language_tools/src/lsp_button.rs @@ -20,7 +20,7 @@ use ui::{ ContextMenu, ContextMenuEntry, Indicator, PopoverMenu, PopoverMenuHandle, Tooltip, prelude::*, }; -use util::{ResultExt, rel_path::RelPath}; +use util::{ResultExt, paths::PathExt, rel_path::RelPath}; use workspace::{StatusItemView, Workspace}; use crate::lsp_log_view; @@ -132,12 +132,20 @@ impl LanguageServerState { return menu; }; - let server_versions = self + let server_metadata = self .lsp_store .update(cx, |lsp_store, _| { lsp_store .language_server_statuses() - .map(|(server_id, status)| (server_id, status.server_version.clone())) + .map(|(server_id, status)| { + ( + server_id, + ( + status.server_version.clone(), + status.binary.as_ref().map(|b| b.path.clone()), + ), + ) + }) .collect::>() }) .unwrap_or_default(); @@ -266,9 +274,16 @@ impl LanguageServerState { .or_else(|| server_info.binary_status.as_ref()?.message.as_ref()) .cloned(); - let server_version = server_versions + let (server_version, binary_path) = server_metadata .get(&server_info.id) - .and_then(|version| version.clone()); + .map(|(version, path)| { + ( + version.clone(), + path.as_ref() + .map(|p| SharedString::from(p.compact().to_string_lossy().to_string())), + ) + }) + .unwrap_or((None, None)); let truncated_message = message.as_ref().and_then(|message| { message @@ -495,6 +510,7 @@ impl LanguageServerState { submenu = submenu.separator().custom_row({ let metadata_label = metadata_label.clone(); + let binary_path = binary_path.clone(); move |_, _| { h_flex() .id("metadata-container") @@ -525,6 +541,9 @@ impl LanguageServerState { .truncate(), ) }) + .when_some(binary_path.clone(), |el, path| { + el.tooltip(Tooltip::text(path)) + }) .into_any_element() } });