@@ -470,12 +470,8 @@ public struct BridgeJSLink {
470470 }
471471 }
472472
473- private func genericCodecEntries(
474- allStructs: [ ExportedStruct ] ,
475- allClasses: [ ExportedClass ] ,
476- allEnums: [ ExportedEnum ]
477- ) -> [ ( token: String , type: BridgeType ) ] {
478- var entries : [ ( token: String , type: BridgeType ) ] = [
473+ private var genericPrimitiveEntries : [ ( token: String , type: BridgeType ) ] {
474+ [
479475 ( " Bool " , . bool) ,
480476 ( " Int " , . integer( . int) ) ,
481477 ( " Int8 " , . integer( . int8) ) ,
@@ -492,6 +488,14 @@ public struct BridgeJSLink {
492488 ( " String " , . string) ,
493489 ( " JSValue " , . jsValue) ,
494490 ]
491+ }
492+
493+ private func genericCodecEntries(
494+ allStructs: [ ExportedStruct ] ,
495+ allClasses: [ ExportedClass ] ,
496+ allEnums: [ ExportedEnum ]
497+ ) -> [ ( token: String , type: BridgeType ) ] {
498+ var entries = genericPrimitiveEntries
495499 for structDef in allStructs {
496500 entries. append ( ( structDef. abiName, . swiftStruct( structDef. abiName) ) )
497501 }
@@ -571,23 +575,9 @@ public struct BridgeJSLink {
571575 }
572576
573577 private func generateBridgeTypeTokens( ) -> ( js: [ String ] , dts: [ String ] ) {
574- let primitives : [ ( token: String , tsType: String ) ] = [
575- ( " Bool " , BridgeType . bool. tsType) ,
576- ( " Int " , BridgeType . integer ( . int) . tsType) ,
577- ( " Int8 " , BridgeType . integer ( . int8) . tsType) ,
578- ( " UInt8 " , BridgeType . integer ( . uint8) . tsType) ,
579- ( " Int16 " , BridgeType . integer ( . int16) . tsType) ,
580- ( " UInt16 " , BridgeType . integer ( . uint16) . tsType) ,
581- ( " Int32 " , BridgeType . integer ( . int32) . tsType) ,
582- ( " UInt32 " , BridgeType . integer ( . uint32) . tsType) ,
583- ( " UInt " , BridgeType . integer ( . uint) . tsType) ,
584- ( " Int64 " , BridgeType . integer ( . int64) . tsType) ,
585- ( " UInt64 " , BridgeType . integer ( . uint64) . tsType) ,
586- ( " Float " , BridgeType . float. tsType) ,
587- ( " Double " , BridgeType . double. tsType) ,
588- ( " String " , BridgeType . string. tsType) ,
589- ( " JSValue " , BridgeType . jsValue. tsType) ,
590- ]
578+ let primitives : [ ( token: String , tsType: String ) ] = genericPrimitiveEntries. map {
579+ ( token: $0. token, tsType: $0. type. tsType)
580+ }
591581 func tsQualifiedName( name: String , namespace: [ String ] ? ) -> String {
592582 ( ( namespace ?? [ ] ) + [ name] ) . joined ( separator: " . " )
593583 }
@@ -609,8 +599,9 @@ public struct BridgeJSLink {
609599 )
610600 }
611601 for enumDef in enums {
612- guard let bridgeType = genericEnumBridgeType ( enumDef) else { continue }
613- tokens. append ( ( token: enumDef. abiName, tsType: bridgeType. tsType) )
602+ guard genericEnumBridgeType ( enumDef) != nil else { continue }
603+ let enumTypeName = enumDef. emitStyle == . tsEnum ? enumDef. tsFullPath : " \( enumDef. tsFullPath) Tag "
604+ tokens. append ( ( token: enumDef. abiName, tsType: enumTypeName) )
614605 }
615606
616607 let jsEntries = tokens. map { " \( $0. token) : \" \( $0. token) \" " }
@@ -2201,9 +2192,20 @@ extension BridgeJSLink {
22012192 }
22022193 let concreteForwardings = thunkBuilder. parameterForwardings
22032194
2204- func tokenName( _ genericName: String ) -> String { " type \( genericName) " }
2205- func codecVariable( _ genericName: String ) -> String { " codec \( genericName) " }
2206- func typeIdVariable( _ genericName: String ) -> String { " \( genericName. lowercased ( ) ) TypeId " }
2195+ let nameScope = JSGlueVariableScope ( intrinsicRegistry: intrinsicRegistry)
2196+ for parameter in function. parameters {
2197+ _ = nameScope. variable ( parameter. name)
2198+ }
2199+ let tokenNames = Dictionary ( uniqueKeysWithValues: genericNames. map { ( $0, nameScope. variable ( " type \( $0) " ) ) } )
2200+ let codecNames = Dictionary ( uniqueKeysWithValues: genericNames. map { ( $0, nameScope. variable ( " codec \( $0) " ) ) } )
2201+ let typeIdNames = Dictionary (
2202+ uniqueKeysWithValues: genericNames. map { ( $0, nameScope. variable ( " \( $0. lowercased ( ) ) TypeId " ) ) }
2203+ )
2204+ func tokenName( _ genericName: String ) -> String { tokenNames [ genericName] ?? " type \( genericName) " }
2205+ func codecVariable( _ genericName: String ) -> String { codecNames [ genericName] ?? " codec \( genericName) " }
2206+ func typeIdVariable( _ genericName: String ) -> String {
2207+ typeIdNames [ genericName] ?? " \( genericName. lowercased ( ) ) TypeId "
2208+ }
22072209
22082210 let returnGenericName = function. returnType. referencedGenericName
22092211
@@ -2665,6 +2667,7 @@ extension BridgeJSLink {
26652667 var parameterForwardings : [ String ] = [ ]
26662668 var returnExpr : String ?
26672669 var genericCodecVariables : [ String : String ] = [ : ]
2670+ var genericTypeIdParameters : [ String : String ] = [ : ]
26682671 let printContext : IntrinsicJSFragment . PrintCodeContext
26692672
26702673 init (
@@ -2692,10 +2695,11 @@ extension BridgeJSLink {
26922695
26932696 func declareGenericCodecs( genericParameters: [ String ] ) {
26942697 for genericParam in genericParameters {
2695- let typeIdParam = " \( genericParam. lowercased ( ) ) TypeId "
2698+ let typeIdParam = scope . variable ( " \( genericParam. lowercased ( ) ) TypeId " )
26962699 let codecVar = scope. variable ( " codec \( genericParam) " )
26972700 body. write ( " const \( codecVar) = \( JSGlueVariableScope . reservedCodecsById) [ \( typeIdParam) ]; " )
26982701 genericCodecVariables [ genericParam] = codecVar
2702+ genericTypeIdParameters [ genericParam] = typeIdParam
26992703 }
27002704 }
27012705
@@ -3742,7 +3746,7 @@ extension BridgeJSLink {
37423746 try thunkBuilder. liftParameter ( param: param)
37433747 }
37443748 for genericParam in genericParameters {
3745- thunkBuilder. parameterNames. append ( " \( genericParam . lowercased ( ) ) TypeId " )
3749+ thunkBuilder. parameterNames. append ( thunkBuilder . genericTypeIdParameters [ genericParam ] ?? genericParam )
37463750 }
37473751 let jsName = function. jsName ?? function. name
37483752 let importRootExpr = function. from == . global ? " globalThis " : " imports "
0 commit comments