@@ -838,18 +838,18 @@ struct StackCodegen {
838838
839839 func liftArrayExpression( elementType: BridgeType ) -> ExprSyntax {
840840 switch elementType {
841- case . int, . uint, . float, . double, . string, . bool, . jsValue,
842- . jsObject( nil ) , . swiftStruct, . caseEnum, . swiftHeapObject,
843- . unsafePointer, . rawValueEnum, . associatedValueEnum:
844- return " [ \( raw: elementType. swiftType) ].bridgeJSLiftParameter() "
845- case . jsObject( _? ) :
841+ case . jsObject( let className? ) where className != " JSObject " :
846842 return liftArrayExpressionInline ( elementType: elementType)
847843 case . swiftProtocol( let protocolName) :
848844 return " [Any \( raw: protocolName) ].bridgeJSLiftParameter() "
849- case . nullable, . array , . closure, . dictionary :
845+ case . nullable, . closure:
850846 return liftArrayExpressionInline ( elementType: elementType)
851847 case . void, . namespaceEnum:
852848 fatalError ( " Invalid array element type: \( elementType) " )
849+ default :
850+ // Delegates to the generic Array<Element>.bridgeJSLiftParameter() conformance.
851+ // Works for primitives, structs, enums, nested arrays, dictionaries, JSObject, etc.
852+ return " [ \( raw: elementType. swiftType) ].bridgeJSLiftParameter() "
853853 }
854854 }
855855
@@ -872,11 +872,7 @@ struct StackCodegen {
872872
873873 func liftDictionaryExpression( valueType: BridgeType ) -> ExprSyntax {
874874 switch valueType {
875- case . int, . uint, . float, . double, . string, . bool, . jsValue,
876- . jsObject( nil ) , . swiftStruct, . caseEnum, . swiftHeapObject,
877- . unsafePointer, . rawValueEnum, . associatedValueEnum:
878- return " [String: \( raw: valueType. swiftType) ].bridgeJSLiftParameter() "
879- case . jsObject( let className? ) :
875+ case . jsObject( let className? ) where className != " JSObject " :
880876 return """
881877 {
882878 let __dict = [String: JSObject].bridgeJSLiftParameter()
@@ -890,10 +886,13 @@ struct StackCodegen {
890886 return __dict.mapValues { $0 as! Any \( raw: protocolName) }
891887 }()
892888 """
893- case . nullable, . array , . dictionary , . closure:
889+ case . nullable, . closure:
894890 return liftDictionaryExpressionInline ( valueType: valueType)
895891 case . void, . namespaceEnum:
896892 fatalError ( " Invalid dictionary value type: \( valueType) " )
893+ default :
894+ // Delegates to the generic Dictionary<String, Value>.bridgeJSLiftParameter() conformance.
895+ return " [String: \( raw: valueType. swiftType) ].bridgeJSLiftParameter() "
897896 }
898897 }
899898
@@ -1005,22 +1004,22 @@ struct StackCodegen {
10051004 varPrefix: String
10061005 ) -> [ CodeBlockItemSyntax ] {
10071006 switch elementType {
1008- case . int, . uint, . float, . double, . string, . bool, . jsValue,
1009- . jsObject( nil ) , . swiftStruct, . caseEnum, . swiftHeapObject,
1010- . unsafePointer, . rawValueEnum, . associatedValueEnum:
1011- return [ " \( raw: accessor) .bridgeJSLowerReturn() " ]
1012- case . jsObject( _? ) :
1007+ case . jsObject( let className? ) where className != " JSObject " :
10131008 return [ " \( raw: accessor) .map { $0.jsObject }.bridgeJSLowerReturn() " ]
10141009 case . swiftProtocol( let protocolName) :
10151010 return [ " \( raw: accessor) .map { $0 as! Any \( raw: protocolName) }.bridgeJSLowerReturn() " ]
1016- case . nullable, . array , . closure, . dictionary :
1011+ case . nullable, . closure:
10171012 return lowerArrayStatementsInline (
10181013 elementType: elementType,
10191014 accessor: accessor,
10201015 varPrefix: varPrefix
10211016 )
10221017 case . void, . namespaceEnum:
10231018 fatalError ( " Invalid array element type: \( elementType) " )
1019+ default :
1020+ // Delegates to the generic Array<Element>.bridgeJSLowerReturn() conformance.
1021+ // This works for primitives, structs, enums, nested arrays, dictionaries, etc.
1022+ return [ " \( raw: accessor) .bridgeJSLowerReturn() " ]
10241023 }
10251024 }
10261025
@@ -1054,22 +1053,21 @@ struct StackCodegen {
10541053 varPrefix: String
10551054 ) -> [ CodeBlockItemSyntax ] {
10561055 switch valueType {
1057- case . int, . uint, . float, . double, . string, . bool, . jsValue,
1058- . jsObject( nil ) , . swiftStruct, . caseEnum, . swiftHeapObject,
1059- . unsafePointer, . rawValueEnum, . associatedValueEnum:
1060- return [ " \( raw: accessor) .bridgeJSLowerReturn() " ]
1061- case . jsObject( _? ) :
1056+ case . jsObject( let className? ) where className != " JSObject " :
10621057 return [ " \( raw: accessor) .mapValues { $0.jsObject }.bridgeJSLowerReturn() " ]
10631058 case . swiftProtocol( let protocolName) :
10641059 return [ " \( raw: accessor) .mapValues { $0 as! Any \( raw: protocolName) }.bridgeJSLowerReturn() " ]
1065- case . nullable, . array , . dictionary , . closure:
1060+ case . nullable, . closure:
10661061 return lowerDictionaryStatementsInline (
10671062 valueType: valueType,
10681063 accessor: accessor,
10691064 varPrefix: varPrefix
10701065 )
10711066 case . void, . namespaceEnum:
10721067 fatalError ( " Invalid dictionary value type: \( valueType) " )
1068+ default :
1069+ // Delegates to the generic Dictionary<String, Value>.bridgeJSLowerReturn() conformance.
1070+ return [ " \( raw: accessor) .bridgeJSLowerReturn() " ]
10731071 }
10741072 }
10751073
0 commit comments