| ... | @@ -238,8 +238,8 @@ pub const Parser = struct { | ... | @@ -238,8 +238,8 @@ pub const Parser = struct { |
| 238 | | 238 | |
| 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); |
| 1528 | | 1532 | |
| 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 | }, |
| 3586 | | 3589 | |
| 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); |
| 3889 | | 3886 | |
| 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"}); |