diff --git a/unified/extractor/ast_types.yml b/unified/extractor/ast_types.yml index 73f8ac7f66d..418772aa268 100644 --- a/unified/extractor/ast_types.yml +++ b/unified/extractor/ast_types.yml @@ -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 diff --git a/unified/extractor/src/languages/swift/swift.rs b/unified/extractor/src/languages/swift/swift.rs index c84e3cf3867..adafc253989 100644 --- a/unified/extractor/src/languages/swift/swift.rs +++ b/unified/extractor/src/languages/swift/swift.rs @@ -654,9 +654,9 @@ fn translation_rules() -> Vec> { ), // 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!( diff --git a/unified/extractor/tests/corpus/swift/control-flow.txt b/unified/extractor/tests/corpus/swift/control-flow.txt index 9a740cb9d45..2f209f8c642 100644 --- a/unified/extractor/tests/corpus/swift/control-flow.txt +++ b/unified/extractor/tests/corpus/swift/control-flow.txt @@ -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"