parser: fix sumtype match with array type (#7939)
parent
15ba53be21
commit
085085a2b9
|
@ -2,41 +2,41 @@ vlib/v/checker/tests/match_duplicate_branch.vv:15:3: error: match case `St1` is
|
||||||
13 | match i {
|
13 | match i {
|
||||||
14 | St1 { println('St1') }
|
14 | St1 { println('St1') }
|
||||||
15 | St1 { println('St1') }
|
15 | St1 { println('St1') }
|
||||||
| ~~~~~
|
| ~~~
|
||||||
16 | St2 { println('St2') }
|
16 | St2 { println('St2') }
|
||||||
17 | }
|
17 | }
|
||||||
vlib/v/checker/tests/match_duplicate_branch.vv:20:3: error: match case `St1` is handled more than once
|
vlib/v/checker/tests/match_duplicate_branch.vv:20:3: error: match case `St1` is handled more than once
|
||||||
18 | match i {
|
18 | match i {
|
||||||
19 | St1 { println('St1') }
|
19 | St1 { println('St1') }
|
||||||
20 | St1 { println('St1') }
|
20 | St1 { println('St1') }
|
||||||
| ~~~~~
|
| ~~~
|
||||||
21 | else { println('else') }
|
21 | else { println('else') }
|
||||||
22 | }
|
22 | }
|
||||||
vlib/v/checker/tests/match_duplicate_branch.vv:29:3: error: match case `green` is handled more than once
|
vlib/v/checker/tests/match_duplicate_branch.vv:29:3: error: match case `green` is handled more than once
|
||||||
27 | .red { println('red') }
|
27 | .red { println('red') }
|
||||||
28 | .green { println('green') }
|
28 | .green { println('green') }
|
||||||
29 | .green { println('green') }
|
29 | .green { println('green') }
|
||||||
| ~~~~~~~~
|
| ~~~~~~
|
||||||
30 | .blue { println('blue') }
|
30 | .blue { println('blue') }
|
||||||
31 | }
|
31 | }
|
||||||
vlib/v/checker/tests/match_duplicate_branch.vv:34:3: error: match case `green` is handled more than once
|
vlib/v/checker/tests/match_duplicate_branch.vv:34:3: error: match case `green` is handled more than once
|
||||||
32 | match c {
|
32 | match c {
|
||||||
33 | .red, .green { println('red green') }
|
33 | .red, .green { println('red green') }
|
||||||
34 | .green { println('green') }
|
34 | .green { println('green') }
|
||||||
| ~~~~~~~~
|
| ~~~~~~
|
||||||
35 | else { println('else') }
|
35 | else { println('else') }
|
||||||
36 | }
|
36 | }
|
||||||
vlib/v/checker/tests/match_duplicate_branch.vv:43:3: error: match case `2` is handled more than once
|
vlib/v/checker/tests/match_duplicate_branch.vv:43:3: error: match case `2` is handled more than once
|
||||||
41 | 1 { println('1') }
|
41 | 1 { println('1') }
|
||||||
42 | 2 { println('2') }
|
42 | 2 { println('2') }
|
||||||
43 | 2 { println('3') }
|
43 | 2 { println('3') }
|
||||||
| ~~~
|
| ^
|
||||||
44 | else { println('else') }
|
44 | else { println('else') }
|
||||||
45 | }
|
45 | }
|
||||||
vlib/v/checker/tests/match_duplicate_branch.vv:51:3: error: match case `3` is handled more than once
|
vlib/v/checker/tests/match_duplicate_branch.vv:51:3: error: match case `3` is handled more than once
|
||||||
49 | match i {
|
49 | match i {
|
||||||
50 | 1...5 { println('1 to 5') }
|
50 | 1...5 { println('1 to 5') }
|
||||||
51 | 3 { println('3') }
|
51 | 3 { println('3') }
|
||||||
| ~~~
|
| ^
|
||||||
52 | else { println('else') }
|
52 | else { println('else') }
|
||||||
53 | }
|
53 | }
|
|
@ -2,6 +2,6 @@ vlib/v/checker/tests/match_else_last_expr.vv:4:3: error: `else` must be the last
|
||||||
2 | match 1 {
|
2 | match 1 {
|
||||||
3 | 1 { println('1') }
|
3 | 1 { println('1') }
|
||||||
4 | else { println('else') }
|
4 | else { println('else') }
|
||||||
| ~~~~~~
|
| ~~~~
|
||||||
5 | 4 { println('4') }
|
5 | 4 { println('4') }
|
||||||
6 | }
|
6 | }
|
|
@ -9,13 +9,13 @@ vlib/v/checker/tests/match_expr_else.vv:23:3: error: match expression is exhaust
|
||||||
21 | 'f64'
|
21 | 'f64'
|
||||||
22 | }
|
22 | }
|
||||||
23 | else {
|
23 | else {
|
||||||
| ~~~~~~
|
| ~~~~
|
||||||
24 | 'else'
|
24 | 'else'
|
||||||
25 | }
|
25 | }
|
||||||
vlib/v/checker/tests/match_expr_else.vv:34:3: error: `else` must be the last branch of `match`
|
vlib/v/checker/tests/match_expr_else.vv:34:3: error: `else` must be the last branch of `match`
|
||||||
32 | 'string'
|
32 | 'string'
|
||||||
33 | }
|
33 | }
|
||||||
34 | else {
|
34 | else {
|
||||||
| ~~~~~~
|
| ~~~~
|
||||||
35 | 'else'
|
35 | 'else'
|
||||||
36 | }
|
36 | }
|
||||||
|
|
|
@ -175,9 +175,10 @@ fn (mut p Parser) match_expr() ast.MatchExpr {
|
||||||
if p.tok.kind == .key_else {
|
if p.tok.kind == .key_else {
|
||||||
is_else = true
|
is_else = true
|
||||||
p.next()
|
p.next()
|
||||||
} else if p.tok.kind == .name && !(p.tok.lit == 'C' &&
|
} else if (p.tok.kind == .name && !(p.tok.lit == 'C' &&
|
||||||
p.peek_tok.kind == .dot) && (p.tok.lit in table.builtin_type_names || p.tok.lit[0].is_capital() ||
|
p.peek_tok.kind == .dot) && (p.tok.lit in table.builtin_type_names || p.tok.lit[0].is_capital() ||
|
||||||
(p.peek_tok.kind == .dot && p.peek_tok2.lit.len > 0 && p.peek_tok2.lit[0].is_capital())) {
|
(p.peek_tok.kind == .dot && p.peek_tok2.lit.len > 0 && p.peek_tok2.lit[0].is_capital()))) ||
|
||||||
|
p.tok.kind == .lsbr {
|
||||||
mut types := []table.Type{}
|
mut types := []table.Type{}
|
||||||
for {
|
for {
|
||||||
// Sum type match
|
// Sum type match
|
||||||
|
@ -224,18 +225,14 @@ fn (mut p Parser) match_expr() ast.MatchExpr {
|
||||||
p.check(.comma)
|
p.check(.comma)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
branch_last_pos := p.tok.position()
|
branch_last_pos := p.prev_tok.position()
|
||||||
// p.warn('match block')
|
// p.warn('match block')
|
||||||
p.inside_match_body = true
|
p.inside_match_body = true
|
||||||
stmts := p.parse_block_no_scope(false)
|
stmts := p.parse_block_no_scope(false)
|
||||||
branch_scope := p.scope
|
branch_scope := p.scope
|
||||||
p.close_scope()
|
p.close_scope()
|
||||||
p.inside_match_body = false
|
p.inside_match_body = false
|
||||||
pos := token.Position{
|
pos := branch_first_pos.extend(branch_last_pos)
|
||||||
line_nr: branch_first_pos.line_nr
|
|
||||||
pos: branch_first_pos.pos
|
|
||||||
len: branch_last_pos.pos - branch_first_pos.pos + branch_last_pos.len
|
|
||||||
}
|
|
||||||
post_comments := p.eat_comments()
|
post_comments := p.eat_comments()
|
||||||
branches << ast.MatchBranch{
|
branches << ast.MatchBranch{
|
||||||
exprs: exprs
|
exprs: exprs
|
||||||
|
|
|
@ -245,3 +245,26 @@ fn test_match_constant_string() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type WithArray = []WithArray | int
|
||||||
|
|
||||||
|
fn test_sumtype_with_array() {
|
||||||
|
fa := [WithArray(0)]
|
||||||
|
f := WithArray(fa)
|
||||||
|
match f {
|
||||||
|
[]WithArray {
|
||||||
|
assert true
|
||||||
|
}
|
||||||
|
int {
|
||||||
|
assert false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
match f {
|
||||||
|
int {
|
||||||
|
assert false
|
||||||
|
}
|
||||||
|
[]WithArray {
|
||||||
|
assert true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue