Skip to content

Commit ed9d981

Browse files
committed
BridgeJS: Support generic functions at the Swift and JavaScript boundary
1 parent fba3be0 commit ed9d981

34 files changed

Lines changed: 7246 additions & 30 deletions

Plugins/BridgeJS/Sources/BridgeJSCore/ExportSwift.swift

Lines changed: 499 additions & 4 deletions
Large diffs are not rendered by default.

Plugins/BridgeJS/Sources/BridgeJSCore/ImportTS.swift

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,11 @@ public struct ImportTS {
143143
}
144144

145145
func lowerParameter(param: Parameter) throws {
146+
if case .generic = param.type {
147+
stackLoweringStmts.insert("\(param.name).bridgeJSStackPush()", at: 0)
148+
return
149+
}
150+
146151
let loweringInfo = try param.type.loweringParameterInfo(context: context)
147152

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

249+
func appendTypeIDParameter(genericParameterName: String) {
250+
let abiParamName = "\(genericParameterName.lowercased())TypeId"
251+
abiParameterSignatures.append((abiParamName, .i32))
252+
abiParameterForwardings.append("\(genericParameterName).bridgeJSTypeID")
253+
}
254+
244255
func call() throws {
245256
for stmt in stackLoweringStmts {
246257
body.write(stmt.description)
@@ -298,6 +309,8 @@ public struct ImportTS {
298309
} else {
299310
let liftExpr: String
300311
switch returnType {
312+
case .generic(let name):
313+
liftExpr = "\(name).bridgeJSStackPop()"
301314
case .closure(let signature, _):
302315
liftExpr = "_BJS_Closure_\(signature.mangleName).bridgeJSLift(ret)"
303316
default:
@@ -363,7 +376,8 @@ public struct ImportTS {
363376
name: String,
364377
parameters: [Parameter],
365378
returnType: BridgeType,
366-
effects: Effects
379+
effects: Effects,
380+
genericParameters: [String] = []
367381
) -> DeclSyntax {
368382
let printer = CodeFragmentPrinter()
369383
let signature = SwiftSignatureBuilder.buildFunctionSignature(
@@ -372,7 +386,12 @@ public struct ImportTS {
372386
effects: effects,
373387
useWildcardLabels: true
374388
)
375-
printer.write("func \(name.backtickIfNeeded())\(signature) {")
389+
let genericClause =
390+
genericParameters.isEmpty
391+
? ""
392+
: "<" + genericParameters.map { "\($0): _BridgedSwiftGenericBridgeable" }.joined(separator: ", ")
393+
+ ">"
394+
printer.write("func \(name.backtickIfNeeded())\(genericClause)\(signature) {")
376395
printer.indent {
377396
printer.write(lines: body.lines)
378397
}
@@ -432,6 +451,9 @@ public struct ImportTS {
432451
for param in function.parameters {
433452
try builder.lowerParameter(param: param)
434453
}
454+
for genericParam in function.genericParameters {
455+
builder.appendTypeIDParameter(genericParameterName: genericParam)
456+
}
435457
try builder.call()
436458
try builder.liftReturnValue()
437459
topLevelDecls.append(builder.renderImportDecl())
@@ -440,7 +462,8 @@ public struct ImportTS {
440462
name: Self.thunkName(function: function),
441463
parameters: function.parameters,
442464
returnType: function.returnType,
443-
effects: function.effects
465+
effects: function.effects,
466+
genericParameters: function.genericParameters
444467
)
445468
.with(\.leadingTrivia, Self.renderDocumentation(documentation: function.documentation))
446469
]
@@ -957,6 +980,8 @@ extension BridgeType {
957980
return LoweringParameterInfo(loweredParameters: params, useBorrowing: wrappedInfo.useBorrowing)
958981
case .array, .dictionary:
959982
return LoweringParameterInfo(loweredParameters: [])
983+
case .generic:
984+
return LoweringParameterInfo(loweredParameters: [])
960985
}
961986
}
962987

@@ -1029,6 +1054,8 @@ extension BridgeType {
10291054
return LiftingReturnInfo(valueToLift: wrappedInfo.valueToLift)
10301055
case .array, .dictionary:
10311056
return LiftingReturnInfo(valueToLift: nil)
1057+
case .generic:
1058+
return LiftingReturnInfo(valueToLift: nil)
10321059
}
10331060
}
10341061
}

0 commit comments

Comments
 (0)