Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
104 changes: 30 additions & 74 deletions Plugins/BridgeJS/Sources/BridgeJSCore/ExportSwift.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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()
Expand Down Expand Up @@ -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)"))
)
}
}

Expand All @@ -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)")
}
}

Expand Down Expand Up @@ -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)")
}
}

Expand Down Expand Up @@ -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\")"]
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down
8 changes: 4 additions & 4 deletions Tests/BridgeJSRuntimeTests/Generated/BridgeJS.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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)
}
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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")
Expand Down