1
0
mirror of https://github.com/vlang/v.git synced 2023-08-10 21:13:21 +03:00

fmt: don't remove mut from if mut smart cast (#6188)

This commit is contained in:
Nick Treleaven 2020-08-21 23:00:02 +01:00 committed by GitHub
parent 06967d9297
commit 1b914d217e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 36 additions and 31 deletions

View File

@ -472,9 +472,10 @@ pub:
pos token.Position pos token.Position
body_pos token.Position body_pos token.Position
comments []Comment comments []Comment
left_as_name string // `name` in `if cond is SumType as name`
mut_name bool // `if mut name is`
pub mut: pub mut:
smartcast bool // should only be true if cond is `x is sumtype`, it will be set in checker - if_expr smartcast bool // true when cond is `x is SumType`, set in checker.if_expr
left_as_name string // only used in x is SumType check
} }
pub struct UnsafeExpr { pub struct UnsafeExpr {

View File

@ -1357,35 +1357,30 @@ pub fn (mut f Fmt) if_expr(it ast.IfExpr) {
} }
} }
if i == 0 { if i == 0 {
// first `if`
f.comments(branch.comments, {}) f.comments(branch.comments, {})
f.write('if ') } else {
f.expr(branch.cond) // `else`, close previous branch
if smartcast_as {
f.write(' as $branch.left_as_name')
}
f.write(' {')
} else if i < it.branches.len - 1 || !it.has_else {
if branch.comments.len > 0 { if branch.comments.len > 0 {
f.writeln('}') f.writeln('}')
f.comments(branch.comments, {}) f.comments(branch.comments, {})
} else { } else {
f.write('} ') f.write('} ')
} }
f.write('else if ') f.write('else ')
f.expr(branch.cond)
if smartcast_as {
f.write(' as $branch.left_as_name')
}
f.write(' {')
} else if i == it.branches.len - 1 && it.has_else {
if branch.comments.len > 0 {
f.writeln('}')
f.comments(branch.comments, {})
} else {
f.write('} ')
}
f.write('else {')
} }
if i < it.branches.len - 1 || !it.has_else {
f.write('if ')
if branch.mut_name {
f.write('mut ')
}
f.expr(branch.cond)
if smartcast_as {
f.write(' as $branch.left_as_name')
}
f.write(' ')
}
f.write('{')
if single_line { if single_line {
f.write(' ') f.write(' ')
} else { } else {

View File

@ -1,4 +1,6 @@
struct S1 { struct S1 {
mut:
i int
} }
struct S2 { struct S2 {
@ -7,7 +9,8 @@ struct S2 {
type Sum = S1 | S2 type Sum = S1 | S2
fn f(sum Sum) { fn f(sum Sum) {
if sum is S1 { if mut sum is S1 {
sum.i++
} }
if sum is S1 as s1 { if sum is S1 as s1 {
} }

View File

@ -21,15 +21,11 @@ fn (mut p Parser) if_expr() ast.IfExpr {
for p.tok.kind in [.key_if, .key_else] { for p.tok.kind in [.key_if, .key_else] {
p.inside_if = true p.inside_if = true
start_pos := p.tok.position() start_pos := p.tok.position()
if p.tok.kind == .key_if { if p.tok.kind == .key_else {
p.next()
} else {
comments << p.eat_comments() comments << p.eat_comments()
p.check(.key_else) p.check(.key_else)
comments << p.eat_comments() comments << p.eat_comments()
if p.tok.kind == .key_if { if p.tok.kind == .lcbr {
p.next()
} else {
// else { // else {
has_else = true has_else = true
p.inside_if = false p.inside_if = false
@ -64,9 +60,18 @@ fn (mut p Parser) if_expr() ast.IfExpr {
break break
} }
} }
// `if` or `else if`
p.check(.key_if)
comments << p.eat_comments()
// `if mut name is T`
mut mut_name := false
if p.tok.kind == .key_mut && p.peek_tok2.kind == .key_is {
mut_name = true
p.next()
comments << p.eat_comments()
}
mut cond := ast.Expr{} mut cond := ast.Expr{}
mut is_guard := false mut is_guard := false
comments << p.eat_comments()
// `if x := opt() {` // `if x := opt() {`
if p.peek_tok.kind == .decl_assign { if p.peek_tok.kind == .decl_assign {
p.open_scope() p.open_scope()
@ -121,6 +126,7 @@ fn (mut p Parser) if_expr() ast.IfExpr {
body_pos: body_pos.extend(p.prev_tok.position()) body_pos: body_pos.extend(p.prev_tok.position())
comments: comments comments: comments
left_as_name: left_as_name left_as_name: left_as_name
mut_name: mut_name
} }
comments = p.eat_comments() comments = p.eat_comments()
if p.tok.kind != .key_else { if p.tok.kind != .key_else {