diff --git a/vlib/v/parser/if_match.v b/vlib/v/parser/if_match.v index 454a8cc8c3..66302e1f24 100644 --- a/vlib/v/parser/if_match.v +++ b/vlib/v/parser/if_match.v @@ -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() diff --git a/vlib/v/parser/tests/unnecessary_mut.out b/vlib/v/parser/tests/unnecessary_mut.out new file mode 100644 index 0000000000..4399c9f164 --- /dev/null +++ b/vlib/v/parser/tests/unnecessary_mut.out @@ -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 | } \ No newline at end of file diff --git a/vlib/v/parser/tests/unnecessary_mut.vv b/vlib/v/parser/tests/unnecessary_mut.vv new file mode 100644 index 0000000000..e52a2d9ac7 --- /dev/null +++ b/vlib/v/parser/tests/unnecessary_mut.vv @@ -0,0 +1,6 @@ +fn main() { + mut x := 0 + if mut x == 0 { + println(true) + } +} diff --git a/vlib/v/parser/tests/unnecessary_mut_2.out b/vlib/v/parser/tests/unnecessary_mut_2.out new file mode 100644 index 0000000000..7016e470b9 --- /dev/null +++ b/vlib/v/parser/tests/unnecessary_mut_2.out @@ -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 | } \ No newline at end of file diff --git a/vlib/v/parser/tests/unnecessary_mut_2.vv b/vlib/v/parser/tests/unnecessary_mut_2.vv new file mode 100644 index 0000000000..0df3f80307 --- /dev/null +++ b/vlib/v/parser/tests/unnecessary_mut_2.vv @@ -0,0 +1,5 @@ +fn main() { + if mut true { + println(true) + } +} diff --git a/vlib/v/tests/union_sum_type_test.v b/vlib/v/tests/union_sum_type_test.v index e9a1aec3b3..fb7fd5d1c5 100644 --- a/vlib/v/tests/union_sum_type_test.v +++ b/vlib/v/tests/union_sum_type_test.v @@ -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))