mirror of
https://github.com/nushell/nushell
synced 2024-12-26 04:53:09 +00:00
Fixed the panic when type a statement similar to let f = 'f' $
in the nushell (#9851)
- this PR should close #9596 - fixes #9596 - this PR should close #9826 - fixes #9826 fixed the following bugs: ```nu # type following statements in the nushell let f = 'f' $; mut f = 'f' $; const f = 'f' $; # then remove variable f, it will panics let = 'f' $; mut = 'f' $; const = 'f' $; ```
This commit is contained in:
parent
f6033ac5af
commit
fea822792f
2 changed files with 26 additions and 3 deletions
|
@ -2894,7 +2894,9 @@ pub fn parse_let(working_set: &mut StateWorkingSet, spans: &[Span]) -> Pipeline
|
||||||
// so that the var-id created by the variable isn't visible in the expression that init it
|
// so that the var-id created by the variable isn't visible in the expression that init it
|
||||||
for span in spans.iter().enumerate() {
|
for span in spans.iter().enumerate() {
|
||||||
let item = working_set.get_span_contents(*span.1);
|
let item = working_set.get_span_contents(*span.1);
|
||||||
if item == b"=" && spans.len() > (span.0 + 1) {
|
// https://github.com/nushell/nushell/issues/9596, let = if $
|
||||||
|
// let x = 'f', = at least start from index 2
|
||||||
|
if item == b"=" && spans.len() > (span.0 + 1) && span.0 > 1 {
|
||||||
let (tokens, parse_error) = lex(
|
let (tokens, parse_error) = lex(
|
||||||
working_set.get_span_contents(nu_protocol::span(&spans[(span.0 + 1)..])),
|
working_set.get_span_contents(nu_protocol::span(&spans[(span.0 + 1)..])),
|
||||||
spans[span.0 + 1].start,
|
spans[span.0 + 1].start,
|
||||||
|
@ -3013,7 +3015,8 @@ pub fn parse_const(working_set: &mut StateWorkingSet, spans: &[Span]) -> Pipelin
|
||||||
// so that the var-id created by the variable isn't visible in the expression that init it
|
// so that the var-id created by the variable isn't visible in the expression that init it
|
||||||
for span in spans.iter().enumerate() {
|
for span in spans.iter().enumerate() {
|
||||||
let item = working_set.get_span_contents(*span.1);
|
let item = working_set.get_span_contents(*span.1);
|
||||||
if item == b"=" && spans.len() > (span.0 + 1) {
|
// const x = 'f', = at least start from index 2
|
||||||
|
if item == b"=" && spans.len() > (span.0 + 1) && span.0 > 1 {
|
||||||
let mut idx = span.0;
|
let mut idx = span.0;
|
||||||
// let rvalue = parse_multispan_value(
|
// let rvalue = parse_multispan_value(
|
||||||
// working_set,
|
// working_set,
|
||||||
|
@ -3151,7 +3154,8 @@ pub fn parse_mut(working_set: &mut StateWorkingSet, spans: &[Span]) -> Pipeline
|
||||||
// so that the var-id created by the variable isn't visible in the expression that init it
|
// so that the var-id created by the variable isn't visible in the expression that init it
|
||||||
for span in spans.iter().enumerate() {
|
for span in spans.iter().enumerate() {
|
||||||
let item = working_set.get_span_contents(*span.1);
|
let item = working_set.get_span_contents(*span.1);
|
||||||
if item == b"=" && spans.len() > (span.0 + 1) {
|
// mut x = 'f', = at least start from index 2
|
||||||
|
if item == b"=" && spans.len() > (span.0 + 1) && span.0 > 1 {
|
||||||
let (tokens, parse_error) = lex(
|
let (tokens, parse_error) = lex(
|
||||||
working_set.get_span_contents(nu_protocol::span(&spans[(span.0 + 1)..])),
|
working_set.get_span_contents(nu_protocol::span(&spans[(span.0 + 1)..])),
|
||||||
spans[span.0 + 1].start,
|
spans[span.0 + 1].start,
|
||||||
|
|
|
@ -145,6 +145,25 @@ fn bad_var_name2() -> TestResult {
|
||||||
fail_test(r#"let $foo-bar = 4"#, "valid variable")
|
fail_test(r#"let $foo-bar = 4"#, "valid variable")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn assignment_with_no_var() -> TestResult {
|
||||||
|
let cases = [
|
||||||
|
"let = if $",
|
||||||
|
"mut = if $",
|
||||||
|
"const = if $",
|
||||||
|
"let = 'foo' | $in; $x | describe",
|
||||||
|
"mut = 'foo' | $in; $x | describe",
|
||||||
|
];
|
||||||
|
|
||||||
|
let expected = "valid variable";
|
||||||
|
|
||||||
|
for case in cases {
|
||||||
|
fail_test(case, expected)?;
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn long_flag() -> TestResult {
|
fn long_flag() -> TestResult {
|
||||||
run_test(
|
run_test(
|
||||||
|
|
Loading…
Reference in a new issue