@@ -262,15 +262,34 @@ extension ASTGenVisitor {
262
262
}
263
263
264
264
func generate( closureExpr node: ClosureExprSyntax ) -> BridgedClosureExpr {
265
+ let params : BridgedParameterList
266
+
267
+ if let signature = node. signature {
268
+ // FIXME: Translate the signature, capture list, 'in' location, etc.
269
+ fatalError ( " unimplmented " )
270
+ } else {
271
+ let lBraceLoc = self . generateSourceLoc ( node. leftBrace)
272
+ params = BridgedParameterList . createParsed (
273
+ self . ctx,
274
+ leftParenLoc: lBraceLoc,
275
+ parameters: . init( ) ,
276
+ rightParenLoc: lBraceLoc
277
+ )
278
+ }
279
+
265
280
let body = BridgedBraceStmt . createParsed (
266
281
self . ctx,
267
282
lBraceLoc: self . generateSourceLoc ( node. leftBrace) ,
268
283
elements: self . generate ( codeBlockItemList: node. statements) ,
269
284
rBraceLoc: self . generateSourceLoc ( node. rightBrace)
270
285
)
271
286
272
- // FIXME: Translate the signature, capture list, 'in' location, etc.
273
- return . createParsed( self . ctx, declContext: self . declContext, body: body)
287
+ return . createParsed(
288
+ self . ctx,
289
+ declContext: self . declContext,
290
+ parameterList: params,
291
+ body: body
292
+ )
274
293
}
275
294
276
295
func generate( consumeExpr node: ConsumeExprSyntax ) -> BridgedConsumeExpr {
@@ -289,6 +308,71 @@ extension ASTGenVisitor {
289
308
)
290
309
}
291
310
311
+ func generateArgumentList(
312
+ leftParen: TokenSyntax ? ,
313
+ labeledExprList: LabeledExprListSyntax ,
314
+ rightParen: TokenSyntax ? ,
315
+ trailingClosure: ClosureExprSyntax ? ,
316
+ additionalTrailingClosures: MultipleTrailingClosureElementListSyntax ?
317
+ ) -> BridgedArgumentList {
318
+
319
+ var bridgedArgs : BridgedArrayRef = {
320
+ // Arguments before ')'
321
+ let normalArgs = labeledExprList. lazy. map ( { elem in
322
+ let labelInfo = elem. label. map ( self . generateIdentifierAndSourceLoc ( _: ) )
323
+ return BridgedCallArgument (
324
+ labelLoc: labelInfo? . sourceLoc ?? BridgedSourceLoc ( ) ,
325
+ label: labelInfo? . identifier ?? BridgedIdentifier ( ) ,
326
+ argExpr: self . generate ( expr: elem. expression)
327
+ )
328
+ } )
329
+ guard let trailingClosure else {
330
+ // FIXME: Diagnose, instead of precondition.
331
+ precondition (
332
+ additionalTrailingClosures == nil || additionalTrailingClosures!. isEmpty,
333
+ " multiple trailing closures without the first trailing closure "
334
+ )
335
+ return normalArgs. bridgedArray ( in: self )
336
+ }
337
+
338
+ // The first trailing closure.
339
+ let bridgedTrailingClosureArg = BridgedCallArgument (
340
+ labelLoc: nil ,
341
+ label: nil ,
342
+ argExpr: self . generate ( closureExpr: trailingClosure) . asExpr
343
+ )
344
+ let normalArgsAndClosure = ConcatCollection ( normalArgs, CollectionOfOne ( bridgedTrailingClosureArg) )
345
+ guard let additionalTrailingClosures else {
346
+ return normalArgsAndClosure. bridgedArray ( in: self )
347
+ }
348
+
349
+ // Remaining trailing closures.
350
+ let additions = additionalTrailingClosures. lazy. map { argNode in
351
+ return BridgedCallArgument (
352
+ labelLoc: self . generateSourceLoc ( argNode. label) ,
353
+ label: self . generateIdentifier ( argNode. label) ,
354
+ argExpr: self . generate ( closureExpr: argNode. closure) . asExpr
355
+ )
356
+ }
357
+ let allArgs = ConcatCollection ( normalArgsAndClosure, additions)
358
+ return allArgs. bridgedArray ( in: self )
359
+ } ( )
360
+
361
+ // This should be "nil" value if there's no trailing closure. Passing the number
362
+ // of the normal arguments because we don't have a convenient way to pass
363
+ // Optional to ASTBridging, ASTBridging can know it's "nil" if
364
+ // bridgedArgs.count == firstTrailingClosureIndex
365
+ var firstTrailingClosureIndex = labeledExprList. count
366
+
367
+ return BridgedArgumentList . createParsed (
368
+ self . ctx,
369
+ lParenLoc: self . generateSourceLoc ( leftParen) ,
370
+ args: bridgedArgs,
371
+ rParenLoc: self . generateSourceLoc ( rightParen) ,
372
+ firstTrailingClosureIndex: firstTrailingClosureIndex
373
+ )
374
+ }
375
+
292
376
func generate( functionCallExpr node: FunctionCallExprSyntax ) -> BridgedCallExpr {
293
377
if !node. arguments. isEmpty || node. trailingClosure == nil {
294
378
if node. leftParen == nil {
@@ -303,29 +387,16 @@ extension ASTGenVisitor {
303
387
}
304
388
}
305
389
306
- var node = node
307
-
308
- // Transform the trailing closure into an argument.
309
- if let trailingClosure = node. trailingClosure {
310
- let tupleElement = LabeledExprSyntax (
311
- label: nil ,
312
- colon: nil ,
313
- expression: ExprSyntax ( trailingClosure) ,
314
- trailingComma: nil
315
- )
316
-
317
- node. arguments. append ( tupleElement)
318
- node. trailingClosure = nil
319
- }
320
-
321
- let argumentTuple = self . generate (
322
- labeledExprList: node. arguments,
390
+ let callee = generate ( expr: node. calledExpression)
391
+ let arguments = generateArgumentList (
323
392
leftParen: node. leftParen,
324
- rightParen: node. rightParen
393
+ labeledExprList: node. arguments,
394
+ rightParen: node. rightParen,
395
+ trailingClosure: node. trailingClosure,
396
+ additionalTrailingClosures: node. additionalTrailingClosures
325
397
)
326
- let callee = generate ( expr: node. calledExpression)
327
398
328
- return . createParsed( self . ctx, fn: callee, args: argumentTuple )
399
+ return . createParsed( self . ctx, fn: callee, args: arguments )
329
400
}
330
401
331
402
func generateDeclNameRef( declReferenceExpr node: DeclReferenceExprSyntax ) -> (
@@ -565,7 +636,28 @@ extension ASTGenVisitor {
565
636
}
566
637
567
638
func generate( tupleExpr node: TupleExprSyntax ) -> BridgedTupleExpr {
568
- return self . generate ( labeledExprList: node. elements, leftParen: node. leftParen, rightParen: node. rightParen)
639
+ let expressions = node. elements. lazy. map {
640
+ self . generate ( expr: $0. expression)
641
+ }
642
+ let labels = node. elements. lazy. map {
643
+ self . generateIdentifier ( $0. label)
644
+ }
645
+ let labelLocations = node. elements. lazy. map {
646
+ if let label = $0. label {
647
+ return self . generateSourceLoc ( label)
648
+ }
649
+
650
+ return self . generateSourceLoc ( $0)
651
+ }
652
+
653
+ return BridgedTupleExpr . createParsed (
654
+ self . ctx,
655
+ leftParenLoc: self . generateSourceLoc ( node. leftParen) ,
656
+ exprs: expressions. bridgedArray ( in: self ) ,
657
+ labels: labels. bridgedArray ( in: self ) ,
658
+ labelLocs: labelLocations. bridgedArray ( in: self ) ,
659
+ rightParenLoc: self . generateSourceLoc ( node. rightParen)
660
+ )
569
661
}
570
662
571
663
func generate( typeExpr node: TypeExprSyntax ) -> BridgedTypeExpr {
@@ -639,35 +731,4 @@ extension ASTGenVisitor {
639
731
loc: . createParsed( nameLoc)
640
732
) ;
641
733
}
642
-
643
- /// Generate a tuple expression from a ``LabeledExprListSyntax`` and parentheses.
644
- func generate(
645
- labeledExprList node: LabeledExprListSyntax ,
646
- leftParen: TokenSyntax ? ,
647
- rightParen: TokenSyntax ?
648
- ) -> BridgedTupleExpr {
649
- // FIXME: This should return bridged 'ArgumentList' instead of `TupleExpr`
650
- let expressions = node. lazy. map {
651
- self . generate ( expr: $0. expression)
652
- }
653
- let labels = node. lazy. map {
654
- self . generateIdentifier ( $0. label)
655
- }
656
- let labelLocations = node. lazy. map {
657
- if let label = $0. label {
658
- return self . generateSourceLoc ( label)
659
- }
660
-
661
- return self . generateSourceLoc ( $0)
662
- }
663
-
664
- return BridgedTupleExpr . createParsed (
665
- self . ctx,
666
- leftParenLoc: self . generateSourceLoc ( leftParen) ,
667
- exprs: expressions. bridgedArray ( in: self ) ,
668
- labels: labels. bridgedArray ( in: self ) ,
669
- labelLocs: labelLocations. bridgedArray ( in: self ) ,
670
- rightParenLoc: self . generateSourceLoc ( rightParen)
671
- )
672
- }
673
734
}
0 commit comments