Skip to content
Draft
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
2 changes: 1 addition & 1 deletion Plugins/BridgeJS/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ graph LR
| `Dictionary<K, V>` | `Record<K, V>` | - | [#495](https://github.com/swiftwasm/JavaScriptKit/issues/495) |
| `Set<T>` | `Set<T>` | - | [#397](https://github.com/swiftwasm/JavaScriptKit/issues/397) |
| `Foundation.URL` | `string` | - | [#496](https://github.com/swiftwasm/JavaScriptKit/issues/496) |
| Generics | - | - | [#398](https://github.com/swiftwasm/JavaScriptKit/issues/398) |
| Generics (top-level functions) | `<T>(value: T, type: BridgeType<T>)` | - | |

### Import-specific (TypeScript -> Swift)

Expand Down
419 changes: 417 additions & 2 deletions Plugins/BridgeJS/Sources/BridgeJSCore/ExportSwift.swift

Large diffs are not rendered by default.

51 changes: 40 additions & 11 deletions Plugins/BridgeJS/Sources/BridgeJSCore/ImportTS.swift
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,11 @@ public struct ImportTS {
}

func lowerParameter(param: Parameter) throws {
if let genericPush = param.type.genericStackPushStatement(value: param.name) {
stackLoweringStmts.insert(genericPush, at: 0)
return
}

let loweringInfo = try param.type.loweringParameterInfo(context: context)

switch param.type {
Expand Down Expand Up @@ -241,6 +246,12 @@ public struct ImportTS {
abiParameterForwardings.insert(contentsOf: ["resolveRef", "rejectRef"], at: 0)
}

func appendTypeIDParameter(index: Int, genericParameterName: String) {
let abiParamName = "_generic\(index)TypeId"
abiParameterSignatures.append((abiParamName, .i32))
abiParameterForwardings.append("\(genericParameterName).bridgeJSTypeID")
}

func call() throws {
for stmt in stackLoweringStmts {
body.write(stmt.description)
Expand Down Expand Up @@ -297,14 +308,18 @@ public struct ImportTS {
body.write("return \(returnType.swiftType).bridgeJSLiftReturnFromSideChannel()")
} else {
let liftExpr: String
switch returnType {
case .closure(let signature, _):
liftExpr = "_BJS_Closure_\(signature.mangleName).bridgeJSLift(ret)"
default:
if liftingInfo.valueToLift != nil {
liftExpr = "\(returnType.swiftType).bridgeJSLiftReturn(ret)"
} else {
liftExpr = "\(returnType.swiftType).bridgeJSLiftReturn()"
if let genericPop = returnType.genericStackPopExpression {
liftExpr = genericPop
} else {
switch returnType {
case .closure(let signature, _):
liftExpr = "_BJS_Closure_\(signature.mangleName).bridgeJSLift(ret)"
default:
if liftingInfo.valueToLift != nil {
liftExpr = "\(returnType.swiftType).bridgeJSLiftReturn(ret)"
} else {
liftExpr = "\(returnType.swiftType).bridgeJSLiftReturn()"
}
}
}
body.write("return \(liftExpr)")
Expand Down Expand Up @@ -363,7 +378,8 @@ public struct ImportTS {
name: String,
parameters: [Parameter],
returnType: BridgeType,
effects: Effects
effects: Effects,
genericParameters: [String] = []
) -> DeclSyntax {
let printer = CodeFragmentPrinter()
let signature = SwiftSignatureBuilder.buildFunctionSignature(
Expand All @@ -372,7 +388,12 @@ public struct ImportTS {
effects: effects,
useWildcardLabels: true
)
printer.write("func \(name.backtickIfNeeded())\(signature) {")
let genericClause =
genericParameters.isEmpty
? ""
: "<" + genericParameters.map { "\($0): _BridgedSwiftGenericBridgeable" }.joined(separator: ", ")
+ ">"
printer.write("func \(name.backtickIfNeeded())\(genericClause)\(signature) {")
printer.indent {
printer.write(lines: body.lines)
}
Expand Down Expand Up @@ -432,6 +453,9 @@ public struct ImportTS {
for param in function.parameters {
try builder.lowerParameter(param: param)
}
for (index, genericParam) in (function.genericParameters ?? []).enumerated() {
builder.appendTypeIDParameter(index: index, genericParameterName: genericParam)
}
try builder.call()
try builder.liftReturnValue()
topLevelDecls.append(builder.renderImportDecl())
Expand All @@ -440,7 +464,8 @@ public struct ImportTS {
name: Self.thunkName(function: function),
parameters: function.parameters,
returnType: function.returnType,
effects: function.effects
effects: function.effects,
genericParameters: function.genericParameters ?? []
)
.with(\.leadingTrivia, Self.renderDocumentation(documentation: function.documentation))
]
Expand Down Expand Up @@ -957,6 +982,8 @@ extension BridgeType {
return LoweringParameterInfo(loweredParameters: params, useBorrowing: wrappedInfo.useBorrowing)
case .array, .dictionary:
return LoweringParameterInfo(loweredParameters: [])
case .generic:
return LoweringParameterInfo(loweredParameters: [])
}
}

Expand Down Expand Up @@ -1029,6 +1056,8 @@ extension BridgeType {
return LiftingReturnInfo(valueToLift: wrappedInfo.valueToLift)
case .array, .dictionary:
return LiftingReturnInfo(valueToLift: nil)
case .generic:
return LiftingReturnInfo(valueToLift: nil)
}
}
}
Expand Down
Loading
Loading