@@ -482,12 +482,7 @@ public class ExportSwift {
482482 }
483483
484484 if function. effects. isStatic, let staticContext = function. staticContext {
485- let callName : String
486- switch staticContext {
487- case . className( let baseName) , . enumName( let baseName) , . structName( let baseName) ,
488- . namespaceEnum( let baseName) :
489- callName = " \( baseName) . \( function. name) "
490- }
485+ let callName = " \( staticContextBaseName ( staticContext) ) . \( function. name) "
491486 builder. call ( name: callName, returnType: function. returnType)
492487 } else {
493488 builder. call ( name: function. name, returnType: function. returnType)
@@ -497,17 +492,61 @@ public class ExportSwift {
497492 return builder. render ( abiName: function. abiName)
498493 }
499494
495+ private func staticContextBaseName( _ staticContext: StaticContext ) -> String {
496+ switch staticContext {
497+ case . className( let baseName) , . enumName( let baseName) , . structName( let baseName) ,
498+ . namespaceEnum( let baseName) :
499+ return baseName
500+ }
501+ }
502+
503+ private func renderSingleExportedConstructor(
504+ constructor: ExportedConstructor ,
505+ callName: String ,
506+ returnType: BridgeType
507+ ) throws -> DeclSyntax {
508+ let builder = ExportedThunkBuilder ( effects: constructor. effects)
509+ for param in constructor. parameters {
510+ try builder. liftParameter ( param: param)
511+ }
512+ builder. call ( name: callName, returnType: returnType)
513+ try builder. lowerReturnValue ( returnType: returnType)
514+ return builder. render ( abiName: constructor. abiName)
515+ }
516+
517+ private func renderSingleExportedMethod(
518+ method: ExportedFunction ,
519+ ownerTypeName: String ,
520+ instanceSelfType: BridgeType
521+ ) throws -> DeclSyntax {
522+ let builder = ExportedThunkBuilder ( effects: method. effects)
523+ if !method. effects. isStatic {
524+ try builder. liftParameter ( param: Parameter ( label: nil , name: " _self " , type: instanceSelfType) )
525+ }
526+ for param in method. parameters {
527+ try builder. liftParameter ( param: param)
528+ }
529+
530+ if method. effects. isStatic {
531+ builder. call ( name: " \( ownerTypeName) . \( method. name) " , returnType: method. returnType)
532+ } else {
533+ builder. callMethod ( methodName: method. name, returnType: method. returnType)
534+ }
535+ try builder. lowerReturnValue ( returnType: method. returnType)
536+ return builder. render ( abiName: method. abiName)
537+ }
538+
500539 func renderSingleExportedStruct( struct structDef: ExportedStruct ) throws -> [ DeclSyntax ] {
501540 var decls : [ DeclSyntax ] = [ ]
502541
503542 if let constructor = structDef. constructor {
504- let builder = ExportedThunkBuilder ( effects : constructor . effects )
505- for param in constructor . parameters {
506- try builder . liftParameter ( param : param )
507- }
508- builder . call ( name : structDef . swiftCallName , returnType: . swiftStruct( structDef. swiftCallName) )
509- try builder . lowerReturnValue ( returnType : . swiftStruct ( structDef . swiftCallName ) )
510- decls . append ( builder . render ( abiName : constructor . abiName ) )
543+ decls . append (
544+ try renderSingleExportedConstructor (
545+ constructor : constructor ,
546+ callName : structDef . swiftCallName ,
547+ returnType: . swiftStruct( structDef. swiftCallName)
548+ )
549+ )
511550 }
512551
513552 for property in structDef. properties where property. isStatic {
@@ -520,28 +559,13 @@ public class ExportSwift {
520559 }
521560
522561 for method in structDef. methods {
523- let builder = ExportedThunkBuilder ( effects: method. effects)
524-
525- if method. effects. isStatic {
526- for param in method. parameters {
527- try builder. liftParameter ( param: param)
528- }
529- builder. call ( name: " \( structDef. swiftCallName) . \( method. name) " , returnType: method. returnType)
530- } else {
531- try builder. liftParameter (
532- param: Parameter ( label: nil , name: " _self " , type: . swiftStruct( structDef. swiftCallName) )
533- )
534- for param in method. parameters {
535- try builder. liftParameter ( param: param)
536- }
537- builder. callMethod (
538- methodName: method. name,
539- returnType: method. returnType
562+ decls. append (
563+ try renderSingleExportedMethod (
564+ method: method,
565+ ownerTypeName: structDef. swiftCallName,
566+ instanceSelfType: . swiftStruct( structDef. swiftCallName)
540567 )
541- }
542-
543- try builder. lowerReturnValue ( returnType: method. returnType)
544- decls. append ( builder. render ( abiName: method. abiName) )
568+ )
545569 }
546570
547571 return decls
@@ -598,55 +622,29 @@ public class ExportSwift {
598622 var decls : [ DeclSyntax ] = [ ]
599623
600624 if let constructor = klass. constructor {
601- let builder = ExportedThunkBuilder ( effects : constructor . effects )
602- for param in constructor . parameters {
603- try builder . liftParameter ( param : param )
604- }
605- builder . call ( name : klass . swiftCallName , returnType: BridgeType . swiftHeapObject ( klass. name) )
606- try builder . lowerReturnValue ( returnType : BridgeType . swiftHeapObject ( klass . name ) )
607- decls . append ( builder . render ( abiName : constructor . abiName ) )
625+ decls . append (
626+ try renderSingleExportedConstructor (
627+ constructor : constructor ,
628+ callName : klass . swiftCallName ,
629+ returnType: . swiftHeapObject( klass. name)
630+ )
631+ )
608632 }
609633 for method in klass. methods {
610- let builder = ExportedThunkBuilder ( effects: method. effects)
611-
612- if method. effects. isStatic {
613- for param in method. parameters {
614- try builder. liftParameter ( param: param)
615- }
616- builder. call ( name: " \( klass. swiftCallName) . \( method. name) " , returnType: method. returnType)
617- } else {
618- try builder. liftParameter (
619- param: Parameter ( label: nil , name: " _self " , type: BridgeType . swiftHeapObject ( klass. swiftCallName) )
620- )
621- for param in method. parameters {
622- try builder. liftParameter ( param: param)
623- }
624- builder. callMethod (
625- methodName: method. name,
626- returnType: method. returnType
634+ decls. append (
635+ try renderSingleExportedMethod (
636+ method: method,
637+ ownerTypeName: klass. swiftCallName,
638+ instanceSelfType: . swiftHeapObject( klass. swiftCallName)
627639 )
628- }
629- try builder. lowerReturnValue ( returnType: method. returnType)
630- decls. append ( builder. render ( abiName: method. abiName) )
640+ )
631641 }
632642
633643 // Generate property getters and setters
634644 for property in klass. properties {
635- if property. isStatic {
636- decls. append (
637- contentsOf: try renderSingleExportedProperty (
638- property: property,
639- context: . classStatic( klass: klass)
640- )
641- )
642- } else {
643- decls. append (
644- contentsOf: try renderSingleExportedProperty (
645- property: property,
646- context: . classInstance( klass: klass)
647- )
648- )
649- }
645+ let context : PropertyRenderingContext =
646+ property. isStatic ? . classStatic( klass: klass) : . classInstance( klass: klass)
647+ decls. append ( contentsOf: try renderSingleExportedProperty ( property: property, context: context) )
650648 }
651649
652650 do {
@@ -760,7 +758,7 @@ struct StackCodegen {
760758 func liftArrayExpression( elementType: BridgeType ) -> ExprSyntax {
761759 switch elementType {
762760 case . jsObject( let className? ) where className != " JSObject " :
763- return liftArrayExpressionInline ( elementType : elementType )
761+ return " [JSObject].bridgeJSLiftParameter().map { \( raw : className ) (unsafelyWrapping: $0) } "
764762 case . nullable, . closure:
765763 return liftArrayExpressionInline ( elementType: elementType)
766764 case . void, . namespaceEnum:
@@ -992,8 +990,7 @@ struct StackCodegen {
992990
993991 let innerStatements = lowerUnwrappedOptionalStatements (
994992 wrappedType: wrappedType,
995- unwrappedVar: " __bjs_unwrapped_ \( varPrefix) " ,
996- varPrefix: varPrefix
993+ unwrappedVar: " __bjs_unwrapped_ \( varPrefix) "
997994 )
998995 for stmt in innerStatements {
999996 statements. append ( stmt. description)
@@ -1007,8 +1004,7 @@ struct StackCodegen {
10071004
10081005 private func lowerUnwrappedOptionalStatements(
10091006 wrappedType: BridgeType ,
1010- unwrappedVar: String ,
1011- varPrefix: String
1007+ unwrappedVar: String
10121008 ) -> [ CodeBlockItemSyntax ] {
10131009 switch wrappedType {
10141010 case . jsObject( _? ) :
0 commit comments