From 3e4df7f140b13e93f0d1c64872c8fff2b3943fbd Mon Sep 17 00:00:00 2001 From: Nick Treleaven Date: Mon, 3 Aug 2020 16:16:06 +0100 Subject: [PATCH] v/fmt: fix dropping `as ident` from `if sum is T` statement (#6049) --- .github/workflows/ci.yml | 1 + vlib/v/fmt/fmt.v | 19 +++++++++---------- vlib/v/fmt/tests/sum_smartcast_keep.vv | 19 +++++++++++++++++++ 3 files changed, 29 insertions(+), 10 deletions(-) create mode 100644 vlib/v/fmt/tests/sum_smartcast_keep.vv diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4384190101..46a61f35b3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -53,6 +53,7 @@ jobs: - name: v fmt run: | ./v fmt -verify vlib/v/checker/checker.v + ./v fmt -verify vlib/v/fmt/fmt.v ./v fmt -verify vlib/v/parser/parser.v ./v fmt -verify vlib/v/gen/cgen.v # - name: Test v binaries diff --git a/vlib/v/fmt/fmt.v b/vlib/v/fmt/fmt.v index a2456b0573..959add0010 100644 --- a/vlib/v/fmt/fmt.v +++ b/vlib/v/fmt/fmt.v @@ -1311,21 +1311,20 @@ pub fn (mut f Fmt) if_expr(it ast.IfExpr) { (it.is_expr || f.is_assign) f.single_line_if = single_line for i, branch in it.branches { - // NOTE: taken from checker in if_expr(). used for smartcast - mut is_variable := false - if branch.cond is ast.InfixExpr { - infix := branch.cond as ast.InfixExpr - if infix.op == .key_is && - (infix.left is ast.Ident || infix.left is ast.SelectorExpr) && infix.right is ast.Type { - // right_expr := infix.right as ast.Type - is_variable = if infix.left is ast.Ident { (infix.left as ast.Ident).kind == .variable } else { true } + // Check `sum is T` smartcast + mut smartcast_as := false + if branch.cond is ast.InfixExpr as infix { + if infix.op == .key_is { + // left_as_name is either empty, infix.left.str() or the `as` name + smartcast_as = branch.left_as_name.len > 0 && + infix.left.str() != branch.left_as_name } } if i == 0 { f.comments(branch.comments, {}) f.write('if ') f.expr(branch.cond) - if is_variable && branch.left_as_name.len > 0 { + if smartcast_as { f.write(' as $branch.left_as_name') } f.write(' {') @@ -1338,7 +1337,7 @@ pub fn (mut f Fmt) if_expr(it ast.IfExpr) { } f.write('else if ') f.expr(branch.cond) - if is_variable && branch.left_as_name.len > 0 { + if smartcast_as { f.write(' as $branch.left_as_name') } f.write(' {') diff --git a/vlib/v/fmt/tests/sum_smartcast_keep.vv b/vlib/v/fmt/tests/sum_smartcast_keep.vv new file mode 100644 index 0000000000..9378122a5a --- /dev/null +++ b/vlib/v/fmt/tests/sum_smartcast_keep.vv @@ -0,0 +1,19 @@ +struct S1 { +} + +struct S2 { +} + +type Sum = S1 | S2 + +fn f(sum Sum) { + if sum is S1 { + } + if sum is S1 as s1 { + } + a := [sum] + if a[0] is S2 { + } + if a[0] is S2 as s2 { + } +}