unified: Make switch_case pattern optional; add or_pattern disjunction node

This commit is contained in:
Asger F
2026-06-24 12:39:50 +02:00
parent da3d0cf977
commit c4b4fde0d7
3 changed files with 73 additions and 55 deletions

View File

@@ -42,6 +42,7 @@ supertypes:
- name_pattern
- tuple_pattern
- constructor_pattern
- or_pattern
- ignore_pattern
- expr_equality_pattern
- bulk_importing_pattern
@@ -359,12 +360,12 @@ named:
case*: switch_case
# A single `case ...:` (or `default:`) entry in a switch.
# An entry with multiple `case p1, p2:` patterns has multiple `pattern`s.
# A `default:` entry has no patterns.
# An entry with multiple `case p1, p2:` patterns uses an `or_pattern`.
# A `default:` entry has no pattern.
# An optional `guard` corresponds to a `where`-clause on the case.
switch_case:
modifier*: modifier
pattern*: pattern
pattern?: pattern
guard?: expr
body: block
@@ -421,6 +422,11 @@ named:
constructor: expr_or_type
element*: pattern_element
# A disjunction pattern that matches if any of its sub-patterns match.
or_pattern:
modifier*: modifier
pattern*: pattern
# A pattern with an optional associated name.
pattern_element:
modifier*: modifier

View File

@@ -654,9 +654,9 @@ fn translation_rules() -> Vec<Rule<SwiftContext>> {
),
// Switch entry with patterns and body
rule!(
(switch_entry pattern: (switch_pattern pattern: @pats)* statement: _* @body)
(switch_entry pattern: (switch_pattern pattern: @pats)+ statement: _* @body)
=>
(switch_case pattern: {..pats} body: (block stmt: {..body}))
(switch_case pattern: (or_pattern pattern: {..pats}) body: (block stmt: {..body}))
),
// Switch entry: default case (no patterns)
rule!(

View File

@@ -559,8 +559,10 @@ top_level
name_expr
identifier: identifier "print"
pattern:
expr_equality_pattern
expr: int_literal "1"
or_pattern
pattern:
expr_equality_pattern
expr: int_literal "1"
switch_case
body:
block
@@ -573,10 +575,12 @@ top_level
name_expr
identifier: identifier "print"
pattern:
expr_equality_pattern
expr: int_literal "2"
expr_equality_pattern
expr: int_literal "3"
or_pattern
pattern:
expr_equality_pattern
expr: int_literal "2"
expr_equality_pattern
expr: int_literal "3"
switch_case
body:
block
@@ -699,16 +703,18 @@ top_level
name_expr
identifier: identifier "print"
pattern:
constructor_pattern
element:
pattern_element
pattern:
name_pattern
identifier: identifier "r"
constructor:
member_access_expr
base: inferred_type_expr "."
member: identifier "circle"
or_pattern
pattern:
constructor_pattern
element:
pattern_element
pattern:
name_pattern
identifier: identifier "r"
constructor:
member_access_expr
base: inferred_type_expr "."
member: identifier "circle"
switch_case
body:
block
@@ -723,16 +729,18 @@ top_level
name_expr
identifier: identifier "print"
pattern:
constructor_pattern
element:
pattern_element
pattern:
name_pattern
identifier: identifier "s"
constructor:
member_access_expr
base: inferred_type_expr "."
member: identifier "square"
or_pattern
pattern:
constructor_pattern
element:
pattern_element
pattern:
name_pattern
identifier: identifier "s"
constructor:
member_access_expr
base: inferred_type_expr "."
member: identifier "square"
value:
name_expr
identifier: identifier "shape"
@@ -844,17 +852,19 @@ top_level
name_expr
identifier: identifier "print"
pattern:
constructor_pattern
element:
pattern_element
key: identifier "isAcknowledged"
pattern:
expr_equality_pattern
expr: boolean_literal "false"
constructor:
member_access_expr
base: inferred_type_expr "."
member: identifier "implicit"
or_pattern
pattern:
constructor_pattern
element:
pattern_element
key: identifier "isAcknowledged"
pattern:
expr_equality_pattern
expr: boolean_literal "false"
constructor:
member_access_expr
base: inferred_type_expr "."
member: identifier "implicit"
switch_case
body:
block
@@ -869,19 +879,21 @@ top_level
name_expr
identifier: identifier "print"
pattern:
constructor_pattern
element:
pattern_element
key: identifier "threadRowId"
pattern: ignore_pattern "_"
pattern_element
pattern:
name_pattern
identifier: identifier "rowId"
constructor:
member_access_expr
base: inferred_type_expr "."
member: identifier "thread"
or_pattern
pattern:
constructor_pattern
element:
pattern_element
key: identifier "threadRowId"
pattern: ignore_pattern "_"
pattern_element
pattern:
name_pattern
identifier: identifier "rowId"
constructor:
member_access_expr
base: inferred_type_expr "."
member: identifier "thread"
value:
name_expr
identifier: identifier "x"