File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff 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
Original file line number Diff line number Diff 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"
Original file line number Diff line number Diff 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"
Original file line number Diff line number Diff line change 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"
Original file line number Diff line number Diff line change 1+ ( x, _) = ( 1 , 2 )
2+ ( foo. x, _) = ( 1 , 2 )
You can’t perform that action at this time.
0 commit comments