diff --git a/crates/nu-parser/src/parser.rs b/crates/nu-parser/src/parser.rs index 85a510f9b1..ae1bb6a048 100644 --- a/crates/nu-parser/src/parser.rs +++ b/crates/nu-parser/src/parser.rs @@ -5476,10 +5476,14 @@ pub fn parse_pipeline( { let block = working_set.get_block(*block_id); - let element = block.pipelines[0].elements[0].clone(); - - if let PipelineElement::Expression(prepend, expr) = - element + if let Some(PipelineElement::Expression( + prepend, + expr, + )) = block + .pipelines + .first() + .and_then(|p| p.elements.first()) + .cloned() { if expr.has_in_variable(working_set) { let new_expr = PipelineElement::Expression( @@ -5608,9 +5612,12 @@ pub fn parse_pipeline( { let block = working_set.get_block(*block_id); - let element = block.pipelines[0].elements[0].clone(); - - if let PipelineElement::Expression(prepend, expr) = element { + if let Some(PipelineElement::Expression(prepend, expr)) = block + .pipelines + .first() + .and_then(|p| p.elements.first()) + .cloned() + { if expr.has_in_variable(working_set) { let new_expr = PipelineElement::Expression( prepend, diff --git a/crates/nu-parser/tests/test_parser.rs b/crates/nu-parser/tests/test_parser.rs index e6647e37d5..8278f702ab 100644 --- a/crates/nu-parser/tests/test_parser.rs +++ b/crates/nu-parser/tests/test_parser.rs @@ -1007,6 +1007,18 @@ mod string { } } +#[rstest] +#[case(b"let a = }")] +#[case(b"mut a = }")] +#[case(b"let a = | }")] +#[case(b"mut a = | }")] +fn test_semi_open_brace(#[case] phrase: &[u8]) { + let engine_state = EngineState::new(); + let mut working_set = StateWorkingSet::new(&engine_state); + // this should not panic + let _block = parse(&mut working_set, None, phrase, true); +} + mod range { use super::*; use nu_protocol::ast::{RangeInclusion, RangeOperator};