Skip to content

Commit 92aa746

Browse files
committed
NFC: BridgeJS: Refactor to descriptor-driven codegen with BridgeTypeDescriptor
1 parent dadff8b commit 92aa746

31 files changed

+2496
-2674
lines changed

Plugins/BridgeJS/Sources/BridgeJSCore/ClosureCodegen.swift

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -123,23 +123,23 @@ public struct ClosureCodegen {
123123

124124
for (index, paramType) in signature.parameters.enumerated() {
125125
let paramName = "param\(index)"
126-
let liftInfo = try paramType.liftParameterInfo()
126+
let liftParams = try paramType.liftParameterInfo()
127127

128-
for (argName, wasmType) in liftInfo.parameters {
128+
for (argName, wasmType) in liftParams {
129129
let fullName =
130-
liftInfo.parameters.count > 1 ? "\(paramName)\(argName.capitalizedFirstLetter)" : paramName
130+
liftParams.count > 1 ? "\(paramName)\(argName.capitalizedFirstLetter)" : paramName
131131
abiParams.append((fullName, wasmType))
132132
}
133133

134-
let argNames = liftInfo.parameters.map { (argName, _) in
135-
liftInfo.parameters.count > 1 ? "\(paramName)\(argName.capitalizedFirstLetter)" : paramName
134+
let argNames = liftParams.map { (argName, _) in
135+
liftParams.count > 1 ? "\(paramName)\(argName.capitalizedFirstLetter)" : paramName
136136
}
137137
liftedParams.append("\(paramType.swiftType).bridgeJSLiftParameter(\(argNames.joined(separator: ", ")))")
138138
}
139139

140140
let closureCallExpr = ExprSyntax("closure(\(raw: liftedParams.joined(separator: ", ")))")
141141

142-
let abiReturnWasmType = try signature.returnType.loweringReturnInfo().returnType
142+
let abiReturnWasmType = try signature.returnType.loweringReturnInfo()
143143

144144
// Build signature using SwiftSignatureBuilder
145145
let funcSignature = SwiftSignatureBuilder.buildABIFunctionSignature(

Plugins/BridgeJS/Sources/BridgeJSCore/ExportSwift.swift

Lines changed: 123 additions & 286 deletions
Large diffs are not rendered by default.

Plugins/BridgeJS/Sources/BridgeJSCore/ImportTS.swift

Lines changed: 21 additions & 113 deletions
Original file line numberDiff line numberDiff line change
@@ -695,143 +695,51 @@ enum SwiftCodePattern {
695695
extension BridgeType {
696696
struct LoweringParameterInfo {
697697
let loweredParameters: [(name: String, type: WasmCoreType)]
698-
699-
static let bool = LoweringParameterInfo(loweredParameters: [("value", .i32)])
700-
static let int = LoweringParameterInfo(loweredParameters: [("value", .i32)])
701-
static let float = LoweringParameterInfo(loweredParameters: [("value", .f32)])
702-
static let double = LoweringParameterInfo(loweredParameters: [("value", .f64)])
703-
static let string = LoweringParameterInfo(loweredParameters: [("value", .i32)])
704-
static let jsObject = LoweringParameterInfo(loweredParameters: [("value", .i32)])
705-
static let jsValue = LoweringParameterInfo(loweredParameters: [
706-
("kind", .i32),
707-
("payload1", .i32),
708-
("payload2", .f64),
709-
])
710-
static let void = LoweringParameterInfo(loweredParameters: [])
711698
}
712699

713700
func loweringParameterInfo(context: BridgeContext = .importTS) throws -> LoweringParameterInfo {
714701
switch self {
715-
case .bool: return .bool
716-
case .int, .uint: return .int
717-
case .float: return .float
718-
case .double: return .double
719-
case .string: return .string
720-
case .jsObject: return .jsObject
721-
case .jsValue: return .jsValue
722-
case .void: return .void
723-
case .closure:
724-
// Swift closure is passed to JS as a JS function reference.
725-
return LoweringParameterInfo(loweredParameters: [("funcRef", .i32)])
726-
case .unsafePointer:
727-
return LoweringParameterInfo(loweredParameters: [("pointer", .pointer)])
728-
case .swiftHeapObject:
729-
return LoweringParameterInfo(loweredParameters: [("pointer", .pointer)])
730-
case .swiftProtocol:
731-
throw BridgeJSCoreError("swiftProtocol is not supported in imported signatures")
732-
case .caseEnum:
733-
switch context {
734-
case .importTS:
735-
throw BridgeJSCoreError("Enum types are not yet supported in TypeScript imports")
736-
case .exportSwift:
737-
return LoweringParameterInfo(loweredParameters: [("value", .i32)])
738-
}
739-
case .rawValueEnum(_, let rawType):
740-
let wasmType = rawType.wasmCoreType ?? .i32
741-
return LoweringParameterInfo(loweredParameters: [("value", wasmType)])
742-
case .associatedValueEnum:
743-
switch context {
744-
case .importTS:
745-
throw BridgeJSCoreError("Enum types are not yet supported in TypeScript imports")
746-
case .exportSwift:
747-
return LoweringParameterInfo(loweredParameters: [("caseId", .i32)])
748-
}
749-
case .swiftStruct:
750-
switch context {
751-
case .importTS:
752-
// Swift structs are bridged as JS objects (object IDs) in imported signatures.
753-
return LoweringParameterInfo(loweredParameters: [("objectId", .i32)])
754-
case .exportSwift:
755-
return LoweringParameterInfo(loweredParameters: [])
756-
}
757-
case .namespaceEnum:
758-
throw BridgeJSCoreError("Namespace enums cannot be used as parameters")
759702
case .nullable(let wrappedType, _):
760703
let wrappedInfo = try wrappedType.loweringParameterInfo(context: context)
761704
var params = [("isSome", WasmCoreType.i32)]
762705
params.append(contentsOf: wrappedInfo.loweredParameters)
763706
return LoweringParameterInfo(loweredParameters: params)
764-
case .array, .dictionary:
765-
return LoweringParameterInfo(loweredParameters: [])
707+
case .namespaceEnum:
708+
throw BridgeJSCoreError("Namespace enums cannot be used as parameters")
709+
case .swiftProtocol:
710+
throw BridgeJSCoreError("swiftProtocol is not supported in imported signatures")
711+
case .caseEnum, .associatedValueEnum:
712+
if context == .importTS {
713+
throw BridgeJSCoreError("Enum types are not yet supported in TypeScript imports")
714+
}
715+
fallthrough
716+
default:
717+
return LoweringParameterInfo(loweredParameters: descriptor.importParams)
766718
}
767719
}
768720

769721
struct LiftingReturnInfo {
770722
let valueToLift: WasmCoreType?
771-
772-
static let bool = LiftingReturnInfo(valueToLift: .i32)
773-
static let int = LiftingReturnInfo(valueToLift: .i32)
774-
static let float = LiftingReturnInfo(valueToLift: .f32)
775-
static let double = LiftingReturnInfo(valueToLift: .f64)
776-
static let string = LiftingReturnInfo(valueToLift: .i32)
777-
static let jsObject = LiftingReturnInfo(valueToLift: .i32)
778-
static let jsValue = LiftingReturnInfo(valueToLift: nil)
779-
static let void = LiftingReturnInfo(valueToLift: nil)
780723
}
781724

782725
func liftingReturnInfo(
783726
context: BridgeContext = .importTS
784727
) throws -> LiftingReturnInfo {
785728
switch self {
786-
case .bool: return .bool
787-
case .int, .uint: return .int
788-
case .float: return .float
789-
case .double: return .double
790-
case .string: return .string
791-
case .jsObject: return .jsObject
792-
case .jsValue: return .jsValue
793-
case .void: return .void
794-
case .closure:
795-
// JS returns a callback ID for closures, which Swift lifts to a typed closure.
796-
return LiftingReturnInfo(valueToLift: .i32)
797-
case .unsafePointer:
798-
return LiftingReturnInfo(valueToLift: .pointer)
799-
case .swiftHeapObject:
800-
return LiftingReturnInfo(valueToLift: .pointer)
729+
case .nullable(let wrappedType, _):
730+
let wrappedInfo = try wrappedType.liftingReturnInfo(context: context)
731+
return LiftingReturnInfo(valueToLift: wrappedInfo.valueToLift)
732+
case .namespaceEnum:
733+
throw BridgeJSCoreError("Namespace enums cannot be used as return values")
801734
case .swiftProtocol:
802735
throw BridgeJSCoreError("swiftProtocol is not supported in imported signatures")
803-
case .caseEnum:
804-
switch context {
805-
case .importTS:
806-
throw BridgeJSCoreError("Enum types are not yet supported in TypeScript imports")
807-
case .exportSwift:
808-
return LiftingReturnInfo(valueToLift: .i32)
809-
}
810-
case .rawValueEnum(_, let rawType):
811-
let wasmType = rawType.wasmCoreType ?? .i32
812-
return LiftingReturnInfo(valueToLift: wasmType)
813-
case .associatedValueEnum:
814-
switch context {
815-
case .importTS:
736+
case .caseEnum, .associatedValueEnum:
737+
if context == .importTS {
816738
throw BridgeJSCoreError("Enum types are not yet supported in TypeScript imports")
817-
case .exportSwift:
818-
return LiftingReturnInfo(valueToLift: .i32)
819-
}
820-
case .swiftStruct:
821-
switch context {
822-
case .importTS:
823-
// Swift structs are bridged as JS objects (object IDs) in imported signatures.
824-
return LiftingReturnInfo(valueToLift: .i32)
825-
case .exportSwift:
826-
return LiftingReturnInfo(valueToLift: nil)
827739
}
828-
case .namespaceEnum:
829-
throw BridgeJSCoreError("Namespace enums cannot be used as return values")
830-
case .nullable(let wrappedType, _):
831-
let wrappedInfo = try wrappedType.liftingReturnInfo(context: context)
832-
return LiftingReturnInfo(valueToLift: wrappedInfo.valueToLift)
833-
case .array, .dictionary:
834-
return LiftingReturnInfo(valueToLift: nil)
740+
fallthrough
741+
default:
742+
return LiftingReturnInfo(valueToLift: descriptor.importReturnType)
835743
}
836744
}
837745
}

Plugins/BridgeJS/Sources/BridgeJSLink/BridgeJSLink.swift

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1534,16 +1534,8 @@ public struct BridgeJSLink {
15341534
let enumValuesName = enumDefinition.valuesName
15351535

15361536
switch enumDefinition.enumType {
1537-
case .simple:
1538-
let fragment = IntrinsicJSFragment.simpleEnumHelper(enumDefinition: enumDefinition)
1539-
_ = try fragment.printCode([enumValuesName], context)
1540-
jsTopLevelLines.append(contentsOf: printer.lines)
1541-
case .rawValue:
1542-
guard enumDefinition.rawType != nil else {
1543-
throw BridgeJSLinkError(message: "Raw value enum \(enumDefinition.name) is missing rawType")
1544-
}
1545-
1546-
let fragment = IntrinsicJSFragment.rawValueEnumHelper(enumDefinition: enumDefinition)
1537+
case .simple, .rawValue:
1538+
let fragment = IntrinsicJSFragment.caseEnumHelper(enumDefinition: enumDefinition)
15471539
_ = try fragment.printCode([enumValuesName], context)
15481540
jsTopLevelLines.append(contentsOf: printer.lines)
15491541
case .associatedValue:
@@ -2172,7 +2164,7 @@ extension BridgeJSLink {
21722164
printer.write("} catch (error) {")
21732165
printer.indent {
21742166
printer.write("setException(error);")
2175-
if let abiReturnType = returnType.abiReturnType {
2167+
if !returnType.isOptional, let abiReturnType = returnType.descriptor.wasmReturnType {
21762168
printer.write("return \(abiReturnType.placeholderValue)")
21772169
}
21782170
}

0 commit comments

Comments
 (0)