diff --git a/crates/typst-eval/src/markup.rs b/crates/typst-eval/src/markup.rs index 5beefa912..22b413d66 100644 --- a/crates/typst-eval/src/markup.rs +++ b/crates/typst-eval/src/markup.rs @@ -62,7 +62,7 @@ fn eval_markup<'a>( )); } - *elem = std::mem::take(elem).labelled(label); + *elem = std::mem::take(elem).labelled(label, expr.span()); } else { vm.engine.sink.warn(warning!( expr.span(), diff --git a/crates/typst-ide/src/definition.rs b/crates/typst-ide/src/definition.rs index 69d702b3b..7080f6d44 100644 --- a/crates/typst-ide/src/definition.rs +++ b/crates/typst-ide/src/definition.rs @@ -75,7 +75,10 @@ pub fn definition( let label = Label::new(PicoStr::intern(node.cast::()?.target())); let selector = Selector::Label(label); let elem = document?.introspector.query_first(&selector)?; - return Some(Definition::Span(elem.span())); + let labelled_at = elem.labelled_at().or(elem.span()); + if !labelled_at.is_detached() { + return Some(Definition::Span(labelled_at)); + } } _ => {} @@ -181,7 +184,13 @@ mod tests { #[test] fn test_definition_ref() { - test("#figure[] See @hi", -2, Side::After).must_be_at("main.typ", 1..9); + test("#figure[] See @hi", -2, Side::After).must_be_at("main.typ", 10..14); + let source = + r#"#let test1(body) = figure(body); #test1([Test1]) @fig:test1"#; + test(source, -2, Side::After).must_be_at("main.typ", 49..60); + let source = r#"#let test1(body) = figure(body); #test1([Test1]) @fig:test1 +#let test2(body) = test1(body); #test2([Test2]) ; @fig:test2"#; + test(source, -2, Side::After).must_be_at("main.typ", 120..131); } #[test] diff --git a/crates/typst-library/src/foundations/content.rs b/crates/typst-library/src/foundations/content.rs index daf6c2dd9..f240fe7d1 100644 --- a/crates/typst-library/src/foundations/content.rs +++ b/crates/typst-library/src/foundations/content.rs @@ -82,6 +82,8 @@ pub struct Content { struct Inner { /// An optional label attached to the element. label: Option