diff options
| author | Max <me@mkor.je> | 2024-09-02 12:58:33 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-09-02 12:58:33 +0000 |
| commit | c644dce81b1685383ee8d991a92991eb03f5e32e (patch) | |
| tree | efbbb92823928d5ae3f96dc14dde1f496fac080c | |
| parent | a2628ac9702b085f3981c7306cee366717b0b77c (diff) | |
Add warnings when labels are ignored or unattached (#4783)
| -rw-r--r-- | crates/typst/src/eval/markup.rs | 17 | ||||
| -rw-r--r-- | tests/suite/foundations/label.typ | 23 |
2 files changed, 39 insertions, 1 deletions
diff --git a/crates/typst/src/eval/markup.rs b/crates/typst/src/eval/markup.rs index 46abf8ce..a735bb8e 100644 --- a/crates/typst/src/eval/markup.rs +++ b/crates/typst/src/eval/markup.rs @@ -1,6 +1,8 @@ use crate::diag::{warning, SourceResult}; use crate::eval::{Eval, Vm}; -use crate::foundations::{Content, Label, NativeElement, Smart, Unlabellable, Value}; +use crate::foundations::{ + Content, Label, NativeElement, Repr, Smart, Unlabellable, Value, +}; use crate::math::EquationElem; use crate::model::{ EmphElem, EnumItem, HeadingElem, LinkElem, ListItem, ParbreakElem, RefElem, @@ -52,7 +54,20 @@ fn eval_markup<'a>( if let Some(elem) = seq.iter_mut().rev().find(|node| !node.can::<dyn Unlabellable>()) { + if elem.label().is_some() { + vm.engine.sink.warn(warning!( + elem.span(), "content labelled multiple times"; + hint: "only the last label is used, the rest are ignored", + )); + } + *elem = std::mem::take(elem).labelled(label); + } else { + vm.engine.sink.warn(warning!( + expr.span(), + "label `{}` is not attached to anything", + label.repr() + )); } } value => seq.push(value.display().spanned(expr.span())), diff --git a/tests/suite/foundations/label.typ b/tests/suite/foundations/label.typ index 28c6383b..4875f697 100644 --- a/tests/suite/foundations/label.typ +++ b/tests/suite/foundations/label.typ @@ -50,6 +50,7 @@ _Visible_ --- label-in-block --- // Test that label only works within one content block. #show <strike>: strike +// Warning: 13-21 label `<strike>` is not attached to anything *This is* #[<strike>] *protected.* *This is not.* <strike> @@ -74,3 +75,25 @@ _Visible_ // Hint: 7-7 labels can only be applied in markup mode // Hint: 7-7 try wrapping your code in a markup block (`[ ]`) #{ [A] <a> } + +--- label-multiple-ignored-warn --- +// Warning: 1-8 content labelled multiple times +// Hint: 1-8 only the last label is used, the rest are ignored += Hello <a> <b> + +// Warning: 12-19 content labelled multiple times +// Hint: 12-19 only the last label is used, the rest are ignored +#let f = [#block()<c>] +#f<d> + +// Warning: 6-13 content labelled multiple times +// Hint: 6-13 only the last label is used, the rest are ignored +#[#[#block()]<e>]<f> + +// Error: 1-3 label `<a>` does not exist in the document +@a + +--- label-unattached-warn --- +#set heading(numbering: "1.") +// Warning: 1-4 label `<a>` is not attached to anything +<a> |
