@@ -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 }
0 commit comments