Skip to content

Commit c4b4fde

Browse files
committed
unified: Make switch_case pattern optional; add or_pattern disjunction node
1 parent da3d0cf commit c4b4fde

3 files changed

Lines changed: 73 additions & 55 deletions

File tree

unified/extractor/ast_types.yml

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ supertypes:
4242
- name_pattern
4343
- tuple_pattern
4444
- constructor_pattern
45+
- or_pattern
4546
- ignore_pattern
4647
- expr_equality_pattern
4748
- bulk_importing_pattern
@@ -359,12 +360,12 @@ named:
359360
case*: switch_case
360361

361362
# A single `case ...:` (or `default:`) entry in a switch.
362-
# An entry with multiple `case p1, p2:` patterns has multiple `pattern`s.
363-
# A `default:` entry has no patterns.
363+
# An entry with multiple `case p1, p2:` patterns uses an `or_pattern`.
364+
# A `default:` entry has no pattern.
364365
# An optional `guard` corresponds to a `where`-clause on the case.
365366
switch_case:
366367
modifier*: modifier
367-
pattern*: pattern
368+
pattern?: pattern
368369
guard?: expr
369370
body: block
370371

@@ -421,6 +422,11 @@ named:
421422
constructor: expr_or_type
422423
element*: pattern_element
423424

425+
# A disjunction pattern that matches if any of its sub-patterns match.
426+
or_pattern:
427+
modifier*: modifier
428+
pattern*: pattern
429+
424430
# A pattern with an optional associated name.
425431
pattern_element:
426432
modifier*: modifier

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -654,9 +654,9 @@ fn translation_rules() -> Vec<Rule<SwiftContext>> {
654654
),
655655
// Switch entry with patterns and body
656656
rule!(
657-
(switch_entry pattern: (switch_pattern pattern: @pats)* statement: _* @body)
657+
(switch_entry pattern: (switch_pattern pattern: @pats)+ statement: _* @body)
658658
=>
659-
(switch_case pattern: {..pats} body: (block stmt: {..body}))
659+
(switch_case pattern: (or_pattern pattern: {..pats}) body: (block stmt: {..body}))
660660
),
661661
// Switch entry: default case (no patterns)
662662
rule!(

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

Lines changed: 62 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -559,8 +559,10 @@ top_level
559559
name_expr
560560
identifier: identifier "print"
561561
pattern:
562-
expr_equality_pattern
563-
expr: int_literal "1"
562+
or_pattern
563+
pattern:
564+
expr_equality_pattern
565+
expr: int_literal "1"
564566
switch_case
565567
body:
566568
block
@@ -573,10 +575,12 @@ top_level
573575
name_expr
574576
identifier: identifier "print"
575577
pattern:
576-
expr_equality_pattern
577-
expr: int_literal "2"
578-
expr_equality_pattern
579-
expr: int_literal "3"
578+
or_pattern
579+
pattern:
580+
expr_equality_pattern
581+
expr: int_literal "2"
582+
expr_equality_pattern
583+
expr: int_literal "3"
580584
switch_case
581585
body:
582586
block
@@ -699,16 +703,18 @@ top_level
699703
name_expr
700704
identifier: identifier "print"
701705
pattern:
702-
constructor_pattern
703-
element:
704-
pattern_element
705-
pattern:
706-
name_pattern
707-
identifier: identifier "r"
708-
constructor:
709-
member_access_expr
710-
base: inferred_type_expr "."
711-
member: identifier "circle"
706+
or_pattern
707+
pattern:
708+
constructor_pattern
709+
element:
710+
pattern_element
711+
pattern:
712+
name_pattern
713+
identifier: identifier "r"
714+
constructor:
715+
member_access_expr
716+
base: inferred_type_expr "."
717+
member: identifier "circle"
712718
switch_case
713719
body:
714720
block
@@ -723,16 +729,18 @@ top_level
723729
name_expr
724730
identifier: identifier "print"
725731
pattern:
726-
constructor_pattern
727-
element:
728-
pattern_element
729-
pattern:
730-
name_pattern
731-
identifier: identifier "s"
732-
constructor:
733-
member_access_expr
734-
base: inferred_type_expr "."
735-
member: identifier "square"
732+
or_pattern
733+
pattern:
734+
constructor_pattern
735+
element:
736+
pattern_element
737+
pattern:
738+
name_pattern
739+
identifier: identifier "s"
740+
constructor:
741+
member_access_expr
742+
base: inferred_type_expr "."
743+
member: identifier "square"
736744
value:
737745
name_expr
738746
identifier: identifier "shape"
@@ -844,17 +852,19 @@ top_level
844852
name_expr
845853
identifier: identifier "print"
846854
pattern:
847-
constructor_pattern
848-
element:
849-
pattern_element
850-
key: identifier "isAcknowledged"
851-
pattern:
852-
expr_equality_pattern
853-
expr: boolean_literal "false"
854-
constructor:
855-
member_access_expr
856-
base: inferred_type_expr "."
857-
member: identifier "implicit"
855+
or_pattern
856+
pattern:
857+
constructor_pattern
858+
element:
859+
pattern_element
860+
key: identifier "isAcknowledged"
861+
pattern:
862+
expr_equality_pattern
863+
expr: boolean_literal "false"
864+
constructor:
865+
member_access_expr
866+
base: inferred_type_expr "."
867+
member: identifier "implicit"
858868
switch_case
859869
body:
860870
block
@@ -869,19 +879,21 @@ top_level
869879
name_expr
870880
identifier: identifier "print"
871881
pattern:
872-
constructor_pattern
873-
element:
874-
pattern_element
875-
key: identifier "threadRowId"
876-
pattern: ignore_pattern "_"
877-
pattern_element
878-
pattern:
879-
name_pattern
880-
identifier: identifier "rowId"
881-
constructor:
882-
member_access_expr
883-
base: inferred_type_expr "."
884-
member: identifier "thread"
882+
or_pattern
883+
pattern:
884+
constructor_pattern
885+
element:
886+
pattern_element
887+
key: identifier "threadRowId"
888+
pattern: ignore_pattern "_"
889+
pattern_element
890+
pattern:
891+
name_pattern
892+
identifier: identifier "rowId"
893+
constructor:
894+
member_access_expr
895+
base: inferred_type_expr "."
896+
member: identifier "thread"
885897
value:
886898
name_expr
887899
identifier: identifier "x"

0 commit comments

Comments
 (0)