mirror of
https://github.com/typst/typst
synced 2025-05-16 10:05:28 +08:00
Fix unnamed sinks not capturing named args (#2984)
This commit is contained in:
parent
22ba6825db
commit
eb9dd539aa
@ -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.
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user