From c644dce81b1685383ee8d991a92991eb03f5e32e Mon Sep 17 00:00:00 2001 From: Max Date: Mon, 2 Sep 2024 12:58:33 +0000 Subject: [PATCH] Add warnings when labels are ignored or unattached (#4783) --- crates/typst/src/eval/markup.rs | 17 ++++++++++++++++- tests/suite/foundations/label.typ | 23 +++++++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/crates/typst/src/eval/markup.rs b/crates/typst/src/eval/markup.rs index 46abf8ce4..a735bb8e2 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::()) { + 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 28c6383bb..4875f6970 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 +// Warning: 13-21 label `` is not attached to anything *This is* #[] *protected.* *This is not.* @@ -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] } + +--- 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 + +// Warning: 12-19 content labelled multiple times +// Hint: 12-19 only the last label is used, the rest are ignored +#let f = [#block()] +#f + +// Warning: 6-13 content labelled multiple times +// Hint: 6-13 only the last label is used, the rest are ignored +#[#[#block()]] + +// Error: 1-3 label `` does not exist in the document +@a + +--- label-unattached-warn --- +#set heading(numbering: "1.") +// Warning: 1-4 label `` is not attached to anything +