@@ -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