Skip to content

Commit 2675070

Browse files
committed
unified/swift: Clean up translation of patterns
Patterns have an unusual parse tree, but now the matching should at least be a bit easier to follow. The TODO regarding not being able to pass down context to handle var/let is still relevant, and can't be solved in the mapping alone.
1 parent c01264d commit 2675070

3 files changed

Lines changed: 40 additions & 13 deletions

File tree

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

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -282,9 +282,8 @@ 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: (identifier #{key}) pattern: {pat})),
287-
rule!((tuple_pattern_item pattern: @pat) => (pattern_element pattern: {pat})),
285+
// Pattern with bound_identifier → name_pattern
286+
rule!((pattern bound_identifier: @name) => (name_pattern identifier: (identifier #{name}))),
288287
// Pattern with 'let' or 'var' binding: extract the inner pattern
289288
// 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.
290289
rule!(
@@ -308,10 +307,18 @@ fn translation_rules() -> Vec<yeast::Rule> {
308307
constructor: (member_access_expr base: (inferred_type_expr #{dot}) member: (identifier #{name}))
309308
element: {..items})
310309
),
311-
// Pattern with bound_identifier → name_pattern
312-
rule!((pattern bound_identifier: @name) => (name_pattern identifier: (identifier #{name}))),
313-
// Tuple pattern (destructuring)
314-
rule!((pattern (pattern)* @elems) => (tuple_pattern element: {..elems})),
310+
// Tuple pattern and its (optionally named) items
311+
rule!((pattern kind: (tuple_pattern item: _* @elems)) => (tuple_pattern element: {..elems})),
312+
rule!((tuple_pattern_item name: @key pattern: @pat) => (pattern_element key: (identifier #{key}) pattern: {pat})),
313+
rule!((tuple_pattern_item pattern: @pat) => (pattern_element pattern: {pat})),
314+
// Type casting pattern (TODO)
315+
rule!((pattern kind: (type_casting_pattern)) => (unsupported_node)),
316+
// Wildcard pattern
317+
rule!((pattern kind: (wildcard_pattern)) => (ignore_pattern)),
318+
// Expression pattern
319+
// We lack a way to check if 'expr' is actually an expression, but due to rule ordering
320+
// the 'expression' case is the only remaining possibility when this rule tries to match.
321+
rule!((pattern kind: @expr) => (expr_equality_pattern expr: {expr})),
315322
// ---- Functions ----
316323
// Function declaration
317324
// Function declaration (return type optional, body statements optional).

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

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -558,7 +558,9 @@ top_level
558558
callee:
559559
name_expr
560560
identifier: identifier "print"
561-
pattern: tuple_pattern "1"
561+
pattern:
562+
expr_equality_pattern
563+
expr: int_literal "1"
562564
switch_case
563565
body:
564566
block
@@ -571,8 +573,10 @@ top_level
571573
name_expr
572574
identifier: identifier "print"
573575
pattern:
574-
tuple_pattern "2"
575-
tuple_pattern "3"
576+
expr_equality_pattern
577+
expr: int_literal "2"
578+
expr_equality_pattern
579+
expr: int_literal "3"
576580
switch_case
577581
body:
578582
block
@@ -844,7 +848,9 @@ top_level
844848
element:
845849
pattern_element
846850
key: identifier "isAcknowledged"
847-
pattern: tuple_pattern "false"
851+
pattern:
852+
expr_equality_pattern
853+
expr: boolean_literal "false"
848854
constructor:
849855
member_access_expr
850856
base: inferred_type_expr "."
@@ -867,7 +873,7 @@ top_level
867873
element:
868874
pattern_element
869875
key: identifier "threadRowId"
870-
pattern: tuple_pattern "_"
876+
pattern: ignore_pattern "_"
871877
pattern_element
872878
pattern:
873879
name_pattern

unified/extractor/tests/corpus/swift/variables.txt

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,21 @@ top_level
195195
stmt:
196196
variable_declaration
197197
modifier: modifier "let"
198-
pattern: tuple_pattern "(a, b)"
198+
pattern:
199+
tuple_pattern
200+
element:
201+
pattern_element
202+
pattern:
203+
expr_equality_pattern
204+
expr:
205+
name_expr
206+
identifier: identifier "a"
207+
pattern_element
208+
pattern:
209+
expr_equality_pattern
210+
expr:
211+
name_expr
212+
identifier: identifier "b"
199213
value:
200214
name_expr
201215
identifier: identifier "pair"

0 commit comments

Comments
 (0)