Require variable declaration for pipe expressions
This commit is contained in:
@ -2086,6 +2086,20 @@ const newVar = myVar + 1"#;
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[tokio::test(flavor = "multi_thread")]
|
||||||
|
async fn test_execute_top_level_pipe_without_variable() {
|
||||||
|
let ast = r#"startSketchOn('XY')
|
||||||
|
|> startProfileAt([0, 0], %)
|
||||||
|
|> lineTo([2, 2], %, $yo)
|
||||||
|
"#;
|
||||||
|
let result = parse_execute(ast).await;
|
||||||
|
assert!(result.is_err());
|
||||||
|
assert_eq!(
|
||||||
|
result.unwrap_err().to_string(),
|
||||||
|
r#"syntax: KclErrorDetails { source_ranges: [SourceRange([0, 78])], message: "A top-level pipe expression must be assigned to a new variable declaration" }"#.to_owned()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
#[tokio::test(flavor = "multi_thread")]
|
#[tokio::test(flavor = "multi_thread")]
|
||||||
async fn test_execute_angled_line_that_intersects() {
|
async fn test_execute_angled_line_that_intersects() {
|
||||||
let ast_fn = |offset: &str| -> String {
|
let ast_fn = |offset: &str| -> String {
|
||||||
|
|||||||
@ -50,6 +50,37 @@ fn program(i: TokenSlice) -> PResult<Program> {
|
|||||||
// Once this is merged and stable, consider changing this as I think it's more accurate
|
// Once this is merged and stable, consider changing this as I think it's more accurate
|
||||||
// without the -1.
|
// without the -1.
|
||||||
out.end -= 1;
|
out.end -= 1;
|
||||||
|
|
||||||
|
// Prevent top-level pipe expressions without a variable declaration, giving
|
||||||
|
// a good error message that will help users fix their code. This is a
|
||||||
|
// band-aid until we can use the artifact graph.
|
||||||
|
let source_ranges = out
|
||||||
|
.body
|
||||||
|
.iter()
|
||||||
|
.filter_map(|item| {
|
||||||
|
if let BodyItem::ExpressionStatement(ExpressionStatement {
|
||||||
|
expression: Value::PipeExpression(_),
|
||||||
|
start,
|
||||||
|
end,
|
||||||
|
..
|
||||||
|
}) = item
|
||||||
|
{
|
||||||
|
Some(SourceRange([*start, *end]))
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.collect::<Vec<_>>();
|
||||||
|
if !source_ranges.is_empty() {
|
||||||
|
return Err(ErrMode::Cut(
|
||||||
|
KclError::Syntax(KclErrorDetails {
|
||||||
|
source_ranges,
|
||||||
|
message: "A top-level pipe expression must be assigned to a new variable declaration".to_owned(),
|
||||||
|
})
|
||||||
|
.into(),
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
Ok(out)
|
Ok(out)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user