@@ -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::<lsp::request::HoverRequest, _, _>({
+ 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, |_| {});