| author | |
| committer | |
| log | 9d69e94bbad0b1ff23999584f5f632cfe8db3656 |
| tree | 41b7fd86a7a450e8ccf9b596a7bdb2e670e5d204 |
| parent | 5c82ed2ea9360ea0931ba789a4ffb73d689b6a72 |
* I also moved some tests down, as they fail in ways I can't fix yet2 files changed, 99 insertions(+), 44 deletions(-)
std/zig/ast.zig+28| ... | @@ -18,6 +18,7 @@ pub const Node = struct { | ... | @@ -18,6 +18,7 @@ pub const Node = struct { |
| 18 | InfixOp, | 18 | InfixOp, |
| 19 | PrefixOp, | 19 | PrefixOp, |
| 20 | SuffixOp, | 20 | SuffixOp, |
| 21 | GroupedExpression, | ||
| 21 | FieldInitializer, | 22 | FieldInitializer, |
| 22 | IntegerLiteral, | 23 | IntegerLiteral, |
| 23 | FloatLiteral, | 24 | FloatLiteral, |
| ... | @@ -46,6 +47,7 @@ pub const Node = struct { | ... | @@ -46,6 +47,7 @@ pub const Node = struct { |
| 46 | Id.InfixOp => @fieldParentPtr(NodeInfixOp, "base", base).iterate(index), | 47 | Id.InfixOp => @fieldParentPtr(NodeInfixOp, "base", base).iterate(index), |
| 47 | Id.PrefixOp => @fieldParentPtr(NodePrefixOp, "base", base).iterate(index), | 48 | Id.PrefixOp => @fieldParentPtr(NodePrefixOp, "base", base).iterate(index), |
| 48 | Id.SuffixOp => @fieldParentPtr(NodeSuffixOp, "base", base).iterate(index), | 49 | Id.SuffixOp => @fieldParentPtr(NodeSuffixOp, "base", base).iterate(index), |
| 50 | Id.GroupedExpression => @fieldParentPtr(NodeGroupedExpression, "base", base).iterate(index), | ||
| 49 | Id.FieldInitializer => @fieldParentPtr(NodeFieldInitializer, "base", base).iterate(index), | 51 | Id.FieldInitializer => @fieldParentPtr(NodeFieldInitializer, "base", base).iterate(index), |
| 50 | Id.IntegerLiteral => @fieldParentPtr(NodeIntegerLiteral, "base", base).iterate(index), | 52 | Id.IntegerLiteral => @fieldParentPtr(NodeIntegerLiteral, "base", base).iterate(index), |
| 51 | Id.FloatLiteral => @fieldParentPtr(NodeFloatLiteral, "base", base).iterate(index), | 53 | Id.FloatLiteral => @fieldParentPtr(NodeFloatLiteral, "base", base).iterate(index), |
| ... | @@ -75,6 +77,7 @@ pub const Node = struct { | ... | @@ -75,6 +77,7 @@ pub const Node = struct { |
| 75 | Id.InfixOp => @fieldParentPtr(NodeInfixOp, "base", base).firstToken(), | 77 | Id.InfixOp => @fieldParentPtr(NodeInfixOp, "base", base).firstToken(), |
| 76 | Id.PrefixOp => @fieldParentPtr(NodePrefixOp, "base", base).firstToken(), | 78 | Id.PrefixOp => @fieldParentPtr(NodePrefixOp, "base", base).firstToken(), |
| 77 | Id.SuffixOp => @fieldParentPtr(NodeSuffixOp, "base", base).firstToken(), | 79 | Id.SuffixOp => @fieldParentPtr(NodeSuffixOp, "base", base).firstToken(), |
| 80 | Id.GroupedExpression => @fieldParentPtr(NodeGroupedExpression, "base", base).firstToken(), | ||
| 78 | Id.FieldInitializer => @fieldParentPtr(NodeFieldInitializer, "base", base).firstToken(), | 81 | Id.FieldInitializer => @fieldParentPtr(NodeFieldInitializer, "base", base).firstToken(), |
| 79 | Id.IntegerLiteral => @fieldParentPtr(NodeIntegerLiteral, "base", base).firstToken(), | 82 | Id.IntegerLiteral => @fieldParentPtr(NodeIntegerLiteral, "base", base).firstToken(), |
| 80 | Id.FloatLiteral => @fieldParentPtr(NodeFloatLiteral, "base", base).firstToken(), | 83 | Id.FloatLiteral => @fieldParentPtr(NodeFloatLiteral, "base", base).firstToken(), |
| ... | @@ -104,6 +107,7 @@ pub const Node = struct { | ... | @@ -104,6 +107,7 @@ pub const Node = struct { |
| 104 | Id.InfixOp => @fieldParentPtr(NodeInfixOp, "base", base).lastToken(), | 107 | Id.InfixOp => @fieldParentPtr(NodeInfixOp, "base", base).lastToken(), |
| 105 | Id.PrefixOp => @fieldParentPtr(NodePrefixOp, "base", base).lastToken(), | 108 | Id.PrefixOp => @fieldParentPtr(NodePrefixOp, "base", base).lastToken(), |
| 106 | Id.SuffixOp => @fieldParentPtr(NodeSuffixOp, "base", base).lastToken(), | 109 | Id.SuffixOp => @fieldParentPtr(NodeSuffixOp, "base", base).lastToken(), |
| 110 | Id.GroupedExpression => @fieldParentPtr(NodeGroupedExpression, "base", base).lastToken(), | ||
| 107 | Id.FieldInitializer => @fieldParentPtr(NodeFieldInitializer, "base", base).lastToken(), | 111 | Id.FieldInitializer => @fieldParentPtr(NodeFieldInitializer, "base", base).lastToken(), |
| 108 | Id.IntegerLiteral => @fieldParentPtr(NodeIntegerLiteral, "base", base).lastToken(), | 112 | Id.IntegerLiteral => @fieldParentPtr(NodeIntegerLiteral, "base", base).lastToken(), |
| 109 | Id.FloatLiteral => @fieldParentPtr(NodeFloatLiteral, "base", base).lastToken(), | 113 | Id.FloatLiteral => @fieldParentPtr(NodeFloatLiteral, "base", base).lastToken(), |
| ... | @@ -624,6 +628,30 @@ pub const NodeSuffixOp = struct { | ... | @@ -624,6 +628,30 @@ pub const NodeSuffixOp = struct { |
| 624 | } | 628 | } |
| 625 | }; | 629 | }; |
| 626 | 630 | ||
| 631 | pub const NodeGroupedExpression = struct { | ||
| 632 | base: Node, | ||
| 633 | lparen: Token, | ||
| 634 | expr: &Node, | ||
| 635 | rparen: Token, | ||
| 636 | |||
| 637 | pub fn iterate(self: &NodeGroupedExpression, index: usize) ?&Node { | ||
| 638 | var i = index; | ||
| 639 | |||
| 640 | if (i < 1) return self.expr; | ||
| 641 | i -= 1; | ||
| 642 | |||
| 643 | return null; | ||
| 644 | } | ||
| 645 | |||
| 646 | pub fn firstToken(self: &NodeGroupedExpression) Token { | ||
| 647 | return self.lparen; | ||
| 648 | } | ||
| 649 | |||
| 650 | pub fn lastToken(self: &NodeGroupedExpression) Token { | ||
| 651 | return self.rparen; | ||
| 652 | } | ||
| 653 | }; | ||
| 654 | |||
| 627 | pub const NodeIntegerLiteral = struct { | 655 | pub const NodeIntegerLiteral = struct { |
| 628 | base: Node, | 656 | base: Node, |
| 629 | token: Token, | 657 | token: Token, |
std/zig/parser.zig+71-44| ... | @@ -594,6 +594,27 @@ pub const Parser = struct { | ... | @@ -594,6 +594,27 @@ pub const Parser = struct { |
| 594 | try stack.append(State.AfterOperand); | 594 | try stack.append(State.AfterOperand); |
| 595 | continue; | 595 | continue; |
| 596 | }, | 596 | }, |
| 597 | Token.Id.LParen => { | ||
| 598 | const node = try arena.create(ast.NodeGroupedExpression); | ||
| 599 | *node = ast.NodeGroupedExpression { | ||
| 600 | .base = self.initNode(ast.Node.Id.GroupedExpression), | ||
| 601 | .lparen = token, | ||
| 602 | .expr = undefined, | ||
| 603 | .rparen = undefined, | ||
| 604 | }; | ||
| 605 | try stack.append(State { | ||
| 606 | .Operand = &node.base | ||
| 607 | }); | ||
| 608 | try stack.append(State.AfterOperand); | ||
| 609 | try stack.append(State { | ||
| 610 | .ExpectTokenSave = ExpectTokenSave { | ||
| 611 | .id = Token.Id.RParen, | ||
| 612 | .ptr = &node.rparen, | ||
| 613 | } | ||
| 614 | }); | ||
| 615 | try stack.append(State { .Expression = DestPtr { .Field = &node.expr } }); | ||
| 616 | continue; | ||
| 617 | }, | ||
| 597 | 618 | ||
| 598 | else => return self.parseError(token, "expected primary expression, found {}", @tagName(token.id)), | 619 | else => return self.parseError(token, "expected primary expression, found {}", @tagName(token.id)), |
| 599 | } | 620 | } |
| ... | @@ -1770,6 +1791,12 @@ pub const Parser = struct { | ... | @@ -1770,6 +1791,12 @@ pub const Parser = struct { |
| 1770 | 1791 | ||
| 1771 | try stack.append(RenderState { .Expression = suffix_op.lhs }); | 1792 | try stack.append(RenderState { .Expression = suffix_op.lhs }); |
| 1772 | }, | 1793 | }, |
| 1794 | ast.Node.Id.GroupedExpression => { | ||
| 1795 | const grouped_expr = @fieldParentPtr(ast.NodeGroupedExpression, "base", base); | ||
| 1796 | try stack.append(RenderState { .Text = ")"}); | ||
| 1797 | try stack.append(RenderState { .Expression = grouped_expr.expr }); | ||
| 1798 | try stack.append(RenderState { .Text = "("}); | ||
| 1799 | }, | ||
| 1773 | ast.Node.Id.FieldInitializer => { | 1800 | ast.Node.Id.FieldInitializer => { |
| 1774 | const field_init = @fieldParentPtr(ast.NodeFieldInitializer, "base", base); | 1801 | const field_init = @fieldParentPtr(ast.NodeFieldInitializer, "base", base); |
| 1775 | try stream.print(".{} = ", self.tokenizer.getTokenSlice(field_init.name_token)); | 1802 | try stream.print(".{} = ", self.tokenizer.getTokenSlice(field_init.name_token)); |
| ... | @@ -2240,50 +2267,6 @@ test "zig fmt: indexing" { | ... | @@ -2240,50 +2267,6 @@ test "zig fmt: indexing" { |
| 2240 | ); | 2267 | ); |
| 2241 | } | 2268 | } |
| 2242 | 2269 | ||
| 2243 | test "zig fmt: arrays" { | ||
| 2244 | try testCanonical( | ||
| 2245 | \\test "test array" { | ||
| 2246 | \\ const a: [2]u8 = [2]u8{ 1, 2 }; | ||
| 2247 | \\ const a: [2]u8 = []u8{ 1, 2 }; | ||
| 2248 | \\ const a: [0]u8 = []u8{}; | ||
| 2249 | \\} | ||
| 2250 | \\ | ||
| 2251 | ); | ||
| 2252 | } | ||
| 2253 | |||
| 2254 | test "zig fmt: precedence" { | ||
| 2255 | try testCanonical( | ||
| 2256 | \\test "precedence" { | ||
| 2257 | \\ a!b(); | ||
| 2258 | \\ (a!b)(); | ||
| 2259 | \\ !a!b; | ||
| 2260 | \\ !(a!b); | ||
| 2261 | \\ !a{}; | ||
| 2262 | \\ !(a{}); | ||
| 2263 | \\ a + b{}; | ||
| 2264 | \\ (a + b){}; | ||
| 2265 | \\ a << b + c; | ||
| 2266 | \\ (a << b) + c; | ||
| 2267 | \\ a & b << c; | ||
| 2268 | \\ (a & b) << c; | ||
| 2269 | \\ a ^ b & c; | ||
| 2270 | \\ (a ^ b) & c; | ||
| 2271 | \\ a | b ^ c; | ||
| 2272 | \\ (a | b) ^ c; | ||
| 2273 | \\ a == b | c; | ||
| 2274 | \\ (a == b) | c; | ||
| 2275 | \\ a and b == c; | ||
| 2276 | \\ (a and b) == c; | ||
| 2277 | \\ a or b and c; | ||
| 2278 | \\ (a or b) and c; | ||
| 2279 | \\ (a or b) and c; | ||
| 2280 | \\ a = b or c; | ||
| 2281 | \\ (a = b) or c; | ||
| 2282 | \\} | ||
| 2283 | \\ | ||
| 2284 | ); | ||
| 2285 | } | ||
| 2286 | |||
| 2287 | test "zig fmt: struct declaration" { | 2270 | test "zig fmt: struct declaration" { |
| 2288 | try testCanonical( | 2271 | try testCanonical( |
| 2289 | \\const S = struct { | 2272 | \\const S = struct { |
| ... | @@ -2682,6 +2665,50 @@ test "zig fmt: coroutines" { | ... | @@ -2682,6 +2665,50 @@ test "zig fmt: coroutines" { |
| 2682 | ); | 2665 | ); |
| 2683 | } | 2666 | } |
| 2684 | 2667 | ||
| 2668 | test "zig fmt: arrays" { | ||
| 2669 | try testCanonical( | ||
| 2670 | \\test "test array" { | ||
| 2671 | \\ const a: [2]u8 = [2]u8{ 1, 2 }; | ||
| 2672 | \\ const a: [2]u8 = []u8{ 1, 2 }; | ||
| 2673 | \\ const a: [0]u8 = []u8{}; | ||
| 2674 | \\} | ||
| 2675 | \\ | ||
| 2676 | ); | ||
| 2677 | } | ||
| 2678 | |||
| 2679 | test "zig fmt: precedence" { | ||
| 2680 | try testCanonical( | ||
| 2681 | \\test "precedence" { | ||
| 2682 | \\ a!b(); | ||
| 2683 | \\ (a!b)(); | ||
| 2684 | \\ !a!b; | ||
| 2685 | \\ !(a!b); | ||
| 2686 | \\ !a{}; | ||
| 2687 | \\ !(a{}); | ||
| 2688 | \\ a + b{}; | ||
| 2689 | \\ (a + b){}; | ||
| 2690 | \\ a << b + c; | ||
| 2691 | \\ (a << b) + c; | ||
| 2692 | \\ a & b << c; | ||
| 2693 | \\ (a & b) << c; | ||
| 2694 | \\ a ^ b & c; | ||
| 2695 | \\ (a ^ b) & c; | ||
| 2696 | \\ a | b ^ c; | ||
| 2697 | \\ (a | b) ^ c; | ||
| 2698 | \\ a == b | c; | ||
| 2699 | \\ (a == b) | c; | ||
| 2700 | \\ a and b == c; | ||
| 2701 | \\ (a and b) == c; | ||
| 2702 | \\ a or b and c; | ||
| 2703 | \\ (a or b) and c; | ||
| 2704 | \\ (a or b) and c; | ||
| 2705 | \\ a = b or c; | ||
| 2706 | \\ (a = b) or c; | ||
| 2707 | \\} | ||
| 2708 | \\ | ||
| 2709 | ); | ||
| 2710 | } | ||
| 2711 | |||
| 2685 | test "zig fmt: zig fmt" { | 2712 | test "zig fmt: zig fmt" { |
| 2686 | try testCanonical(@embedFile("ast.zig")); | 2713 | try testCanonical(@embedFile("ast.zig")); |
| 2687 | try testCanonical(@embedFile("index.zig")); | 2714 | try testCanonical(@embedFile("index.zig")); |