fix unwrap (#6825)

* fix unwrap

Signed-off-by: Jess Frazelle <github@jessfraz.com>

* add test

Signed-off-by: Jess Frazelle <github@jessfraz.com>

* updates

Signed-off-by: Jess Frazelle <github@jessfraz.com>

* udaptes

Signed-off-by: Jess Frazelle <github@jessfraz.com>

---------

Signed-off-by: Jess Frazelle <github@jessfraz.com>
This commit is contained in:
Jess Frazelle
2025-05-10 13:00:14 -07:00
committed by GitHub
parent 3956958452
commit 7ac4a9507b
10 changed files with 2419 additions and 2 deletions

View File

@ -2729,3 +2729,24 @@ mod involute_circular_units {
super::execute(TEST_NAME, true).await super::execute(TEST_NAME, true).await
} }
} }
mod panic_repro_cube {
const TEST_NAME: &str = "panic_repro_cube";
/// 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
}
}

View File

@ -407,8 +407,15 @@ impl Args {
}) })
})?; })?;
// TODO unnecessary cloning T::from_kcl_val(&arg).ok_or_else(|| {
Ok(T::from_kcl_val(&arg).unwrap()) KclError::Semantic(KclErrorDetails {
source_ranges: vec![self.source_range],
message: format!(
"This function expected the input argument to be {}",
ty.human_friendly_type(),
),
})
})
} }
// Add a modeling command to the batch but don't fire it right away. // Add a modeling command to the batch but don't fire it right away.

View File

@ -0,0 +1,445 @@
---
source: kcl-lib/src/simulation_tests.rs
description: Artifact commands panic_repro_cube.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": "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": "move_path_pen",
"path": "[uuid]",
"to": {
"x": -10.0,
"y": -10.0,
"z": 0.0
}
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "sketch_mode_disable"
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "start_path"
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "extend_path",
"path": "[uuid]",
"segment": {
"type": "line",
"end": {
"x": 20.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": 20.0,
"z": 0.0
},
"relative": true
}
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "extend_path",
"path": "[uuid]",
"segment": {
"type": "line",
"end": {
"x": -20.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": -20.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": 20.0,
"faces": null,
"opposite": "None"
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "object_bring_to_front",
"object_id": "[uuid]"
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "sketch_mode_disable"
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "solid3d_get_all_edge_faces",
"object_id": "[uuid]",
"edge_id": "[uuid]"
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "solid3d_get_all_edge_faces",
"object_id": "[uuid]",
"edge_id": "[uuid]"
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "solid3d_get_all_edge_faces",
"object_id": "[uuid]",
"edge_id": "[uuid]"
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "solid3d_get_all_edge_faces",
"object_id": "[uuid]",
"edge_id": "[uuid]"
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "solid3d_get_all_edge_faces",
"object_id": "[uuid]",
"edge_id": "[uuid]"
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "solid3d_get_all_edge_faces",
"object_id": "[uuid]",
"edge_id": "[uuid]"
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "solid3d_get_all_edge_faces",
"object_id": "[uuid]",
"edge_id": "[uuid]"
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "solid3d_get_all_edge_faces",
"object_id": "[uuid]",
"edge_id": "[uuid]"
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "solid3d_get_all_edge_faces",
"object_id": "[uuid]",
"edge_id": "[uuid]"
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "solid3d_get_all_edge_faces",
"object_id": "[uuid]",
"edge_id": "[uuid]"
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "solid3d_get_all_edge_faces",
"object_id": "[uuid]",
"edge_id": "[uuid]"
}
},
{
"cmdId": "[uuid]",
"range": [],
"command": {
"type": "solid3d_get_all_edge_faces",
"object_id": "[uuid]",
"edge_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_next_adjacent_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_next_adjacent_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_opposite_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_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_next_adjacent_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]"
}
}
]

View File

@ -0,0 +1,6 @@
---
source: kcl-lib/src/simulation_tests.rs
description: Artifact graph flowchart panic_repro_cube.kcl
extension: md
snapshot_kind: binary
---

View File

@ -0,0 +1,78 @@
```mermaid
flowchart LR
subgraph path2 [Path]
2["Path<br>[565, 614, 0]"]
3["Segment<br>[620, 644, 0]"]
4["Segment<br>[650, 688, 0]"]
5["Segment<br>[694, 719, 0]"]
6["Segment<br>[725, 764, 0]"]
7["Segment<br>[770, 777, 0]"]
8[Solid2d]
end
1["Plane<br>[542, 559, 0]"]
9["Sweep Extrusion<br>[806, 924, 0]"]
10[Wall]
11[Wall]
12[Wall]
13[Wall]
14["Cap Start"]
15["Cap End"]
16["SweepEdge Opposite"]
17["SweepEdge Opposite"]
18["SweepEdge Opposite"]
19["SweepEdge Opposite"]
20["SweepEdge Adjacent"]
21["SweepEdge Adjacent"]
22["SweepEdge Adjacent"]
23["SweepEdge Adjacent"]
1 --- 2
2 --- 3
2 --- 4
2 --- 5
2 --- 6
2 --- 7
2 --- 8
2 ---- 9
3 --- 13
3 x--> 14
3 --- 16
3 --- 23
4 --- 11
4 x--> 14
4 --- 19
4 --- 22
5 --- 10
5 x--> 14
5 --- 18
5 --- 21
6 --- 12
6 x--> 14
6 --- 17
6 --- 20
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
18 <--x 10
21 <--x 10
19 <--x 11
23 <--x 11
17 <--x 12
21 <--x 12
16 <--x 13
23 <--x 13
16 <--x 15
17 <--x 15
18 <--x 15
19 <--x 15
```

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,14 @@
---
source: kcl-lib/src/simulation_tests.rs
description: Error from executing panic_repro_cube.kcl
---
KCL Semantic error
× semantic: This function expected the input argument to be Edge
╭─[43:5]
42 │ // these double wrapped functions are the point of this test
43 │ getNextAdjacentEdge(getNextAdjacentEdge(seg01)),
· ───────────────────────┬───────────────────────
· ╰── tests/panic_repro_cube/input.kcl
44 │ getNextAdjacentEdge(getNextAdjacentEdge(seg02))
╰────

View File

@ -0,0 +1,56 @@
/* Generated by Text-to-CAD:
Create a cube with sides of length 20mm. On the top face, add a cylindrical boss of radius 6mm and height 2mm. Then, shell the body to 2mm thickness, leaving the top face of the cylindrical boss open. */
@settings(defaultLengthUnit = mm)
// Define the dimensions of the cube
cubeSide = 20
// Define the dimensions of the cylindrical boss
bossRadius = 6
bossHeight = 2
// Define the shell thickness
shellThickness = 2
// Define the fillet radius
filletRadius = 2
// Create a sketch for the cube
cubeSketch = startSketchOn(XY)
|> startProfile(at = [-cubeSide / 2, -cubeSide / 2])
|> xLine(length = cubeSide)
|> yLine(length = cubeSide, tag = $seg01)
|> xLine(length = -cubeSide)
|> yLine(length = -cubeSide, tag = $seg02)
|> close()
// Extrude the cube
cube = extrude(
cubeSketch,
length = cubeSide,
tagEnd = $topFace,
tagStart = $capStart001,
)
// Apply fillets to all edges of the cube
filletedCube = fillet(
cube,
radius = filletRadius,
tags = [
getNextAdjacentEdge(seg01),
getNextAdjacentEdge(seg02),
// these double wrapped functions are the point of this test
getNextAdjacentEdge(getNextAdjacentEdge(seg01)),
getNextAdjacentEdge(getNextAdjacentEdge(seg02))
]
)
// Create a sketch for the cylindrical boss on the top face of the cube
bossSketch = startSketchOn(filletedCube, face = topFace)
|> circle(center = [0, 0], radius = bossRadius)
// Extrude the cylindrical boss
boss = extrude(bossSketch, length = bossHeight, tagEnd = $bossTopFace)
// Shell the cube, leaving the top face of the cylindrical boss open
shell([filletedCube, boss], thickness = shellThickness, faces = [bossTopFace])

View File

@ -0,0 +1,65 @@
---
source: kcl-lib/src/simulation_tests.rs
description: Operations executed panic_repro_cube.kcl
---
[
{
"labeledArgs": {},
"name": "startSketchOn",
"sourceRange": [],
"type": "StdLibCall",
"unlabeledArg": {
"value": {
"type": "Plane",
"artifact_id": "[uuid]"
},
"sourceRange": []
}
},
{
"labeledArgs": {
"length": {
"value": {
"type": "Number",
"value": 20.0,
"ty": {
"type": "Default",
"len": {
"type": "Mm"
},
"angle": {
"type": "Degrees"
}
}
},
"sourceRange": []
},
"tagEnd": {
"value": {
"type": "TagDeclarator",
"name": "topFace"
},
"sourceRange": []
},
"tagStart": {
"value": {
"type": "TagDeclarator",
"name": "capStart001"
},
"sourceRange": []
}
},
"name": "extrude",
"sourceRange": [],
"type": "StdLibCall",
"unlabeledArg": {
"value": {
"type": "Sketch",
"value": {
"artifactId": "[uuid]"
}
},
"sourceRange": []
}
}
]

View File

@ -0,0 +1,60 @@
---
source: kcl-lib/src/simulation_tests.rs
description: Result of unparsing panic_repro_cube.kcl
---
/* Generated by Text-to-CAD:
Create a cube with sides of length 20mm. On the top face, add a cylindrical boss of radius 6mm and height 2mm. Then, shell the body to 2mm thickness, leaving the top face of the cylindrical boss open. */
@settings(defaultLengthUnit = mm)
// Define the dimensions of the cube
cubeSide = 20
// Define the dimensions of the cylindrical boss
bossRadius = 6
bossHeight = 2
// Define the shell thickness
shellThickness = 2
// Define the fillet radius
filletRadius = 2
// Create a sketch for the cube
cubeSketch = startSketchOn(XY)
|> startProfile(at = [-cubeSide / 2, -cubeSide / 2])
|> xLine(length = cubeSide)
|> yLine(length = cubeSide, tag = $seg01)
|> xLine(length = -cubeSide)
|> yLine(length = -cubeSide, tag = $seg02)
|> close()
// Extrude the cube
cube = extrude(
cubeSketch,
length = cubeSide,
tagEnd = $topFace,
tagStart = $capStart001,
)
// Apply fillets to all edges of the cube
filletedCube = fillet(
cube,
radius = filletRadius,
tags = [
getNextAdjacentEdge(seg01),
getNextAdjacentEdge(seg02),
// these double wrapped functions are the point of this test
getNextAdjacentEdge(getNextAdjacentEdge(seg01)),
getNextAdjacentEdge(getNextAdjacentEdge(seg02))
],
)
// Create a sketch for the cylindrical boss on the top face of the cube
bossSketch = startSketchOn(filletedCube, face = topFace)
|> circle(center = [0, 0], radius = bossRadius)
// Extrude the cylindrical boss
boss = extrude(bossSketch, length = bossHeight, tagEnd = $bossTopFace)
// Shell the cube, leaving the top face of the cylindrical boss open
shell([filletedCube, boss], thickness = shellThickness, faces = [bossTopFace])