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