aboutsummaryrefslogtreecommitdiff
path: root/lib/std
diff options
context:
space:
mode:
Diffstat (limited to 'lib/std')
-rw-r--r--lib/std/zig/ast.zig5
-rw-r--r--lib/std/zig/parse.zig7
-rw-r--r--lib/std/zig/parser_test.zig3
-rw-r--r--lib/std/zig/render.zig8
4 files changed, 21 insertions, 2 deletions
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); // ]
},