From 3f75b6b371a8befc8b1b25d693265144b0344b13 Mon Sep 17 00:00:00 2001 From: Solomon Date: Tue, 22 Oct 2024 15:40:45 +0000 Subject: [PATCH] error when closure param lists aren't terminated by `|` (#14095) Fixes #13757, fixes #9562 # User-Facing Changes - `unclosed |` is returned for malformed closure parameters: ``` { |a } ``` - Parameter list closing pipes are highlighted as part of the closure --- crates/nu-parser/src/parser.rs | 3 ++- tests/repl/test_signatures.rs | 10 ++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/crates/nu-parser/src/parser.rs b/crates/nu-parser/src/parser.rs index c0bf4f59ff..faf0a94c24 100644 --- a/crates/nu-parser/src/parser.rs +++ b/crates/nu-parser/src/parser.rs @@ -4594,7 +4594,7 @@ pub fn parse_closure_expression( } = token.1 { end_span = Some(span); - amt_to_skip = token.0; + amt_to_skip += token.0; break; } } @@ -4602,6 +4602,7 @@ pub fn parse_closure_expression( let end_point = if let Some(span) = end_span { span.end } else { + working_set.error(ParseError::Unclosed("|".into(), Span::new(end, end))); end }; diff --git a/tests/repl/test_signatures.rs b/tests/repl/test_signatures.rs index 5e265974d5..25b22ee1be 100644 --- a/tests/repl/test_signatures.rs +++ b/tests/repl/test_signatures.rs @@ -1,4 +1,5 @@ use crate::repl::tests::{fail_test, run_test, TestResult}; +use rstest::rstest; #[test] fn list_annotations() -> TestResult { @@ -375,3 +376,12 @@ fn table_annotations_with_extra_characters() -> TestResult { let expected = "Extra characters in the parameter name"; fail_test(input, expected) } + +#[rstest] +#[case("{ |a $a }")] +#[case("{ |a, b $a + $b }")] +#[case("do { |a $a } 1")] +#[case("do { |a $a } 1 2")] +fn closure_param_list_not_terminated(#[case] input: &str) -> TestResult { + fail_test(input, "unclosed |") +}