parser: smartcast mutable selector (#6881)
							parent
							
								
									2e57a1e1a6
								
							
						
					
					
						commit
						41ba942369
					
				| 
						 | 
				
			
			@ -87,8 +87,10 @@ fn (mut p Parser) if_expr(is_comptime bool) ast.IfExpr {
 | 
			
		|||
		comments << p.eat_comments()
 | 
			
		||||
		// `if mut name is T`
 | 
			
		||||
		mut is_mut_name := false
 | 
			
		||||
		if p.tok.kind == .key_mut && p.peek_tok2.kind == .key_is {
 | 
			
		||||
		mut mut_pos := token.Position{}
 | 
			
		||||
		if p.tok.kind == .key_mut {
 | 
			
		||||
			is_mut_name = true
 | 
			
		||||
			mut_pos = p.tok.position()
 | 
			
		||||
			p.next()
 | 
			
		||||
			comments << p.eat_comments()
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			@ -135,6 +137,11 @@ fn (mut p Parser) if_expr(is_comptime bool) ast.IfExpr {
 | 
			
		|||
			} else {
 | 
			
		||||
				''
 | 
			
		||||
			}
 | 
			
		||||
			if !is_is_cast && is_mut_name {
 | 
			
		||||
				p.error_with_pos('remove unnecessary `mut`', mut_pos)
 | 
			
		||||
			}
 | 
			
		||||
		} else if is_mut_name {
 | 
			
		||||
			p.error_with_pos('remove unnecessary `mut`', mut_pos)
 | 
			
		||||
		}
 | 
			
		||||
		end_pos := p.prev_tok.position()
 | 
			
		||||
		body_pos := p.tok.position()
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,7 @@
 | 
			
		|||
vlib/v/parser/tests/unnecessary_mut.vv:3:5: error: remove unnecessary `mut`
 | 
			
		||||
    1 | fn main() {
 | 
			
		||||
    2 |     mut x := 0
 | 
			
		||||
    3 |     if mut x == 0 {
 | 
			
		||||
      |        ~~~
 | 
			
		||||
    4 |         println(true)
 | 
			
		||||
    5 |     }
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,6 @@
 | 
			
		|||
fn main() {
 | 
			
		||||
	mut x := 0
 | 
			
		||||
	if mut x == 0 {
 | 
			
		||||
		println(true)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,6 @@
 | 
			
		|||
vlib/v/parser/tests/unnecessary_mut_2.vv:2:5: error: remove unnecessary `mut`
 | 
			
		||||
    1 | fn main() {
 | 
			
		||||
    2 |     if mut true {
 | 
			
		||||
      |        ~~~
 | 
			
		||||
    3 |         println(true)
 | 
			
		||||
    4 |     }
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,5 @@
 | 
			
		|||
fn main() {
 | 
			
		||||
	if mut true {
 | 
			
		||||
		println(true)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -357,6 +357,11 @@ mut:
 | 
			
		|||
 | 
			
		||||
__type Food = Milk | Eggs
 | 
			
		||||
 | 
			
		||||
struct FoodWrapper {
 | 
			
		||||
mut:
 | 
			
		||||
	food Food
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn test_match_aggregate() {
 | 
			
		||||
	f := Food(Milk{'test'})
 | 
			
		||||
	match union f {
 | 
			
		||||
| 
						 | 
				
			
			@ -410,6 +415,28 @@ fn test_if_not_mut() {
 | 
			
		|||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn test_match_mut_selector() {
 | 
			
		||||
	mut f := FoodWrapper{Food(Milk{'test'})}
 | 
			
		||||
	match union mut f.food {
 | 
			
		||||
		Eggs {
 | 
			
		||||
			f.food.name = 'eggs'
 | 
			
		||||
			assert f.food.name == 'eggs'
 | 
			
		||||
		}
 | 
			
		||||
		Milk {
 | 
			
		||||
			f.food.name = 'milk'
 | 
			
		||||
			assert f.food.name == 'milk'
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn test_if_mut_selector() {
 | 
			
		||||
	mut f := FoodWrapper{Food(Milk{'test'})}
 | 
			
		||||
	if mut f.food is Milk {
 | 
			
		||||
		f.food.name = 'milk'
 | 
			
		||||
		assert f.food.name == 'milk'
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn test_sum_type_match() {
 | 
			
		||||
	// TODO: Remove these casts
 | 
			
		||||
	assert is_gt_simple('3', int(2))
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue