@@ -262,15 +262,34 @@ extension ASTGenVisitor {
262262 }
263263
264264 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+
265280 let body = BridgedBraceStmt . createParsed (
266281 self . ctx,
267282 lBraceLoc: self . generateSourceLoc ( node. leftBrace) ,
268283 elements: self . generate ( codeBlockItemList: node. statements) ,
269284 rBraceLoc: self . generateSourceLoc ( node. rightBrace)
270285 )
271286
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+ )
274293 }
275294
276295 func generate( consumeExpr node: ConsumeExprSyntax ) -> BridgedConsumeExpr {
@@ -289,6 +308,71 @@ extension ASTGenVisitor {
289308 )
290309 }
291310
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+
292376 func generate( functionCallExpr node: FunctionCallExprSyntax ) -> BridgedCallExpr {
293377 if !node. arguments. isEmpty || node. trailingClosure == nil {
294378 if node. leftParen == nil {
@@ -303,29 +387,16 @@ extension ASTGenVisitor {
303387 }
304388 }
305389
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 (
323392 leftParen: node. leftParen,
324- rightParen: node. rightParen
393+ labeledExprList: node. arguments,
394+ rightParen: node. rightParen,
395+ trailingClosure: node. trailingClosure,
396+ additionalTrailingClosures: node. additionalTrailingClosures
325397 )
326- let callee = generate ( expr: node. calledExpression)
327398
328- return . createParsed( self . ctx, fn: callee, args: argumentTuple )
399+ return . createParsed( self . ctx, fn: callee, args: arguments )
329400 }
330401
331402 func generateDeclNameRef( declReferenceExpr node: DeclReferenceExprSyntax ) -> (
@@ -565,7 +636,28 @@ extension ASTGenVisitor {
565636 }
566637
567638 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+ )
569661 }
570662
571663 func generate( typeExpr node: TypeExprSyntax ) -> BridgedTypeExpr {
@@ -639,35 +731,4 @@ extension ASTGenVisitor {
639731 loc: . createParsed( nameLoc)
640732 ) ;
641733 }
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- }
673734}
0 commit comments