From 07316ff9b094ffda8a33cbdc1f8930a8126f3f48 Mon Sep 17 00:00:00 2001 From: T0mstone Date: Sat, 26 Jul 2025 14:56:06 +0200 Subject: [PATCH] Move error back into symbol constructor, fix and add tests --- crates/typst-library/src/foundations/symbol.rs | 13 ++++++++----- tests/suite/symbols/symbol.typ | 18 +++++++++++++++--- 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/crates/typst-library/src/foundations/symbol.rs b/crates/typst-library/src/foundations/symbol.rs index 05631372b..9d1d8f700 100644 --- a/crates/typst-library/src/foundations/symbol.rs +++ b/crates/typst-library/src/foundations/symbol.rs @@ -238,6 +238,13 @@ impl Symbol { 'variants: for (i, &Spanned { ref v, span }) in variants.iter().enumerate() { modifiers.clear(); + if v.1.is_empty() || v.1.graphemes(true).nth(1).is_some() { + errors.push(error!( + span, "invalid variant value: {}", v.1.repr(); + hint: "variant value must be exactly one grapheme cluster" + )); + } + if !v.0.is_empty() { // Collect all modifiers. for modifier in v.0.split('.') { @@ -399,11 +406,7 @@ pub struct SymbolVariant(EcoString, EcoString); cast! { SymbolVariant, - s: EcoString => if s.is_empty() || s.graphemes(true).nth(1).is_some() { - Err("variant value must be exactly one grapheme cluster")? - } else { - Self(EcoString::new(), s) - }, + s: EcoString => Self(EcoString::new(), s), array: Array => { let mut iter = array.into_iter(); match (iter.next(), iter.next(), iter.next()) { diff --git a/tests/suite/symbols/symbol.typ b/tests/suite/symbols/symbol.typ index 071bbc1a7..aa57d835b 100644 --- a/tests/suite/symbols/symbol.typ +++ b/tests/suite/symbols/symbol.typ @@ -88,14 +88,26 @@ ("variant.duplicate", "y"), ) ---- symbol-constructor-empty-variant --- -// Error: 2:3-2:5 empty default variant -// Error: 3:3-3:16 empty variant: "empty" +--- symbol-constructor-empty-variant-value --- +// Error: 2:3-2:5 invalid variant value: "" +// Hint: 2:3-2:5 variant value must be exactly one grapheme cluster +// Error: 3:3-3:16 invalid variant value: "" +// Hint: 3:3-3:16 variant value must be exactly one grapheme cluster #symbol( "", ("empty", "") ) +--- symbol-constructor-multi-cluster-variant-value --- +// Error: 2:3-2:7 invalid variant value: "aa" +// Hint: 2:3-2:7 variant value must be exactly one grapheme cluster +// Error: 3:3-3:14 invalid variant value: "bb" +// Hint: 3:3-3:14 variant value must be exactly one grapheme cluster +#symbol( + "aa", + ("b", "bb") +) + --- symbol-unknown-modifier --- // Error: 13-20 unknown symbol modifier #emoji.face.garbage