Skip to content

Commit 3b56e52

Browse files
committed
unified: Fix issue with '_' as an assignment target
1 parent c1ef3f1 commit 3b56e52

5 files changed

Lines changed: 136 additions & 5 deletions

File tree

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -267,8 +267,11 @@ fn translation_rules() -> Vec<Rule<SwiftContext>> {
267267
// `reduce(0, +)`), are both `declReferenceExpr`; its `baseName` is the
268268
// referenced identifier / operator symbol.
269269
rule!((declReferenceExpr baseName: @name) => (name_expr identifier: (identifier #{name}))),
270-
// A discard `_` used as the target of an assignment becomes an `ignore_pattern`.
271-
rule!((discardAssignmentExpr wildcard: @@w) => (ignore_pattern #{w})),
270+
// A discard `_` used as the target of an assignment becomes a `builtin_expr` because the LHS of a
271+
// tuple-assignment such as `(foo.x, _) = ...` can't contain a mix of patterns and exprs. So we consistently
272+
// use exprs.
273+
rule!((discardAssignmentExpr wildcard: @@w) where ctx.in_pattern => (ignore_pattern #{w})),
274+
rule!((discardAssignmentExpr wildcard: @@w) => (builtin_expr #{w})),
272275
// A generic specialization in expression position (`C<Foo>`,
273276
// `Array<Int>`) is represented by swift-syntax as a
274277
// `genericSpecializationExpr`. When used as a call target

unified/extractor/tests/corpus/swift/operators/unresolved-operator-sequence-with-casts.output

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ top_level
117117
stmt:
118118
unresolved_operator_sequence
119119
element:
120-
ignore_pattern "_"
120+
builtin_expr "_"
121121
infix_operator "="
122122
name_expr
123123
identifier: identifier "a"
@@ -128,7 +128,7 @@ top_level
128128
identifier: identifier "b"
129129
unresolved_operator_sequence
130130
element:
131-
ignore_pattern "_"
131+
builtin_expr "_"
132132
infix_operator "="
133133
name_expr
134134
identifier: identifier "a"

unified/extractor/tests/corpus/swift/operators/unresolved-operator-sequence.output

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ top_level
9090
stmt:
9191
unresolved_operator_sequence
9292
element:
93-
ignore_pattern "_"
93+
builtin_expr "_"
9494
infix_operator "="
9595
name_expr
9696
identifier: identifier "a"
Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
(x, _) = (1, 2)
2+
(foo.x, _) = (1, 2)
3+
4+
---
5+
6+
sourceFile
7+
endOfFileToken: endOfFile
8+
statements:
9+
codeBlockItem
10+
item:
11+
infixOperatorExpr
12+
operator:
13+
assignmentExpr
14+
equal: =
15+
leftOperand:
16+
tupleExpr
17+
leftParen: (
18+
rightParen: )
19+
elements:
20+
labeledExpr
21+
expression:
22+
declReferenceExpr
23+
baseName: identifier "x"
24+
trailingComma: ,
25+
labeledExpr
26+
expression:
27+
discardAssignmentExpr
28+
wildcard: _
29+
rightOperand:
30+
tupleExpr
31+
leftParen: (
32+
rightParen: )
33+
elements:
34+
labeledExpr
35+
expression:
36+
integerLiteralExpr
37+
literal: integerLiteral "1"
38+
trailingComma: ,
39+
labeledExpr
40+
expression:
41+
integerLiteralExpr
42+
literal: integerLiteral "2"
43+
codeBlockItem
44+
item:
45+
infixOperatorExpr
46+
operator:
47+
assignmentExpr
48+
equal: =
49+
leftOperand:
50+
tupleExpr
51+
leftParen: (
52+
rightParen: )
53+
elements:
54+
labeledExpr
55+
expression:
56+
memberAccessExpr
57+
period: .
58+
declName:
59+
declReferenceExpr
60+
baseName: identifier "x"
61+
base:
62+
declReferenceExpr
63+
baseName: identifier "foo"
64+
trailingComma: ,
65+
labeledExpr
66+
expression:
67+
discardAssignmentExpr
68+
wildcard: _
69+
rightOperand:
70+
tupleExpr
71+
leftParen: (
72+
rightParen: )
73+
elements:
74+
labeledExpr
75+
expression:
76+
integerLiteralExpr
77+
literal: integerLiteral "1"
78+
trailingComma: ,
79+
labeledExpr
80+
expression:
81+
integerLiteralExpr
82+
literal: integerLiteral "2"
83+
84+
---
85+
86+
top_level
87+
body:
88+
block
89+
stmt:
90+
assign_expr
91+
target:
92+
tuple_expr
93+
element:
94+
argument
95+
value:
96+
name_expr
97+
identifier: identifier "x"
98+
argument
99+
value: builtin_expr "_"
100+
value:
101+
tuple_expr
102+
element:
103+
argument
104+
value: int_literal "1"
105+
argument
106+
value: int_literal "2"
107+
assign_expr
108+
target:
109+
tuple_expr
110+
element:
111+
argument
112+
value:
113+
member_access_expr
114+
base:
115+
name_expr
116+
identifier: identifier "foo"
117+
member: identifier "x"
118+
argument
119+
value: builtin_expr "_"
120+
value:
121+
tuple_expr
122+
element:
123+
argument
124+
value: int_literal "1"
125+
argument
126+
value: int_literal "2"
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
(x, _) = (1, 2)
2+
(foo.x, _) = (1, 2)

0 commit comments

Comments
 (0)