From e8a2250ef842c18da1fe9d92b6402ce3b79f9988 Mon Sep 17 00:00:00 2001 From: JT Date: Thu, 10 Jun 2021 05:17:45 +1200 Subject: [PATCH] Improve expr parse (#3584) * Require '-' to be a number for math * Add test * improve parse logic, add test --- crates/nu-parser/src/parse.rs | 11 +++++++++-- tests/shell/pipeline/commands/internal.rs | 23 +++++++++++++++++++++++ 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/crates/nu-parser/src/parse.rs b/crates/nu-parser/src/parse.rs index 218fe1b338..de185fd00e 100644 --- a/crates/nu-parser/src/parse.rs +++ b/crates/nu-parser/src/parse.rs @@ -1577,7 +1577,7 @@ fn parse_internal_command( let arg = { let (new_idx, expr, err) = parse_positional_argument( idx, - &lite_cmd, + lite_cmd, &signature.positional[current_positional].0, signature.positional.len() - current_positional - 1, scope, @@ -1802,7 +1802,14 @@ fn parse_call( } 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('-') + && 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('1') || lite_cmd.parts[0].item.starts_with('2') diff --git a/tests/shell/pipeline/commands/internal.rs b/tests/shell/pipeline/commands/internal.rs index e5184258d8..ab8deee45b 100644 --- a/tests/shell/pipeline/commands/internal.rs +++ b/tests/shell/pipeline/commands/internal.rs @@ -618,6 +618,29 @@ fn index_out_of_bounds() { 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] fn index_row() { let actual = nu!(