Require variable declaration for pipe expressions

This commit is contained in:
Jonathan Tran
2024-08-02 17:40:04 -04:00
parent 834472e0a6
commit b45aa89d16
2 changed files with 45 additions and 0 deletions

View File

@ -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")]
async fn test_execute_angled_line_that_intersects() {
let ast_fn = |offset: &str| -> String {

View File

@ -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
// without the -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)
}