From a5b506c424d4da54984c4c4f1827ff52c0259770 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20d=27Herbais=20de=20Thun?= Date: Thu, 26 Sep 2024 10:53:31 +0200 Subject: [PATCH] Make `jump_from_cursor` return a vector of `Position` (#4886) --- crates/typst-ide/src/jump.rs | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/crates/typst-ide/src/jump.rs b/crates/typst-ide/src/jump.rs index a97e5a0a..d7f2e1d2 100644 --- a/crates/typst-ide/src/jump.rs +++ b/crates/typst-ide/src/jump.rs @@ -113,25 +113,30 @@ pub fn jump_from_cursor( document: &Document, source: &Source, cursor: usize, -) -> Option { +) -> Vec { fn is_text(node: &LinkedNode) -> bool { node.get().kind() == SyntaxKind::Text } let root = LinkedNode::new(source.root()); - let node = root + let Some(node) = root .leaf_at(cursor, Side::Before) .filter(is_text) - .or_else(|| root.leaf_at(cursor, Side::After).filter(is_text))?; + .or_else(|| root.leaf_at(cursor, Side::After).filter(is_text)) + else { + return vec![]; + }; let span = node.span(); - for (i, page) in document.pages.iter().enumerate() { - if let Some(point) = find_in_frame(&page.frame, span) { - return Some(Position { page: NonZeroUsize::new(i + 1).unwrap(), point }); - } - } - - None + document + .pages + .iter() + .enumerate() + .filter_map(|(i, page)| { + find_in_frame(&page.frame, span) + .map(|point| Position { page: NonZeroUsize::new(i + 1).unwrap(), point }) + }) + .collect() } /// Find the position of a span in a frame. @@ -226,8 +231,8 @@ mod tests { let world = TestWorld::new(text); let doc = typst::compile(&world).output.unwrap(); let pos = jump_from_cursor(&doc, &world.main, cursor); - assert_eq!(pos.is_some(), expected.is_some()); - if let (Some(pos), Some(expected)) = (pos, expected) { + assert_eq!(!pos.is_empty(), expected.is_some()); + if let (Some(pos), Some(expected)) = (pos.first(), expected) { assert_eq!(pos.page, expected.page); assert_approx_eq!(pos.point.x, expected.point.x); assert_approx_eq!(pos.point.y, expected.point.y);