authorgravatar for mail@isaacfreund.comIsaac Freund <mail@isaacfreund.com> 2021-02-07 14:37:12+01:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2021-02-07 12:04:32-08:00
logbb7b5ee2acb81a69290b2eaafecd6095f3adfe6a
treed97f14f4983fb429dc0a2f782660cc6ff1550c12
parent0929fcbc34a2aa8cd69492c9437622d29a9a46b9

zig fmt: implement catch and return


3 files changed, 51 insertions(+), 40 deletions(-)

lib/std/zig/ast.zig+9-2
...@@ -436,7 +436,6 @@ pub const Tree = struct {...@@ -436,7 +436,6 @@ pub const Tree = struct {
436 .Suspend,436 .Suspend,
437 .Resume,437 .Resume,
438 .Break,438 .Break,
439 .Return,
440 .Nosuspend,439 .Nosuspend,
441 .Comptime,440 .Comptime,
442 => n = datas[n].lhs,441 => n = datas[n].lhs,
...@@ -516,6 +515,12 @@ pub const Tree = struct {...@@ -516,6 +515,12 @@ pub const Tree = struct {
516 .EnumLiteral,515 .EnumLiteral,
517 => return main_tokens[n] + end_offset,516 => return main_tokens[n] + end_offset,
518517
518 .Return => if (datas[n].lhs != 0) {
519 n = datas[n].lhs;
520 } else {
521 return main_tokens[n] + end_offset;
522 },
523
519 .Call => {524 .Call => {
520 end_offset += 1; // for the rparen525 end_offset += 1; // for the rparen
521 const params = tree.extraData(datas[n].rhs, Node.SubRange);526 const params = tree.extraData(datas[n].rhs, Node.SubRange);
...@@ -1791,7 +1796,9 @@ pub const Node = struct {...@@ -1791,7 +1796,9 @@ pub const Node = struct {
1791 /// lhs is unused.1796 /// lhs is unused.
1792 /// rhs is the deferred expression.1797 /// rhs is the deferred expression.
1793 Defer,1798 Defer,
1794 /// lhs is target expr; rhs is fallback expr.1799 /// lhs catch rhs
1800 /// lhs catch |err| rhs
1801 /// main_token is the catch
1795 /// payload is determined by looking at the prev tokens before rhs.1802 /// payload is determined by looking at the prev tokens before rhs.
1796 Catch,1803 Catch,
1797 /// `lhs.a`. main_token is the dot. rhs is the identifier token index.1804 /// `lhs.a`. main_token is the dot. rhs is the identifier token index.
lib/std/zig/parser_test.zig+16-12
...@@ -2622,18 +2622,22 @@ test "zig fmt: ptr deref operator and unwrap optional operator" {...@@ -2622,18 +2622,22 @@ test "zig fmt: ptr deref operator and unwrap optional operator" {
2622// \\2622// \\
2623// );2623// );
2624//}2624//}
2625//2625
2626//test "zig fmt: catch" {2626test "zig fmt: catch" {
2627// try testCanonical(2627 try testCanonical(
2628// \\test "catch" {2628 \\test "catch" {
2629// \\ const a: anyerror!u8 = 0;2629 \\ const a: anyerror!u8 = 0;
2630// \\ _ = a catch return;2630 \\ _ = a catch return;
2631// \\ _ = a catch |err| return;2631 \\ _ = a catch
2632// \\}2632 \\ return;
2633// \\2633 \\ _ = a catch |err| return;
2634// );2634 \\ _ = a catch |err|
2635//}2635 \\ return;
2636//2636 \\}
2637 \\
2638 );
2639}
2640
2637//test "zig fmt: blocks" {2641//test "zig fmt: blocks" {
2638// try testCanonical(2642// try testCanonical(
2639// \\test "blocks" {2643// \\test "blocks" {
lib/std/zig/render.zig+26-26
...@@ -257,27 +257,29 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac...@@ -257,27 +257,29 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac
257 // }257 // }
258 //},258 //},
259259
260 .Catch => unreachable, // TODO260 .Catch => {
261 //.Catch => {261 const main_token = main_tokens[node];
262 // const infix_op_node = @fieldParentPtr(ast.Node.Catch, "base", base);262 const fallback_first = tree.firstToken(datas[node].rhs);
263263
264 // const op_space = Space.Space;264 const same_line = tree.tokensOnSameLine(main_token, fallback_first);
265 // try renderExpression(ais, tree, infix_op_node.lhs, op_space);265 const after_op_space = if (same_line) Space.Space else Space.Newline;
266266
267 // const after_op_space = blk: {267 try renderExpression(ais, tree, datas[node].lhs, .Space); // target
268 // const same_line = tree.tokensOnSameLine(infix_op_node.op_token, tree.nextToken(infix_op_node.op_token));
269 // break :blk if (same_line) op_space else Space.Newline;
270 // };
271268
272 // try renderToken(ais, tree, infix_op_node.op_token, after_op_space);269 if (token_tags[fallback_first - 1] == .Pipe) {
270 try renderToken(ais, tree, main_token, .Space); // catch keyword
271 try renderToken(ais, tree, main_token + 1, .None); // pipe
272 try renderToken(ais, tree, main_token + 2, .None); // payload identifier
273 try renderToken(ais, tree, main_token + 3, after_op_space); // pipe
274 } else {
275 assert(token_tags[fallback_first - 1] == .Keyword_catch);
276 try renderToken(ais, tree, main_token, after_op_space); // catch keyword
277 }
273278
274 // if (infix_op_node.payload) |payload| {279 ais.pushIndentOneShot();
275 // try renderExpression(ais, tree, payload, Space.Space);280 try renderExpression(ais, tree, datas[node].rhs, space); // fallback
276 // }281 },
277282
278 // ais.pushIndentOneShot();
279 // return renderExpression(ais, tree, infix_op_node.rhs, space);
280 //},
281 .FieldAccess => {283 .FieldAccess => {
282 const field_access = datas[node];284 const field_access = datas[node];
283 try renderExpression(ais, tree, field_access.lhs, .None);285 try renderExpression(ais, tree, field_access.lhs, .None);
...@@ -516,16 +518,14 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac...@@ -516,16 +518,14 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac
516 // }518 // }
517 //},519 //},
518520
519 .Return => unreachable, // TODO521 .Return => {
520 //.Return => {522 if (datas[node].lhs != 0) {
521 // const flow_expr = base.castTag(.Return).?;523 try renderToken(ais, tree, main_tokens[node], .Space);
522 // if (flow_expr.getRHS()) |rhs| {524 try renderExpression(ais, tree, datas[node].lhs, space);
523 // try renderToken(ais, tree, flow_expr.ltoken, Space.Space);525 } else {
524 // return renderExpression(ais, tree, rhs, space);526 try renderToken(ais, tree, main_tokens[node], space);
525 // } else {527 }
526 // return renderToken(ais, tree, flow_expr.ltoken, space);528 },
527 // }
528 //},
529529
530 .GroupedExpression => unreachable, // TODO530 .GroupedExpression => unreachable, // TODO
531 //.GroupedExpression => {531 //.GroupedExpression => {