diff options
| author | Leedehai <18319900+Leedehai@users.noreply.github.com> | 2024-01-31 04:12:06 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-01-31 09:12:06 +0000 |
| commit | 51854ba4df0e941bd17acee499fdb3a7e43b31e0 (patch) | |
| tree | 32bde5fc13107df85d82aa8e1d5c0384e4b9db91 /crates | |
| parent | ce5abf5a4e338a151f8c8a49bc5ba864c1319d9d (diff) | |
Adjust for-loop's pattern matching rules (#3308)
Diffstat (limited to 'crates')
| -rw-r--r-- | crates/typst/src/eval/flow.rs | 29 |
1 files changed, 15 insertions, 14 deletions
diff --git a/crates/typst/src/eval/flow.rs b/crates/typst/src/eval/flow.rs index 82b68192..d25d5472 100644 --- a/crates/typst/src/eval/flow.rs +++ b/crates/typst/src/eval/flow.rs @@ -108,11 +108,11 @@ impl Eval for ast::ForLoop<'_> { let mut output = Value::None; macro_rules! iter { - (for $pat:ident in $iter:expr) => {{ + (for $pat:ident in $iterable:expr) => {{ vm.scopes.enter(); #[allow(unused_parens)] - for value in $iter { + for value in $iterable { destructure(vm, $pat, value.into_value())?; let body = self.body(); @@ -134,28 +134,29 @@ impl Eval for ast::ForLoop<'_> { }}; } + let pattern = self.pattern(); let iterable = self.iterable().eval(vm)?; let iterable_type = iterable.ty(); - let pattern = self.pattern(); - match (&pattern, iterable) { - (ast::Pattern::Normal(_), Value::Str(string)) => { - // Iterate over graphemes of string. - iter!(for pattern in string.as_str().graphemes(true)); + use ast::Pattern; + match (pattern, iterable) { + (_, Value::Array(array)) => { + // Iterate over values of array. + iter!(for pattern in array); } (_, Value::Dict(dict)) => { // Iterate over pairs of dict. iter!(for pattern in dict.pairs()); } - (_, Value::Array(array)) => { - // Iterate over values of array. - iter!(for pattern in array); + (Pattern::Normal(_) | Pattern::Placeholder(_), Value::Str(str)) => { + // Iterate over graphemes of string. + iter!(for pattern in str.as_str().graphemes(true)); } - (ast::Pattern::Normal(_), _) => { - bail!(self.iterable().span(), "cannot loop over {}", iterable_type); + (Pattern::Destructuring(_), Value::Str(_)) => { + bail!(pattern.span(), "cannot destructure values of {}", iterable_type); } - (_, _) => { - bail!(pattern.span(), "cannot destructure values of {}", iterable_type) + _ => { + bail!(self.iterable().span(), "cannot loop over {}", iterable_type); } } |
