ensure error in else is forwarded appropriately (#7411)

# 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.
This commit is contained in:
pwygab 2022-12-09 21:48:12 +08:00 committed by GitHub
parent c01d44e37d
commit fc5fe4b445
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 37 additions and 10 deletions

View File

@ -645,18 +645,25 @@ 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];
if err.is_some() {
(Expression::garbage(span), err)
} else {
(
Expression::garbage(span),
Some(ParseError::Expected(
@ -665,6 +672,7 @@ pub fn parse_multispan_value(
)),
)
}
}
SyntaxShape::Expression => {
trace!("parsing: expression");

View File

@ -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(_)));
}
}