Skip to content

Commit 65865d0

Browse files
authored
Merge pull request #23050 from github/unified/anonymous-identifier
Unified, Swift: Translate ignored parameters into ignore patterns
2 parents b0dac8f + fbef21d commit 65865d0

5 files changed

Lines changed: 279 additions & 6 deletions

File tree

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

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,17 @@ fn make_or_pattern(
111111
}
112112
}
113113

114+
fn parameter_pattern(
115+
ctx: &mut yeast::build::BuildCtx<'_, SwiftContext>,
116+
name: yeast::Id,
117+
) -> yeast::OutputId {
118+
if ctx.source_text(name) == "_" {
119+
tree!((ignore_pattern #{name}))
120+
} else {
121+
tree!((identifier #{name}))
122+
}
123+
}
124+
114125
/// Translate a multi-part identifier (for example `Foo.Bar.Baz`) into a
115126
/// `member_access_expr` chain rooted at a `name_node` for the first
116127
/// part. Panics on an empty input because the grammar's `_+` quantifier
@@ -669,7 +680,7 @@ fn translation_rules() -> Vec<Rule<SwiftContext>> {
669680
=>
670681
(parameter
671682
external_name_node: (identifier #{first})
672-
pattern: (identifier #{second})
683+
pattern: {parameter_pattern(&mut ctx, second)}
673684
type: {ty}
674685
default: {val})
675686
),
@@ -681,7 +692,7 @@ fn translation_rules() -> Vec<Rule<SwiftContext>> {
681692
=>
682693
(parameter
683694
external_name_node: (identifier #{first}) // duplicate the parameter name
684-
pattern: (identifier #{first})
695+
pattern: {parameter_pattern(&mut ctx, first)}
685696
type: {ty}
686697
default: {val})
687698
),
@@ -867,14 +878,14 @@ fn translation_rules() -> Vec<Rule<SwiftContext>> {
867878
rule!(
868879
(closureParameter firstName: @@name type: _? @ty)
869880
=>
870-
(parameter pattern: (identifier #{name}) type: {ty})
881+
(parameter pattern: {parameter_pattern(&mut ctx, name)} type: {ty})
871882
),
872883
// A shorthand closure parameter (`x` in `{ x, y in … }`): a bare name
873884
// with no parentheses and no type.
874885
rule!(
875886
(closureShorthandParameter name: @@name)
876887
=>
877-
(parameter pattern: (identifier #{name}))
888+
(parameter pattern: {parameter_pattern(&mut ctx, name)})
878889
),
879890
// ---- Control flow ----
880891
// An `if`/`else` expression. Conditions are joined via `and_chain`; the

‎unified/extractor/tests/corpus/swift/expressions/array-type-constructor.output‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ top_level source="⟨body⟩"
181181
function_expr source="{ ⟨parameter⟩, ⟨parameter⟩ in\n\t⟨body⟩\n}"
182182
parameter:
183183
parameter source="⟨pattern⟩"
184-
pattern: identifier "_" source="_"
184+
pattern: ignore_pattern "_" source="_"
185185
parameter source="⟨pattern⟩"
186186
pattern: identifier "count" source="count"
187187
body:
Lines changed: 251 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,251 @@
1+
func ignore(_: Int, _: String) {
2+
}
3+
4+
func ignore(first _: Int, second _: String) {
5+
}
6+
7+
let ignoreClosure: (Int, String) -> Void = { _, _ in
8+
}
9+
10+
let ignoreTypedClosure = { (_: Int, _: String) in
11+
}
12+
13+
---
14+
15+
sourceFile
16+
endOfFileToken: endOfFile
17+
statements:
18+
codeBlockItem
19+
item:
20+
functionDecl
21+
attributes:
22+
body:
23+
codeBlock
24+
leftBrace: {
25+
rightBrace: }
26+
statements:
27+
modifiers:
28+
name: identifier "ignore"
29+
signature:
30+
functionSignature
31+
parameterClause:
32+
functionParameterClause
33+
leftParen: (
34+
rightParen: )
35+
parameters:
36+
functionParameter
37+
colon: :
38+
attributes:
39+
modifiers:
40+
trailingComma: ,
41+
type:
42+
identifierType
43+
name: identifier "Int"
44+
firstName: _
45+
functionParameter
46+
colon: :
47+
attributes:
48+
modifiers:
49+
type:
50+
identifierType
51+
name: identifier "String"
52+
firstName: _
53+
funcKeyword: func
54+
codeBlockItem
55+
item:
56+
functionDecl
57+
attributes:
58+
body:
59+
codeBlock
60+
leftBrace: {
61+
rightBrace: }
62+
statements:
63+
modifiers:
64+
name: identifier "ignore"
65+
signature:
66+
functionSignature
67+
parameterClause:
68+
functionParameterClause
69+
leftParen: (
70+
rightParen: )
71+
parameters:
72+
functionParameter
73+
colon: :
74+
attributes:
75+
modifiers:
76+
trailingComma: ,
77+
type:
78+
identifierType
79+
name: identifier "Int"
80+
firstName: identifier "first"
81+
secondName: _
82+
functionParameter
83+
colon: :
84+
attributes:
85+
modifiers:
86+
type:
87+
identifierType
88+
name: identifier "String"
89+
firstName: identifier "second"
90+
secondName: _
91+
funcKeyword: func
92+
codeBlockItem
93+
item:
94+
variableDecl
95+
attributes:
96+
modifiers:
97+
bindingSpecifier: let
98+
bindings:
99+
patternBinding
100+
initializer:
101+
initializerClause
102+
equal: =
103+
value:
104+
closureExpr
105+
leftBrace: {
106+
rightBrace: }
107+
signature:
108+
closureSignature
109+
attributes:
110+
inKeyword: in
111+
parameterClause:
112+
closureShorthandParameter
113+
name: _
114+
trailingComma: ,
115+
closureShorthandParameter
116+
name: _
117+
statements:
118+
pattern:
119+
identifierPattern
120+
identifier: identifier "ignoreClosure"
121+
typeAnnotation:
122+
typeAnnotation
123+
colon: :
124+
type:
125+
functionType
126+
leftParen: (
127+
rightParen: )
128+
parameters:
129+
tupleTypeElement
130+
trailingComma: ,
131+
type:
132+
identifierType
133+
name: identifier "Int"
134+
tupleTypeElement
135+
type:
136+
identifierType
137+
name: identifier "String"
138+
returnClause:
139+
returnClause
140+
arrow: ->
141+
type:
142+
identifierType
143+
name: identifier "Void"
144+
codeBlockItem
145+
item:
146+
variableDecl
147+
attributes:
148+
modifiers:
149+
bindingSpecifier: let
150+
bindings:
151+
patternBinding
152+
initializer:
153+
initializerClause
154+
equal: =
155+
value:
156+
closureExpr
157+
leftBrace: {
158+
rightBrace: }
159+
signature:
160+
closureSignature
161+
attributes:
162+
inKeyword: in
163+
parameterClause:
164+
closureParameterClause
165+
leftParen: (
166+
rightParen: )
167+
parameters:
168+
closureParameter
169+
colon: :
170+
attributes:
171+
modifiers:
172+
trailingComma: ,
173+
type:
174+
identifierType
175+
name: identifier "Int"
176+
firstName: _
177+
closureParameter
178+
colon: :
179+
attributes:
180+
modifiers:
181+
type:
182+
identifierType
183+
name: identifier "String"
184+
firstName: _
185+
statements:
186+
pattern:
187+
identifierPattern
188+
identifier: identifier "ignoreTypedClosure"
189+
190+
---
191+
192+
top_level source="⟨body⟩"
193+
body:
194+
block source="⟨stmt⟩\n\n⟨stmt⟩\n\n⟨stmt⟩\n\n⟨stmt⟩"
195+
stmt:
196+
function_declaration source="func ⟨name_node⟩(⟨parameter⟩, ⟨parameter⟩) ⟨body⟩"
197+
name_node: identifier "ignore" source="ignore"
198+
parameter:
199+
parameter source="⟨external_name_node⟩⟨pattern⟩: ⟨type⟩"
200+
external_name_node: identifier "_" source="_"
201+
type: identifier "Int" source="Int"
202+
pattern: ignore_pattern "_" source="_"
203+
parameter source="⟨external_name_node⟩⟨pattern⟩: ⟨type⟩"
204+
external_name_node: identifier "_" source="_"
205+
type: identifier "String" source="String"
206+
pattern: ignore_pattern "_" source="_"
207+
body: block "{\n}" source="{\n}"
208+
function_declaration source="func ⟨name_node⟩(⟨parameter⟩, ⟨parameter⟩) ⟨body⟩"
209+
name_node: identifier "ignore" source="ignore"
210+
parameter:
211+
parameter source="⟨external_name_node⟩ ⟨pattern⟩: ⟨type⟩"
212+
external_name_node: identifier "first" source="first"
213+
type: identifier "Int" source="Int"
214+
pattern: ignore_pattern "_" source="_"
215+
parameter source="⟨external_name_node⟩ ⟨pattern⟩: ⟨type⟩"
216+
external_name_node: identifier "second" source="second"
217+
type: identifier "String" source="String"
218+
pattern: ignore_pattern "_" source="_"
219+
body: block "{\n}" source="{\n}"
220+
variable_declaration source="⟨modifier⟩ ⟨pattern⟩: ⟨type⟩ = ⟨value⟩"
221+
modifier: modifier "let" source="let"
222+
pattern: identifier "ignoreClosure" source="ignoreClosure"
223+
type:
224+
function_expr source="(⟨parameter⟩, ⟨parameter⟩) -> ⟨return_type⟩"
225+
parameter:
226+
parameter source="⟨type⟩"
227+
type: identifier "Int" source="Int"
228+
parameter source="⟨type⟩"
229+
type: identifier "String" source="String"
230+
return_type: identifier "Void" source="Void"
231+
value:
232+
function_expr source="{ ⟨parameter⟩, ⟨parameter⟩ in\n}"
233+
parameter:
234+
parameter source="⟨pattern⟩"
235+
pattern: ignore_pattern "_" source="_"
236+
parameter source="⟨pattern⟩"
237+
pattern: ignore_pattern "_" source="_"
238+
body: block source=""
239+
variable_declaration source="⟨modifier⟩ ⟨pattern⟩ = ⟨value⟩"
240+
modifier: modifier "let" source="let"
241+
pattern: identifier "ignoreTypedClosure" source="ignoreTypedClosure"
242+
value:
243+
function_expr source="{ (⟨parameter⟩, ⟨parameter⟩) in\n}"
244+
parameter:
245+
parameter source="⟨pattern⟩: ⟨type⟩"
246+
type: identifier "Int" source="Int"
247+
pattern: ignore_pattern "_" source="_"
248+
parameter source="⟨pattern⟩: ⟨type⟩"
249+
type: identifier "String" source="String"
250+
pattern: ignore_pattern "_" source="_"
251+
body: block source=""
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
func ignore(_: Int, _: String) {
2+
}
3+
4+
func ignore(first _: Int, second _: String) {
5+
}
6+
7+
let ignoreClosure: (Int, String) -> Void = { _, _ in
8+
}
9+
10+
let ignoreTypedClosure = { (_: Int, _: String) in
11+
}

‎unified/extractor/tests/corpus/swift/types/function-type-with-inout-parameter.output‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,5 +79,5 @@ top_level source="⟨body⟩"
7979
function_expr source="{ ⟨parameter⟩ in }"
8080
parameter:
8181
parameter source="⟨pattern⟩"
82-
pattern: identifier "_" source="_"
82+
pattern: ignore_pattern "_" source="_"
8383
body: block source=""

0 commit comments

Comments
 (0)