Skip to content

Commit 3b4bba1

Browse files
authored
Merge pull request #750 from wfltaylor/js-as
BridgeJS: Export types using a separate JS representation
2 parents 358b38a + 76d11c0 commit 3b4bba1

87 files changed

Lines changed: 10448 additions & 2588 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

Benchmarks/Sources/Generated/JavaScript/BridgeJS.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
{
22
"exported" : {
3+
"aliases" : [
4+
5+
],
36
"classes" : [
47
{
58
"constructor" : {

Examples/PlayBridgeJS/Sources/PlayBridgeJS/Generated/JavaScript/BridgeJS.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
{
22
"exported" : {
3+
"aliases" : [
4+
5+
],
36
"classes" : [
47
{
58
"constructor" : {

Plugins/BridgeJS/Sources/BridgeJSCore/ClosureCodegen.swift

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,9 @@ public struct ClosureCodegen {
153153
let argNames = liftInfo.parameters.map { (argName, _) in
154154
liftInfo.parameters.count > 1 ? "\(paramName)\(argName.capitalizedFirstLetter)" : paramName
155155
}
156-
liftedParams.append("\(paramType.swiftType).bridgeJSLiftParameter(\(argNames.joined(separator: ", ")))")
156+
liftedParams.append(
157+
"\(paramType.swiftType).bridgeJSLiftParameter(\(argNames.joined(separator: ", ")))"
158+
)
157159
}
158160

159161
let tryPrefix = signature.isThrows ? "try " : ""

Plugins/BridgeJS/Sources/BridgeJSCore/ExportSwift.swift

Lines changed: 49 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,15 @@ public class ExportSwift {
100100
}
101101
}
102102
}
103+
104+
withSpan("Render Aliases") { [self] in
105+
let aliasCodegen = AliasCodegen()
106+
for alias in skeleton.aliases {
107+
if let aliasExtension = aliasCodegen.renderAliasConformance(alias) {
108+
decls.append(aliasExtension)
109+
}
110+
}
111+
}
103112
return withSpan("Format Export Glue") {
104113
return decls.map { $0.description }.joined(separator: "\n\n")
105114
}
@@ -877,7 +886,7 @@ struct StackCodegen {
877886
switch type {
878887
case .string, .integer, .bool, .float, .double,
879888
.jsObject(nil), .jsValue, .swiftStruct, .swiftHeapObject, .unsafePointer,
880-
.swiftProtocol, .caseEnum, .associatedValueEnum, .rawValueEnum, .array, .dictionary:
889+
.swiftProtocol, .caseEnum, .associatedValueEnum, .rawValueEnum, .array, .dictionary, .alias:
881890
return "\(raw: type.swiftType).bridgeJSStackPop()"
882891
case .jsObject(let className?):
883892
return "\(raw: className)(unsafelyWrapping: JSObject.bridgeJSStackPop())"
@@ -895,7 +904,7 @@ struct StackCodegen {
895904
switch wrappedType {
896905
case .string, .integer, .bool, .float, .double, .jsObject(nil), .jsValue,
897906
.swiftStruct, .swiftHeapObject, .caseEnum, .associatedValueEnum, .rawValueEnum,
898-
.array, .dictionary:
907+
.array, .dictionary, .alias:
899908
return "\(raw: typeName)<\(raw: wrappedType.swiftType)>.bridgeJSStackPop()"
900909
case .jsObject(let className?):
901910
return "\(raw: typeName)<JSObject>.bridgeJSStackPop().map { \(raw: className)(unsafelyWrapping: $0) }"
@@ -918,7 +927,7 @@ struct StackCodegen {
918927
switch type {
919928
case .string, .integer, .bool, .float, .double, .jsValue,
920929
.jsObject(nil), .swiftHeapObject, .unsafePointer, .closure,
921-
.caseEnum, .rawValueEnum, .associatedValueEnum, .swiftStruct, .nullable:
930+
.caseEnum, .rawValueEnum, .associatedValueEnum, .swiftStruct, .nullable, .alias:
922931
return ["\(raw: accessor).bridgeJSStackPush()"]
923932
case .jsObject(_?):
924933
return ["\(raw: accessor).jsObject.bridgeJSStackPush()"]
@@ -1339,10 +1348,9 @@ struct StructCodegen {
13391348
let instanceProps = structDef.properties.filter { !$0.isStatic }
13401349

13411350
for property in instanceProps {
1342-
let accessor = "self.\(property.name)"
13431351
let statements = stackCodegen.lowerStatements(
13441352
for: property.type,
1345-
accessor: accessor,
1353+
accessor: "self.\(property.name)",
13461354
varPrefix: property.name
13471355
)
13481356
for statement in statements {
@@ -1354,6 +1362,18 @@ struct StructCodegen {
13541362
}
13551363
}
13561364

1365+
// MARK: - AliasCodegen
1366+
1367+
struct AliasCodegen {
1368+
func renderAliasConformance(_ alias: ExportedAlias) -> DeclSyntax? {
1369+
guard let protocols = alias.underlying.aliasConformanceProtocols else {
1370+
return nil
1371+
}
1372+
let conformances = (["_BridgedSwiftAlias"] + protocols).joined(separator: ", ")
1373+
return "extension \(raw: alias.swiftCallName): \(raw: conformances) {}"
1374+
}
1375+
}
1376+
13571377
// MARK: - ProtocolCodegen
13581378

13591379
struct ProtocolCodegen {
@@ -1565,6 +1585,23 @@ extension UnsafePointerType {
15651585
}
15661586

15671587
extension BridgeType {
1588+
var aliasConformanceProtocols: [String]? {
1589+
switch self {
1590+
case .swiftHeapObject, .jsObject, .integer, .float, .double, .bool, .string, .jsValue:
1591+
return ["_BridgedSwiftStackType"]
1592+
case .swiftStruct:
1593+
return ["_BridgedSwiftStruct"]
1594+
case .caseEnum:
1595+
return ["_BridgedSwiftCaseEnum"]
1596+
case .associatedValueEnum:
1597+
return ["_BridgedSwiftAssociatedValueEnum"]
1598+
case .rawValueEnum, .void, .unsafePointer, .namespaceEnum,
1599+
.swiftProtocol, .closure, .nullable, .array, .dictionary, .alias:
1600+
// Not supported yet.
1601+
return nil
1602+
}
1603+
}
1604+
15681605
var swiftType: String {
15691606
switch self {
15701607
case .bool: return "Bool"
@@ -1593,6 +1630,7 @@ extension BridgeType {
15931630
let effectsStr = (signature.isAsync ? " async" : "") + (signature.isThrows ? " throws" : "")
15941631
let closureType = "(\(paramTypes))\(effectsStr) -> \(signature.returnType.swiftType)"
15951632
return useJSTypedClosure ? "JSTypedClosure<\(closureType)>" : closureType
1633+
case .alias(let name, _): return name
15961634
}
15971635
}
15981636

@@ -1617,6 +1655,8 @@ extension BridgeType {
16171655
return true
16181656
case .nullable(let wrapped, _):
16191657
return wrapped.isStackUsingParameter
1658+
case .alias(_, let underlying):
1659+
return underlying.isStackUsingParameter
16201660
default:
16211661
return false
16221662
}
@@ -1675,6 +1715,8 @@ extension BridgeType {
16751715
return LiftingIntrinsicInfo(parameters: [("callbackId", .i32)])
16761716
case .array, .dictionary:
16771717
return LiftingIntrinsicInfo(parameters: [])
1718+
case .alias(_, let underlying):
1719+
return try underlying.liftParameterInfo()
16781720
}
16791721
}
16801722

@@ -1726,6 +1768,8 @@ extension BridgeType {
17261768
return .jsObject
17271769
case .array, .dictionary:
17281770
return .array
1771+
case .alias(_, let underlying):
1772+
return try underlying.loweringReturnInfo()
17291773
}
17301774
}
17311775
}

Plugins/BridgeJS/Sources/BridgeJSCore/ExternalModuleIndex.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,12 @@ public struct ExternalModuleIndex {
6363
for proto in exported.protocols {
6464
register(dotPath: proto.name, bridgeType: .swiftProtocol(proto.name))
6565
}
66+
for alias in exported.aliases {
67+
register(
68+
dotPath: alias.swiftCallName,
69+
bridgeType: .alias(name: alias.swiftCallName, underlying: alias.underlying)
70+
)
71+
}
6672

6773
entriesByModule[moduleName] = moduleEntries
6874
}

Plugins/BridgeJS/Sources/BridgeJSCore/ImportTS.swift

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -903,7 +903,7 @@ extension BridgeType {
903903
}
904904

905905
func loweringParameterInfo(context: BridgeContext = .importTS) throws -> LoweringParameterInfo {
906-
switch self {
906+
switch self.unaliased {
907907
case .bool: return .bool
908908
case .integer(let t): return LoweringParameterInfo(loweredParameters: [("value", t.wasmCoreType)])
909909
case .float: return .float
@@ -957,6 +957,8 @@ extension BridgeType {
957957
return LoweringParameterInfo(loweredParameters: params, useBorrowing: wrappedInfo.useBorrowing)
958958
case .array, .dictionary:
959959
return LoweringParameterInfo(loweredParameters: [])
960+
case .alias:
961+
preconditionFailure("`.alias` must be resolved by `.unaliased` before reaching loweringParameterInfo")
960962
}
961963
}
962964

@@ -976,7 +978,7 @@ extension BridgeType {
976978
func liftingReturnInfo(
977979
context: BridgeContext = .importTS
978980
) throws -> LiftingReturnInfo {
979-
switch self {
981+
switch self.unaliased {
980982
case .bool: return .bool
981983
case .integer(let t): return LiftingReturnInfo(valueToLift: t.wasmCoreType)
982984
case .float: return .float
@@ -1029,6 +1031,8 @@ extension BridgeType {
10291031
return LiftingReturnInfo(valueToLift: wrappedInfo.valueToLift)
10301032
case .array, .dictionary:
10311033
return LiftingReturnInfo(valueToLift: nil)
1034+
case .alias:
1035+
preconditionFailure("`.alias` must be resolved by `.unaliased` before reaching liftingReturnInfo")
10321036
}
10331037
}
10341038
}

0 commit comments

Comments
 (0)