Improve expr parse (#3584)

* Require '-' to be a number for math

* Add test

* improve parse logic, add test
This commit is contained in:
JT 2021-06-10 05:17:45 +12:00 committed by GitHub
parent 440e12abc4
commit e8a2250ef8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 32 additions and 2 deletions

View File

@ -1577,7 +1577,7 @@ fn parse_internal_command(
let arg = { let arg = {
let (new_idx, expr, err) = parse_positional_argument( let (new_idx, expr, err) = parse_positional_argument(
idx, idx,
&lite_cmd, lite_cmd,
&signature.positional[current_positional].0, &signature.positional[current_positional].0,
signature.positional.len() - current_positional - 1, signature.positional.len() - current_positional - 1,
scope, scope,
@ -1802,7 +1802,14 @@ fn parse_call(
} else if lite_cmd.parts[0].item.starts_with('$') } else if lite_cmd.parts[0].item.starts_with('$')
|| lite_cmd.parts[0].item.starts_with('\"') || lite_cmd.parts[0].item.starts_with('\"')
|| lite_cmd.parts[0].item.starts_with('\'') || lite_cmd.parts[0].item.starts_with('\'')
|| lite_cmd.parts[0].item.starts_with('-') || (lite_cmd.parts[0].item.starts_with('-')
&& parse_arg(SyntaxShape::Number, scope, &lite_cmd.parts[0])
.1
.is_none())
|| (lite_cmd.parts[0].item.starts_with('-')
&& parse_arg(SyntaxShape::Range, scope, &lite_cmd.parts[0])
.1
.is_none())
|| lite_cmd.parts[0].item.starts_with('0') || lite_cmd.parts[0].item.starts_with('0')
|| lite_cmd.parts[0].item.starts_with('1') || lite_cmd.parts[0].item.starts_with('1')
|| lite_cmd.parts[0].item.starts_with('2') || lite_cmd.parts[0].item.starts_with('2')

View File

@ -618,6 +618,29 @@ fn index_out_of_bounds() {
assert!(actual.err.contains("unknown row")); assert!(actual.err.contains("unknown row"));
} }
#[test]
fn dash_def() {
let actual = nu!(
cwd: ".",
r#"
def - [x, y] { $x - $y }; - 4 1
"#
);
assert_eq!(actual.out, "3");
}
#[test]
fn negative_decimal_start() {
let actual = nu!(
cwd: ".",
r#"
-1.3 + 4
"#
);
assert_eq!(actual.out, "2.7");
}
#[test] #[test]
fn index_row() { fn index_row() {
let actual = nu!( let actual = nu!(