@@ -134,39 +134,26 @@ public class ExportSwift {
134134 case . closure ( let signature , _) :
135135 typeNameForIntrinsic = param . type . swiftType
136136 liftingExpr = ExprSyntax ( " _BJS_Closure_ \( raw : signature . mangleName ) .bridgeJSLift( \( raw : param . name ) ) " )
137- case . swiftStruct ( let structName ) :
138- typeNameForIntrinsic = structName
139- liftingExpr = ExprSyntax ( " \( raw : structName ) .bridgeJSLiftParameter() " )
140137 case . array :
141138 typeNameForIntrinsic = param . type . swiftType
142139 liftingExpr = StackCodegen ( ) . liftExpression ( for : param . type )
143140 case . nullable ( let wrappedType , let kind ) :
144- let optionalSwiftType : String
145- if case . null = kind {
146- optionalSwiftType = " Optional "
147- } else {
148- optionalSwiftType = " JSUndefinedOr "
149- }
150- if case . swiftProtocol ( let protocolName ) = wrappedType {
151- let wrapperName = " Any \( protocolName ) "
152- typeNameForIntrinsic = " \( optionalSwiftType ) < \( wrapperName ) > "
153- liftingExpr = ExprSyntax (
154- " \( raw : typeNameForIntrinsic ) .bridgeJSLiftParameter( \( raw : argumentsToLift . joined ( separator : " , " ) ) ) "
155- )
156- } else {
157- typeNameForIntrinsic = " \( optionalSwiftType ) < \( wrappedType . swiftType ) > "
158- liftingExpr = ExprSyntax (
159- " \( raw : typeNameForIntrinsic ) .bridgeJSLiftParameter( \( raw : argumentsToLift . joined ( separator : " , " ) ) ) "
160- )
161- }
162- case . swiftProtocol ( let protocolName ) :
163- let wrapperName = " Any \( protocolName ) "
164- typeNameForIntrinsic = wrapperName
141+ let optionalSwiftType : String =
142+ if case . null = kind { " Optional " } else { " JSUndefinedOr " }
143+ let wrappedName : String =
144+ if case . cast ( let name ) = wrappedType . descriptor . accessorTransform { name } else {
145+ wrappedType . swiftType
146+ }
147+ typeNameForIntrinsic = " \( optionalSwiftType ) < \( wrappedName ) > "
165148 liftingExpr = ExprSyntax (
166- " \( raw : wrapperName ) .bridgeJSLiftParameter( \( raw : argumentsToLift . joined ( separator : " , " ) ) ) "
149+ " \( raw : typeNameForIntrinsic ) .bridgeJSLiftParameter( \( raw : argumentsToLift . joined ( separator : " , " ) ) ) "
167150 )
168151 default :
169- typeNameForIntrinsic = param . type . swiftType
152+ if case . cast ( let name ) = param . type . descriptor . accessorTransform {
153+ typeNameForIntrinsic = name
154+ } else {
155+ typeNameForIntrinsic = param . type . swiftType
156+ }
170157 liftingExpr = ExprSyntax (
171158 " \( raw : typeNameForIntrinsic ) .bridgeJSLiftParameter( \( raw : argumentsToLift . joined ( separator : " , " ) ) ) "
172159 )
@@ -211,26 +198,9 @@ public class ExportSwift {
211198 if returnType == . void {
212199 return CodeBlockItemSyntax ( item : . init ( ExpressionStmtSyntax ( expression : callExpr ) ) )
213200 } else {
214- switch returnType {
215- case . swiftProtocol ( let protocolName ) :
216- let wrapperName = " Any \( protocolName ) "
217- return CodeBlockItemSyntax (
218- item : . init ( DeclSyntax ( " let ret = \( raw : callExpr ) as! \( raw : wrapperName ) " ) )
219- )
220- case . nullable ( let wrappedType , _) :
221- if case . swiftProtocol ( let protocolName ) = wrappedType {
222- let wrapperName = " Any \( protocolName ) "
223- return CodeBlockItemSyntax (
224- item : . init (
225- DeclSyntax ( " let ret = ( \( raw : callExpr ) ).flatMap { $0 as? \( raw : wrapperName ) } " )
226- )
227- )
228- } else {
229- return CodeBlockItemSyntax ( item : . init ( DeclSyntax ( " let ret = \( raw : callExpr ) " ) ) )
230- }
231- default :
232- return CodeBlockItemSyntax ( item : . init ( DeclSyntax ( " let ret = \( raw : callExpr ) " ) ) )
233- }
201+ let binding = returnType . descriptor . accessorTransform
202+ . applyToReturnBinding ( " \( callExpr ) " , isOptional : returnType . isOptional )
203+ return CodeBlockItemSyntax ( item : . init ( DeclSyntax ( " \( raw : binding ) " ) ) )
234204 }
235205 }
236206
@@ -244,20 +214,9 @@ public class ExportSwift {
244214 if returnType == . void {
245215 append ( " \( raw : name ) " )
246216 } else {
247- switch returnType {
248- case . swiftProtocol ( let protocolName ) :
249- let wrapperName = " Any \( protocolName ) "
250- append ( " let ret = \( raw : name ) as! \( raw : wrapperName ) " )
251- case . nullable ( let wrappedType , _) :
252- if case . swiftProtocol ( let protocolName ) = wrappedType {
253- let wrapperName = " Any \( protocolName ) "
254- append ( " let ret = \( raw : name ) .flatMap { $0 as? \( raw : wrapperName ) } " )
255- } else {
256- append ( " let ret = \( raw : name ) " )
257- }
258- default :
259- append ( " let ret = \( raw : name ) " )
260- }
217+ let binding = returnType . descriptor . accessorTransform
218+ . applyToReturnBinding ( name , isOptional : returnType . isOptional )
219+ append ( " \( raw : binding ) " )
261220 }
262221 }
263222
@@ -274,14 +233,7 @@ public class ExportSwift {
274233 /// Generates intermediate variables for stack-using parameters if needed for LIFO compatibility
275234 private func generateParameterLifting ( ) {
276235 let stackParamIndices = parameters . enumerated ( ) . compactMap { index , param -> Int ? in
277- switch param . type {
278- case . swiftStruct , . nullable ( . swiftStruct , _) ,
279- . associatedValueEnum , . nullable ( . associatedValueEnum , _) ,
280- . array :
281- return index
282- default :
283- return nil
284- }
236+ param . type . descriptor . usesStackLifting ? index : nil
285237 }
286238
287239 guard stackParamIndices . count > 1 else { return }
@@ -298,23 +250,13 @@ public class ExportSwift {
298250
299251 func callPropertyGetter ( propertyName : String , returnType : BridgeType ) {
300252 let ( _, selfExpr ) = removeFirstLiftedParameter ( )
253+ let expr = " \( selfExpr ) . \( propertyName ) "
301254 if returnType == . void {
302- append ( " \( raw : selfExpr ) . \( raw : propertyName ) " )
255+ append ( " \( raw : expr ) " )
303256 } else {
304- switch returnType {
305- case . swiftProtocol ( let protocolName ) :
306- let wrapperName = " Any \( protocolName ) "
307- append ( " let ret = \( raw : selfExpr ) . \( raw : propertyName ) as! \( raw : wrapperName ) " )
308- case . nullable ( let wrappedType , _) :
309- if case . swiftProtocol ( let protocolName ) = wrappedType {
310- let wrapperName = " Any \( protocolName ) "
311- append ( " let ret = \( raw : selfExpr ) . \( raw : propertyName ) .flatMap { $0 as? \( raw : wrapperName ) } " )
312- } else {
313- append ( " let ret = \( raw : selfExpr ) . \( raw : propertyName ) " )
314- }
315- default :
316- append ( " let ret = \( raw : selfExpr ) . \( raw : propertyName ) " )
317- }
257+ let binding = returnType . descriptor . accessorTransform
258+ . applyToReturnBinding ( expr , isOptional : returnType . isOptional )
259+ append ( " \( raw : binding ) " )
318260 }
319261 }
320262
@@ -778,30 +720,15 @@ struct StackCodegen {
778720 func liftExpression ( for type : BridgeType ) -> ExprSyntax {
779721 switch type {
780722 case . string , . int , . uint , . bool , . float , . double ,
781- . jsObject ( nil ) , . jsValue , . swiftStruct , . swiftHeapObject :
723+ . jsObject ( nil ) , . jsValue , . swiftStruct , . swiftHeapObject , . unsafePointer :
782724 return " \( raw : type . swiftType ) .bridgeJSLiftParameter() "
783725 case . jsObject ( let className ? ) :
784726 return " \( raw : className ) (unsafelyWrapping: JSObject.bridgeJSLiftParameter()) "
785- case . unsafePointer :
786- return " \( raw : type . swiftType ) .bridgeJSLiftParameter() "
787- case . swiftProtocol ( let protocolName ) :
788- return " Any \( raw : protocolName ) .bridgeJSLiftParameter(_swift_js_pop_i32()) "
789- case . caseEnum :
790- return " \( raw : type . swiftType ) .bridgeJSLiftParameter(_swift_js_pop_i32()) "
791- case . rawValueEnum ( _, let rawType ) :
792- switch rawType {
793- case . string :
794- return
795- " \( raw : type . swiftType ) .bridgeJSLiftParameter(_swift_js_pop_i32(), _swift_js_pop_i32()) "
796- case . float :
797- return " \( raw : type . swiftType ) .bridgeJSLiftParameter(_swift_js_pop_f32()) "
798- case . double :
799- return " \( raw : type . swiftType ) .bridgeJSLiftParameter(_swift_js_pop_f64()) "
800- case . bool , . int , . int32 , . int64 , . uint , . uint32 , . uint64 :
801- return " \( raw : type . swiftType ) .bridgeJSLiftParameter(_swift_js_pop_i32()) "
802- }
803- case . associatedValueEnum :
727+ case . swiftProtocol , . caseEnum , . associatedValueEnum :
804728 return " \( raw : type . swiftType ) .bridgeJSLiftParameter(_swift_js_pop_i32()) "
729+ case . rawValueEnum :
730+ let popArgs = type . descriptor . wasmParams . map { " _swift_js_pop_ \( $0 . type . rawValue ) () " } . joined ( separator : " , " )
731+ return " \( raw : type . swiftType ) .bridgeJSLiftParameter( \( raw : popArgs ) ) "
805732 case . nullable ( let wrappedType , let kind ) :
806733 return liftNullableExpression ( wrappedType : wrappedType , kind : kind )
807734 case . array ( let elementType ) :
@@ -819,12 +746,8 @@ struct StackCodegen {
819746 switch elementType {
820747 case . jsObject ( let className ? ) where className != " JSObject " :
821748 return liftArrayExpressionInline ( elementType : elementType )
822- case . swiftProtocol ( let protocolName ) :
823- return " [Any \( raw : protocolName ) ].bridgeJSLiftParameter() "
824749 case . nullable , . closure :
825750 return liftArrayExpressionInline ( elementType : elementType )
826- case . void , . namespaceEnum :
827- fatalError ( " Invalid array element type: \( elementType ) " )
828751 default :
829752 return " [ \( raw : elementType . swiftType ) ].bridgeJSLiftParameter() "
830753 }
@@ -943,23 +866,16 @@ struct StackCodegen {
943866 accessor : String ,
944867 varPrefix : String
945868 ) -> [ CodeBlockItemSyntax ] {
946- // Types needing accessor transformation
947- switch elementType {
948- case . jsObject ( let className ? ) where className != " JSObject " :
949- return [ " \( raw : accessor ) .map { $0.jsObject }.bridgeJSLowerReturn() " ]
950- case . swiftProtocol ( let protocolName ) :
951- return [ " \( raw : accessor ) .map { $0 as! Any \( raw : protocolName ) }.bridgeJSLowerReturn() " ]
952- case . nullable , . closure :
953- return lowerArrayStatementsInline (
954- elementType : elementType ,
955- accessor : accessor ,
956- varPrefix : varPrefix
957- )
958- case . void , . namespaceEnum :
959- fatalError ( " Invalid array element type: \( elementType ) " )
960- default :
961- return [ " \( raw : accessor ) .bridgeJSLowerReturn() " ]
869+ if case . nullable = elementType {
870+ return lowerArrayStatementsInline ( elementType : elementType , accessor : accessor , varPrefix : varPrefix )
871+ }
872+ if case . closure = elementType {
873+ return lowerArrayStatementsInline ( elementType : elementType , accessor : accessor , varPrefix : varPrefix )
962874 }
875+ if let mapClosure = elementType . descriptor . accessorTransform . mapClosure {
876+ return [ " \( raw : accessor ) .map { \( raw : mapClosure ) }.bridgeJSLowerReturn() " ]
877+ }
878+ return [ " \( raw : accessor ) .bridgeJSLowerReturn() " ]
963879 }
964880
965881 private func lowerArrayStatementsInline (
@@ -991,22 +907,16 @@ struct StackCodegen {
991907 accessor : String ,
992908 varPrefix : String
993909 ) -> [ CodeBlockItemSyntax ] {
994- switch valueType {
995- case . jsObject ( let className ? ) where className != " JSObject " :
996- return [ " \( raw : accessor ) .mapValues { $0.jsObject }.bridgeJSLowerReturn() " ]
997- case . swiftProtocol ( let protocolName ) :
998- return [ " \( raw : accessor ) .mapValues { $0 as! Any \( raw : protocolName ) }.bridgeJSLowerReturn() " ]
999- case . nullable , . closure :
1000- return lowerDictionaryStatementsInline (
1001- valueType : valueType ,
1002- accessor : accessor ,
1003- varPrefix : varPrefix
1004- )
1005- case . void , . namespaceEnum :
1006- fatalError ( " Invalid dictionary value type: \( valueType ) " )
1007- default :
1008- return [ " \( raw : accessor ) .bridgeJSLowerReturn() " ]
910+ if case . nullable = valueType {
911+ return lowerDictionaryStatementsInline ( valueType : valueType , accessor : accessor , varPrefix : varPrefix )
912+ }
913+ if case . closure = valueType {
914+ return lowerDictionaryStatementsInline ( valueType : valueType , accessor : accessor , varPrefix : varPrefix )
915+ }
916+ if let mapClosure = valueType . descriptor . accessorTransform . mapClosure {
917+ return [ " \( raw : accessor ) .mapValues { \( raw : mapClosure ) }.bridgeJSLowerReturn() " ]
1009918 }
919+ return [ " \( raw : accessor ) .bridgeJSLowerReturn() " ]
1010920 }
1011921
1012922 private func lowerDictionaryStatementsInline (
0 commit comments