diff --git a/Plugins/BridgeJS/Sources/BridgeJSCore/ExportSwift.swift b/Plugins/BridgeJS/Sources/BridgeJSCore/ExportSwift.swift index 600a24e2c..e324c866f 100644 --- a/Plugins/BridgeJS/Sources/BridgeJSCore/ExportSwift.swift +++ b/Plugins/BridgeJS/Sources/BridgeJSCore/ExportSwift.swift @@ -147,23 +147,9 @@ public class ExportSwift { } else { optionalSwiftType = "JSUndefinedOr" } - if case .swiftProtocol(let protocolName) = wrappedType { - let wrapperName = "Any\(protocolName)" - typeNameForIntrinsic = "\(optionalSwiftType)<\(wrapperName)>" - liftingExpr = ExprSyntax( - "\(raw: typeNameForIntrinsic).bridgeJSLiftParameter(\(raw: argumentsToLift.joined(separator: ", ")))" - ) - } else { - typeNameForIntrinsic = "\(optionalSwiftType)<\(wrappedType.swiftType)>" - liftingExpr = ExprSyntax( - "\(raw: typeNameForIntrinsic).bridgeJSLiftParameter(\(raw: argumentsToLift.joined(separator: ", ")))" - ) - } - case .swiftProtocol(let protocolName): - let wrapperName = "Any\(protocolName)" - typeNameForIntrinsic = wrapperName + typeNameForIntrinsic = "\(optionalSwiftType)<\(wrappedType.swiftType)>" liftingExpr = ExprSyntax( - "\(raw: wrapperName).bridgeJSLiftParameter(\(raw: argumentsToLift.joined(separator: ", ")))" + "\(raw: typeNameForIntrinsic).bridgeJSLiftParameter(\(raw: argumentsToLift.joined(separator: ", ")))" ) default: typeNameForIntrinsic = param.type.swiftType @@ -178,6 +164,20 @@ public class ExportSwift { } } + private func protocolCastSuffix(for returnType: BridgeType) -> (prefix: String, suffix: String) { + switch returnType { + case .swiftProtocol: + return ("", " as! \(returnType.swiftType)") + case .nullable(let wrappedType, _): + if case .swiftProtocol = wrappedType { + return ("(", ").flatMap { $0 as? \(wrappedType.swiftType) }") + } + return ("", "") + default: + return ("", "") + } + } + private func removeFirstLiftedParameter() -> (parameter: Parameter, expr: ExprSyntax) { let parameter = parameters.removeFirst() let expr = liftedParameterExprs.removeFirst() @@ -211,26 +211,10 @@ public class ExportSwift { if returnType == .void { return CodeBlockItemSyntax(item: .init(ExpressionStmtSyntax(expression: callExpr))) } else { - switch returnType { - case .swiftProtocol(let protocolName): - let wrapperName = "Any\(protocolName)" - return CodeBlockItemSyntax( - item: .init(DeclSyntax("let ret = \(raw: callExpr) as! \(raw: wrapperName)")) - ) - case .nullable(let wrappedType, _): - if case .swiftProtocol(let protocolName) = wrappedType { - let wrapperName = "Any\(protocolName)" - return CodeBlockItemSyntax( - item: .init( - DeclSyntax("let ret = (\(raw: callExpr)).flatMap { $0 as? \(raw: wrapperName) }") - ) - ) - } else { - return CodeBlockItemSyntax(item: .init(DeclSyntax("let ret = \(raw: callExpr)"))) - } - default: - return CodeBlockItemSyntax(item: .init(DeclSyntax("let ret = \(raw: callExpr)"))) - } + let (prefix, suffix) = protocolCastSuffix(for: returnType) + return CodeBlockItemSyntax( + item: .init(DeclSyntax("let ret = \(raw: prefix)\(raw: callExpr)\(raw: suffix)")) + ) } } @@ -244,20 +228,8 @@ public class ExportSwift { if returnType == .void { append("\(raw: name)") } else { - switch returnType { - case .swiftProtocol(let protocolName): - let wrapperName = "Any\(protocolName)" - append("let ret = \(raw: name) as! \(raw: wrapperName)") - case .nullable(let wrappedType, _): - if case .swiftProtocol(let protocolName) = wrappedType { - let wrapperName = "Any\(protocolName)" - append("let ret = \(raw: name).flatMap { $0 as? \(raw: wrapperName) }") - } else { - append("let ret = \(raw: name)") - } - default: - append("let ret = \(raw: name)") - } + let (prefix, suffix) = protocolCastSuffix(for: returnType) + append("let ret = \(raw: prefix)\(raw: name)\(raw: suffix)") } } @@ -301,20 +273,8 @@ public class ExportSwift { if returnType == .void { append("\(raw: selfExpr).\(raw: propertyName)") } else { - switch returnType { - case .swiftProtocol(let protocolName): - let wrapperName = "Any\(protocolName)" - append("let ret = \(raw: selfExpr).\(raw: propertyName) as! \(raw: wrapperName)") - case .nullable(let wrappedType, _): - if case .swiftProtocol(let protocolName) = wrappedType { - let wrapperName = "Any\(protocolName)" - append("let ret = \(raw: selfExpr).\(raw: propertyName).flatMap { $0 as? \(raw: wrapperName) }") - } else { - append("let ret = \(raw: selfExpr).\(raw: propertyName)") - } - default: - append("let ret = \(raw: selfExpr).\(raw: propertyName)") - } + let (prefix, suffix) = protocolCastSuffix(for: returnType) + append("let ret = \(raw: prefix)\(raw: selfExpr).\(raw: propertyName)\(raw: suffix)") } } @@ -1051,18 +1011,14 @@ struct StackCodegen { varPrefix: String ) -> [CodeBlockItemSyntax] { switch wrappedType { - case .string, .int, .uint, .bool, .float, .double, .jsValue: - return ["\(raw: unwrappedVar).bridgeJSLowerStackReturn()"] - case .caseEnum, .rawValueEnum: - return ["\(raw: unwrappedVar).bridgeJSLowerStackReturn()"] - case .swiftHeapObject: - return ["\(raw: unwrappedVar).bridgeJSLowerStackReturn()"] - case .associatedValueEnum: - return ["_swift_js_push_i32(\(raw: unwrappedVar).bridgeJSLowerParameter())"] - case .jsObject(nil): - return ["\(raw: unwrappedVar).bridgeJSLowerStackReturn()"] case .jsObject(_?): return ["\(raw: unwrappedVar).jsObject.bridgeJSLowerStackReturn()"] + case .swiftProtocol: + return ["(\(raw: unwrappedVar) as! \(raw: wrappedType.swiftType)).bridgeJSLowerStackReturn()"] + case .string, .int, .uint, .bool, .float, .double, .jsValue, + .jsObject(nil), .swiftHeapObject, .unsafePointer, .closure, + .caseEnum, .rawValueEnum, .associatedValueEnum: + return ["\(raw: unwrappedVar).bridgeJSLowerStackReturn()"] default: return ["preconditionFailure(\"BridgeJS: unsupported optional wrapped type\")"] } diff --git a/Plugins/BridgeJS/Tests/BridgeJSToolTests/__Snapshots__/BridgeJSCodegenTests/EnumAssociatedValue.swift b/Plugins/BridgeJS/Tests/BridgeJSToolTests/__Snapshots__/BridgeJSCodegenTests/EnumAssociatedValue.swift index 39582c9a9..fa19b481c 100644 --- a/Plugins/BridgeJS/Tests/BridgeJSToolTests/__Snapshots__/BridgeJSCodegenTests/EnumAssociatedValue.swift +++ b/Plugins/BridgeJS/Tests/BridgeJSToolTests/__Snapshots__/BridgeJSCodegenTests/EnumAssociatedValue.swift @@ -387,7 +387,7 @@ extension OptionalAllTypesResult: _BridgedSwiftAssociatedValueEnum { case .optNestedEnum(let param0): let __bjs_isSome_param0 = param0 != nil if let __bjs_unwrapped_param0 = param0 { - _swift_js_push_i32(__bjs_unwrapped_param0.bridgeJSLowerParameter()) + __bjs_unwrapped_param0.bridgeJSLowerStackReturn() } _swift_js_push_i32(__bjs_isSome_param0 ? 1 : 0) return Int32(3) diff --git a/Plugins/BridgeJS/Tests/BridgeJSToolTests/__Snapshots__/BridgeJSCodegenTests/Protocol.swift b/Plugins/BridgeJS/Tests/BridgeJSToolTests/__Snapshots__/BridgeJSCodegenTests/Protocol.swift index fcca0aaa3..4051f5c9e 100644 --- a/Plugins/BridgeJS/Tests/BridgeJSToolTests/__Snapshots__/BridgeJSCodegenTests/Protocol.swift +++ b/Plugins/BridgeJS/Tests/BridgeJSToolTests/__Snapshots__/BridgeJSCodegenTests/Protocol.swift @@ -565,7 +565,7 @@ public func _bjs_MyViewController_delegate_set(_ _self: UnsafeMutableRawPointer, @_cdecl("bjs_MyViewController_secondDelegate_get") public func _bjs_MyViewController_secondDelegate_get(_ _self: UnsafeMutableRawPointer) -> Void { #if arch(wasm32) - let ret = MyViewController.bridgeJSLiftParameter(_self).secondDelegate.flatMap { $0 as? AnyMyViewControllerDelegate } + let ret = (MyViewController.bridgeJSLiftParameter(_self).secondDelegate).flatMap { $0 as? AnyMyViewControllerDelegate } return ret.bridgeJSLowerReturn() #else fatalError("Only available on WebAssembly") diff --git a/Tests/BridgeJSRuntimeTests/Generated/BridgeJS.swift b/Tests/BridgeJSRuntimeTests/Generated/BridgeJS.swift index 07092d4bd..e01c41511 100644 --- a/Tests/BridgeJSRuntimeTests/Generated/BridgeJS.swift +++ b/Tests/BridgeJSRuntimeTests/Generated/BridgeJS.swift @@ -2631,7 +2631,7 @@ extension OptionalAllTypesResult: _BridgedSwiftAssociatedValueEnum { case .optNestedEnum(let param0): let __bjs_isSome_param0 = param0 != nil if let __bjs_unwrapped_param0 = param0 { - _swift_js_push_i32(__bjs_unwrapped_param0.bridgeJSLowerParameter()) + __bjs_unwrapped_param0.bridgeJSLowerStackReturn() } _swift_js_push_i32(__bjs_isSome_param0 ? 1 : 0) return Int32(3) @@ -3115,7 +3115,7 @@ extension ValidationReport: _BridgedSwiftStruct { _swift_js_push_i32(__bjs_isSome_status ? 1 : 0) let __bjs_isSome_outcome = self.outcome != nil if let __bjs_unwrapped_outcome = self.outcome { - _swift_js_push_i32(__bjs_unwrapped_outcome.bridgeJSLowerParameter()) + __bjs_unwrapped_outcome.bridgeJSLowerStackReturn() } _swift_js_push_i32(__bjs_isSome_outcome ? 1 : 0) } @@ -3176,7 +3176,7 @@ extension AdvancedConfig: _BridgedSwiftStruct { self.status.bridgeJSLowerStackReturn() let __bjs_isSome_result = self.result != nil if let __bjs_unwrapped_result = self.result { - _swift_js_push_i32(__bjs_unwrapped_result.bridgeJSLowerParameter()) + __bjs_unwrapped_result.bridgeJSLowerStackReturn() } _swift_js_push_i32(__bjs_isSome_result ? 1 : 0) let __bjs_isSome_metadata = self.metadata != nil @@ -7670,7 +7670,7 @@ public func _bjs_DataProcessorManager_processor_set(_ _self: UnsafeMutableRawPoi @_cdecl("bjs_DataProcessorManager_backupProcessor_get") public func _bjs_DataProcessorManager_backupProcessor_get(_ _self: UnsafeMutableRawPointer) -> Void { #if arch(wasm32) - let ret = DataProcessorManager.bridgeJSLiftParameter(_self).backupProcessor.flatMap { $0 as? AnyDataProcessor } + let ret = (DataProcessorManager.bridgeJSLiftParameter(_self).backupProcessor).flatMap { $0 as? AnyDataProcessor } return ret.bridgeJSLowerReturn() #else fatalError("Only available on WebAssembly")