diff --git a/crates/nu-parser/src/parser.rs b/crates/nu-parser/src/parser.rs index 8dc452e060..6340c46a4a 100644 --- a/crates/nu-parser/src/parser.rs +++ b/crates/nu-parser/src/parser.rs @@ -3610,7 +3610,8 @@ pub fn parse_block( let block: Block = lite_block .block .iter() - .map(|pipeline| { + .enumerate() + .map(|(idx, pipeline)| { if pipeline.commands.len() > 1 { let mut output = pipeline .commands @@ -3636,7 +3637,42 @@ pub fn parse_block( expressions: output, }) } else { - let (stmt, err) = parse_statement(working_set, &pipeline.commands[0]); + let (mut stmt, err) = parse_statement(working_set, &pipeline.commands[0]); + + if idx == 0 { + if let Some(let_decl_id) = working_set.find_decl(b"let") { + if let Some(let_env_decl_id) = working_set.find_decl(b"let-env") { + if let Statement::Pipeline(pipeline) = &mut stmt { + for expr in pipeline.expressions.iter_mut() { + if let Expression { + expr: Expr::Call(call), + .. + } = expr + { + if call.decl_id == let_decl_id + || call.decl_id == let_env_decl_id + { + // Do an expansion + if let Some(Expression { + expr: Expr::Keyword(_, _, expr), + .. + }) = call.positional.get_mut(1) + { + if expr.has_in_variable(working_set) { + *expr = Box::new(wrap_expr_with_collect( + working_set, + expr, + )); + } + } + continue; + } + } + } + } + } + } + } if error.is_none() { error = err; diff --git a/src/tests/test_engine.rs b/src/tests/test_engine.rs index 8a5cc4a35b..d7a156df8e 100644 --- a/src/tests/test_engine.rs +++ b/src/tests/test_engine.rs @@ -174,3 +174,19 @@ fn let_sees_input() -> TestResult { "11", ) } + +#[test] +fn let_sees_in_variable() -> TestResult { + run_test( + r#"def c [] { let x = $in.name; $x | str length }; {name: bob, size: 100 } | c"#, + "3", + ) +} + +#[test] +fn let_sees_in_variable2() -> TestResult { + run_test( + r#"def c [] { let x = ($in | str length); $x }; 'bob' | c"#, + "3", + ) +}