@@ -362,7 +362,7 @@ extension JNISwift2JavaGenerator {
362362 throw JavaTranslationError . unsupportedSwiftType ( swiftType)
363363 }
364364
365- let ( returnType, staticCallee ) = switch javaType {
365+ let ( returnType, optionalClass ) = switch javaType {
366366 case . boolean: ( " Optional<Boolean> " , " Optional " )
367367 case . byte: ( " Optional<Byte> " , " Optional " )
368368 case . char: ( " Optional<Character> " , " Optional " )
@@ -387,7 +387,7 @@ extension JNISwift2JavaGenerator {
387387 nextIntergralTypeWithSpaceForByte. java,
388388 valueType: javaType,
389389 valueSizeInBytes: nextIntergralTypeWithSpaceForByte. valueBytes,
390- optionalType: staticCallee
390+ optionalType: optionalClass
391391 )
392392 )
393393 } else {
@@ -398,19 +398,11 @@ extension JNISwift2JavaGenerator {
398398 outParameters: [
399399 OutParameter ( name: " result_discriminator$ " , type: . array( . byte) , allocation: . newArray( . byte, size: 1 ) )
400400 ] ,
401- conversion: . aggregate(
402- name: " result$ " ,
403- type: javaType,
404- [
405- . ternary(
406- . equals(
407- . subscriptOf( . constant( " result_discriminator$ " ) , arguments: [ . constant( " 0 " ) ] ) ,
408- . constant( " 1 " )
409- ) ,
410- thenExp: . method( . constant( staticCallee) , function: " of " , arguments: [ . constant( " result$ " ) ] ) ,
411- elseExp: . method( . constant( staticCallee) , function: " empty " )
412- )
413- ]
401+ conversion: . toOptionalFromIndirectReturn(
402+ discriminatorName: " result_discriminator$ " ,
403+ optionalClass: optionalClass,
404+ javaType: javaType,
405+ toValue: . placeholder
414406 )
415407 )
416408 }
@@ -420,8 +412,20 @@ extension JNISwift2JavaGenerator {
420412 throw JavaTranslationError . unsupportedSwiftType ( swiftType)
421413 }
422414
423- // Assume JExtract imported class
424- throw JavaTranslationError . unsupportedSwiftType ( swiftType)
415+ // We assume this is a JExtract class.
416+ let returnType = JavaType . class ( package : nil , name: " Optional< \( nominalTypeName) > " )
417+ return TranslatedResult (
418+ javaType: returnType,
419+ outParameters: [
420+ OutParameter ( name: " result_discriminator$ " , type: . array( . byte) , allocation: . newArray( . byte, size: 1 ) )
421+ ] ,
422+ conversion: . toOptionalFromIndirectReturn(
423+ discriminatorName: " result_discriminator$ " ,
424+ optionalClass: " Optional " ,
425+ javaType: . long,
426+ toValue: . constructSwiftValue( . placeholder, . class( package : nil , name: nominalTypeName) )
427+ )
428+ )
425429
426430 default :
427431 throw JavaTranslationError . unsupportedSwiftType ( swiftType)
@@ -558,6 +562,28 @@ extension JNISwift2JavaGenerator {
558562
559563 indirect case subscriptOf( JavaNativeConversionStep , arguments: [ JavaNativeConversionStep ] )
560564
565+ static func toOptionalFromIndirectReturn(
566+ discriminatorName: String ,
567+ optionalClass: String ,
568+ javaType: JavaType ,
569+ toValue valueConversion: JavaNativeConversionStep
570+ ) -> JavaNativeConversionStep {
571+ . aggregate(
572+ name: " result$ " ,
573+ type: javaType,
574+ [
575+ . ternary(
576+ . equals(
577+ . subscriptOf( . constant( discriminatorName) , arguments: [ . constant( " 0 " ) ] ) ,
578+ . constant( " 1 " )
579+ ) ,
580+ thenExp: . method( . constant( optionalClass) , function: " of " , arguments: [ valueConversion] ) ,
581+ elseExp: . method( . constant( optionalClass) , function: " empty " )
582+ )
583+ ]
584+ )
585+ }
586+
561587 /// Perform multiple conversions using the same input.
562588 case aggregate( name: String , type: JavaType , [ JavaNativeConversionStep ] )
563589
@@ -652,8 +678,8 @@ extension JNISwift2JavaGenerator {
652678 case . commaSeparated( let list) :
653679 return list. contains ( where: { $0. requiresSwiftArena } )
654680
655- case . method( let inner, _, _ ) :
656- return inner. requiresSwiftArena
681+ case . method( let inner, _, let args ) :
682+ return inner. requiresSwiftArena || args . contains ( where : \ . requiresSwiftArena )
657683
658684 case . combinedValueToOptional( let inner, _, _, _, _) :
659685 return inner. requiresSwiftArena
0 commit comments