@@ -278,36 +278,131 @@ extension ASTGenVisitor {
278
278
return createOperatorRefExpr ( token: node. operator, kind: . binaryOperator)
279
279
}
280
280
281
- func generate( closureExpr node: ClosureExprSyntax ) -> BridgedClosureExpr {
282
- let params : BridgedParameterList
281
+ func generate( closureSignature node: ClosureSignatureSyntax ) -> GeneratedClosureSignature {
282
+ var result = GeneratedClosureSignature ( )
283
+
284
+ // Attributes.
285
+ visitIfConfigElements ( node. attributes, of: AttributeSyntax . self) { element in
286
+ switch element {
287
+ case . ifConfigDecl( let ifConfigDecl) :
288
+ return . ifConfigDecl( ifConfigDecl)
289
+ case . attribute( let attribute) :
290
+ return . underlying( attribute)
291
+ }
292
+ } body: { node in
293
+ if let attr = self . generateDeclAttribute ( attribute: node) {
294
+ result. attributes. add ( attr)
295
+ }
296
+ }
283
297
284
- if let signature = node. signature {
285
- // FIXME: Translate the signature, capture list, 'in' location, etc.
286
- _ = signature
287
- fatalError ( " unimplmented " )
288
- } else {
289
- let lBraceLoc = self . generateSourceLoc ( node. leftBrace)
290
- params = BridgedParameterList . createParsed (
298
+ if let node = node. capture {
299
+ result. bracketRange = self . generateSourceRange ( node)
300
+ let captures = node. items. lazy. map { node in
301
+ self . generate ( closureCapture: node)
302
+ }
303
+ result. captureList = captures. bridgedArray ( in: self )
304
+ }
305
+
306
+ switch node. parameterClause {
307
+ case . parameterClause( let node) :
308
+ result. params = self . generate ( closureParameterClause: node)
309
+ case . simpleInput( let node) :
310
+ result. params = self . generate ( closureShorthandParameterList: node)
311
+ case nil :
312
+ result. params = . createParsed(
291
313
self . ctx,
292
- leftParenLoc: lBraceLoc ,
293
- parameters: . init ( ) ,
294
- rightParenLoc: lBraceLoc
314
+ leftParenLoc: nil ,
315
+ parameters: BridgedArrayRef ( ) ,
316
+ rightParenLoc: nil
295
317
)
296
318
}
297
319
298
- let body = BridgedBraceStmt . createParsed (
299
- self . ctx,
300
- lBraceLoc: self . generateSourceLoc ( node. leftBrace) ,
301
- elements: self . generate ( codeBlockItemList: node. statements) ,
302
- rBraceLoc: self . generateSourceLoc ( node. rightBrace)
303
- )
320
+ if let effects = node. effectSpecifiers {
321
+ result. asyncLoc = self . generateSourceLoc ( effects. asyncSpecifier)
322
+ result. throwsLoc = self . generateSourceLoc ( effects. throwsClause)
323
+ result. thrownType = effects. throwsClause? . type. map ( generate ( type: ) )
324
+ }
304
325
305
- return . createParsed(
326
+ if let returnClause = node. returnClause {
327
+ result. arrowLoc = self . generateSourceLoc ( returnClause. arrow)
328
+ result. explicitResultType = self . generate ( type: returnClause. type)
329
+ }
330
+
331
+ result. inLoc = self . generateSourceLoc ( node. inKeyword)
332
+
333
+ return result
334
+ }
335
+
336
+ func generate( closureCapture node: ClosureCaptureSyntax ) {
337
+ fatalError ( " unimplemented " )
338
+ }
339
+
340
+ struct GeneratedClosureSignature {
341
+ var attributes : BridgedDeclAttributes = BridgedDeclAttributes ( )
342
+ var bracketRange : BridgedSourceRange = BridgedSourceRange ( start: nil , end: nil )
343
+ var captureList : BridgedArrayRef = BridgedArrayRef ( )
344
+ var capturedSelfDecl : BridgedVarDecl ? = nil
345
+ var params : BridgedParameterList ? = nil
346
+ var asyncLoc : BridgedSourceLoc = nil
347
+ var throwsLoc : BridgedSourceLoc = nil
348
+ var thrownType : BridgedTypeRepr ? = nil
349
+ var arrowLoc : BridgedSourceLoc = nil
350
+ var explicitResultType : BridgedTypeRepr ? = nil
351
+ var inLoc : BridgedSourceLoc = nil
352
+ }
353
+
354
+ func generate( closureExpr node: ClosureExprSyntax ) -> BridgedClosureExpr {
355
+ let signature : GeneratedClosureSignature
356
+ if let node = node. signature {
357
+ signature = self . generate ( closureSignature: node)
358
+ } else {
359
+ signature = GeneratedClosureSignature ( )
360
+ }
361
+
362
+ let expr = BridgedClosureExpr . createParsed (
306
363
self . ctx,
307
364
declContext: self . declContext,
308
- parameterList: params,
309
- body: body
365
+ attributes: signature. attributes,
366
+ bracketRange: signature. bracketRange,
367
+ capturedSelfDecl: BridgedNullableVarDecl ( raw: signature. capturedSelfDecl? . raw) ,
368
+ parameterList: signature. params. asNullable,
369
+ asyncLoc: signature. asyncLoc,
370
+ throwsLoc: signature. throwsLoc,
371
+ thrownType: signature. thrownType. asNullable,
372
+ arrowLoc: signature. arrowLoc,
373
+ explicitResultType: signature. explicitResultType. asNullable,
374
+ inLoc: signature. inLoc
310
375
)
376
+
377
+ let body = self . withDeclContext ( expr. asDeclContext) {
378
+ BridgedBraceStmt . createParsed (
379
+ self . ctx,
380
+ lBraceLoc: self . generateSourceLoc ( node. leftBrace) ,
381
+ elements: self . generate ( codeBlockItemList: node. statements) ,
382
+ rBraceLoc: self . generateSourceLoc ( node. rightBrace)
383
+ )
384
+ }
385
+
386
+ if signature. params == nil {
387
+ // TODO: Handle doller identifiers inside the closure.
388
+ let loc = self . generateSourceLoc ( node. leftBrace)
389
+ let params = BridgedParameterList . createParsed (
390
+ self . ctx,
391
+ leftParenLoc: loc,
392
+ parameters: . init( ) ,
393
+ rightParenLoc: loc
394
+ )
395
+ expr. setParameterList ( params)
396
+ expr. setHasAnonymousClosureVars ( )
397
+ }
398
+
399
+ expr. setBody ( body)
400
+
401
+ if signature. captureList. count > 0 {
402
+ // TODO: CaptureListExpr.
403
+ }
404
+
405
+ return expr
311
406
}
312
407
313
408
func generate( consumeExpr node: ConsumeExprSyntax ) -> BridgedConsumeExpr {
@@ -502,6 +597,10 @@ extension ASTGenVisitor {
502
597
if node. baseName. isEditorPlaceholder {
503
598
return generateEditorPlaceholderExpr ( token: node. baseName) . asExpr
504
599
}
600
+ if node. baseName. rawTokenKind == . dollarIdentifier {
601
+ // TODO: Handle dollar identifier in closure decl context.
602
+ // It's done in C++ Parser because it needs to handle inactive #if regions.
603
+ }
505
604
let nameAndLoc = generateDeclNameRef ( declReferenceExpr: node)
506
605
return BridgedUnresolvedDeclRefExpr . createParsed (
507
606
self . ctx,
0 commit comments