...
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user