diff --git a/unified/extractor/src/languages/swift/swift.rs b/unified/extractor/src/languages/swift/swift.rs index 07b4d8774b7..cb0546ce8e1 100644 --- a/unified/extractor/src/languages/swift/swift.rs +++ b/unified/extractor/src/languages/swift/swift.rs @@ -673,13 +673,13 @@ fn translation_rules() -> Vec> { => (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 diff --git a/unified/extractor/tests/corpus/swift/control-flow.txt b/unified/extractor/tests/corpus/swift/control-flow.txt index 00ce2c77db9..f7d59e8cfe4 100644 --- a/unified/extractor/tests/corpus/swift/control-flow.txt +++ b/unified/extractor/tests/corpus/swift/control-flow.txt @@ -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 ===