| ... | ... | @@ -594,6 +594,27 @@ pub const Parser = struct { |
| 594 | 594 | try stack.append(State.AfterOperand); |
| 595 | 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 | 619 | else => return self.parseError(token, "expected primary expression, found {}", @tagName(token.id)), |
| 599 | 620 | } |
| ... | ... | @@ -1770,6 +1791,12 @@ pub const Parser = struct { |
| 1770 | 1791 | |
| 1771 | 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 | 1800 | ast.Node.Id.FieldInitializer => { |
| 1774 | 1801 | const field_init = @fieldParentPtr(ast.NodeFieldInitializer, "base", base); |
| 1775 | 1802 | try stream.print(".{} = ", self.tokenizer.getTokenSlice(field_init.name_token)); |
| ... | ... | @@ -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 | 2270 | test "zig fmt: struct declaration" { |
| 2288 | 2271 | try testCanonical( |
| 2289 | 2272 | \\const S = struct { |
| ... | ... | @@ -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 | 2712 | test "zig fmt: zig fmt" { |
| 2686 | 2713 | try testCanonical(@embedFile("ast.zig")); |
| 2687 | 2714 | try testCanonical(@embedFile("index.zig")); |