diff --git a/crates/editor/src/hover_popover.rs b/crates/editor/src/hover_popover.rs index 730adec4f9b6b13ea14fc00c447b37bf77156b94..21177ad27b5886739ce5f57421412226ae4b1123 100644 --- a/crates/editor/src/hover_popover.rs +++ b/crates/editor/src/hover_popover.rs @@ -62,6 +62,8 @@ pub fn hover_at( editor.hover_state.hiding_delay_task = None; editor.hover_state.closest_mouse_distance = None; show_hover(editor, anchor, false, window, cx); + } else if !editor.hover_state.visible() { + editor.hover_state.info_task = None; } else { let settings = EditorSettings::get_global(cx); if !settings.hover_popover_sticky { @@ -1501,6 +1503,64 @@ mod tests { }); } + #[gpui::test] + async fn test_mouse_hover_cancelled_before_delay(cx: &mut gpui::TestAppContext) { + init_test(cx, |_| {}); + + let mut cx = EditorLspTestContext::new_rust( + lsp::ServerCapabilities { + hover_provider: Some(lsp::HoverProviderCapability::Simple(true)), + ..Default::default() + }, + cx, + ) + .await; + + cx.set_state(indoc! {" + fn ˇtest() { println!(); } + "}); + let hover_point = cx.display_point(indoc! {" + fn test() { printˇln!(); } + "}); + + cx.update_editor(|editor, window, cx| { + let snapshot = editor.snapshot(window, cx); + let anchor = snapshot + .buffer_snapshot() + .anchor_before(hover_point.to_offset(&snapshot, Bias::Left)); + hover_at(editor, Some(anchor), None, window, cx); + hover_at(editor, None, None, window, cx); + }); + + let request_count = Arc::new(AtomicUsize::new(0)); + cx.set_request_handler::({ + let request_count = request_count.clone(); + move |_, _, _| { + let request_count = request_count.clone(); + async move { + request_count.fetch_add(1, atomic::Ordering::Release); + Ok(Some(lsp::Hover { + contents: lsp::HoverContents::Markup(lsp::MarkupContent { + kind: lsp::MarkupKind::Markdown, + value: "some basic docs".to_string(), + }), + range: None, + })) + } + } + }); + + cx.background_executor + .advance_clock(Duration::from_millis(get_hover_popover_delay(&cx) + 100)); + cx.background_executor.run_until_parked(); + cx.run_until_parked(); + + assert_eq!(request_count.load(atomic::Ordering::Acquire), 0); + cx.editor(|editor, _, _| { + assert!(!editor.hover_state.visible()); + }); + } + #[gpui::test] async fn test_keyboard_hover_info_popover(cx: &mut gpui::TestAppContext) { init_test(cx, |_| {});