diff --git a/crates/nu-parser/src/parser.rs b/crates/nu-parser/src/parser.rs index ea736db3b..ac5591a2b 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 02600ccd7..b3ca540cc 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(_))); + } }