@@ -143,6 +143,11 @@ public struct ImportTS {
143143 }
144144
145145 func lowerParameter( param: Parameter ) throws {
146+ if case . generic = param. type {
147+ stackLoweringStmts. insert ( " \( param. name) .bridgeJSStackPush() " , 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( genericParameterName: String ) {
250+ let abiParamName = " \( genericParameterName. lowercased ( ) ) 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)
@@ -298,6 +309,8 @@ public struct ImportTS {
298309 } else {
299310 let liftExpr : String
300311 switch returnType {
312+ case . generic( let name) :
313+ liftExpr = " \( name) .bridgeJSStackPop() "
301314 case . closure( let signature, _) :
302315 liftExpr = " _BJS_Closure_ \( signature. mangleName) .bridgeJSLift(ret) "
303316 default :
@@ -363,7 +376,8 @@ public struct ImportTS {
363376 name: String ,
364377 parameters: [ Parameter ] ,
365378 returnType: BridgeType ,
366- effects: Effects
379+ effects: Effects ,
380+ genericParameters: [ String ] = [ ]
367381 ) -> DeclSyntax {
368382 let printer = CodeFragmentPrinter ( )
369383 let signature = SwiftSignatureBuilder . buildFunctionSignature (
@@ -372,7 +386,12 @@ public struct ImportTS {
372386 effects: effects,
373387 useWildcardLabels: true
374388 )
375- printer. write ( " func \( name. backtickIfNeeded ( ) ) \( signature) { " )
389+ let genericClause =
390+ genericParameters. isEmpty
391+ ? " "
392+ : " < " + genericParameters. map { " \( $0) : _BridgedSwiftGenericBridgeable " } . joined ( separator: " , " )
393+ + " > "
394+ printer. write ( " func \( name. backtickIfNeeded ( ) ) \( genericClause) \( signature) { " )
376395 printer. indent {
377396 printer. write ( lines: body. lines)
378397 }
@@ -432,6 +451,9 @@ public struct ImportTS {
432451 for param in function. parameters {
433452 try builder. lowerParameter ( param: param)
434453 }
454+ for genericParam in function. genericParameters {
455+ builder. appendTypeIDParameter ( genericParameterName: genericParam)
456+ }
435457 try builder. call ( )
436458 try builder. liftReturnValue ( )
437459 topLevelDecls. append ( builder. renderImportDecl ( ) )
@@ -440,7 +462,8 @@ public struct ImportTS {
440462 name: Self . thunkName ( function: function) ,
441463 parameters: function. parameters,
442464 returnType: function. returnType,
443- effects: function. effects
465+ effects: function. effects,
466+ genericParameters: function. genericParameters
444467 )
445468 . with ( \. leadingTrivia, Self . renderDocumentation ( documentation: function. documentation) )
446469 ]
@@ -957,6 +980,8 @@ extension BridgeType {
957980 return LoweringParameterInfo ( loweredParameters: params, useBorrowing: wrappedInfo. useBorrowing)
958981 case . array, . dictionary:
959982 return LoweringParameterInfo ( loweredParameters: [ ] )
983+ case . generic:
984+ return LoweringParameterInfo ( loweredParameters: [ ] )
960985 }
961986 }
962987
@@ -1029,6 +1054,8 @@ extension BridgeType {
10291054 return LiftingReturnInfo ( valueToLift: wrappedInfo. valueToLift)
10301055 case . array, . dictionary:
10311056 return LiftingReturnInfo ( valueToLift: nil )
1057+ case . generic:
1058+ return LiftingReturnInfo ( valueToLift: nil )
10321059 }
10331060 }
10341061}
0 commit comments