Skip to content

Commit

Permalink
ensure error in else is forwarded appropriately (#7411)
Browse files Browse the repository at this point in the history
# 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.
  • Loading branch information
merelymyself committed Dec 9, 2022
1 parent c01d44e commit fc5fe4b
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 10 deletions.
28 changes: 18 additions & 10 deletions crates/nu-parser/src/parser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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");
Expand Down
19 changes: 19 additions & 0 deletions crates/nu-parser/tests/test_parser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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(_)));
}
}

0 comments on commit fc5fe4b

Please sign in to comment.