mirror of
https://github.com/typst/typst
synced 2025-05-16 18:15:29 +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) => {
|
ast::Param::Sink(ident) => {
|
||||||
sink = ident.name();
|
sink = Some(ident.name());
|
||||||
if let Some(sink_size) = sink_size {
|
if let Some(sink_size) = sink_size {
|
||||||
sink_pos_values = Some(args.consume(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();
|
let mut remaining_args = args.take();
|
||||||
|
if let Some(sink_name) = sink_name {
|
||||||
if let Some(sink_pos_values) = sink_pos_values {
|
if let Some(sink_pos_values) = sink_pos_values {
|
||||||
remaining_args.items.extend(sink_pos_values);
|
remaining_args.items.extend(sink_pos_values);
|
||||||
}
|
}
|
||||||
vm.define(sink, remaining_args);
|
vm.define(sink_name, remaining_args);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Ensure all arguments have been used.
|
// Ensure all arguments have been used.
|
||||||
|
@ -114,6 +114,16 @@
|
|||||||
test(repr(f(1, 2, 3, 4, 5)), "(1, (2, 3, 4), 5)")
|
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
|
let f(..a, b, c, d) = none
|
||||||
|
Loading…
x
Reference in New Issue
Block a user