@@ -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,12 @@ public struct ImportTS {
241246 abiParameterForwardings. insert ( contentsOf: [ " resolveRef " , " rejectRef " ] , at: 0 )
242247 }
243248
249+ func appendTypeIDParameter( index: Int , genericParameterName: String ) {
250+ let abiParamName = " _generic \( index) TypeId "
251+ abiParameterSignatures. append ( ( abiParamName, . i32) )
252+ abiParameterForwardings. append ( " \( genericParameterName) .bridgeJSTypeID " )
253+ }
254+
244255 func call( ) throws {
245256 for stmt in stackLoweringStmts {
246257 body. write ( stmt. description)
@@ -297,14 +308,18 @@ public struct ImportTS {
297308 body. write ( " return \( returnType. swiftType) .bridgeJSLiftReturnFromSideChannel() " )
298309 } else {
299310 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() "
311+ if let genericPop = returnType. genericStackPopExpression {
312+ liftExpr = genericPop
313+ } else {
314+ switch returnType {
315+ case . closure( let signature, _) :
316+ liftExpr = " _BJS_Closure_ \( signature. mangleName) .bridgeJSLift(ret) "
317+ default :
318+ if liftingInfo. valueToLift != nil {
319+ liftExpr = " \( returnType. swiftType) .bridgeJSLiftReturn(ret) "
320+ } else {
321+ liftExpr = " \( returnType. swiftType) .bridgeJSLiftReturn() "
322+ }
308323 }
309324 }
310325 body. write ( " return \( liftExpr) " )
@@ -363,7 +378,8 @@ public struct ImportTS {
363378 name: String ,
364379 parameters: [ Parameter ] ,
365380 returnType: BridgeType ,
366- effects: Effects
381+ effects: Effects ,
382+ genericParameters: [ String ] = [ ]
367383 ) -> DeclSyntax {
368384 let printer = CodeFragmentPrinter ( )
369385 let signature = SwiftSignatureBuilder . buildFunctionSignature (
@@ -372,7 +388,12 @@ public struct ImportTS {
372388 effects: effects,
373389 useWildcardLabels: true
374390 )
375- printer. write ( " func \( name. backtickIfNeeded ( ) ) \( signature) { " )
391+ let genericClause =
392+ genericParameters. isEmpty
393+ ? " "
394+ : " < " + genericParameters. map { " \( $0) : _BridgedSwiftGenericBridgeable " } . joined ( separator: " , " )
395+ + " > "
396+ printer. write ( " func \( name. backtickIfNeeded ( ) ) \( genericClause) \( signature) { " )
376397 printer. indent {
377398 printer. write ( lines: body. lines)
378399 }
@@ -432,6 +453,9 @@ public struct ImportTS {
432453 for param in function. parameters {
433454 try builder. lowerParameter ( param: param)
434455 }
456+ for (index, genericParam) in ( function. genericParameters ?? [ ] ) . enumerated ( ) {
457+ builder. appendTypeIDParameter ( index: index, genericParameterName: genericParam)
458+ }
435459 try builder. call ( )
436460 try builder. liftReturnValue ( )
437461 topLevelDecls. append ( builder. renderImportDecl ( ) )
@@ -440,7 +464,8 @@ public struct ImportTS {
440464 name: Self . thunkName ( function: function) ,
441465 parameters: function. parameters,
442466 returnType: function. returnType,
443- effects: function. effects
467+ effects: function. effects,
468+ genericParameters: function. genericParameters ?? [ ]
444469 )
445470 . with ( \. leadingTrivia, Self . renderDocumentation ( documentation: function. documentation) )
446471 ]
@@ -959,6 +984,8 @@ extension BridgeType {
959984 return LoweringParameterInfo ( loweredParameters: [ ] )
960985 case . alias:
961986 preconditionFailure ( " `.alias` must be resolved by `.unaliased` before reaching loweringParameterInfo " )
987+ case . generic:
988+ return LoweringParameterInfo ( loweredParameters: [ ] )
962989 }
963990 }
964991
@@ -1033,6 +1060,8 @@ extension BridgeType {
10331060 return LiftingReturnInfo ( valueToLift: nil )
10341061 case . alias:
10351062 preconditionFailure ( " `.alias` must be resolved by `.unaliased` before reaching liftingReturnInfo " )
1063+ case . generic:
1064+ return LiftingReturnInfo ( valueToLift: nil )
10361065 }
10371066 }
10381067}
0 commit comments