mirror of
https://github.com/nushell/nushell.git
synced 2025-08-19 14:53:21 +02:00
Fix panic on too few arguments for custom function (#10395)
# Description Old code was comparing remaining positional arguments with total number of arguments, where it should've compared remaining positional with with remaining arguments of any kind. This means that if a function was given too few arguments, `calculate_end_span` would believe that it actually had too many arguments, since after parsing the first few arguments, the number of remaining arguments needed were fewer than the *total* number of arguments, of which we had used several. Fixes #9072 Fixes: https://github.com/nushell/nushell/issues/13930 Fixes: https://github.com/nushell/nushell/issues/12069 Fixes: https://github.com/nushell/nushell/issues/8385 Extracted from #10381 ## Bonus It also improves the error handling on missing positional arguments before keywords (no longer crashing since #9851). Instead of just giving the keyword to the parser for the missing positional, we give an explicit error about a missing positional argument. I would like better descriptions than "missing var_name" though, but I'm not sure if that's available without Old error ``` Error: nu::parser::parse_mismatch × Parse mismatch during operation. ╭─[entry #1:1:1] 1 │ let = if foo · ┬ · ╰── expected valid variable name ╰──── ``` New error ``` Error: nu::parser::missing_positional × Missing required positional argument. ╭─[entry #18:1:1] 1 │ let = foo · ┬ · ╰── missing var_name ╰──── help: Usage: let <var_name> = <initial_value> ``` # User-Facing Changes The program `alias = = =` is no longer accepted by the parser
This commit is contained in:
@@ -189,7 +189,31 @@ fn assignment_with_no_var() -> TestResult {
|
||||
"mut = 'foo' | $in; $x | describe",
|
||||
];
|
||||
|
||||
let expected = "valid variable";
|
||||
let expecteds = [
|
||||
"missing var_name",
|
||||
"missing var_name",
|
||||
"missing const_name",
|
||||
"missing var_name",
|
||||
"missing var_name",
|
||||
];
|
||||
|
||||
for (case, expected) in std::iter::zip(cases, expecteds) {
|
||||
fail_test(case, expected)?;
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn too_few_arguments() -> TestResult {
|
||||
// Test for https://github.com/nushell/nushell/issues/9072
|
||||
let cases = [
|
||||
"def a [b: bool, c: bool, d: float, e: float, f: float] {}; a true true 1 1",
|
||||
"def a [b: bool, c: bool, d: float, e: float, f: float, g: float] {}; a true true 1 1",
|
||||
"def a [b: bool, c: bool, d: float, e: float, f: float, g: float, h: float] {}; a true true 1 1",
|
||||
];
|
||||
|
||||
let expected = "missing f";
|
||||
|
||||
for case in cases {
|
||||
fail_test(case, expected)?;
|
||||
|
Reference in New Issue
Block a user