Skip to content

Commit 7aca67f

Browse files
authored
ast, parser: fix complex map init (#14206)
1 parent dd94ab8 commit 7aca67f

File tree

3 files changed

+26
-3
lines changed

3 files changed

+26
-3
lines changed

vlib/v/ast/ast.v

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2074,9 +2074,16 @@ pub fn (mut lx IndexExpr) recursive_mapset_is_setter(val bool) {
20742074
if lx.left.is_map {
20752075
lx.left.recursive_mapset_is_setter(val)
20762076
}
2077+
}
2078+
}
2079+
2080+
pub fn (mut lx IndexExpr) recursive_arraymap_set_is_setter() {
2081+
lx.is_setter = true
2082+
if mut lx.left is IndexExpr {
2083+
lx.left.recursive_arraymap_set_is_setter()
20772084
} else if mut lx.left is SelectorExpr {
20782085
if mut lx.left.expr is IndexExpr {
2079-
lx.left.expr.recursive_mapset_is_setter(val)
2086+
lx.left.expr.recursive_arraymap_set_is_setter()
20802087
}
20812088
}
20822089
}

vlib/v/parser/expr.v

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -423,7 +423,7 @@ pub fn (mut p Parser) expr_with_left(left ast.Expr, precedence int, is_stmt_iden
423423
right := p.expr(precedence - 1)
424424
pos.update_last_line(p.prev_tok.line_nr)
425425
if mut node is ast.IndexExpr {
426-
node.recursive_mapset_is_setter(true)
426+
node.recursive_arraymap_set_is_setter()
427427
}
428428
node = ast.InfixExpr{
429429
left: node

vlib/v/tests/complex_map_op_test.v

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,33 @@
1-
fn test_complex_map_op() {
1+
fn test_complex_map_op1() {
22
mut test_map := map[string]Point_map{}
33

44
test_map['test1'].points['point3'] << Point{10, 20}
55
test_map['test2'].points['point4'] << Point{50, 60}
66

77
println(test_map)
8+
89
assert test_map.len == 2
910
assert Point{10, 20} in test_map['test1'].points['point3']
1011
assert Point{50, 60} in test_map['test2'].points['point4']
1112
assert Point{10, 20} !in test_map['test2'].points['point4']
1213
assert Point{1, 2} !in test_map['test1'].points['point3']
1314
}
1415

16+
fn test_complex_map_op2() {
17+
mut test_map := map[string]map[string][]Point{}
18+
19+
test_map['test1']['point3'] << Point{10, 20}
20+
test_map['test2']['point4'] << Point{50, 60}
21+
22+
println(test_map)
23+
24+
assert test_map.len == 2
25+
assert Point{10, 20} in test_map['test1']['point3']
26+
assert Point{50, 60} in test_map['test2']['point4']
27+
assert Point{10, 20} !in test_map['test2']['point4']
28+
assert Point{1, 2} !in test_map['test1']['point3']
29+
}
30+
1531
struct Point {
1632
mut:
1733
x int

0 commit comments

Comments
 (0)