From f8e53d941dc23d7dd59a8fad2328e597e25d555d Mon Sep 17 00:00:00 2001 From: Jonathan Tran Date: Fri, 25 Apr 2025 17:55:54 -0400 Subject: [PATCH] Change so that var definitions can be a module's return value (#6504) * Change so that var definitions can be a module's return value * Change car wheel assembly to use the new return mechanism * Add sim test * Update output * Update module docs * Add safety check to only work with modules * Fix to use updated keyword args --- docs/kcl/modules.md | 20 +- .../car-wheel-assembly/car-rotor.kcl | 2 +- .../car-wheel-assembly/car-tire.kcl | 2 +- .../car-wheel-assembly/lug-nut.kcl | 2 +- rust/kcl-lib/src/execution/exec_ast.rs | 7 +- rust/kcl-lib/src/simulation_tests.rs | 22 ++ .../artifact_graph_flowchart.snap.md | 12 +- .../artifact_commands.snap | 331 ++++++++++++++++++ .../artifact_graph_flowchart.snap | 6 + .../artifact_graph_flowchart.snap.md | 62 ++++ .../tests/module_return_using_var/ast.snap | 112 ++++++ .../tests/module_return_using_var/cube.kcl | 9 + .../tests/module_return_using_var/input.kcl | 5 + .../tests/module_return_using_var/ops.snap | 65 ++++ .../program_memory.snap | 10 + .../rendered_model.png | Bin 0 -> 68590 bytes .../module_return_using_var/unparsed.snap | 9 + .../unparsed@cube.kcl.snap | 13 + 18 files changed, 669 insertions(+), 20 deletions(-) create mode 100644 rust/kcl-lib/tests/module_return_using_var/artifact_commands.snap create mode 100644 rust/kcl-lib/tests/module_return_using_var/artifact_graph_flowchart.snap create mode 100644 rust/kcl-lib/tests/module_return_using_var/artifact_graph_flowchart.snap.md create mode 100644 rust/kcl-lib/tests/module_return_using_var/ast.snap create mode 100644 rust/kcl-lib/tests/module_return_using_var/cube.kcl create mode 100644 rust/kcl-lib/tests/module_return_using_var/input.kcl create mode 100644 rust/kcl-lib/tests/module_return_using_var/ops.snap create mode 100644 rust/kcl-lib/tests/module_return_using_var/program_memory.snap create mode 100644 rust/kcl-lib/tests/module_return_using_var/rendered_model.png create mode 100644 rust/kcl-lib/tests/module_return_using_var/unparsed.snap create mode 100644 rust/kcl-lib/tests/module_return_using_var/unparsed@cube.kcl.snap diff --git a/docs/kcl/modules.md b/docs/kcl/modules.md index 7cbfb5f5e..61832c17c 100644 --- a/docs/kcl/modules.md +++ b/docs/kcl/modules.md @@ -191,10 +191,11 @@ In `cube.kcl`, you cannot have multiple objects. It has to be a single part. If you have multiple objects, you will get an error. This is because the module is expected to return a single object that can be used as a variable. -You also cannot assign that object to a variable. This is because the module is -expected to return a single object that can be used as a variable. +The last expression or variable definition becomes the module's return value. +The module is expected to return a single object that can be used as a variable +by whatever imports it. -So for example, this is not allowed: +So for example, this is allowed: ```norun ... a bunch of code to create cube and cube2 ... @@ -202,7 +203,7 @@ So for example, this is not allowed: myUnion = union([cube, cube2]) ``` -What you need to do instead is: +You can also do this: ```norun ... a bunch of code to create cube and cube2 ... @@ -210,7 +211,7 @@ What you need to do instead is: union([cube, cube2]) ``` -That way the last line will return the union of the two objects. +Either way, the last line will return the union of the two objects. Or what you could do instead is: @@ -221,9 +222,12 @@ myUnion = union([cube, cube2]) myUnion ``` -This will return the union of the two objects, but it will not be assigned to a -variable. This is because the module is expected to return a single object that -can be used as a variable. +This will assign the union of the two objects to a variable, and then return it +on the last statement. It's simply another way of doing the same thing. + +The final statement is what's important because it's the return value of the +entire module. The module is expected to return a single object that can be used +as a variable by the file that imports it. --- diff --git a/public/kcl-samples/car-wheel-assembly/car-rotor.kcl b/public/kcl-samples/car-wheel-assembly/car-rotor.kcl index 33d31c017..12a9b5d20 100644 --- a/public/kcl-samples/car-wheel-assembly/car-rotor.kcl +++ b/public/kcl-samples/car-wheel-assembly/car-rotor.kcl @@ -85,5 +85,5 @@ secondRotorSlottedSketch = startSketchOn(secondRotor, face = END) rotateDuplicates = true, ) -extrude(secondRotorSlottedSketch, length = -rotorSinglePlateThickness / 2) +carRotor = extrude(secondRotorSlottedSketch, length = -rotorSinglePlateThickness / 2) |> appearance(color = "#dbcd70", roughness = 90, metalness = 90) diff --git a/public/kcl-samples/car-wheel-assembly/car-tire.kcl b/public/kcl-samples/car-wheel-assembly/car-tire.kcl index f8a26616e..e1c211aeb 100644 --- a/public/kcl-samples/car-wheel-assembly/car-tire.kcl +++ b/public/kcl-samples/car-wheel-assembly/car-tire.kcl @@ -41,5 +41,5 @@ tireSketch = startSketchOn(XY) |> close() // Revolve the sketch to create the tire -revolve(tireSketch, axis = Y) +carTire = revolve(tireSketch, axis = Y) |> appearance(color = "#0f0f0f", roughness = 80) diff --git a/public/kcl-samples/car-wheel-assembly/lug-nut.kcl b/public/kcl-samples/car-wheel-assembly/lug-nut.kcl index be94402ac..584a47fc1 100644 --- a/public/kcl-samples/car-wheel-assembly/lug-nut.kcl +++ b/public/kcl-samples/car-wheel-assembly/lug-nut.kcl @@ -35,4 +35,4 @@ fn lug(plane, length, diameter) { return lugSketch } -lug(customPlane, lugLength, lugDiameter) +lugNut = lug(customPlane, lugLength, lugDiameter) diff --git a/rust/kcl-lib/src/execution/exec_ast.rs b/rust/kcl-lib/src/execution/exec_ast.rs index df7ead0ee..fba387895 100644 --- a/rust/kcl-lib/src/execution/exec_ast.rs +++ b/rust/kcl-lib/src/execution/exec_ast.rs @@ -278,7 +278,7 @@ impl ExecutorContext { let annotations = &variable_declaration.outer_attrs; - let memory_item = self + let value = self .execute_expr( &variable_declaration.declaration.init, exec_state, @@ -289,13 +289,14 @@ impl ExecutorContext { .await?; exec_state .mut_stack() - .add(var_name.clone(), memory_item, source_range)?; + .add(var_name.clone(), value.clone(), source_range)?; // Track exports. if let ItemVisibility::Export = variable_declaration.visibility { exec_state.mod_local.module_exports.push(var_name); } - last_expr = None; + // Variable declaration can be the return value of a module. + last_expr = matches!(body_type, BodyType::Root).then_some(value); } BodyItem::TypeDeclaration(ty) => { let metadata = Metadata::from(&**ty); diff --git a/rust/kcl-lib/src/simulation_tests.rs b/rust/kcl-lib/src/simulation_tests.rs index fd1d8fabd..a46fa9b9f 100644 --- a/rust/kcl-lib/src/simulation_tests.rs +++ b/rust/kcl-lib/src/simulation_tests.rs @@ -2240,6 +2240,28 @@ mod multi_transform { } } +mod module_return_using_var { + const TEST_NAME: &str = "module_return_using_var"; + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[tokio::test(flavor = "multi_thread")] + async fn unparse() { + super::unparse(TEST_NAME).await + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, true).await + } +} + mod import_transform { const TEST_NAME: &str = "import_transform"; diff --git a/rust/kcl-lib/tests/kcl_samples/car-wheel-assembly/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/kcl_samples/car-wheel-assembly/artifact_graph_flowchart.snap.md index ccf919414..32672de10 100644 --- a/rust/kcl-lib/tests/kcl_samples/car-wheel-assembly/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/kcl_samples/car-wheel-assembly/artifact_graph_flowchart.snap.md @@ -276,7 +276,7 @@ flowchart LR 103["Sweep Extrusion
[2763, 2831, 7]"] 104["Sweep Extrusion
[2763, 2831, 7]"] 105["Sweep Extrusion
[2763, 2831, 7]"] - 113["Sweep Extrusion
[3242, 3316, 7]"] + 113["Sweep Extrusion
[3253, 3327, 7]"] 114[Wall] 115[Wall] 116[Wall] @@ -290,10 +290,10 @@ flowchart LR 124["SweepEdge Adjacent"] 125["SweepEdge Opposite"] 126["SweepEdge Adjacent"] - 127["Sweep Extrusion
[3242, 3316, 7]"] - 128["Sweep Extrusion
[3242, 3316, 7]"] - 129["Sweep Extrusion
[3242, 3316, 7]"] - 130["Sweep Extrusion
[3242, 3316, 7]"] + 127["Sweep Extrusion
[3253, 3327, 7]"] + 128["Sweep Extrusion
[3253, 3327, 7]"] + 129["Sweep Extrusion
[3253, 3327, 7]"] + 130["Sweep Extrusion
[3253, 3327, 7]"] 131["Plane
[331, 348, 6]"] 138["Sweep Extrusion
[487, 520, 6]"] 139[Wall] @@ -500,7 +500,7 @@ flowchart LR 436["SweepEdge Opposite"] 437["SweepEdge Adjacent"] 438["Plane
[464, 481, 10]"] - 455["Sweep Revolve
[1474, 1503, 10]"] + 455["Sweep Revolve
[1484, 1513, 10]"] 456[Wall] 457[Wall] 458[Wall] diff --git a/rust/kcl-lib/tests/module_return_using_var/artifact_commands.snap b/rust/kcl-lib/tests/module_return_using_var/artifact_commands.snap new file mode 100644 index 000000000..8f5077591 --- /dev/null +++ b/rust/kcl-lib/tests/module_return_using_var/artifact_commands.snap @@ -0,0 +1,331 @@ +--- +source: kcl-lib/src/simulation_tests.rs +description: Artifact commands module_return_using_var.kcl +--- +[ + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "edge_lines_visible", + "hidden": false + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "object_visible", + "object_id": "[uuid]", + "hidden": true + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "object_visible", + "object_id": "[uuid]", + "hidden": true + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "set_object_transform", + "object_id": "[uuid]", + "transforms": [ + { + "translate": { + "property": { + "x": 5.0, + "y": 0.0, + "z": 0.0 + }, + "set": false, + "is_local": true + }, + "rotate_rpy": null, + "rotate_angle_axis": null, + "scale": null + } + ] + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "make_plane", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "x_axis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "y_axis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "size": 60.0, + "clobber": false, + "hide": true + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "enable_sketch_mode", + "entity_id": "[uuid]", + "ortho": false, + "animated": false, + "adjust_camera": false, + "planar_normal": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + } + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "start_path" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "move_path_pen", + "path": "[uuid]", + "to": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "sketch_mode_disable" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "extend_path", + "path": "[uuid]", + "segment": { + "type": "line", + "end": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "relative": true + } + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "extend_path", + "path": "[uuid]", + "segment": { + "type": "line", + "end": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "relative": true + } + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "extend_path", + "path": "[uuid]", + "segment": { + "type": "line", + "end": { + "x": -1.0, + "y": 0.0, + "z": 0.0 + }, + "relative": true + } + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "extend_path", + "path": "[uuid]", + "segment": { + "type": "line", + "end": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "relative": true + } + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "close_path", + "path_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "enable_sketch_mode", + "entity_id": "[uuid]", + "ortho": false, + "animated": false, + "adjust_camera": false, + "planar_normal": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + } + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "extrude", + "target": "[uuid]", + "distance": 1.0, + "faces": null, + "opposite": "None" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "sketch_mode_disable" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "object_bring_to_front", + "object_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "solid3d_get_extrusion_face_info", + "object_id": "[uuid]", + "edge_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "solid3d_get_opposite_edge", + "object_id": "[uuid]", + "edge_id": "[uuid]", + "face_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "solid3d_get_next_adjacent_edge", + "object_id": "[uuid]", + "edge_id": "[uuid]", + "face_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "solid3d_get_opposite_edge", + "object_id": "[uuid]", + "edge_id": "[uuid]", + "face_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "solid3d_get_next_adjacent_edge", + "object_id": "[uuid]", + "edge_id": "[uuid]", + "face_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "solid3d_get_opposite_edge", + "object_id": "[uuid]", + "edge_id": "[uuid]", + "face_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "solid3d_get_next_adjacent_edge", + "object_id": "[uuid]", + "edge_id": "[uuid]", + "face_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "solid3d_get_opposite_edge", + "object_id": "[uuid]", + "edge_id": "[uuid]", + "face_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "solid3d_get_next_adjacent_edge", + "object_id": "[uuid]", + "edge_id": "[uuid]", + "face_id": "[uuid]" + } + } +] diff --git a/rust/kcl-lib/tests/module_return_using_var/artifact_graph_flowchart.snap b/rust/kcl-lib/tests/module_return_using_var/artifact_graph_flowchart.snap new file mode 100644 index 000000000..80897f238 --- /dev/null +++ b/rust/kcl-lib/tests/module_return_using_var/artifact_graph_flowchart.snap @@ -0,0 +1,6 @@ +--- +source: kcl-lib/src/simulation_tests.rs +description: Artifact graph flowchart module_return_using_var.kcl +extension: md +snapshot_kind: binary +--- diff --git a/rust/kcl-lib/tests/module_return_using_var/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/module_return_using_var/artifact_graph_flowchart.snap.md new file mode 100644 index 000000000..24311a443 --- /dev/null +++ b/rust/kcl-lib/tests/module_return_using_var/artifact_graph_flowchart.snap.md @@ -0,0 +1,62 @@ +```mermaid +flowchart LR + subgraph path2 [Path] + 2["Path
[80, 105, 6]"] + 3["Segment
[111, 128, 6]"] + 4["Segment
[134, 151, 6]"] + 5["Segment
[157, 175, 6]"] + 6["Segment
[181, 199, 6]"] + 7["Segment
[205, 213, 6]"] + 8[Solid2d] + end + 1["Plane
[57, 74, 6]"] + 9["Sweep Extrusion
[219, 238, 6]"] + 10[Wall] + 11[Wall] + 12[Wall] + 13[Wall] + 14["Cap Start"] + 15["Cap End"] + 16["SweepEdge Opposite"] + 17["SweepEdge Adjacent"] + 18["SweepEdge Opposite"] + 19["SweepEdge Adjacent"] + 20["SweepEdge Opposite"] + 21["SweepEdge Adjacent"] + 22["SweepEdge Opposite"] + 23["SweepEdge Adjacent"] + 1 --- 2 + 2 --- 3 + 2 --- 4 + 2 --- 5 + 2 --- 6 + 2 --- 7 + 2 ---- 9 + 2 --- 8 + 3 --- 10 + 3 --- 16 + 3 --- 17 + 4 --- 11 + 4 --- 18 + 4 --- 19 + 5 --- 12 + 5 --- 20 + 5 --- 21 + 6 --- 13 + 6 --- 22 + 6 --- 23 + 9 --- 10 + 9 --- 11 + 9 --- 12 + 9 --- 13 + 9 --- 14 + 9 --- 15 + 9 --- 16 + 9 --- 17 + 9 --- 18 + 9 --- 19 + 9 --- 20 + 9 --- 21 + 9 --- 22 + 9 --- 23 +``` diff --git a/rust/kcl-lib/tests/module_return_using_var/ast.snap b/rust/kcl-lib/tests/module_return_using_var/ast.snap new file mode 100644 index 000000000..eb1eadad1 --- /dev/null +++ b/rust/kcl-lib/tests/module_return_using_var/ast.snap @@ -0,0 +1,112 @@ +--- +source: kcl-lib/src/simulation_tests.rs +description: Result of parsing module_return_using_var.kcl +--- +{ + "Ok": { + "body": [ + { + "commentStart": 0, + "end": 0, + "path": { + "type": "Kcl", + "filename": "cube.kcl" + }, + "selector": { + "type": "None", + "alias": null + }, + "start": 0, + "type": "ImportStatement", + "type": "ImportStatement" + }, + { + "commentStart": 0, + "end": 0, + "expression": { + "body": [ + { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "cube", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "x", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "5", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 5.0, + "suffix": "None" + } + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "translate", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + } + ], + "commentStart": 0, + "end": 0, + "start": 0, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "preComments": [ + "", + "", + "// Use the module's return value." + ], + "start": 0, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + } + ], + "commentStart": 0, + "end": 0, + "start": 0 + } +} diff --git a/rust/kcl-lib/tests/module_return_using_var/cube.kcl b/rust/kcl-lib/tests/module_return_using_var/cube.kcl new file mode 100644 index 000000000..d3e970db0 --- /dev/null +++ b/rust/kcl-lib/tests/module_return_using_var/cube.kcl @@ -0,0 +1,9 @@ +// The last statement is a variable definition. +myCube = startSketchOn(XY) + |> startProfile(at = [0, 0]) + |> xLine(length = 1) + |> yLine(length = 1) + |> xLine(length = -1) + |> yLine(length = -1) + |> close(%) + |> extrude(length = 1) diff --git a/rust/kcl-lib/tests/module_return_using_var/input.kcl b/rust/kcl-lib/tests/module_return_using_var/input.kcl new file mode 100644 index 000000000..d7bbeffc5 --- /dev/null +++ b/rust/kcl-lib/tests/module_return_using_var/input.kcl @@ -0,0 +1,5 @@ +import 'cube.kcl' + +// Use the module's return value. +cube + |> translate(x = 5) diff --git a/rust/kcl-lib/tests/module_return_using_var/ops.snap b/rust/kcl-lib/tests/module_return_using_var/ops.snap new file mode 100644 index 000000000..1573f56c2 --- /dev/null +++ b/rust/kcl-lib/tests/module_return_using_var/ops.snap @@ -0,0 +1,65 @@ +--- +source: kcl-lib/src/simulation_tests.rs +description: Operations executed module_return_using_var.kcl +--- +[ + { + "type": "GroupBegin", + "group": { + "type": "ModuleInstance", + "name": "cube", + "moduleId": 6 + }, + "sourceRange": [] + }, + { + "labeledArgs": { + "planeOrSolid": { + "value": { + "type": "Plane", + "artifact_id": "[uuid]" + }, + "sourceRange": [] + } + }, + "name": "startSketchOn", + "sourceRange": [], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "length": { + "value": { + "type": "Number", + "value": 1.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "name": "extrude", + "sourceRange": [], + "type": "StdLibCall", + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + } + }, + { + "type": "GroupEnd" + } +] diff --git a/rust/kcl-lib/tests/module_return_using_var/program_memory.snap b/rust/kcl-lib/tests/module_return_using_var/program_memory.snap new file mode 100644 index 000000000..f95ab0844 --- /dev/null +++ b/rust/kcl-lib/tests/module_return_using_var/program_memory.snap @@ -0,0 +1,10 @@ +--- +source: kcl-lib/src/simulation_tests.rs +description: Variables in memory after executing module_return_using_var.kcl +--- +{ + "cube": { + "type": "Module", + "value": 6 + } +} diff --git a/rust/kcl-lib/tests/module_return_using_var/rendered_model.png b/rust/kcl-lib/tests/module_return_using_var/rendered_model.png new file mode 100644 index 0000000000000000000000000000000000000000..c0bde52a8df4ff3b8867194e924e206ea16ea238 GIT binary patch literal 68590 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 z zo4R>%Zoib)i;DTKjX%3pA9crIiT%!SaaaU7l#ed192Y{`pdiF-zvX+!CfOi}FzLV_ znJ7+7U`i2-8D$p*FcRHF&3ATp+>z?ze(r11zhho}xJ?`ONWe#8rfbk?0lKphY4OJYO5jhz# zaB0?qjn=tc(cFt7WJEO##gX2(XL5ahR=KwpCv^mKZjb>g+UQtUd86$;aW<_eGS)-} z9wa`k-QgOZUqSZn*Bpg-HZR5m6?V3Gd?E$H9ah9(_e*wdUK~CwG~pNcll^SA8Pyk| z%*IvY`*-8}+JjWQi)4b#&~?greoY-()rZy&7KY4Wz>Eq3&Dp7&8!G&rz1eq3%}7W8 zeQ38g0oTC{q99Q$Dg2Q3scG(hzD`}Ng=Ddq$)u=b^1%YS!JiPOkw5(kJbiyUxoGu$ z&%c|DA$ct9DX=K^B{bc$AQRZP$P&M3!AkK;ghJ@_FSFf=LV6lM z*|5NBB@l}=NRwFV2wZG=f@|B(ZZp9ba?^Ttd>9IW3V671VEF!~7KGgVY`NL1ZMI{Z zd(7B!i_cwNAa|$&$p_+c*Hr@YH*FO(@UMIjb-N;>XIc<#i~O&Q{+JDntOO+r_{gUV zwJyZojGNseRu33unck*aosR0r0?J4f=PPNHwK>A|O@}?_c9v%^=>a z`NP97hxD^`y)GbG3ZwT=eDwZb#)*2eGR7>(lJEj0U3wiUfEcccC{#^T1no>3=AIG`kfP`Mt83a-5pbXk@&C1V^(qYn zLD))bF_=O$g@s^a;S=~*gh;F;Li)Ryv z5E#HCH!QZ1m=`>5T2J~@;23Xnv&Q}oZb`18uJqc0o>d8m8SKBAV^lQZp-9bO!iFcX ziz7vqfP^t*NiSqjU_#&zKywT=wFP95XZoIB3GXE>6@#({gpHs@@Xt2+1L#wNn2?{F z9q%J$A1`&@>x$%8ka zBczXYgT=)-widrg@ zbFsVxWpr9nUI5m&uAj+}r%V>#lDMr3 translate(x = 5) diff --git a/rust/kcl-lib/tests/module_return_using_var/unparsed@cube.kcl.snap b/rust/kcl-lib/tests/module_return_using_var/unparsed@cube.kcl.snap new file mode 100644 index 000000000..9c7dcc64c --- /dev/null +++ b/rust/kcl-lib/tests/module_return_using_var/unparsed@cube.kcl.snap @@ -0,0 +1,13 @@ +--- +source: kcl-lib/src/simulation_tests.rs +description: Result of unparsing tests/module_return_using_var/cube.kcl +--- +// The last statement is a variable definition. +myCube = startSketchOn(XY) + |> startProfile(at = [0, 0]) + |> xLine(length = 1) + |> yLine(length = 1) + |> xLine(length = -1) + |> yLine(length = -1) + |> close(%) + |> extrude(length = 1)