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
25 changes: 22 additions & 3 deletions Plugins/BridgeJS/Sources/BridgeJSCore/ClosureCodegen.swift
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@ public struct ClosureCodegen {
public init() {}

private func swiftClosureType(for signature: ClosureSignature) -> String {
let closureParams = signature.parameters.map { "\($0.swiftType)" }.joined(separator: ", ")
let closureParams = signature.parameters.map { "\($0.closureSwiftType)" }.joined(separator: ", ")
let swiftEffects = (signature.isAsync ? " async" : "") + (signature.isThrows ? " throws" : "")
let swiftReturnType = signature.returnType.swiftType
let swiftReturnType = signature.returnType.closureSwiftType
return "(\(closureParams))\(swiftEffects) -> \(swiftReturnType)"
}

Expand Down Expand Up @@ -158,7 +158,26 @@ public struct ClosureCodegen {
printer.write(closureCallExpr.description)
} else {
printer.write("let result = \(closureCallExpr)")
printer.write("return result.bridgeJSLowerReturn()")
switch signature.returnType {
case .swiftProtocol:
printer.write(
"return (result as! _BridgedSwiftProtocolExportable).bridgeJSLowerAsProtocolReturn()"
)
case .nullable(.swiftProtocol, _):
printer.write("if let result {")
printer.indent {
printer.write(
"_swift_js_return_optional_object(1, (result as! _BridgedSwiftProtocolExportable).bridgeJSLowerAsProtocolReturn())"
)
}
printer.write("} else {")
printer.indent {
printer.write("_swift_js_return_optional_object(0, 0)")
}
printer.write("}")
default:
printer.write("return result.bridgeJSLowerReturn()")
}
}
}

Expand Down
10 changes: 10 additions & 0 deletions Plugins/BridgeJS/Sources/BridgeJSCore/ExportSwift.swift
Original file line number Diff line number Diff line change
Expand Up @@ -1454,6 +1454,16 @@ extension BridgeType {
}
}

var closureSwiftType: String {
switch self {
case .swiftProtocol(let name): return "any \(name)"
case .nullable(let wrappedType, let kind):
let wrappedClosureType = wrappedType.closureSwiftType
return kind == .null ? "Optional<\(wrappedClosureType)>" : "JSUndefinedOr<\(wrappedClosureType)>"
default: return swiftType
}
}

var isClosureType: Bool {
if case .closure = self { return true }
return false
Expand Down
36 changes: 33 additions & 3 deletions Plugins/BridgeJS/Sources/BridgeJSCore/ImportTS.swift
Original file line number Diff line number Diff line change
Expand Up @@ -163,8 +163,28 @@ public struct ImportTS {
}
)
)
} else if case .nullable(.swiftProtocol, _) = param.type, context == .exportSwift {
body.write("let \(pattern): (Int32, Int32)")
body.write("if let \(param.name) {")
body.indent {
body.write(
"\(pattern) = (1, (\(param.name) as! _BridgedSwiftProtocolExportable).bridgeJSLowerAsProtocolReturn())"
)
}
body.write("} else {")
body.indent {
body.write("\(pattern) = (0, 0)")
}
body.write("}")
} else {
let initializerExpr = ExprSyntax("\(raw: param.name).bridgeJSLowerParameter()")
let initializerExpr: ExprSyntax
if case .swiftProtocol = param.type, context == .exportSwift {
initializerExpr = ExprSyntax(
"(\(raw: param.name) as! _BridgedSwiftProtocolExportable).bridgeJSLowerAsProtocolReturn()"
)
} else {
initializerExpr = ExprSyntax("\(raw: param.name).bridgeJSLowerParameter()")
}

if loweringInfo.loweredParameters.isEmpty {
stackLoweringStmts.insert("let _ = \(initializerExpr)", at: 0)
Expand Down Expand Up @@ -817,7 +837,12 @@ extension BridgeType {
case .swiftHeapObject:
return LoweringParameterInfo(loweredParameters: [("pointer", .pointer)])
case .swiftProtocol:
throw BridgeJSCoreError("swiftProtocol is not supported in imported signatures")
switch context {
case .importTS:
throw BridgeJSCoreError("swiftProtocol is not supported in imported signatures")
case .exportSwift:
return LoweringParameterInfo(loweredParameters: [("objectId", .i32)])
}
case .caseEnum:
switch context {
case .importTS:
Expand Down Expand Up @@ -891,7 +916,12 @@ extension BridgeType {
case .swiftHeapObject:
return LiftingReturnInfo(valueToLift: .pointer)
case .swiftProtocol:
throw BridgeJSCoreError("swiftProtocol is not supported in imported signatures")
switch context {
case .importTS:
throw BridgeJSCoreError("swiftProtocol is not supported in imported signatures")
case .exportSwift:
return LiftingReturnInfo(valueToLift: .i32)
}
case .caseEnum:
switch context {
case .importTS:
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import JavaScriptKit

@JS protocol Renderable {
func render() -> String
}

@JS class Widget {
@JS var name: String

@JS init(name: String) {
self.name = name
}
}

@JS func processRenderable(_ item: Renderable, transform: (Renderable) -> String) -> String
@JS func makeRenderableFactory(defaultName: String) -> () -> Renderable
@JS func roundtripRenderable(_ callback: (Renderable) -> Renderable) -> (Renderable) -> Renderable
@JS func processOptionalRenderable(_ callback: (Renderable?) -> String) -> String
Loading
Loading