From a1188848ef7005900aa366525c0dbd6352e943e4 Mon Sep 17 00:00:00 2001 From: Kirill Bulatov Date: Fri, 11 Jul 2025 00:11:49 +0300 Subject: [PATCH] Make inline and regular diagnostics more related (#34237) Release Notes: - N/A --- crates/language_tools/src/lsp_tool.rs | 1 + crates/ui/src/components/context_menu.rs | 17 ++++++++++++++++- crates/zed/src/zed/quick_action_bar.rs | 17 +++++++++-------- 3 files changed, 26 insertions(+), 9 deletions(-) diff --git a/crates/language_tools/src/lsp_tool.rs b/crates/language_tools/src/lsp_tool.rs index 9e542f582a..d14a6fb781 100644 --- a/crates/language_tools/src/lsp_tool.rs +++ b/crates/language_tools/src/lsp_tool.rs @@ -110,6 +110,7 @@ impl LanguageServerHealthStatus { impl LanguageServerState { fn fill_menu(&self, mut menu: ContextMenu, cx: &mut Context) -> ContextMenu { + menu = menu.align_popover_bottom(); let lsp_logs = cx .try_global::() .and_then(|lsp_logs| lsp_logs.0.upgrade()); diff --git a/crates/ui/src/components/context_menu.rs b/crates/ui/src/components/context_menu.rs index 873b7b9e63..b5bdfdd8bb 100644 --- a/crates/ui/src/components/context_menu.rs +++ b/crates/ui/src/components/context_menu.rs @@ -159,6 +159,7 @@ pub struct ContextMenu { keep_open_on_confirm: bool, documentation_aside: Option<(usize, DocumentationAside)>, fixed_width: Option, + align_popover_top: bool, } #[derive(Copy, Clone, PartialEq, Eq)] @@ -215,6 +216,7 @@ impl ContextMenu { key_context: "menu".into(), _on_blur_subscription, keep_open_on_confirm: false, + align_popover_top: true, documentation_aside: None, fixed_width: None, end_slot_action: None, @@ -257,6 +259,7 @@ impl ContextMenu { key_context: "menu".into(), _on_blur_subscription, keep_open_on_confirm: true, + align_popover_top: true, documentation_aside: None, fixed_width: None, end_slot_action: None, @@ -297,6 +300,7 @@ impl ContextMenu { |this: &mut ContextMenu, window, cx| this.cancel(&menu::Cancel, window, cx), ), keep_open_on_confirm: false, + align_popover_top: true, documentation_aside: None, fixed_width: None, end_slot_action: None, @@ -778,6 +782,11 @@ impl ContextMenu { self } + pub fn align_popover_bottom(mut self) -> Self { + self.align_popover_top = false; + self + } + fn render_menu_item( &self, ix: usize, @@ -1100,7 +1109,13 @@ impl Render for ContextMenu { .when(is_wide_window, |this| this.flex_row()) .when(!is_wide_window, |this| this.flex_col()) .w_full() - .items_start() + .map(|div| { + if self.align_popover_top { + div.items_start() + } else { + div.items_end() + } + }) .gap_1() .child(div().children(aside.clone().and_then(|(_, aside)| { (aside.side == DocumentationSide::Left).then(|| render_aside(aside, cx)) diff --git a/crates/zed/src/zed/quick_action_bar.rs b/crates/zed/src/zed/quick_action_bar.rs index 888101140e..36d446579a 100644 --- a/crates/zed/src/zed/quick_action_bar.rs +++ b/crates/zed/src/zed/quick_action_bar.rs @@ -409,12 +409,10 @@ impl Render for QuickActionBar { ); if supports_inline_diagnostics { - menu = menu.toggleable_entry( - "Inline Diagnostics", - inline_diagnostics_enabled, - IconPosition::Start, - Some(ToggleInlineDiagnostics.boxed_clone()), - { + let mut inline_diagnostics_item = ContextMenuEntry::new("Inline Diagnostics") + .toggleable(IconPosition::Start, diagnostics_enabled && inline_diagnostics_enabled) + .action(ToggleInlineDiagnostics.boxed_clone()) + .handler({ let editor = editor.clone(); move |window, cx| { editor @@ -427,8 +425,11 @@ impl Render for QuickActionBar { }) .ok(); } - }, - ); + }); + if !diagnostics_enabled { + inline_diagnostics_item = inline_diagnostics_item.disabled(true).documentation_aside(DocumentationSide::Left, |_| Label::new("Inline diagnostics are not available until regular diagnostics are enabled.").into_any_element()); + } + menu = menu.item(inline_diagnostics_item) } menu = menu.separator();