Fix unnamed sinks not capturing named args (#2984)

This commit is contained in:
PgBiel 2023-12-18 08:30:03 -03:00 committed by GitHub
parent 22ba6825db
commit eb9dd539aa
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 18 additions and 5 deletions

View File

@ -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.

View File

@ -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