@@ -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