diff --git a/src/wasm-lib/kcl/src/ast/types.rs b/src/wasm-lib/kcl/src/ast/types.rs index b7865cff3..ed08b3489 100644 --- a/src/wasm-lib/kcl/src/ast/types.rs +++ b/src/wasm-lib/kcl/src/ast/types.rs @@ -3511,6 +3511,33 @@ show(mySuperCoolPart) ); } + #[test] + fn test_recast_trailing_comma() { + let some_program_string = r#"startSketchOn('XY') + |> startProfileAt([0, 0], %) + |> arc({ + radius: 1, + angle_start: 0, + angle_end: 180, + }, %)"#; + let tokens = crate::token::lexer(some_program_string); + let parser = crate::parser::Parser::new(tokens); + let program = parser.ast().unwrap(); + + let recasted = program.recast(&Default::default(), 0); + assert_eq!( + recasted, + r#"startSketchOn('XY') + |> startProfileAt([0, 0], %) + |> arc({ + radius: 1, + angle_start: 0, + angle_end: 180 + }, %) +"# + ); + } + #[test] fn test_recast_negative_var() { let some_program_string = r#"const w = 20 diff --git a/src/wasm-lib/kcl/src/parser/parser_impl.rs b/src/wasm-lib/kcl/src/parser/parser_impl.rs index 3c9c7ab5f..5f2596996 100644 --- a/src/wasm-lib/kcl/src/parser/parser_impl.rs +++ b/src/wasm-lib/kcl/src/parser/parser_impl.rs @@ -440,6 +440,7 @@ fn object(i: TokenSlice) -> PResult { "a comma-separated list of key-value pairs, e.g. 'height: 4, width: 3'", )) .parse_next(i)?; + ignore_trailing_comma(i); ignore_whitespace(i); let end = close_brace(i)?.end; Ok(ObjectExpression { start, end, properties }) @@ -977,6 +978,11 @@ fn ignore_whitespace(i: TokenSlice) { let _: PResult<()> = repeat(0.., whitespace).parse_next(i); } +// A helper function to ignore a trailing comma. +fn ignore_trailing_comma(i: TokenSlice) { + let _ = opt(comma).parse_next(i); +} + /// Matches at least 1 whitespace. fn require_whitespace(i: TokenSlice) -> PResult<()> { repeat(1.., whitespace).parse_next(i)