diff --git a/crates/nu-parser/src/parser.rs b/crates/nu-parser/src/parser.rs index e9be15149..eeca304fb 100644 --- a/crates/nu-parser/src/parser.rs +++ b/crates/nu-parser/src/parser.rs @@ -96,7 +96,7 @@ pub fn check_call(command: Span, sig: &Signature, call: &Call) -> Option (signature.required_positional.len() - positional_idx) { spans.len() - (signature.required_positional.len() - positional_idx - 1) - } else if signature.num_positionals_after(positional_idx) == 0 { - spans.len() } else { spans_idx + 1 } @@ -724,11 +724,20 @@ pub fn parse_internal_call( if let Some(positional) = signature.get_positional(positional_idx) { let end = calculate_end_span(working_set, &signature, spans, spans_idx, positional_idx); - if spans[..end].is_empty() { + let end = if spans.len() > spans_idx && end == spans_idx { + end + 1 + } else { + end + }; + + if spans[..end].is_empty() || spans_idx == end { error = error.or_else(|| { Some(ParseError::MissingPositional( positional.name.clone(), - spans[spans_idx], + Span { + start: spans[spans_idx].end, + end: spans[spans_idx].end, + }, signature.call_signature(), )) }); diff --git a/src/tests/test_parser.rs b/src/tests/test_parser.rs index d97526328..75b8b7dde 100644 --- a/src/tests/test_parser.rs +++ b/src/tests/test_parser.rs @@ -304,3 +304,8 @@ fn capture_row_condition() -> TestResult { "foo", ) } + +#[test] +fn proper_missing_param() -> TestResult { + fail_test(r#"def foo [x y z w] { }; foo a b c"#, "missing w") +}