parser: fix syntax error for for c in [othermod.Struct{field: 255}] { (fix #24943) (#24978)

This commit is contained in:
Krchi 2025-07-26 11:55:30 +08:00 committed by GitHub
parent ec5eeb57b2
commit 261a4fb31b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 41 additions and 2 deletions

View File

@ -83,8 +83,11 @@ fn (mut p Parser) check_expr(precedence int) !ast.Expr {
p.tok.pos())
} else if p.tok.kind == .question && p.peek_tok.kind == .amp {
node = p.prefix_expr()
} else if p.inside_for_expr && p.tok.kind == .name && p.tok.lit[0].is_capital()
&& p.peek_tok.kind == .lcbr && p.peek_token(2).kind in [.rcbr, .name] {
} else if p.inside_for_expr && p.tok.kind == .name && ((p.tok.lit[0].is_capital()
&& p.peek_tok.kind == .lcbr && p.peek_token(2).kind in [.rcbr, .name])
|| (p.inside_array_lit && p.peek_tok.kind == .dot && p.peek_token(2).kind == .name
&& p.peek_token(2).lit[0].is_capital() && p.peek_token(3).kind == .lcbr
&& p.peek_token(4).kind in [.rcbr, .name])) {
node = p.struct_init(p.mod + '.' + p.tok.lit, .normal, false)
} else if p.is_generic_name() && p.peek_tok.kind == .lcbr
&& p.peek_token(2).kind == .rcbr && p.peek_token(2).line_nr == p.tok.line_nr {

View File

@ -0,0 +1,36 @@
import v.ast
fn test_main() {
for idx, s in [ast.Struct{
scoped_name: '1'
}, ast.Struct{
embeds: [ast.Type(2), 3]
}, ast.Struct{
is_typedef: true
is_union: true
is_heap: true
}, ast.Struct{
is_minify: ast.Struct{
is_anon: true
}.is_generic
is_shared: true
}, ast.Struct{
has_option: true
}] {
println('${idx} ${s}')
if idx == 0 {
assert s.scoped_name == '1'
} else if idx == 1 {
assert s.embeds == [ast.Type(2), 3]
} else if idx == 2 {
assert s.is_typedef == true
assert s.is_union == true
assert s.is_heap == true
} else if idx == 3 {
assert s.is_minify == false
assert s.is_shared == true
} else if idx == 4 {
assert s.has_option == true
}
}
}