summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--crates/typst/src/eval/markup.rs17
-rw-r--r--tests/suite/foundations/label.typ23
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>