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 {
 | 
			
		||||
   14 |         St1 { println('St1') }
 | 
			
		||||
   15 |         St1 { println('St1') }
 | 
			
		||||
      |         ~~~~~
 | 
			
		||||
      |         ~~~
 | 
			
		||||
   16 |         St2 { println('St2') }
 | 
			
		||||
   17 |     }
 | 
			
		||||
vlib/v/checker/tests/match_duplicate_branch.vv:20:3: error: match case `St1` is handled more than once
 | 
			
		||||
   18 |     match i {
 | 
			
		||||
   19 |         St1 { println('St1') }
 | 
			
		||||
   20 |         St1 { println('St1') }
 | 
			
		||||
      |         ~~~~~
 | 
			
		||||
      |         ~~~
 | 
			
		||||
   21 |         else { println('else') }
 | 
			
		||||
   22 |     }
 | 
			
		||||
vlib/v/checker/tests/match_duplicate_branch.vv:29:3: error: match case `green` is handled more than once
 | 
			
		||||
   27 |         .red { println('red') }
 | 
			
		||||
   28 |         .green { println('green') }
 | 
			
		||||
   29 |         .green { println('green') }
 | 
			
		||||
      |         ~~~~~~~~
 | 
			
		||||
      |         ~~~~~~
 | 
			
		||||
   30 |         .blue { println('blue') }
 | 
			
		||||
   31 |     }
 | 
			
		||||
vlib/v/checker/tests/match_duplicate_branch.vv:34:3: error: match case `green` is handled more than once
 | 
			
		||||
   32 |     match c {
 | 
			
		||||
   33 |         .red, .green { println('red green') }
 | 
			
		||||
   34 |         .green { println('green') }
 | 
			
		||||
      |         ~~~~~~~~
 | 
			
		||||
      |         ~~~~~~
 | 
			
		||||
   35 |         else { println('else') }
 | 
			
		||||
   36 |     }
 | 
			
		||||
vlib/v/checker/tests/match_duplicate_branch.vv:43:3: error: match case `2` is handled more than once
 | 
			
		||||
   41 |         1 { println('1') }
 | 
			
		||||
   42 |         2 { println('2') }
 | 
			
		||||
   43 |         2 { println('3') }
 | 
			
		||||
      |         ~~~
 | 
			
		||||
      |         ^
 | 
			
		||||
   44 |         else { println('else') }
 | 
			
		||||
   45 |     }
 | 
			
		||||
vlib/v/checker/tests/match_duplicate_branch.vv:51:3: error: match case `3` is handled more than once
 | 
			
		||||
   49 |     match i {
 | 
			
		||||
   50 |         1...5 { println('1 to 5') }
 | 
			
		||||
   51 |         3 { println('3') }
 | 
			
		||||
      |         ~~~
 | 
			
		||||
      |         ^
 | 
			
		||||
   52 |         else { println('else') }
 | 
			
		||||
   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 {
 | 
			
		||||
    3 |         1 { println('1') }
 | 
			
		||||
    4 |         else { println('else') }
 | 
			
		||||
      |         ~~~~~~
 | 
			
		||||
      |         ~~~~
 | 
			
		||||
    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'
 | 
			
		||||
   22 |         }
 | 
			
		||||
   23 |         else {
 | 
			
		||||
      |         ~~~~~~
 | 
			
		||||
      |         ~~~~
 | 
			
		||||
   24 |             'else'
 | 
			
		||||
   25 |         }
 | 
			
		||||
vlib/v/checker/tests/match_expr_else.vv:34:3: error: `else` must be the last branch of `match`
 | 
			
		||||
   32 |             'string'
 | 
			
		||||
   33 |         }
 | 
			
		||||
   34 |         else {
 | 
			
		||||
      |         ~~~~~~
 | 
			
		||||
      |         ~~~~
 | 
			
		||||
   35 |             'else'
 | 
			
		||||
   36 |         }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -175,9 +175,10 @@ fn (mut p Parser) match_expr() ast.MatchExpr {
 | 
			
		|||
		if p.tok.kind == .key_else {
 | 
			
		||||
			is_else = true
 | 
			
		||||
			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.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{}
 | 
			
		||||
			for {
 | 
			
		||||
				// Sum type match
 | 
			
		||||
| 
						 | 
				
			
			@ -224,18 +225,14 @@ fn (mut p Parser) match_expr() ast.MatchExpr {
 | 
			
		|||
				p.check(.comma)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		branch_last_pos := p.tok.position()
 | 
			
		||||
		branch_last_pos := p.prev_tok.position()
 | 
			
		||||
		// p.warn('match block')
 | 
			
		||||
		p.inside_match_body = true
 | 
			
		||||
		stmts := p.parse_block_no_scope(false)
 | 
			
		||||
		branch_scope := p.scope
 | 
			
		||||
		p.close_scope()
 | 
			
		||||
		p.inside_match_body = false
 | 
			
		||||
		pos := token.Position{
 | 
			
		||||
			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
 | 
			
		||||
		}
 | 
			
		||||
		pos := branch_first_pos.extend(branch_last_pos)
 | 
			
		||||
		post_comments := p.eat_comments()
 | 
			
		||||
		branches << ast.MatchBranch{
 | 
			
		||||
			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