@@ -143,6 +143,11 @@ public struct ImportTS {
143143 }
144144
145145 func lowerParameter ( param : Parameter ) throws {
146+ if let genericPush = param . type . genericStackPushStatement ( value : param . name ) {
147+ stackLoweringStmts . insert ( genericPush , at : 0 )
148+ return
149+ }
150+
146151 let loweringInfo = try param . type . loweringParameterInfo ( context : context )
147152
148153 switch param . type {
@@ -241,6 +246,18 @@ public struct ImportTS {
241246 abiParameterForwardings . insert ( contentsOf : [ " resolveRef " , " rejectRef " ] , at : 0 )
242247 }
243248
249+ private func appendTypeIDParameter ( index : Int , genericParameterName : String ) {
250+ let abiParamName = ABINameGenerator . genericTypeIdParameterName ( index : index )
251+ abiParameterSignatures . append ( ( abiParamName , . i32 ) )
252+ abiParameterForwardings . append ( " \( genericParameterName ) .bridgeJSTypeID " )
253+ }
254+
255+ func appendTypeIDParameters ( _ genericParameterNames : [ String ] ) {
256+ for ( index , name ) in genericParameterNames . enumerated ( ) {
257+ appendTypeIDParameter ( index : index , genericParameterName : name )
258+ }
259+ }
260+
244261 func call ( ) throws {
245262 for stmt in stackLoweringStmts {
246263 body . write ( stmt . description )
@@ -297,14 +314,18 @@ public struct ImportTS {
297314 body . write ( " return \( returnType . swiftType ) .bridgeJSLiftReturnFromSideChannel() " )
298315 } else {
299316 let liftExpr : String
300- switch returnType {
301- case . closure ( let signature , _) :
302- liftExpr = " _BJS_Closure_ \( signature . mangleName ) .bridgeJSLift(ret) "
303- default :
304- if liftingInfo . valueToLift != nil {
305- liftExpr = " \( returnType . swiftType ) .bridgeJSLiftReturn(ret) "
306- } else {
307- liftExpr = " \( returnType . swiftType ) .bridgeJSLiftReturn() "
317+ if let genericPop = returnType . genericStackPopExpression {
318+ liftExpr = genericPop
319+ } else {
320+ switch returnType {
321+ case . closure ( let signature , _) :
322+ liftExpr = " _BJS_Closure_ \( signature . mangleName ) .bridgeJSLift(ret) "
323+ default :
324+ if liftingInfo . valueToLift != nil {
325+ liftExpr = " \( returnType . swiftType ) .bridgeJSLiftReturn(ret) "
326+ } else {
327+ liftExpr = " \( returnType . swiftType ) .bridgeJSLiftReturn() "
328+ }
308329 }
309330 }
310331 body . write ( " return \( liftExpr ) " )
@@ -363,7 +384,8 @@ public struct ImportTS {
363384 name : String ,
364385 parameters : [ Parameter ] ,
365386 returnType : BridgeType ,
366- effects : Effects
387+ effects : Effects ,
388+ genericParameters : [ String ] = [ ]
367389 ) -> DeclSyntax {
368390 let printer = CodeFragmentPrinter ( )
369391 let signature = SwiftSignatureBuilder . buildFunctionSignature (
@@ -372,7 +394,12 @@ public struct ImportTS {
372394 effects : effects ,
373395 useWildcardLabels : true
374396 )
375- printer . write ( " func \( name . backtickIfNeeded ( ) ) \( signature ) { " )
397+ let genericClause =
398+ genericParameters . isEmpty
399+ ? " "
400+ : " < " + genericParameters . map { " \( $0 ) : _BridgedSwiftGenericBridgeable " } . joined ( separator : " , " )
401+ + " > "
402+ printer . write ( " func \( name . backtickIfNeeded ( ) ) \( genericClause ) \( signature ) { " )
376403 printer . indent {
377404 printer . write ( lines : body . lines )
378405 }
@@ -432,6 +459,7 @@ public struct ImportTS {
432459 for param in function . parameters {
433460 try builder . lowerParameter ( param : param )
434461 }
462+ builder . appendTypeIDParameters ( function . genericParameterNames )
435463 try builder . call ( )
436464 try builder . liftReturnValue ( )
437465 topLevelDecls . append ( builder . renderImportDecl ( ) )
@@ -440,7 +468,8 @@ public struct ImportTS {
440468 name : Self . thunkName ( function : function ) ,
441469 parameters : function . parameters ,
442470 returnType : function . returnType ,
443- effects : function . effects
471+ effects : function . effects ,
472+ genericParameters : function . genericParameterNames
444473 )
445474 . with ( \. leadingTrivia , Self . renderDocumentation ( documentation : function . documentation ) )
446475 ]
@@ -461,6 +490,7 @@ public struct ImportTS {
461490 for param in method . parameters {
462491 try builder . lowerParameter ( param : param )
463492 }
493+ builder . appendTypeIDParameters ( method . genericParameterNames )
464494 try builder . call ( )
465495 try builder . liftReturnValue ( )
466496 topLevelDecls . append ( builder . renderImportDecl ( ) )
@@ -469,7 +499,8 @@ public struct ImportTS {
469499 name : Self . thunkName ( type : type , method : method ) ,
470500 parameters : [ selfParameter ] + method . parameters ,
471501 returnType : method . returnType ,
472- effects : method . effects
502+ effects : method . effects ,
503+ genericParameters : method . genericParameterNames
473504 )
474505 ]
475506 }
@@ -485,6 +516,7 @@ public struct ImportTS {
485516 for param in method . parameters {
486517 try builder . lowerParameter ( param : param )
487518 }
519+ builder . appendTypeIDParameters ( method . genericParameterNames )
488520 try builder . call ( )
489521 try builder . liftReturnValue ( )
490522 topLevelDecls . append ( builder . renderImportDecl ( ) )
@@ -493,7 +525,8 @@ public struct ImportTS {
493525 name : Self . thunkName ( type : type , method : method ) ,
494526 parameters : method . parameters ,
495527 returnType : method . returnType ,
496- effects : method . effects
528+ effects : method . effects ,
529+ genericParameters : method . genericParameterNames
497530 )
498531 ]
499532 }
@@ -959,6 +992,8 @@ extension BridgeType {
959992 return LoweringParameterInfo ( loweredParameters : [ ] )
960993 case . alias :
961994 preconditionFailure ( " `.alias` must be resolved by `.unaliased` before reaching loweringParameterInfo " )
995+ case . generic :
996+ return LoweringParameterInfo ( loweredParameters : [ ] )
962997 }
963998 }
964999
@@ -1033,6 +1068,8 @@ extension BridgeType {
10331068 return LiftingReturnInfo ( valueToLift : nil )
10341069 case . alias :
10351070 preconditionFailure ( " `.alias` must be resolved by `.unaliased` before reaching liftingReturnInfo " )
1071+ case . generic :
1072+ return LiftingReturnInfo ( valueToLift : nil )
10361073 }
10371074 }
10381075}
0 commit comments