@@ -47,6 +47,7 @@ public struct ClosureCodegen {
4747 for (index, paramType) in signature. parameters. enumerated ( ) {
4848 try builder. lowerParameter ( param: Parameter ( label: nil , name: " param \( index) " , type: paramType) )
4949 }
50+ builder. appendTypeIDParameters ( signature. genericParameterNames)
5051
5152 // Generate the call and return value lifting
5253 try builder. call ( )
@@ -69,7 +70,14 @@ public struct ClosureCodegen {
6970 let helperEnumDeclPrinter = CodeFragmentPrinter ( )
7071 helperEnumDeclPrinter. write ( " private enum \( helperName) { " )
7172 helperEnumDeclPrinter. indent {
72- helperEnumDeclPrinter. write ( " static func bridgeJSLift(_ callbackId: Int32) -> \( swiftClosureType) { " )
73+ let genericNames = signature. genericParameterNames
74+ let genericClause =
75+ genericNames. isEmpty
76+ ? " " : " < \( genericNames. map { " \( $0) : BridgedSwiftGenericBridgeable " } . joined ( separator: " , " ) ) > "
77+ let parameters = ( [ " _ callbackId: Int32 " ] + genericNames. map { " _: \( $0) .Type " } ) . joined ( separator: " , " )
78+ helperEnumDeclPrinter. write (
79+ " static func bridgeJSLift \( genericClause) ( \( parameters) ) -> \( swiftClosureType) { "
80+ )
7381 helperEnumDeclPrinter. indent {
7482 helperEnumDeclPrinter. write ( " let callback = JSObject.bridgeJSLiftParameter(callbackId) " )
7583 let parameters : String
@@ -112,6 +120,10 @@ public struct ClosureCodegen {
112120
113121 let helperEnumDecl : DeclSyntax = " \( raw: helperEnumDeclPrinter. lines. joined ( separator: " \n " ) ) "
114122
123+ if !signature. genericParameterNames. isEmpty {
124+ return [ externDecl, helperEnumDecl]
125+ }
126+
115127 let accessModifier = accessLevel. modifierKeyword. map { " \( $0) " } ?? " "
116128 let declaration = signature. sendingParameters ? " static func sending " : " init "
117129 let returnClause = signature. sendingParameters ? " -> Self " : " "
@@ -164,10 +176,38 @@ public struct ClosureCodegen {
164176 guard !signatureAccessLevels. isEmpty else { return nil }
165177
166178 var decls : [ DeclSyntax ] = [ ]
179+ var asyncGenericResults = Set < BridgeType > ( )
167180 for signature in signatureAccessLevels. keys. sorted ( by: { $0. mangleName < $1. mangleName } ) {
168181 let accessLevel = signatureAccessLevels [ signature] ?? . internal
169182 decls. append ( contentsOf: try renderClosureHelpers ( signature, accessLevel: accessLevel) )
170- decls. append ( try renderClosureInvokeHandler ( signature) )
183+ if signature. genericParameterNames. isEmpty {
184+ decls. append ( try renderClosureInvokeHandler ( signature) )
185+ }
186+ let returnType = signature. returnType
187+ if signature. isAsync, returnType. usesGenericParameter, asyncGenericResults. insert ( returnType) . inserted {
188+ let parameter = Parameter ( label: nil , name: " value " , type: . jsValue)
189+ let effects = Effects ( isAsync: false , isThrows: true )
190+ let builder = try ImportTS . CallJSEmission (
191+ moduleName: " bjs " ,
192+ abiName: " async_callback_result_ \( signature. moduleName) _ \( returnType. mangleTypeName) " ,
193+ effects: effects,
194+ returnType: returnType
195+ )
196+ try builder. lowerParameter ( param: parameter)
197+ builder. appendTypeIDParameters ( returnType. referencedGenericNames)
198+ try builder. call ( )
199+ try builder. liftReturnValue ( )
200+ decls. append ( builder. renderImportDecl ( ) )
201+ decls. append (
202+ builder. renderThunkDecl (
203+ name: " _bjs_async_result_ \( returnType. mangleTypeName) " ,
204+ parameters: [ parameter] ,
205+ returnType: returnType,
206+ effects: effects,
207+ genericParameters: returnType. referencedGenericNames. map { GenericParameter ( name: $0) }
208+ )
209+ )
210+ }
171211 }
172212
173213 return withSpan ( " Format Closure Glue " ) {
0 commit comments