This commit is contained in:
agra
2026-02-10 21:03:56 +02:00
parent bba26ca0d7
commit ef14144d49
5 changed files with 168 additions and 5 deletions

View File

@@ -906,11 +906,37 @@ pub const Parser = struct {
expr = try self.createNode(expr.span.start, .{ .field_access = .{ .object = expr, .field = field } });
}
} else if (self.current.tag == .l_bracket) {
// Index access: expr[expr]
// Index or slice access: expr[expr] or expr[start..end]
self.advance();
const index = try self.parseExpr();
try self.expect(.r_bracket);
expr = try self.createNode(expr.span.start, .{ .index_expr = .{ .object = expr, .index = index } });
if (self.current.tag == .dot_dot) {
// [..end]
self.advance();
const end_expr = try self.parseExpr();
try self.expect(.r_bracket);
expr = try self.createNode(expr.span.start, .{ .slice_expr = .{
.object = expr, .start = null, .end = end_expr,
} });
} else {
const first = try self.parseExpr();
if (self.current.tag == .dot_dot) {
// [start..end] or [start..]
self.advance();
const end_expr: ?*ast.Node = if (self.current.tag != .r_bracket)
try self.parseExpr()
else
null;
try self.expect(.r_bracket);
expr = try self.createNode(expr.span.start, .{ .slice_expr = .{
.object = expr, .start = first, .end = end_expr,
} });
} else {
// [index] — normal index access
try self.expect(.r_bracket);
expr = try self.createNode(expr.span.start, .{ .index_expr = .{
.object = expr, .index = first,
} });
}
}
} else {
break;
}