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 {
436436 .Suspend,
437437 .Resume,
438438 .Break,
439 .Return,
440439 .Nosuspend,
441440 .Comptime,
442441 => n = datas[n].lhs,
......@@ -516,6 +515,12 @@ pub const Tree = struct {
516515 .EnumLiteral,
517516 => 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
519524 .Call => {
520525 end_offset += 1; // for the rparen
521526 const params = tree.extraData(datas[n].rhs, Node.SubRange);
......@@ -1791,7 +1796,9 @@ pub const Node = struct {
17911796 /// lhs is unused.
17921797 /// rhs is the deferred expression.
17931798 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
17951802 /// payload is determined by looking at the prev tokens before rhs.
17961803 Catch,
17971804 /// `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" {
26222622// \\
26232623// );
26242624//}
2625//
2626//test "zig fmt: catch" {
2627// try testCanonical(
2628// \\test "catch" {
2629// \\ const a: anyerror!u8 = 0;
2630// \\ _ = a catch return;
2631// \\ _ = a catch |err| return;
2632// \\}
2633// \\
2634// );
2635//}
2636//
2625
2626test "zig fmt: catch" {
2627 try testCanonical(
2628 \\test "catch" {
2629 \\ const a: anyerror!u8 = 0;
2630 \\ _ = a catch return;
2631 \\ _ = a catch
2632 \\ return;
2633 \\ _ = a catch |err| return;
2634 \\ _ = a catch |err|
2635 \\ return;
2636 \\}
2637 \\
2638 );
2639}
2640
26372641//test "zig fmt: blocks" {
26382642// try testCanonical(
26392643// \\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
257257 // }
258258 //},
259259
260 .Catch => unreachable, // TODO
261 //.Catch => {
262 // const infix_op_node = @fieldParentPtr(ast.Node.Catch, "base", base);
260 .Catch => {
261 const main_token = main_tokens[node];
262 const fallback_first = tree.firstToken(datas[node].rhs);
263263
264 // const op_space = Space.Space;
265 // try renderExpression(ais, tree, infix_op_node.lhs, op_space);
264 const same_line = tree.tokensOnSameLine(main_token, fallback_first);
265 const after_op_space = if (same_line) Space.Space else Space.Newline;
266266
267 // const after_op_space = blk: {
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 // };
267 try renderExpression(ais, tree, datas[node].lhs, .Space); // target
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| {
275 // try renderExpression(ais, tree, payload, Space.Space);
276 // }
279 ais.pushIndentOneShot();
280 try renderExpression(ais, tree, datas[node].rhs, space); // fallback
281 },
277282
278 // ais.pushIndentOneShot();
279 // return renderExpression(ais, tree, infix_op_node.rhs, space);
280 //},
281283 .FieldAccess => {
282284 const field_access = datas[node];
283285 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
516518 // }
517519 //},
518520
519 .Return => unreachable, // TODO
520 //.Return => {
521 // const flow_expr = base.castTag(.Return).?;
522 // if (flow_expr.getRHS()) |rhs| {
523 // try renderToken(ais, tree, flow_expr.ltoken, Space.Space);
524 // return renderExpression(ais, tree, rhs, space);
525 // } else {
526 // return renderToken(ais, tree, flow_expr.ltoken, space);
527 // }
528 //},
521 .Return => {
522 if (datas[node].lhs != 0) {
523 try renderToken(ais, tree, main_tokens[node], .Space);
524 try renderExpression(ais, tree, datas[node].lhs, space);
525 } else {
526 try renderToken(ais, tree, main_tokens[node], space);
527 }
528 },
529529
530530 .GroupedExpression => unreachable, // TODO
531531 //.GroupedExpression => {