Skip to content

Commit d6164c3

Browse files
committed
unified: Preserve array constructor trailing closures
1 parent f596a67 commit d6164c3

3 files changed

Lines changed: 136 additions & 0 deletions

File tree

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -621,6 +621,19 @@ fn translation_rules() -> Vec<Rule<SwiftContext>> {
621621
// translating that callee as an array literal would place a type
622622
// expression in an expression-only element field. Normalize it to an
623623
// `Array<T>` generic type constructor instead.
624+
rule!(
625+
(functionCallExpr
626+
calledExpression: (arrayExpr elements: (arrayElement expression: (genericSpecializationExpr) @element))
627+
arguments: _* @args
628+
trailingClosure: @tc)
629+
=>
630+
(call_expr
631+
callee: (generic_type_expr
632+
base: (named_type_expr name: (identifier "Array"))
633+
type_argument: {element})
634+
argument: {args}
635+
argument: (argument value: {tc}))
636+
),
624637
rule!(
625638
(functionCallExpr
626639
calledExpression: (arrayExpr elements: (arrayElement expression: (genericSpecializationExpr) @element))

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

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
let values = [Result<Void>]()
2+
let initialized = [Result<Void>](unsafeUninitializedCapacity: 1) { _, count in
3+
count = 0
4+
}
25

36
---
47

@@ -45,6 +48,79 @@ sourceFile
4548
pattern:
4649
identifierPattern
4750
identifier: identifier "values"
51+
codeBlockItem
52+
item:
53+
variableDecl
54+
attributes:
55+
modifiers:
56+
bindingSpecifier: let
57+
bindings:
58+
patternBinding
59+
initializer:
60+
initializerClause
61+
equal: =
62+
value:
63+
functionCallExpr
64+
leftParen: (
65+
rightParen: )
66+
arguments:
67+
labeledExpr
68+
colon: :
69+
label: identifier "unsafeUninitializedCapacity"
70+
expression:
71+
integerLiteralExpr
72+
literal: integerLiteral "1"
73+
additionalTrailingClosures:
74+
calledExpression:
75+
arrayExpr
76+
elements:
77+
arrayElement
78+
expression:
79+
genericSpecializationExpr
80+
expression:
81+
declReferenceExpr
82+
baseName: identifier "Result"
83+
genericArgumentClause:
84+
genericArgumentClause
85+
arguments:
86+
genericArgument
87+
argument:
88+
identifierType
89+
name: identifier "Void"
90+
leftAngle: <
91+
rightAngle: >
92+
leftSquare: [
93+
rightSquare: ]
94+
trailingClosure:
95+
closureExpr
96+
leftBrace: {
97+
rightBrace: }
98+
signature:
99+
closureSignature
100+
attributes:
101+
inKeyword: in
102+
parameterClause:
103+
closureShorthandParameter
104+
name: _
105+
trailingComma: ,
106+
closureShorthandParameter
107+
name: identifier "count"
108+
statements:
109+
codeBlockItem
110+
item:
111+
infixOperatorExpr
112+
operator:
113+
assignmentExpr
114+
equal: =
115+
leftOperand:
116+
declReferenceExpr
117+
baseName: identifier "count"
118+
rightOperand:
119+
integerLiteralExpr
120+
literal: integerLiteral "0"
121+
pattern:
122+
identifierPattern
123+
identifier: identifier "initialized"
48124

49125
---
50126

@@ -72,3 +148,47 @@ top_level
72148
type_argument:
73149
named_type_expr
74150
name: identifier "Void"
151+
variable_declaration
152+
modifier: modifier "let"
153+
pattern:
154+
name_pattern
155+
identifier: identifier "initialized"
156+
value:
157+
call_expr
158+
callee:
159+
generic_type_expr
160+
base:
161+
named_type_expr
162+
name: identifier "Array"
163+
type_argument:
164+
generic_type_expr
165+
base:
166+
named_type_expr
167+
name: identifier "Result"
168+
type_argument:
169+
named_type_expr
170+
name: identifier "Void"
171+
argument:
172+
argument
173+
name: identifier "unsafeUninitializedCapacity"
174+
value: int_literal "1"
175+
argument
176+
value:
177+
function_expr
178+
parameter:
179+
parameter
180+
pattern:
181+
name_pattern
182+
identifier: identifier "_"
183+
parameter
184+
pattern:
185+
name_pattern
186+
identifier: identifier "count"
187+
body:
188+
block
189+
stmt:
190+
assign_expr
191+
target:
192+
name_expr
193+
identifier: identifier "count"
194+
value: int_literal "0"
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,4 @@
11
let values = [Result<Void>]()
2+
let initialized = [Result<Void>](unsafeUninitializedCapacity: 1) { _, count in
3+
count = 0
4+
}

0 commit comments

Comments
 (0)