From fc5fe4b445ca02bd1133a6bd227d7b07b90dcfae Mon Sep 17 00:00:00 2001 From: pwygab <88221256+merelymyself@users.noreply.github.com> Date: Fri, 9 Dec 2022 21:48:12 +0800 Subject: [PATCH] ensure error in `else` is forwarded appropriately (#7411) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # Description Fixes #7407. ``` /home/gabriel/CodingProjects/nushell〉if false { 'a' } else { $foo } 12/09/2022 08:14:48 PM Error: nu::parser::variable_not_found (link) × Variable not found. ╭─[entry #1:1:1] 1 │ if false { 'a' } else { $foo } · ──┬─ · ╰── variable not found ╰──── ``` # User-Facing Changes _(List of all changes that impact the user experience here. This helps us keep track of breaking changes.)_ # Tests + Formatting Don't forget to add tests that cover your changes. Make sure you've run and fixed any issues with these commands: - `cargo fmt --all -- --check` to check standard code formatting (`cargo fmt --all` applies these changes) - `cargo clippy --workspace -- -D warnings -D clippy::unwrap_used -A clippy::needless_collect` to check that you're using the standard code style - `cargo test --workspace` to check that all tests pass # After Submitting If your PR had any user-facing changes, update [the documentation](https://github.com/nushell/nushell.github.io) after the PR is merged, if necessary. This will help us keep the docs up to date. --- crates/nu-parser/src/parser.rs | 28 +++++++++++++++++---------- crates/nu-parser/tests/test_parser.rs | 19 ++++++++++++++++++ 2 files changed, 37 insertions(+), 10 deletions(-) diff --git a/crates/nu-parser/src/parser.rs b/crates/nu-parser/src/parser.rs index ea736db3ba..ac5591a2b4 100644 --- a/crates/nu-parser/src/parser.rs +++ b/crates/nu-parser/src/parser.rs @@ -645,25 +645,33 @@ pub fn parse_multispan_value( (arg, error) } SyntaxShape::OneOf(shapes) => { + let mut err = None; for shape in shapes.iter() { - if let (s, None) = parse_multispan_value( + let (s, option_err) = parse_multispan_value( working_set, spans, spans_idx, shape, expand_aliases_denylist, - ) { - return (s, None); + ); + match option_err { + None => return (s, None), + e => err = err.or(e), } } let span = spans[*spans_idx]; - ( - Expression::garbage(span), - Some(ParseError::Expected( - format!("one of a list of accepted shapes: {:?}", shapes), - span, - )), - ) + + if err.is_some() { + (Expression::garbage(span), err) + } else { + ( + Expression::garbage(span), + Some(ParseError::Expected( + format!("one of a list of accepted shapes: {:?}", shapes), + span, + )), + ) + } } SyntaxShape::Expression => { trace!("parsing: expression"); diff --git a/crates/nu-parser/tests/test_parser.rs b/crates/nu-parser/tests/test_parser.rs index 02600ccd79..b3ca540cce 100644 --- a/crates/nu-parser/tests/test_parser.rs +++ b/crates/nu-parser/tests/test_parser.rs @@ -1402,4 +1402,23 @@ mod input_types { assert!(block.len() == 2, "testing: {}", input); } } + + #[test] + fn else_errors_correctly() { + let mut engine_state = EngineState::new(); + add_declations(&mut engine_state); + + let mut working_set = StateWorkingSet::new(&engine_state); + let (_, err) = parse( + &mut working_set, + None, + b"if false { 'a' } else { $foo }", + true, + &[], + ); + + let err = err.unwrap(); + + assert!(matches!(err, ParseError::VariableNotFound(_))); + } }