Skip to content

Commit 142ac47

Browse files
committed
Refactor: map switch case patterns to constructor_pattern instead of tuple_pattern
Changed the desugaring rules to properly map case patterns with binding (e.g., 'case .circle(let r):') to constructor_pattern nodes instead of tuple_pattern. New rules added: - tuple_pattern_item → pattern_element (preserves optional name/key) - pattern.kind: binding_pattern → name_pattern (extracts bound identifier) - pattern.kind: case_pattern → constructor_pattern (creates proper constructor with bound arguments as pattern_elements) This provides a more semantically correct AST representation: - Constructor name: name_expr identifier 'circle' - Elements: pattern_element containing name_pattern identifier 'r' Instead of the previous tuple_pattern string representation. Updated control-flow.txt corpus outputs.
1 parent 2470c13 commit 142ac47

2 files changed

Lines changed: 48 additions & 2 deletions

File tree

unified/extractor/src/languages/swift/swift.rs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,32 @@ fn translation_rules() -> Vec<yeast::Rule> {
282282
rule!((type name: @inner) => {inner}),
283283
// `directly_assignable_expression` is just a wrapper; unwrap it
284284
rule!((directly_assignable_expression expr: @inner) => {inner}),
285+
// tuple_pattern_item → pattern_element (preserves optional name/key)
286+
rule!((tuple_pattern_item name: _? @key pattern: @pat) => (pattern_element key: {..key} pattern: {pat})),
287+
rule!((tuple_pattern_item pattern: @pat) => (pattern_element pattern: {pat})),
288+
// Pattern with 'let' or 'var' binding: extract the inner pattern
289+
// TODO: Names in a pattern need to be translated to expr_equality_pattern if not under a 'var/let' but we lack a way to pass down context to do this.
290+
rule!(
291+
(pattern kind: (binding_pattern binding: _? pattern: @pattern))
292+
=>
293+
{pattern}
294+
),
295+
// case T.foo(x,y) pattern
296+
rule!(
297+
(pattern kind: (case_pattern type: @typ name: @name arguments: (tuple_pattern item: (tuple_pattern_item)* @items)? ))
298+
=>
299+
(constructor_pattern
300+
constructor: (member_access_expr base: {typ} member: (identifier #{name}))
301+
element: {..items})
302+
),
303+
// case .foo(x,y) pattern
304+
rule!(
305+
(pattern kind: (case_pattern name: @name arguments: (tuple_pattern item: (tuple_pattern_item)* @items)? ))
306+
=>
307+
(constructor_pattern
308+
constructor: (member_access_expr base: (inferred_type_expr) member: (identifier #{name}))
309+
element: {..items})
310+
),
285311
// Pattern with bound_identifier → name_pattern
286312
rule!((pattern bound_identifier: @name) => (name_pattern identifier: (identifier #{name}))),
287313
// Tuple pattern (destructuring)

unified/extractor/tests/corpus/swift/control-flow.txt

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -692,7 +692,17 @@ top_level
692692
callee:
693693
name_expr
694694
identifier: identifier "print"
695-
pattern: tuple_pattern ".circle(let r)"
695+
pattern:
696+
constructor_pattern
697+
element:
698+
pattern_element
699+
pattern:
700+
name_pattern
701+
identifier: identifier "r"
702+
constructor:
703+
member_access_expr
704+
base: inferred_type_expr ".circle(let r)"
705+
member: identifier "circle"
696706
switch_case
697707
body:
698708
block
@@ -706,7 +716,17 @@ top_level
706716
callee:
707717
name_expr
708718
identifier: identifier "print"
709-
pattern: tuple_pattern ".square(let s)"
719+
pattern:
720+
constructor_pattern
721+
element:
722+
pattern_element
723+
pattern:
724+
name_pattern
725+
identifier: identifier "s"
726+
constructor:
727+
member_access_expr
728+
base: inferred_type_expr ".square(let s)"
729+
member: identifier "square"
710730
value:
711731
name_expr
712732
identifier: identifier "shape"

0 commit comments

Comments
 (0)