From 6dfa7a413c4bb294556e34f9043628c8765e68fb Mon Sep 17 00:00:00 2001 From: Dmytro Halichenko Date: Sat, 8 Feb 2025 23:00:18 -0500 Subject: [PATCH] fix: Go to definition in nested lists (#42) --- crates/iwes/tests/go_to_definition_test.rs | 27 ++++++++++++++++++++++ crates/liwe/src/model/document.rs | 13 ++++------- 2 files changed, 31 insertions(+), 9 deletions(-) diff --git a/crates/iwes/tests/go_to_definition_test.rs b/crates/iwes/tests/go_to_definition_test.rs index e8f23fb..033e6d3 100644 --- a/crates/iwes/tests/go_to_definition_test.rs +++ b/crates/iwes/tests/go_to_definition_test.rs @@ -116,6 +116,33 @@ fn definition_in_list() { ); } +#[test] +fn definition_in_nested_list() { + let fixture = Fixture::with(indoc! {" + # test + + - list + - item + - [test](link) + + "}); + + fixture.go_to_definition( + GotoDefinitionParams { + text_document_position_params: TextDocumentPositionParams { + text_document: TextDocumentIdentifier { uri: uri(1) }, + position: Position::new(4, 8), + }, + work_done_progress_params: Default::default(), + partial_result_params: Default::default(), + }, + GotoDefinitionResponse::Scalar(Location::new( + Url::parse("file:///basepath/link.md").unwrap(), + Range::default(), + )), + ); +} + #[test] fn definition_with_md_extension() { let fixture = Fixture::with_options( diff --git a/crates/liwe/src/model/document.rs b/crates/liwe/src/model/document.rs index b5a484e..d9da273 100644 --- a/crates/liwe/src/model/document.rs +++ b/crates/liwe/src/model/document.rs @@ -204,15 +204,10 @@ impl DocumentBlock { } fn block_at_positon(&self, position: Position) -> Option { - if self.line_range().contains(&position.line) && self.child_blocks().is_empty() { - return Some(self.clone()); - } - for child in self.child_blocks() { - if child.line_range().contains(&position.line) { - return child.block_at_positon(position); - } - } - None + self.child_blocks() + .iter() + .find_map(|child| child.block_at_positon(position)) + .or(Some(self.clone()).filter(|block| block.line_range().contains(&position.line))) } pub fn child_inlines(&self) -> Vec {