Skip to content

Commit 8693da4

Browse files
authored
parser: fix parsing cast array syntax from another module (fix #17704) (#17739)
1 parent 6b5c746 commit 8693da4

File tree

2 files changed

+19
-3
lines changed

2 files changed

+19
-3
lines changed

vlib/v/parser/parser.v

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2556,15 +2556,23 @@ pub fn (mut p Parser) name_expr() ast.Expr {
25562556
}
25572557
}
25582558
} else if p.peek_tok.kind == .lpar || is_generic_call || is_generic_cast
2559-
|| (p.tok.kind == .lsbr && p.peek_tok.kind == .rsbr && p.peek_token(3).kind == .lpar)
2560-
|| (p.tok.kind == .lsbr && p.peek_tok.kind == .number && p.peek_token(2).kind == .rsbr
2561-
&& p.peek_token(4).kind == .lpar) {
2559+
|| (p.tok.kind == .lsbr && p.peek_tok.kind == .rsbr && (p.peek_token(3).kind == .lpar
2560+
|| p.peek_token(5).kind == .lpar)) || (p.tok.kind == .lsbr && p.peek_tok.kind == .number
2561+
&& p.peek_token(2).kind == .rsbr && (p.peek_token(4).kind == .lpar
2562+
|| p.peek_token(6).kind == .lpar)) {
25622563
// ?[]foo(), ?[1]foo, foo(), foo<int>() or type() cast
25632564
mut name := if is_array {
25642565
p.peek_token(if is_fixed_array { 3 } else { 2 }).lit
25652566
} else {
25662567
p.tok.lit
25672568
}
2569+
if is_fixed_array && p.peek_token(4).kind == .dot {
2570+
mod = name
2571+
name = p.peek_token(5).lit
2572+
} else if is_array && p.peek_token(3).kind == .dot {
2573+
mod = name
2574+
name = p.peek_token(4).lit
2575+
}
25682576
if mod.len > 0 {
25692577
name = '${mod}.${name}'
25702578
}

vlib/v/tests/option_array_submodule_test.v

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,12 @@ fn test_submodule_array_instance() {
88
y := ?amodule.SomeStruct(none)
99
dump(y)
1010
assert y == none
11+
12+
w := ?[]amodule.SomeStruct(none)
13+
dump(w)
14+
assert w == none
15+
16+
z := ?[2]amodule.SomeStruct(none)
17+
dump(z)
18+
assert z == none
1119
}

0 commit comments

Comments
 (0)