Skip to content

Commit 318f3ae

Browse files
authored
Merge pull request swiftwasm#624 from PassiveLogic/kr/codegen-cleanup
NFC: BridgeJS: Simplify ExportSwift codegen by removing redundant branches and extracting helpers
2 parents 7018c02 + d5ac7fa commit 318f3ae

File tree

4 files changed

+36
-80
lines changed

4 files changed

+36
-80
lines changed

Plugins/BridgeJS/Sources/BridgeJSCore/ExportSwift.swift

Lines changed: 30 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -147,23 +147,9 @@ public class ExportSwift {
147147
} else {
148148
optionalSwiftType = "JSUndefinedOr"
149149
}
150-
if case .swiftProtocol(let protocolName) = wrappedType {
151-
let wrapperName = "Any\(protocolName)"
152-
typeNameForIntrinsic = "\(optionalSwiftType)<\(wrapperName)>"
153-
liftingExpr = ExprSyntax(
154-
"\(raw: typeNameForIntrinsic).bridgeJSLiftParameter(\(raw: argumentsToLift.joined(separator: ", ")))"
155-
)
156-
} else {
157-
typeNameForIntrinsic = "\(optionalSwiftType)<\(wrappedType.swiftType)>"
158-
liftingExpr = ExprSyntax(
159-
"\(raw: typeNameForIntrinsic).bridgeJSLiftParameter(\(raw: argumentsToLift.joined(separator: ", ")))"
160-
)
161-
}
162-
case .swiftProtocol(let protocolName):
163-
let wrapperName = "Any\(protocolName)"
164-
typeNameForIntrinsic = wrapperName
150+
typeNameForIntrinsic = "\(optionalSwiftType)<\(wrappedType.swiftType)>"
165151
liftingExpr = ExprSyntax(
166-
"\(raw: wrapperName).bridgeJSLiftParameter(\(raw: argumentsToLift.joined(separator: ", ")))"
152+
"\(raw: typeNameForIntrinsic).bridgeJSLiftParameter(\(raw: argumentsToLift.joined(separator: ", ")))"
167153
)
168154
default:
169155
typeNameForIntrinsic = param.type.swiftType
@@ -178,6 +164,20 @@ public class ExportSwift {
178164
}
179165
}
180166

167+
private func protocolCastSuffix(for returnType: BridgeType) -> (prefix: String, suffix: String) {
168+
switch returnType {
169+
case .swiftProtocol:
170+
return ("", " as! \(returnType.swiftType)")
171+
case .nullable(let wrappedType, _):
172+
if case .swiftProtocol = wrappedType {
173+
return ("(", ").flatMap { $0 as? \(wrappedType.swiftType) }")
174+
}
175+
return ("", "")
176+
default:
177+
return ("", "")
178+
}
179+
}
180+
181181
private func removeFirstLiftedParameter() -> (parameter: Parameter, expr: ExprSyntax) {
182182
let parameter = parameters.removeFirst()
183183
let expr = liftedParameterExprs.removeFirst()
@@ -211,26 +211,10 @@ public class ExportSwift {
211211
if returnType == .void {
212212
return CodeBlockItemSyntax(item: .init(ExpressionStmtSyntax(expression: callExpr)))
213213
} else {
214-
switch returnType {
215-
case .swiftProtocol(let protocolName):
216-
let wrapperName = "Any\(protocolName)"
217-
return CodeBlockItemSyntax(
218-
item: .init(DeclSyntax("let ret = \(raw: callExpr) as! \(raw: wrapperName)"))
219-
)
220-
case .nullable(let wrappedType, _):
221-
if case .swiftProtocol(let protocolName) = wrappedType {
222-
let wrapperName = "Any\(protocolName)"
223-
return CodeBlockItemSyntax(
224-
item: .init(
225-
DeclSyntax("let ret = (\(raw: callExpr)).flatMap { $0 as? \(raw: wrapperName) }")
226-
)
227-
)
228-
} else {
229-
return CodeBlockItemSyntax(item: .init(DeclSyntax("let ret = \(raw: callExpr)")))
230-
}
231-
default:
232-
return CodeBlockItemSyntax(item: .init(DeclSyntax("let ret = \(raw: callExpr)")))
233-
}
214+
let (prefix, suffix) = protocolCastSuffix(for: returnType)
215+
return CodeBlockItemSyntax(
216+
item: .init(DeclSyntax("let ret = \(raw: prefix)\(raw: callExpr)\(raw: suffix)"))
217+
)
234218
}
235219
}
236220

@@ -244,20 +228,8 @@ public class ExportSwift {
244228
if returnType == .void {
245229
append("\(raw: name)")
246230
} else {
247-
switch returnType {
248-
case .swiftProtocol(let protocolName):
249-
let wrapperName = "Any\(protocolName)"
250-
append("let ret = \(raw: name) as! \(raw: wrapperName)")
251-
case .nullable(let wrappedType, _):
252-
if case .swiftProtocol(let protocolName) = wrappedType {
253-
let wrapperName = "Any\(protocolName)"
254-
append("let ret = \(raw: name).flatMap { $0 as? \(raw: wrapperName) }")
255-
} else {
256-
append("let ret = \(raw: name)")
257-
}
258-
default:
259-
append("let ret = \(raw: name)")
260-
}
231+
let (prefix, suffix) = protocolCastSuffix(for: returnType)
232+
append("let ret = \(raw: prefix)\(raw: name)\(raw: suffix)")
261233
}
262234
}
263235

@@ -301,20 +273,8 @@ public class ExportSwift {
301273
if returnType == .void {
302274
append("\(raw: selfExpr).\(raw: propertyName)")
303275
} else {
304-
switch returnType {
305-
case .swiftProtocol(let protocolName):
306-
let wrapperName = "Any\(protocolName)"
307-
append("let ret = \(raw: selfExpr).\(raw: propertyName) as! \(raw: wrapperName)")
308-
case .nullable(let wrappedType, _):
309-
if case .swiftProtocol(let protocolName) = wrappedType {
310-
let wrapperName = "Any\(protocolName)"
311-
append("let ret = \(raw: selfExpr).\(raw: propertyName).flatMap { $0 as? \(raw: wrapperName) }")
312-
} else {
313-
append("let ret = \(raw: selfExpr).\(raw: propertyName)")
314-
}
315-
default:
316-
append("let ret = \(raw: selfExpr).\(raw: propertyName)")
317-
}
276+
let (prefix, suffix) = protocolCastSuffix(for: returnType)
277+
append("let ret = \(raw: prefix)\(raw: selfExpr).\(raw: propertyName)\(raw: suffix)")
318278
}
319279
}
320280

@@ -1051,18 +1011,14 @@ struct StackCodegen {
10511011
varPrefix: String
10521012
) -> [CodeBlockItemSyntax] {
10531013
switch wrappedType {
1054-
case .string, .int, .uint, .bool, .float, .double, .jsValue:
1055-
return ["\(raw: unwrappedVar).bridgeJSLowerStackReturn()"]
1056-
case .caseEnum, .rawValueEnum:
1057-
return ["\(raw: unwrappedVar).bridgeJSLowerStackReturn()"]
1058-
case .swiftHeapObject:
1059-
return ["\(raw: unwrappedVar).bridgeJSLowerStackReturn()"]
1060-
case .associatedValueEnum:
1061-
return ["_swift_js_push_i32(\(raw: unwrappedVar).bridgeJSLowerParameter())"]
1062-
case .jsObject(nil):
1063-
return ["\(raw: unwrappedVar).bridgeJSLowerStackReturn()"]
10641014
case .jsObject(_?):
10651015
return ["\(raw: unwrappedVar).jsObject.bridgeJSLowerStackReturn()"]
1016+
case .swiftProtocol:
1017+
return ["(\(raw: unwrappedVar) as! \(raw: wrappedType.swiftType)).bridgeJSLowerStackReturn()"]
1018+
case .string, .int, .uint, .bool, .float, .double, .jsValue,
1019+
.jsObject(nil), .swiftHeapObject, .unsafePointer, .closure,
1020+
.caseEnum, .rawValueEnum, .associatedValueEnum:
1021+
return ["\(raw: unwrappedVar).bridgeJSLowerStackReturn()"]
10661022
default:
10671023
return ["preconditionFailure(\"BridgeJS: unsupported optional wrapped type\")"]
10681024
}

Plugins/BridgeJS/Tests/BridgeJSToolTests/__Snapshots__/BridgeJSCodegenTests/EnumAssociatedValue.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -387,7 +387,7 @@ extension OptionalAllTypesResult: _BridgedSwiftAssociatedValueEnum {
387387
case .optNestedEnum(let param0):
388388
let __bjs_isSome_param0 = param0 != nil
389389
if let __bjs_unwrapped_param0 = param0 {
390-
_swift_js_push_i32(__bjs_unwrapped_param0.bridgeJSLowerParameter())
390+
__bjs_unwrapped_param0.bridgeJSLowerStackReturn()
391391
}
392392
_swift_js_push_i32(__bjs_isSome_param0 ? 1 : 0)
393393
return Int32(3)

Plugins/BridgeJS/Tests/BridgeJSToolTests/__Snapshots__/BridgeJSCodegenTests/Protocol.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -565,7 +565,7 @@ public func _bjs_MyViewController_delegate_set(_ _self: UnsafeMutableRawPointer,
565565
@_cdecl("bjs_MyViewController_secondDelegate_get")
566566
public func _bjs_MyViewController_secondDelegate_get(_ _self: UnsafeMutableRawPointer) -> Void {
567567
#if arch(wasm32)
568-
let ret = MyViewController.bridgeJSLiftParameter(_self).secondDelegate.flatMap { $0 as? AnyMyViewControllerDelegate }
568+
let ret = (MyViewController.bridgeJSLiftParameter(_self).secondDelegate).flatMap { $0 as? AnyMyViewControllerDelegate }
569569
return ret.bridgeJSLowerReturn()
570570
#else
571571
fatalError("Only available on WebAssembly")

Tests/BridgeJSRuntimeTests/Generated/BridgeJS.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2631,7 +2631,7 @@ extension OptionalAllTypesResult: _BridgedSwiftAssociatedValueEnum {
26312631
case .optNestedEnum(let param0):
26322632
let __bjs_isSome_param0 = param0 != nil
26332633
if let __bjs_unwrapped_param0 = param0 {
2634-
_swift_js_push_i32(__bjs_unwrapped_param0.bridgeJSLowerParameter())
2634+
__bjs_unwrapped_param0.bridgeJSLowerStackReturn()
26352635
}
26362636
_swift_js_push_i32(__bjs_isSome_param0 ? 1 : 0)
26372637
return Int32(3)
@@ -3115,7 +3115,7 @@ extension ValidationReport: _BridgedSwiftStruct {
31153115
_swift_js_push_i32(__bjs_isSome_status ? 1 : 0)
31163116
let __bjs_isSome_outcome = self.outcome != nil
31173117
if let __bjs_unwrapped_outcome = self.outcome {
3118-
_swift_js_push_i32(__bjs_unwrapped_outcome.bridgeJSLowerParameter())
3118+
__bjs_unwrapped_outcome.bridgeJSLowerStackReturn()
31193119
}
31203120
_swift_js_push_i32(__bjs_isSome_outcome ? 1 : 0)
31213121
}
@@ -3176,7 +3176,7 @@ extension AdvancedConfig: _BridgedSwiftStruct {
31763176
self.status.bridgeJSLowerStackReturn()
31773177
let __bjs_isSome_result = self.result != nil
31783178
if let __bjs_unwrapped_result = self.result {
3179-
_swift_js_push_i32(__bjs_unwrapped_result.bridgeJSLowerParameter())
3179+
__bjs_unwrapped_result.bridgeJSLowerStackReturn()
31803180
}
31813181
_swift_js_push_i32(__bjs_isSome_result ? 1 : 0)
31823182
let __bjs_isSome_metadata = self.metadata != nil
@@ -7670,7 +7670,7 @@ public func _bjs_DataProcessorManager_processor_set(_ _self: UnsafeMutableRawPoi
76707670
@_cdecl("bjs_DataProcessorManager_backupProcessor_get")
76717671
public func _bjs_DataProcessorManager_backupProcessor_get(_ _self: UnsafeMutableRawPointer) -> Void {
76727672
#if arch(wasm32)
7673-
let ret = DataProcessorManager.bridgeJSLiftParameter(_self).backupProcessor.flatMap { $0 as? AnyDataProcessor }
7673+
let ret = (DataProcessorManager.bridgeJSLiftParameter(_self).backupProcessor).flatMap { $0 as? AnyDataProcessor }
76747674
return ret.bridgeJSLowerReturn()
76757675
#else
76767676
fatalError("Only available on WebAssembly")

0 commit comments

Comments
 (0)