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 {...@@ -1269,7 +1269,7 @@ pub const Node = struct {
1269 ArrayAccess: &Node,1269 ArrayAccess: &Node,
1270 Slice: SliceRange,1270 Slice: SliceRange,
1271 ArrayInitializer: ArrayList(&Node),1271 ArrayInitializer: ArrayList(&Node),
1272 StructInitializer: ArrayList(&FieldInitializer),1272 StructInitializer: ArrayList(&Node),
1273 };1273 };
12741274
1275 const CallInfo = struct {1275 const CallInfo = struct {
...@@ -1311,7 +1311,7 @@ pub const Node = struct {...@@ -1311,7 +1311,7 @@ pub const Node = struct {
1311 i -= exprs.len;1311 i -= exprs.len;
1312 },1312 },
1313 Op.StructInitializer => |fields| {1313 Op.StructInitializer => |fields| {
1314 if (i < fields.len) return &fields.at(i).base;1314 if (i < fields.len) return fields.at(i);
1315 i -= fields.len;1315 i -= fields.len;
1316 },1316 },
1317 }1317 }
std/zig/parser.zig+25-15
...@@ -238,8 +238,8 @@ pub const Parser = struct {...@@ -238,8 +238,8 @@ pub const Parser = struct {
238238
239 ExprListItemOrEnd: ExprListCtx,239 ExprListItemOrEnd: ExprListCtx,
240 ExprListCommaOrEnd: ExprListCtx,240 ExprListCommaOrEnd: ExprListCtx,
241 FieldInitListItemOrEnd: ListSave(&ast.Node.FieldInitializer),241 FieldInitListItemOrEnd: ListSave(&ast.Node),
242 FieldInitListCommaOrEnd: ListSave(&ast.Node.FieldInitializer),242 FieldInitListCommaOrEnd: ListSave(&ast.Node),
243 FieldListCommaOrEnd: &ast.Node.ContainerDecl,243 FieldListCommaOrEnd: &ast.Node.ContainerDecl,
244 FieldInitValue: OptionalCtx,244 FieldInitValue: OptionalCtx,
245 ErrorTagListItemOrEnd: ListSave(&ast.Node),245 ErrorTagListItemOrEnd: ListSave(&ast.Node),
...@@ -1510,6 +1510,10 @@ pub const Parser = struct {...@@ -1510,6 +1510,10 @@ pub const Parser = struct {
1510 }1510 }
1511 },1511 },
1512 State.FieldInitListItemOrEnd => |list_state| {1512 State.FieldInitListItemOrEnd => |list_state| {
1513 while (try self.eatLineComment(arena)) |line_comment| {
1514 try list_state.list.append(&line_comment.base);
1515 }
1516
1513 if (self.eatToken(Token.Id.RBrace)) |rbrace| {1517 if (self.eatToken(Token.Id.RBrace)) |rbrace| {
1514 *list_state.ptr = rbrace;1518 *list_state.ptr = rbrace;
1515 continue;1519 continue;
...@@ -1524,7 +1528,7 @@ pub const Parser = struct {...@@ -1524,7 +1528,7 @@ pub const Parser = struct {
1524 .name_token = undefined,1528 .name_token = undefined,
1525 .expr = undefined,1529 .expr = undefined,
1526 });1530 });
1527 try list_state.list.append(node);1531 try list_state.list.append(&node.base);
15281532
1529 stack.append(State { .FieldInitListCommaOrEnd = list_state }) catch unreachable;1533 stack.append(State { .FieldInitListCommaOrEnd = list_state }) catch unreachable;
1530 try stack.append(State { .Expression = OptionalCtx{ .Required = &node.expr } });1534 try stack.append(State { .Expression = OptionalCtx{ .Required = &node.expr } });
...@@ -2346,7 +2350,7 @@ pub const Parser = struct {...@@ -2346,7 +2350,7 @@ pub const Parser = struct {
2346 .base = undefined,2350 .base = undefined,
2347 .lhs = lhs,2351 .lhs = lhs,
2348 .op = ast.Node.SuffixOp.Op {2352 .op = ast.Node.SuffixOp.Op {
2349 .StructInitializer = ArrayList(&ast.Node.FieldInitializer).init(arena),2353 .StructInitializer = ArrayList(&ast.Node).init(arena),
2350 },2354 },
2351 .rtoken = undefined,2355 .rtoken = undefined,
2352 }2356 }
...@@ -2354,7 +2358,7 @@ pub const Parser = struct {...@@ -2354,7 +2358,7 @@ pub const Parser = struct {
2354 stack.append(State { .CurlySuffixExpressionEnd = opt_ctx.toRequired() }) catch unreachable;2358 stack.append(State { .CurlySuffixExpressionEnd = opt_ctx.toRequired() }) catch unreachable;
2355 try stack.append(State { .IfToken = Token.Id.LBrace });2359 try stack.append(State { .IfToken = Token.Id.LBrace });
2356 try stack.append(State {2360 try stack.append(State {
2357 .FieldInitListItemOrEnd = ListSave(&ast.Node.FieldInitializer) {2361 .FieldInitListItemOrEnd = ListSave(&ast.Node) {
2358 .list = &node.op.StructInitializer,2362 .list = &node.op.StructInitializer,
2359 .ptr = &node.rtoken,2363 .ptr = &node.rtoken,
2360 }2364 }
...@@ -3452,7 +3456,6 @@ pub const Parser = struct {...@@ -3452,7 +3456,6 @@ pub const Parser = struct {
3452 Expression: &ast.Node,3456 Expression: &ast.Node,
3453 VarDecl: &ast.Node.VarDecl,3457 VarDecl: &ast.Node.VarDecl,
3454 Statement: &ast.Node,3458 Statement: &ast.Node,
3455 FieldInitializer: &ast.Node.FieldInitializer,
3456 PrintIndent,3459 PrintIndent,
3457 Indent: usize,3460 Indent: usize,
3458 PrintSameLineComment: ?&Token,3461 PrintSameLineComment: ?&Token,
...@@ -3584,12 +3587,6 @@ pub const Parser = struct {...@@ -3584,12 +3587,6 @@ pub const Parser = struct {
3584 }3587 }
3585 },3588 },
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
3593 RenderState.VarDecl => |var_decl| {3590 RenderState.VarDecl => |var_decl| {
3594 try stack.append(RenderState { .Text = ";" });3591 try stack.append(RenderState { .Text = ";" });
3595 if (var_decl.init_node) |init_node| {3592 if (var_decl.init_node) |init_node| {
...@@ -3888,7 +3885,7 @@ pub const Parser = struct {...@@ -3888,7 +3885,7 @@ pub const Parser = struct {
3888 const field_init = field_inits.at(0);3885 const field_init = field_inits.at(0);
38893886
3890 try stack.append(RenderState { .Text = " }" });3887 try stack.append(RenderState { .Text = " }" });
3891 try stack.append(RenderState { .FieldInitializer = field_init });3888 try stack.append(RenderState { .Expression = field_init });
3892 try stack.append(RenderState { .Text = "{ " });3889 try stack.append(RenderState { .Text = "{ " });
3893 try stack.append(RenderState { .Expression = suffix_op.lhs });3890 try stack.append(RenderState { .Expression = suffix_op.lhs });
3894 continue;3891 continue;
...@@ -3896,13 +3893,26 @@ pub const Parser = struct {...@@ -3896,13 +3893,26 @@ pub const Parser = struct {
3896 try stack.append(RenderState { .Text = "}"});3893 try stack.append(RenderState { .Text = "}"});
3897 try stack.append(RenderState.PrintIndent);3894 try stack.append(RenderState.PrintIndent);
3898 try stack.append(RenderState { .Indent = indent });3895 try stack.append(RenderState { .Indent = indent });
3896 try stack.append(RenderState { .Text = "\n" });
3899 var i = field_inits.len;3897 var i = field_inits.len;
3900 while (i != 0) {3898 while (i != 0) {
3901 i -= 1;3899 i -= 1;
3902 const field_init = field_inits.at(i);3900 const field_init = field_inits.at(i);
3903 try stack.append(RenderState { .Text = ",\n" });3901 if (field_init.id != ast.Node.Id.LineComment) {
3904 try stack.append(RenderState { .FieldInitializer = field_init });3902 try stack.append(RenderState { .Text = "," });
3903 }
3904 try stack.append(RenderState { .Expression = field_init });
3905 try stack.append(RenderState.PrintIndent);3905 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 }
3906 }3916 }
3907 try stack.append(RenderState { .Indent = indent + indent_delta });3917 try stack.append(RenderState { .Indent = indent + indent_delta });
3908 try stack.append(RenderState { .Text = "{\n"});3918 try stack.append(RenderState { .Text = "{\n"});
std/zig/parser_test.zig+41
...@@ -1,3 +1,44 @@...@@ -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
1test "zig fmt: doc comments before struct field" {42test "zig fmt: doc comments before struct field" {
2 try testCanonical(43 try testCanonical(
3 \\pub const Allocator = struct {44 \\pub const Allocator = struct {