Allow any value to start a pipe expression (#2496)
Relaxes an arbitrary restriction. Previously KCL pipelines couldn't start with a number, e.g. `2 |> double(%)`. Now they can.
This commit is contained in:
@ -2742,6 +2742,7 @@ impl PipeExpression {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[async_recursion::async_recursion]
|
||||||
async fn execute_pipe_body(
|
async fn execute_pipe_body(
|
||||||
memory: &mut ProgramMemory,
|
memory: &mut ProgramMemory,
|
||||||
body: &[Value],
|
body: &[Value],
|
||||||
@ -2760,18 +2761,12 @@ async fn execute_pipe_body(
|
|||||||
// They use the `pipe_info` from some AST node above this, so that if pipe expression is nested in a larger pipe expression,
|
// They use the `pipe_info` from some AST node above this, so that if pipe expression is nested in a larger pipe expression,
|
||||||
// they use the % from the parent. After all, this pipe expression hasn't been executed yet, so it doesn't have any % value
|
// they use the % from the parent. After all, this pipe expression hasn't been executed yet, so it doesn't have any % value
|
||||||
// of its own.
|
// of its own.
|
||||||
let output = match first {
|
let meta = Metadata {
|
||||||
Value::BinaryExpression(binary_expression) => binary_expression.get_result(memory, pipe_info, ctx).await?,
|
source_range: SourceRange([first.start(), first.end()]),
|
||||||
Value::CallExpression(call_expression) => call_expression.execute(memory, pipe_info, ctx).await?,
|
|
||||||
Value::Identifier(identifier) => memory.get(&identifier.name, identifier.into())?.clone(),
|
|
||||||
_ => {
|
|
||||||
// Return an error this should not happen.
|
|
||||||
return Err(KclError::Semantic(KclErrorDetails {
|
|
||||||
message: format!("cannot start a PipeExpression with this value: {:?}", first),
|
|
||||||
source_ranges: vec![first.into()],
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
let output = ctx
|
||||||
|
.arg_into_mem_item(first, memory, pipe_info, &meta, StatementKind::Expression)
|
||||||
|
.await?;
|
||||||
// Now that we've evaluated the first child expression in the pipeline, following child expressions
|
// Now that we've evaluated the first child expression in the pipeline, following child expressions
|
||||||
// should use the previous child expression for %.
|
// should use the previous child expression for %.
|
||||||
// This means there's no more need for the previous `pipe_info` from the parent AST node above this one.
|
// This means there's no more need for the previous `pipe_info` from the parent AST node above this one.
|
||||||
|
@ -19,4 +19,4 @@ fn cube = (length, center) => {
|
|||||||
fn double = (x) => { return x * 2}
|
fn double = (x) => { return x * 2}
|
||||||
fn width = () => { return 200 }
|
fn width = () => { return 200 }
|
||||||
|
|
||||||
const myCube = cube(width() |> double(%), [0,0])
|
const myCube = cube(200 |> double(%), [0,0])
|
||||||
|
Reference in New Issue
Block a user