summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPgBiel <9021226+PgBiel@users.noreply.github.com>2023-12-18 08:30:03 -0300
committerGitHub <noreply@github.com>2023-12-18 12:30:03 +0100
commiteb9dd539aa394a9909989f8bacd1a0c6e54e4c2a (patch)
tree96ec9470cc34135aca260c96de7be5d4aa0fbf98
parent22ba6825db3b82e0b0f83ef6052f17289893e385 (diff)
Fix unnamed sinks not capturing named args (#2984)
-rw-r--r--crates/typst/src/eval/call.rs13
-rw-r--r--tests/typ/compiler/spread.typ10
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