Skip to content

Commit d06e55c

Browse files
committed
unified: Preserve 'var' and 'let' pattern modifiers in AST
1 parent 9cc80de commit d06e55c

13 files changed

Lines changed: 210 additions & 46 deletions

‎unified/extractor/ast_types.yml‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ supertypes:
22
expr:
33
- name_expr
44
- named_pattern
5+
- expr_pattern
56
- int_literal
67
- float_literal
78
- boolean_literal
@@ -106,6 +107,11 @@ named:
106107
identifier: identifier
107108
sub_pattern?: expr
108109

110+
# A pattern expression with modifiers, such as `let x` or `var x`.
111+
expr_pattern:
112+
modifier*: modifier
113+
expr: expr
114+
109115
# An integer literal
110116
int_literal:
111117

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -515,8 +515,12 @@ fn translation_rules() -> Vec<Rule<SwiftContext>> {
515515
(named_pattern identifier: (identifier #{name}))
516516
),
517517
// A `let`/`var` value-binding pattern (`let x`) inside a case or `if case`
518-
// introduces a new binding; it unwraps to its inner expression.
519-
rule!((valueBindingPattern pattern: @p) => pattern { p }),
518+
// preserves the binding specifier around its inner pattern.
519+
rule!(
520+
(valueBindingPattern bindingSpecifier: @@spec pattern: @p)
521+
=>
522+
(expr_pattern modifier: (modifier #{spec}) expr: {p})
523+
),
520524
// A tuple destructuring pattern (`let (a, b) = …`). A labelled element
521525
// (`let (x: a) = …`) carries its label through as the `argument` name;
522526
// unlabelled elements have no name.

‎unified/extractor/tests/corpus/swift/control-flow/if-case-let-with-shadowing-in-condition-value.output‎

Lines changed: 82 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@ if case let x = x + 10 {
22
print(x)
33
}
44

5+
if case var y = y + 10 {
6+
y += 1
7+
}
8+
59
---
610

711
sourceFile
@@ -57,6 +61,54 @@ sourceFile
5761
bindingSpecifier: let
5862
caseKeyword: case
5963
ifKeyword: if
64+
codeBlockItem
65+
item:
66+
expressionStmt
67+
expression:
68+
ifExpr
69+
body:
70+
codeBlock
71+
leftBrace: {
72+
rightBrace: }
73+
statements:
74+
codeBlockItem
75+
item:
76+
infixOperatorExpr
77+
operator:
78+
binaryOperatorExpr
79+
operator: binaryOperator "+="
80+
leftOperand:
81+
declReferenceExpr
82+
baseName: identifier "y"
83+
rightOperand:
84+
integerLiteralExpr
85+
literal: integerLiteral "1"
86+
conditions:
87+
conditionElement
88+
condition:
89+
matchingPatternCondition
90+
initializer:
91+
initializerClause
92+
equal: =
93+
value:
94+
infixOperatorExpr
95+
operator:
96+
binaryOperatorExpr
97+
operator: binaryOperator "+"
98+
leftOperand:
99+
declReferenceExpr
100+
baseName: identifier "y"
101+
rightOperand:
102+
integerLiteralExpr
103+
literal: integerLiteral "10"
104+
pattern:
105+
valueBindingPattern
106+
pattern:
107+
identifierPattern
108+
identifier: identifier "y"
109+
bindingSpecifier: var
110+
caseKeyword: case
111+
ifKeyword: if
60112

61113
---
62114

@@ -68,8 +120,11 @@ top_level
68120
condition:
69121
pattern_guard_expr
70122
pattern:
71-
named_pattern
72-
identifier: identifier "x"
123+
expr_pattern
124+
modifier: modifier "let"
125+
expr:
126+
named_pattern
127+
identifier: identifier "x"
73128
value:
74129
binary_expr
75130
left:
@@ -89,3 +144,28 @@ top_level
89144
value:
90145
name_expr
91146
identifier: identifier "x"
147+
if_expr
148+
condition:
149+
pattern_guard_expr
150+
pattern:
151+
expr_pattern
152+
modifier: modifier "var"
153+
expr:
154+
named_pattern
155+
identifier: identifier "y"
156+
value:
157+
binary_expr
158+
left:
159+
name_expr
160+
identifier: identifier "y"
161+
operator: infix_operator "+"
162+
right: int_literal "10"
163+
then:
164+
block
165+
stmt:
166+
compound_assign_expr
167+
target:
168+
name_expr
169+
identifier: identifier "y"
170+
operator: infix_operator "+="
171+
value: int_literal "1"
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
11
if case let x = x + 10 {
22
print(x)
33
}
4+
5+
if case var y = y + 10 {
6+
y += 1
7+
}

‎unified/extractor/tests/corpus/swift/control-flow/nested-enum-case-pattern.output‎

Lines changed: 30 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -166,28 +166,31 @@ top_level
166166
case:
167167
switch_case
168168
pattern:
169-
call_expr
170-
callee:
171-
member_access_expr
172-
base: inferred_type_expr "."
173-
member: identifier "received"
174-
argument:
175-
argument
176-
value:
177-
call_expr
178-
callee:
179-
member_access_expr
180-
base: inferred_type_expr "."
181-
member: identifier "some"
182-
argument:
183-
argument
184-
value:
185-
named_pattern
186-
identifier: identifier "value"
187-
argument
188-
value:
189-
named_pattern
190-
identifier: identifier "timestamp"
169+
expr_pattern
170+
modifier: modifier "let"
171+
expr:
172+
call_expr
173+
callee:
174+
member_access_expr
175+
base: inferred_type_expr "."
176+
member: identifier "received"
177+
argument:
178+
argument
179+
value:
180+
call_expr
181+
callee:
182+
member_access_expr
183+
base: inferred_type_expr "."
184+
member: identifier "some"
185+
argument:
186+
argument
187+
value:
188+
named_pattern
189+
identifier: identifier "value"
190+
argument
191+
value:
192+
named_pattern
193+
identifier: identifier "timestamp"
191194
body:
192195
block
193196
stmt:
@@ -216,8 +219,11 @@ top_level
216219
argument:
217220
argument
218221
value:
219-
named_pattern
220-
identifier: identifier "value"
222+
expr_pattern
223+
modifier: modifier "let"
224+
expr:
225+
named_pattern
226+
identifier: identifier "value"
221227
body:
222228
block
223229
stmt:

‎unified/extractor/tests/corpus/swift/control-flow/switch-case-item-where-clauses.output‎

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -170,8 +170,11 @@ top_level
170170
operator: infix_operator ">"
171171
right: int_literal "0"
172172
pattern:
173-
named_pattern
174-
identifier: identifier "x"
173+
expr_pattern
174+
modifier: modifier "let"
175+
expr:
176+
named_pattern
177+
identifier: identifier "x"
175178
body:
176179
block
177180
stmt:
@@ -195,8 +198,11 @@ top_level
195198
operator: infix_operator "<"
196199
right: int_literal "0"
197200
pattern:
198-
named_pattern
199-
identifier: identifier "y"
201+
expr_pattern
202+
modifier: modifier "let"
203+
expr:
204+
named_pattern
205+
identifier: identifier "y"
200206
int_literal "0"
201207
body:
202208
block

‎unified/extractor/tests/corpus/swift/control-flow/switch-with-binding-pattern.output‎

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -134,8 +134,11 @@ top_level
134134
argument:
135135
argument
136136
value:
137-
named_pattern
138-
identifier: identifier "r"
137+
expr_pattern
138+
modifier: modifier "let"
139+
expr:
140+
named_pattern
141+
identifier: identifier "r"
139142
body:
140143
block
141144
stmt:
@@ -158,8 +161,11 @@ top_level
158161
argument:
159162
argument
160163
value:
161-
named_pattern
162-
identifier: identifier "s"
164+
expr_pattern
165+
modifier: modifier "let"
166+
expr:
167+
named_pattern
168+
identifier: identifier "s"
163169
body:
164170
block
165171
stmt:

‎unified/extractor/tests/corpus/swift/control-flow/switch-with-labeled-case-pattern-arguments.output‎

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -168,8 +168,11 @@ top_level
168168
identifier: identifier "_"
169169
argument
170170
value:
171-
named_pattern
172-
identifier: identifier "rowId"
171+
expr_pattern
172+
modifier: modifier "let"
173+
expr:
174+
named_pattern
175+
identifier: identifier "rowId"
173176
body:
174177
block
175178
stmt:

‎unified/extractor/tests/corpus/swift/optionals-and-errors/catch-where-clauses.output‎

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -168,8 +168,11 @@ top_level
168168
name_expr
169169
identifier: identifier "e"
170170
pattern:
171-
named_pattern
172-
identifier: identifier "e"
171+
expr_pattern
172+
modifier: modifier "let"
173+
expr:
174+
named_pattern
175+
identifier: identifier "e"
173176
conditional_pattern
174177
condition:
175178
call_expr
@@ -182,8 +185,11 @@ top_level
182185
name_expr
183186
identifier: identifier "f"
184187
pattern:
185-
named_pattern
186-
identifier: identifier "f"
188+
expr_pattern
189+
modifier: modifier "let"
190+
expr:
191+
named_pattern
192+
identifier: identifier "f"
187193
body:
188194
block
189195
stmt:

‎unified/extractor/tests/corpus/swift/optionals-and-errors/optional-enum-case-binding.output‎

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,8 +98,11 @@ top_level
9898
argument:
9999
argument
100100
value:
101-
named_pattern
102-
identifier: identifier "value"
101+
expr_pattern
102+
modifier: modifier "let"
103+
expr:
104+
named_pattern
105+
identifier: identifier "value"
103106
value:
104107
name_expr
105108
identifier: identifier "input"

0 commit comments

Comments
 (0)