From 43587af01acba98d9c09c4e0cf20343be8d7c81b Mon Sep 17 00:00:00 2001 From: Tetralux Date: Thu, 22 Aug 2019 22:58:38 +0000 Subject: [PATCH] rendering of align(N) on struct fields --- std/zig/parser_test.zig | 9 +++++++++ std/zig/render.zig | 15 ++++++++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/std/zig/parser_test.zig b/std/zig/parser_test.zig index 871195280f..73089f76fd 100644 --- a/std/zig/parser_test.zig +++ b/std/zig/parser_test.zig @@ -166,6 +166,15 @@ test "zig fmt: doc comments on param decl" { ); } +test "zig fmt: aligned struct field" { + try testCanonical( + \\pub const S = struct { + \\ f: i32 align(32), + \\}; + \\ + ); +} + test "zig fmt: preserve space between async fn definitions" { try testCanonical( \\async fn a() void {} diff --git a/std/zig/render.zig b/std/zig/render.zig index 035526ed11..66edf4daef 100644 --- a/std/zig/render.zig +++ b/std/zig/render.zig @@ -206,7 +206,20 @@ fn renderTopLevelDecl(allocator: *mem.Allocator, stream: var, tree: *ast.Tree, i } else if (field.type_expr != null and field.value_expr == null) { try renderToken(tree, stream, field.name_token, indent, start_col, Space.None); // name try renderToken(tree, stream, tree.nextToken(field.name_token), indent, start_col, Space.Space); // : - return renderExpression(allocator, stream, tree, indent, start_col, field.type_expr.?, Space.Comma); // type, + + if (field.align_expr) |align_value_expr| { + try renderExpression(allocator, stream, tree, indent, start_col, field.type_expr.?, Space.Space); // type + const lparen_token = tree.prevToken(align_value_expr.firstToken()); + const align_kw = tree.prevToken(lparen_token); + const rparen_token = tree.nextToken(align_value_expr.lastToken()); + try renderToken(tree, stream, align_kw, indent, start_col, Space.None); // align + try renderToken(tree, stream, lparen_token, indent, start_col, Space.None); // ( + try renderExpression(allocator, stream, tree, indent, start_col, align_value_expr, Space.None); // alignment + try renderToken(tree, stream, rparen_token, indent, start_col, Space.Comma); // ) + } else { + try renderExpression(allocator, stream, tree, indent, start_col, field.type_expr.?, Space.Comma); // type, + } + } else if (field.type_expr == null and field.value_expr != null) { try renderToken(tree, stream, field.name_token, indent, start_col, Space.Space); // name try renderToken(tree, stream, tree.nextToken(field.name_token), indent, start_col, Space.Space); // =