From eb9dd539aa394a9909989f8bacd1a0c6e54e4c2a Mon Sep 17 00:00:00 2001 From: PgBiel <9021226+PgBiel@users.noreply.github.com> Date: Mon, 18 Dec 2023 08:30:03 -0300 Subject: [PATCH] Fix unnamed sinks not capturing named args (#2984) --- crates/typst/src/eval/call.rs | 13 ++++++++----- 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 @@ -114,6 +114,16 @@ test(repr(f(1, 2, 3, 4, 5)), "(1, (2, 3, 4), 5)") } +--- +// 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