From 8583320e9bc33fbf0f093c704e9adf82acdd9aff Mon Sep 17 00:00:00 2001 From: ForLoveOfCats Date: Thu, 18 Aug 2022 18:33:37 -0400 Subject: [PATCH] Add test for pending selection influence on go-to links Co-authored-by: Max Brunsfeld --- crates/editor/src/link_go_to_definition.rs | 54 ++++++++++++++++++++++ crates/editor/src/test.rs | 2 +- 2 files changed, 55 insertions(+), 1 deletion(-) diff --git a/crates/editor/src/link_go_to_definition.rs b/crates/editor/src/link_go_to_definition.rs index 79b2e950cb477798addd8ae26709c39dc2fa74b7..6af985171a87cd9d678d46a8fc7504b93199ba54 100644 --- a/crates/editor/src/link_go_to_definition.rs +++ b/crates/editor/src/link_go_to_definition.rs @@ -821,5 +821,59 @@ mod tests { fn test() { do_work(); } fn «do_workˇ»() { test(); } "}); + + // 1. We have a pending selection, mouse point is over a symbol that we have a response for, hitting cmd and nothing happens + // 2. Selection is completed, hovering + let hover_point = cx.display_point(indoc! {" + fn test() { do_wˇork(); } + fn do_work() { test(); } + "}); + let target_range = cx.lsp_range(indoc! {" + fn test() { do_work(); } + fn «do_work»() { test(); } + "}); + let mut requests = cx.handle_request::(move |url, _, _| async move { + Ok(Some(lsp::GotoDefinitionResponse::Link(vec![ + lsp::LocationLink { + origin_selection_range: None, + target_uri: url, + target_range, + target_selection_range: target_range, + }, + ]))) + }); + + // create a pending selection + let selection_range = cx.ranges(indoc! {" + fn «test() { do_w»ork(); } + fn do_work() { test(); } + "})[0] + .clone(); + cx.update_editor(|editor, cx| { + let snapshot = editor.buffer().read(cx).snapshot(cx); + let anchor_range = snapshot.anchor_before(selection_range.start) + ..snapshot.anchor_after(selection_range.end); + editor.change_selections(Some(crate::Autoscroll::Fit), cx, |s| { + s.set_pending_anchor_range(anchor_range, crate::SelectMode::Character) + }); + }); + cx.update_editor(|editor, cx| { + update_go_to_definition_link( + editor, + &UpdateGoToDefinitionLink { + point: Some(hover_point), + cmd_held: true, + shift_held: false, + }, + cx, + ); + }); + cx.foreground().run_until_parked(); + assert!(requests.try_next().is_err()); + cx.assert_editor_text_highlights::(indoc! {" + fn test() { do_work(); } + fn do_work() { test(); } + "}); + cx.foreground().run_until_parked(); } } diff --git a/crates/editor/src/test.rs b/crates/editor/src/test.rs index 5f6528db1c32b816694859c0e5e13b028207f23a..43e50829f55ae47299abbe41ad33066dcc3be653 100644 --- a/crates/editor/src/test.rs +++ b/crates/editor/src/test.rs @@ -183,7 +183,7 @@ impl<'a> EditorTestContext<'a> { } } - fn ranges(&self, marked_text: &str) -> Vec> { + pub fn ranges(&self, marked_text: &str) -> Vec> { let (unmarked_text, ranges) = marked_text_ranges(marked_text, false); assert_eq!(self.buffer_text(), unmarked_text); ranges