mirror of
https://github.com/nushell/nushell.git
synced 2025-08-09 05:14:44 +02:00
range operator accepts bot..=top as well as bot..top (#8382)
# Description A compromise fix for #8162. Nushell range operator now accepts `..=` to mean the range includes the top value, so you can use your Rust habits. But the unadorned `..` range operator also includes the value, so you can also use your Nushell habits. _(Description of your pull request goes here. **Provide examples and/or screenshots** if your changes affect the user experience.)_ ```nushell 〉1..5 ╭───┬───╮ │ 0 │ 1 │ │ 1 │ 2 │ │ 2 │ 3 │ │ 3 │ 4 │ │ 4 │ 5 │ ╰───┴───╯ -------------------------------------------- /home/bobhy/src/rust/nushell -------------------------------------------- 〉1..=5 ╭───┬───╮ │ 0 │ 1 │ │ 1 │ 2 │ │ 2 │ 3 │ │ 3 │ 4 │ │ 4 │ 5 │ ╰───┴───╯ -------------------------------------------- /home/bobhy/src/rust/nushell -------------------------------------------- 〉1..<5 ╭───┬───╮ │ 0 │ 1 │ │ 1 │ 2 │ │ 2 │ 3 │ │ 3 │ 4 │ ╰───┴───╯ ``` # User-Facing Changes Existing scripts with range operator will continue to operate as heretofore. _(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: - [x] `cargo fmt --all -- --check` to check standard code formatting (`cargo fmt --all` applies these changes) - [x] `cargo clippy --workspace -- -D warnings -D clippy::unwrap_used -A clippy::needless_collect` to check that you're using the standard code style - [x] `cargo test --workspace` to check that all tests pass # After Submitting Will update the book to include new syntax.
This commit is contained in:
@ -1500,7 +1500,7 @@ pub fn parse_range(
|
||||
|
||||
// Range follows the following syntax: [<from>][<next_operator><next>]<range_operator>[<to>]
|
||||
// where <next_operator> is ".."
|
||||
// and <range_operator> is ".." or "..<"
|
||||
// and <range_operator> is "..", "..=" or "..<"
|
||||
// and one of the <from> or <to> bounds must be present (just '..' is not allowed since it
|
||||
// looks like parent directory)
|
||||
//bugbug range cannot be [..] because that looks like parent directory
|
||||
@ -1553,12 +1553,12 @@ pub fn parse_range(
|
||||
return garbage(span);
|
||||
}
|
||||
} else {
|
||||
let op_str = "..";
|
||||
let op_str = if token.contains("..=") { "..=" } else { ".." };
|
||||
let op_span = Span::new(
|
||||
span.start + range_op_pos,
|
||||
span.start + range_op_pos + op_str.len(),
|
||||
);
|
||||
(RangeInclusion::Inclusive, "..", op_span)
|
||||
(RangeInclusion::Inclusive, op_str, op_span)
|
||||
};
|
||||
|
||||
// Now, based on the operator positions, figure out where the bounds & next are located and
|
||||
@ -5178,7 +5178,12 @@ pub fn parse_expression(
|
||||
|
||||
let split = name.splitn(2, |x| *x == b'=');
|
||||
let split: Vec<_> = split.collect();
|
||||
if !name.starts_with(b"^") && split.len() == 2 && !split[0].is_empty() {
|
||||
if !name.starts_with(b"^")
|
||||
&& split.len() == 2
|
||||
&& !split[0].is_empty()
|
||||
&& !split[0].ends_with(b"..")
|
||||
// was range op ..=
|
||||
{
|
||||
let point = split[0].len() + 1;
|
||||
|
||||
let starting_error_count = working_set.parse_errors.len();
|
||||
|
Reference in New Issue
Block a user