From 290dc5d95b986464a5be91bb3fd0ada2dd0840ae Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Sat, 21 Dec 2019 13:44:00 -0500 Subject: zig fmt support for slice sentinel syntax --- lib/std/zig/ast.zig | 5 +++++ lib/std/zig/parse.zig | 7 ++++++- lib/std/zig/parser_test.zig | 3 +++ lib/std/zig/render.zig | 8 +++++++- 4 files changed, 21 insertions(+), 2 deletions(-) (limited to 'lib/std') diff --git a/lib/std/zig/ast.zig b/lib/std/zig/ast.zig index 47933917b1..e27e62c094 100644 --- a/lib/std/zig/ast.zig +++ b/lib/std/zig/ast.zig @@ -1701,6 +1701,7 @@ pub const Node = struct { pub const Slice = struct { start: *Node, end: ?*Node, + sentinel: ?*Node, }; }; @@ -1732,6 +1733,10 @@ pub const Node = struct { if (i < 1) return end; i -= 1; } + if (range.sentinel) |sentinel| { + if (i < 1) return sentinel; + i -= 1; + } }, .ArrayInitializer => |*exprs| { if (i < exprs.len) return exprs.at(i).*; diff --git a/lib/std/zig/parse.zig b/lib/std/zig/parse.zig index bcf0ea01da..5b168be2e1 100644 --- a/lib/std/zig/parse.zig +++ b/lib/std/zig/parse.zig @@ -2331,7 +2331,7 @@ fn parsePrefixTypeOp(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node } /// SuffixOp -/// <- LBRACKET Expr (DOT2 Expr?)? RBRACKET +/// <- LBRACKET Expr (DOT2 (Expr (COLON Expr)?)?)? RBRACKET /// / DOT IDENTIFIER /// / DOTASTERISK /// / DOTQUESTIONMARK @@ -2349,11 +2349,16 @@ fn parseSuffixOp(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node { if (eatToken(it, .Ellipsis2) != null) { const end_expr = try parseExpr(arena, it, tree); + const sentinel: ?*ast.Node = if (eatToken(it, .Colon) != null) + try parseExpr(arena, it, tree) + else + null; break :blk OpAndToken{ .op = Op{ .Slice = Op.Slice{ .start = index_expr, .end = end_expr, + .sentinel = sentinel, }, }, .token = try expectToken(it, tree, .RBracket), diff --git a/lib/std/zig/parser_test.zig b/lib/std/zig/parser_test.zig index ba022eec95..f193e1b6ef 100644 --- a/lib/std/zig/parser_test.zig +++ b/lib/std/zig/parser_test.zig @@ -419,10 +419,13 @@ test "zig fmt: pointer of unknown length" { test "zig fmt: spaces around slice operator" { try testCanonical( \\var a = b[c..d]; + \\var a = b[c..d :0]; \\var a = b[c + 1 .. d]; \\var a = b[c + 1 ..]; \\var a = b[c .. d + 1]; + \\var a = b[c .. d + 1 :0]; \\var a = b[c.a..d.e]; + \\var a = b[c.a..d.e :0]; \\ ); } diff --git a/lib/std/zig/render.zig b/lib/std/zig/render.zig index 41b8c48b10..263f45a88b 100644 --- a/lib/std/zig/render.zig +++ b/lib/std/zig/render.zig @@ -689,7 +689,13 @@ fn renderExpression( try renderExpression(allocator, stream, tree, indent, start_col, range.start, after_start_space); try renderToken(tree, stream, dotdot, indent, start_col, after_op_space); // .. if (range.end) |end| { - try renderExpression(allocator, stream, tree, indent, start_col, end, Space.None); + const after_end_space = if (range.sentinel != null) Space.Space else Space.None; + try renderExpression(allocator, stream, tree, indent, start_col, end, after_end_space); + } + if (range.sentinel) |sentinel| { + const colon = tree.prevToken(sentinel.firstToken()); + try renderToken(tree, stream, colon, indent, start_col, Space.None); // : + try renderExpression(allocator, stream, tree, indent, start_col, sentinel, Space.None); } return renderToken(tree, stream, suffix_op.rtoken, indent, start_col, space); // ] }, -- cgit v1.2.3