@@ -278,36 +278,131 @@ extension ASTGenVisitor {
278278 return createOperatorRefExpr ( token: node. operator, kind: . binaryOperator)
279279 }
280280
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+ }
283297
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(
291313 self . ctx,
292- leftParenLoc: lBraceLoc ,
293- parameters: . init ( ) ,
294- rightParenLoc: lBraceLoc
314+ leftParenLoc: nil ,
315+ parameters: BridgedArrayRef ( ) ,
316+ rightParenLoc: nil
295317 )
296318 }
297319
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+ }
304325
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 (
306363 self . ctx,
307364 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
310375 )
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
311406 }
312407
313408 func generate( consumeExpr node: ConsumeExprSyntax ) -> BridgedConsumeExpr {
@@ -502,6 +597,10 @@ extension ASTGenVisitor {
502597 if node. baseName. isEditorPlaceholder {
503598 return generateEditorPlaceholderExpr ( token: node. baseName) . asExpr
504599 }
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+ }
505604 let nameAndLoc = generateDeclNameRef ( declReferenceExpr: node)
506605 return BridgedUnresolvedDeclRefExpr . createParsed (
507606 self . ctx,
0 commit comments