zig fmt: line comments in struct initializer

This commit is contained in:
Andrew Kelley 2018-05-01 01:30:53 -04:00
parent 7c822869fe
commit 3a8dc4e90d
3 changed files with 68 additions and 17 deletions

View File

@ -1269,7 +1269,7 @@ pub const Node = struct {
ArrayAccess: &Node, ArrayAccess: &Node,
Slice: SliceRange, Slice: SliceRange,
ArrayInitializer: ArrayList(&Node), ArrayInitializer: ArrayList(&Node),
StructInitializer: ArrayList(&FieldInitializer), StructInitializer: ArrayList(&Node),
}; };
const CallInfo = struct { const CallInfo = struct {
@ -1311,7 +1311,7 @@ pub const Node = struct {
i -= exprs.len; i -= exprs.len;
}, },
Op.StructInitializer => |fields| { Op.StructInitializer => |fields| {
if (i < fields.len) return &fields.at(i).base; if (i < fields.len) return fields.at(i);
i -= fields.len; i -= fields.len;
}, },
} }

View File

@ -238,8 +238,8 @@ pub const Parser = struct {
ExprListItemOrEnd: ExprListCtx, ExprListItemOrEnd: ExprListCtx,
ExprListCommaOrEnd: ExprListCtx, ExprListCommaOrEnd: ExprListCtx,
FieldInitListItemOrEnd: ListSave(&ast.Node.FieldInitializer), FieldInitListItemOrEnd: ListSave(&ast.Node),
FieldInitListCommaOrEnd: ListSave(&ast.Node.FieldInitializer), FieldInitListCommaOrEnd: ListSave(&ast.Node),
FieldListCommaOrEnd: &ast.Node.ContainerDecl, FieldListCommaOrEnd: &ast.Node.ContainerDecl,
FieldInitValue: OptionalCtx, FieldInitValue: OptionalCtx,
ErrorTagListItemOrEnd: ListSave(&ast.Node), ErrorTagListItemOrEnd: ListSave(&ast.Node),
@ -1510,6 +1510,10 @@ pub const Parser = struct {
} }
}, },
State.FieldInitListItemOrEnd => |list_state| { State.FieldInitListItemOrEnd => |list_state| {
while (try self.eatLineComment(arena)) |line_comment| {
try list_state.list.append(&line_comment.base);
}
if (self.eatToken(Token.Id.RBrace)) |rbrace| { if (self.eatToken(Token.Id.RBrace)) |rbrace| {
*list_state.ptr = rbrace; *list_state.ptr = rbrace;
continue; continue;
@ -1524,7 +1528,7 @@ pub const Parser = struct {
.name_token = undefined, .name_token = undefined,
.expr = undefined, .expr = undefined,
}); });
try list_state.list.append(node); try list_state.list.append(&node.base);
stack.append(State { .FieldInitListCommaOrEnd = list_state }) catch unreachable; stack.append(State { .FieldInitListCommaOrEnd = list_state }) catch unreachable;
try stack.append(State { .Expression = OptionalCtx{ .Required = &node.expr } }); try stack.append(State { .Expression = OptionalCtx{ .Required = &node.expr } });
@ -2346,7 +2350,7 @@ pub const Parser = struct {
.base = undefined, .base = undefined,
.lhs = lhs, .lhs = lhs,
.op = ast.Node.SuffixOp.Op { .op = ast.Node.SuffixOp.Op {
.StructInitializer = ArrayList(&ast.Node.FieldInitializer).init(arena), .StructInitializer = ArrayList(&ast.Node).init(arena),
}, },
.rtoken = undefined, .rtoken = undefined,
} }
@ -2354,7 +2358,7 @@ pub const Parser = struct {
stack.append(State { .CurlySuffixExpressionEnd = opt_ctx.toRequired() }) catch unreachable; stack.append(State { .CurlySuffixExpressionEnd = opt_ctx.toRequired() }) catch unreachable;
try stack.append(State { .IfToken = Token.Id.LBrace }); try stack.append(State { .IfToken = Token.Id.LBrace });
try stack.append(State { try stack.append(State {
.FieldInitListItemOrEnd = ListSave(&ast.Node.FieldInitializer) { .FieldInitListItemOrEnd = ListSave(&ast.Node) {
.list = &node.op.StructInitializer, .list = &node.op.StructInitializer,
.ptr = &node.rtoken, .ptr = &node.rtoken,
} }
@ -3452,7 +3456,6 @@ pub const Parser = struct {
Expression: &ast.Node, Expression: &ast.Node,
VarDecl: &ast.Node.VarDecl, VarDecl: &ast.Node.VarDecl,
Statement: &ast.Node, Statement: &ast.Node,
FieldInitializer: &ast.Node.FieldInitializer,
PrintIndent, PrintIndent,
Indent: usize, Indent: usize,
PrintSameLineComment: ?&Token, PrintSameLineComment: ?&Token,
@ -3584,12 +3587,6 @@ pub const Parser = struct {
} }
}, },
RenderState.FieldInitializer => |field_init| {
try stream.print(".{}", self.tokenizer.getTokenSlice(field_init.name_token));
try stream.print(" = ");
try stack.append(RenderState { .Expression = field_init.expr });
},
RenderState.VarDecl => |var_decl| { RenderState.VarDecl => |var_decl| {
try stack.append(RenderState { .Text = ";" }); try stack.append(RenderState { .Text = ";" });
if (var_decl.init_node) |init_node| { if (var_decl.init_node) |init_node| {
@ -3888,7 +3885,7 @@ pub const Parser = struct {
const field_init = field_inits.at(0); const field_init = field_inits.at(0);
try stack.append(RenderState { .Text = " }" }); try stack.append(RenderState { .Text = " }" });
try stack.append(RenderState { .FieldInitializer = field_init }); try stack.append(RenderState { .Expression = field_init });
try stack.append(RenderState { .Text = "{ " }); try stack.append(RenderState { .Text = "{ " });
try stack.append(RenderState { .Expression = suffix_op.lhs }); try stack.append(RenderState { .Expression = suffix_op.lhs });
continue; continue;
@ -3896,13 +3893,26 @@ pub const Parser = struct {
try stack.append(RenderState { .Text = "}"}); try stack.append(RenderState { .Text = "}"});
try stack.append(RenderState.PrintIndent); try stack.append(RenderState.PrintIndent);
try stack.append(RenderState { .Indent = indent }); try stack.append(RenderState { .Indent = indent });
try stack.append(RenderState { .Text = "\n" });
var i = field_inits.len; var i = field_inits.len;
while (i != 0) { while (i != 0) {
i -= 1; i -= 1;
const field_init = field_inits.at(i); const field_init = field_inits.at(i);
try stack.append(RenderState { .Text = ",\n" }); if (field_init.id != ast.Node.Id.LineComment) {
try stack.append(RenderState { .FieldInitializer = field_init }); try stack.append(RenderState { .Text = "," });
}
try stack.append(RenderState { .Expression = field_init });
try stack.append(RenderState.PrintIndent); try stack.append(RenderState.PrintIndent);
if (i != 0) {
try stack.append(RenderState { .Text = blk: {
const prev_node = field_inits.at(i - 1);
const loc = self.tokenizer.getTokenLocation(prev_node.lastToken().end, field_init.firstToken());
if (loc.line >= 2) {
break :blk "\n\n";
}
break :blk "\n";
}});
}
} }
try stack.append(RenderState { .Indent = indent + indent_delta }); try stack.append(RenderState { .Indent = indent + indent_delta });
try stack.append(RenderState { .Text = "{\n"}); try stack.append(RenderState { .Text = "{\n"});

View File

@ -1,3 +1,44 @@
test "zig fmt: line comments in struct initializer" {
try testCanonical(
\\fn foo() void {
\\ return Self{
\\ .a = b,
\\
\\ // Initialize these two fields to buffer_size so that
\\ // in `readFn` we treat the state as being able to read
\\ .start_index = buffer_size,
\\ .end_index = buffer_size,
\\
\\ // middle
\\
\\ .a = b,
\\
\\ // end
\\ };
\\}
\\
);
}
//TODO
//test "zig fmt: same-line comptime" {
// try testCanonical(
// \\test "" {
// \\ comptime assert(@typeId(T) == builtin.TypeId.Int); // must pass an integer to absInt
// \\}
// \\
// );
//}
//TODO
//test "zig fmt: number literals" {
// try testCanonical(
// \\pub const f64_true_min = 4.94065645841246544177e-324;
// \\
// );
//}
test "zig fmt: doc comments before struct field" { test "zig fmt: doc comments before struct field" {
try testCanonical( try testCanonical(
\\pub const Allocator = struct { \\pub const Allocator = struct {