diff options
| author | PgBiel <9021226+PgBiel@users.noreply.github.com> | 2023-12-18 08:30:03 -0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-12-18 12:30:03 +0100 |
| commit | eb9dd539aa394a9909989f8bacd1a0c6e54e4c2a (patch) | |
| tree | 96ec9470cc34135aca260c96de7be5d4aa0fbf98 | |
| parent | 22ba6825db3b82e0b0f83ef6052f17289893e385 (diff) | |
Fix unnamed sinks not capturing named args (#2984)
| -rw-r--r-- | crates/typst/src/eval/call.rs | 13 | ||||
| -rw-r--r-- | tests/typ/compiler/spread.typ | 10 |
2 files changed, 18 insertions, 5 deletions
diff --git a/crates/typst/src/eval/call.rs b/crates/typst/src/eval/call.rs index daa12cff..fd660e94 100644 --- a/crates/typst/src/eval/call.rs +++ b/crates/typst/src/eval/call.rs @@ -306,7 +306,7 @@ pub(crate) fn call_closure( } }, ast::Param::Sink(ident) => { - sink = ident.name(); + sink = Some(ident.name()); if let Some(sink_size) = sink_size { sink_pos_values = Some(args.consume(sink_size)?); } @@ -321,12 +321,15 @@ pub(crate) fn call_closure( } } - if let Some(sink) = sink { + if let Some(sink_name) = sink { + // Remaining args are captured regardless of whether the sink is named. let mut remaining_args = args.take(); - if let Some(sink_pos_values) = sink_pos_values { - remaining_args.items.extend(sink_pos_values); + if let Some(sink_name) = sink_name { + if let Some(sink_pos_values) = sink_pos_values { + remaining_args.items.extend(sink_pos_values); + } + vm.define(sink_name, remaining_args); } - vm.define(sink, remaining_args); } // Ensure all arguments have been used. diff --git a/tests/typ/compiler/spread.typ b/tests/typ/compiler/spread.typ index 0afbed85..f4864faf 100644 --- a/tests/typ/compiler/spread.typ +++ b/tests/typ/compiler/spread.typ @@ -115,6 +115,16 @@ } --- +// Unnamed sink should just ignore any extra arguments. +#{ + let f(a, b: 5, ..) = (a, b) + test(f(4), (4, 5)) + test(f(10, b: 11), (10, 11)) + test(f(13, 20, b: 12), (13, 12)) + test(f(15, b: 16, c: 13), (15, 16)) +} + +--- #{ let f(..a, b, c, d) = none |
