authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-05-01 01:30:53-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-05-01 01:30:53-04:00
log3a8dc4e90ddf6b3dc2bdf640c89061c00eee7d45
tree7fce3222aa46d39b250ef95f163586a236989fd4
parent7c822869feac7713063da320c12a960f3ae58298

zig fmt: line comments in struct initializer


3 files changed, 68 insertions(+), 17 deletions(-)

std/zig/ast.zig+2-2
......@@ -1269,7 +1269,7 @@ pub const Node = struct {
12691269 ArrayAccess: &Node,
12701270 Slice: SliceRange,
12711271 ArrayInitializer: ArrayList(&Node),
1272 StructInitializer: ArrayList(&FieldInitializer),
1272 StructInitializer: ArrayList(&Node),
12731273 };
12741274
12751275 const CallInfo = struct {
......@@ -1311,7 +1311,7 @@ pub const Node = struct {
13111311 i -= exprs.len;
13121312 },
13131313 Op.StructInitializer => |fields| {
1314 if (i < fields.len) return &fields.at(i).base;
1314 if (i < fields.len) return fields.at(i);
13151315 i -= fields.len;
13161316 },
13171317 }
std/zig/parser.zig+25-15
......@@ -238,8 +238,8 @@ pub const Parser = struct {
238238
239239 ExprListItemOrEnd: ExprListCtx,
240240 ExprListCommaOrEnd: ExprListCtx,
241 FieldInitListItemOrEnd: ListSave(&ast.Node.FieldInitializer),
242 FieldInitListCommaOrEnd: ListSave(&ast.Node.FieldInitializer),
241 FieldInitListItemOrEnd: ListSave(&ast.Node),
242 FieldInitListCommaOrEnd: ListSave(&ast.Node),
243243 FieldListCommaOrEnd: &ast.Node.ContainerDecl,
244244 FieldInitValue: OptionalCtx,
245245 ErrorTagListItemOrEnd: ListSave(&ast.Node),
......@@ -1510,6 +1510,10 @@ pub const Parser = struct {
15101510 }
15111511 },
15121512 State.FieldInitListItemOrEnd => |list_state| {
1513 while (try self.eatLineComment(arena)) |line_comment| {
1514 try list_state.list.append(&line_comment.base);
1515 }
1516
15131517 if (self.eatToken(Token.Id.RBrace)) |rbrace| {
15141518 *list_state.ptr = rbrace;
15151519 continue;
......@@ -1524,7 +1528,7 @@ pub const Parser = struct {
15241528 .name_token = undefined,
15251529 .expr = undefined,
15261530 });
1527 try list_state.list.append(node);
1531 try list_state.list.append(&node.base);
15281532
15291533 stack.append(State { .FieldInitListCommaOrEnd = list_state }) catch unreachable;
15301534 try stack.append(State { .Expression = OptionalCtx{ .Required = &node.expr } });
......@@ -2346,7 +2350,7 @@ pub const Parser = struct {
23462350 .base = undefined,
23472351 .lhs = lhs,
23482352 .op = ast.Node.SuffixOp.Op {
2349 .StructInitializer = ArrayList(&ast.Node.FieldInitializer).init(arena),
2353 .StructInitializer = ArrayList(&ast.Node).init(arena),
23502354 },
23512355 .rtoken = undefined,
23522356 }
......@@ -2354,7 +2358,7 @@ pub const Parser = struct {
23542358 stack.append(State { .CurlySuffixExpressionEnd = opt_ctx.toRequired() }) catch unreachable;
23552359 try stack.append(State { .IfToken = Token.Id.LBrace });
23562360 try stack.append(State {
2357 .FieldInitListItemOrEnd = ListSave(&ast.Node.FieldInitializer) {
2361 .FieldInitListItemOrEnd = ListSave(&ast.Node) {
23582362 .list = &node.op.StructInitializer,
23592363 .ptr = &node.rtoken,
23602364 }
......@@ -3452,7 +3456,6 @@ pub const Parser = struct {
34523456 Expression: &ast.Node,
34533457 VarDecl: &ast.Node.VarDecl,
34543458 Statement: &ast.Node,
3455 FieldInitializer: &ast.Node.FieldInitializer,
34563459 PrintIndent,
34573460 Indent: usize,
34583461 PrintSameLineComment: ?&Token,
......@@ -3584,12 +3587,6 @@ pub const Parser = struct {
35843587 }
35853588 },
35863589
3587 RenderState.FieldInitializer => |field_init| {
3588 try stream.print(".{}", self.tokenizer.getTokenSlice(field_init.name_token));
3589 try stream.print(" = ");
3590 try stack.append(RenderState { .Expression = field_init.expr });
3591 },
3592
35933590 RenderState.VarDecl => |var_decl| {
35943591 try stack.append(RenderState { .Text = ";" });
35953592 if (var_decl.init_node) |init_node| {
......@@ -3888,7 +3885,7 @@ pub const Parser = struct {
38883885 const field_init = field_inits.at(0);
38893886
38903887 try stack.append(RenderState { .Text = " }" });
3891 try stack.append(RenderState { .FieldInitializer = field_init });
3888 try stack.append(RenderState { .Expression = field_init });
38923889 try stack.append(RenderState { .Text = "{ " });
38933890 try stack.append(RenderState { .Expression = suffix_op.lhs });
38943891 continue;
......@@ -3896,13 +3893,26 @@ pub const Parser = struct {
38963893 try stack.append(RenderState { .Text = "}"});
38973894 try stack.append(RenderState.PrintIndent);
38983895 try stack.append(RenderState { .Indent = indent });
3896 try stack.append(RenderState { .Text = "\n" });
38993897 var i = field_inits.len;
39003898 while (i != 0) {
39013899 i -= 1;
39023900 const field_init = field_inits.at(i);
3903 try stack.append(RenderState { .Text = ",\n" });
3904 try stack.append(RenderState { .FieldInitializer = field_init });
3901 if (field_init.id != ast.Node.Id.LineComment) {
3902 try stack.append(RenderState { .Text = "," });
3903 }
3904 try stack.append(RenderState { .Expression = field_init });
39053905 try stack.append(RenderState.PrintIndent);
3906 if (i != 0) {
3907 try stack.append(RenderState { .Text = blk: {
3908 const prev_node = field_inits.at(i - 1);
3909 const loc = self.tokenizer.getTokenLocation(prev_node.lastToken().end, field_init.firstToken());
3910 if (loc.line >= 2) {
3911 break :blk "\n\n";
3912 }
3913 break :blk "\n";
3914 }});
3915 }
39063916 }
39073917 try stack.append(RenderState { .Indent = indent + indent_delta });
39083918 try stack.append(RenderState { .Text = "{\n"});
std/zig/parser_test.zig+41
......@@ -1,3 +1,44 @@
1test "zig fmt: line comments in struct initializer" {
2 try testCanonical(
3 \\fn foo() void {
4 \\ return Self{
5 \\ .a = b,
6 \\
7 \\ // Initialize these two fields to buffer_size so that
8 \\ // in `readFn` we treat the state as being able to read
9 \\ .start_index = buffer_size,
10 \\ .end_index = buffer_size,
11 \\
12 \\ // middle
13 \\
14 \\ .a = b,
15 \\
16 \\ // end
17 \\ };
18 \\}
19 \\
20 );
21}
22
23//TODO
24//test "zig fmt: same-line comptime" {
25// try testCanonical(
26// \\test "" {
27// \\ comptime assert(@typeId(T) == builtin.TypeId.Int); // must pass an integer to absInt
28// \\}
29// \\
30// );
31//}
32
33
34//TODO
35//test "zig fmt: number literals" {
36// try testCanonical(
37// \\pub const f64_true_min = 4.94065645841246544177e-324;
38// \\
39// );
40//}
41
142test "zig fmt: doc comments before struct field" {
243 try testCanonical(
344 \\pub const Allocator = struct {