diff --git a/std/zig/parser_test.zig b/std/zig/parser_test.zig index 9d5e64a66f..d321f78668 100644 --- a/std/zig/parser_test.zig +++ b/std/zig/parser_test.zig @@ -1,3 +1,12 @@ +test "zig fmt: nested struct literal with one item" { + try testCanonical( + \\const a = foo{ + \\ .item = bar{ .a = b }, + \\}; + \\ + ); +} + test "zig fmt: switch cases trailing comma" { try testTransform( \\fn switch_cases(x: i32) void { diff --git a/std/zig/render.zig b/std/zig/render.zig index 4691d836c3..04939324a8 100644 --- a/std/zig/render.zig +++ b/std/zig/render.zig @@ -431,12 +431,18 @@ fn renderExpression(allocator: &mem.Allocator, stream: var, tree: &ast.Tree, ind return; } - if (field_inits.len == 1) { - const field_init = field_inits.at(0).*; + if (field_inits.len == 1) blk: { + const field_init = ??field_inits.at(0).*.cast(ast.Node.FieldInitializer); + + if (field_init.expr.cast(ast.Node.SuffixOp)) |nested_suffix_op| { + if (nested_suffix_op.op == ast.Node.SuffixOp.Op.StructInitializer) { + break :blk; + } + } try renderExpression(allocator, stream, tree, indent, suffix_op.lhs, Space.None); try renderToken(tree, stream, lbrace, indent, Space.Space); - try renderExpression(allocator, stream, tree, indent, field_init, Space.Space); + try renderExpression(allocator, stream, tree, indent, &field_init.base, Space.Space); try renderToken(tree, stream, suffix_op.rtoken, indent, space); return; }