unified: Fix handling of 'if case let'

This commit is contained in:
Asger F
2026-06-24 15:12:10 +02:00
parent 7216d12b9a
commit db449dca6a
2 changed files with 80 additions and 3 deletions

View File

@@ -673,13 +673,13 @@ fn translation_rules() -> Vec<Rule<SwiftContext>> {
=>
(switch_case body: (block stmt: {..body}))
),
// if case let x = expr — the pattern is taken as-is (no Optional wrapping)
// if case PATTERN = expr — preserve the pattern directly (no Optional wrapping)
rule!(
(if_let_binding "case" (value_binding_pattern) bound_identifier: @name _ @val)
(if_let_binding "case" pattern: @pat value: @val)
=>
(pattern_guard_expr
value: {val}
pattern: (name_pattern identifier: (identifier #{name})))
pattern: {pat})
),
rule!(
(if_let_binding

View File

@@ -594,6 +594,83 @@ top_level
name_expr
identifier: identifier "x"
===
If-case-let with shadowing in condition value
===
if case let x = x + 10 {
print(x)
}
---
source_file
statement:
if_statement
body:
block
statement:
call_expression
function: simple_identifier "print"
suffix:
call_suffix
arguments:
value_arguments
argument:
value_argument
value: simple_identifier "x"
condition:
if_condition
kind:
if_let_binding
pattern:
pattern
kind:
binding_pattern
binding:
value_binding_pattern
mutability: let
pattern:
pattern
bound_identifier: simple_identifier "x"
value:
additive_expression
lhs: simple_identifier "x"
op: +
rhs: integer_literal "10"
---
top_level
body:
block
stmt:
if_expr
condition:
pattern_guard_expr
pattern:
name_pattern
identifier: identifier "x"
value:
binary_expr
operator: infix_operator "+"
left:
name_expr
identifier: identifier "x"
right: int_literal "10"
then:
block
stmt:
call_expr
argument:
argument
value:
name_expr
identifier: identifier "x"
callee:
name_expr
identifier: identifier "print"
===
Switch with binding pattern
===