@@ -256,7 +256,9 @@ extension FFMSwift2JavaGenerator {
256256 convention: swiftSelf. convention,
257257 parameterName: swiftSelf. parameterName ?? " self " ,
258258 loweredParam: loweredFunctionSignature. selfParameter!,
259- methodName: methodName
259+ methodName: methodName,
260+ genericParameters: swiftSignature. genericParameters,
261+ genericRequirements: swiftSignature. genericRequirements
260262 )
261263 } else {
262264 selfParameter = nil
@@ -272,7 +274,9 @@ extension FFMSwift2JavaGenerator {
272274 convention: swiftParam. convention,
273275 parameterName: parameterName,
274276 loweredParam: loweredParam,
275- methodName: methodName
277+ methodName: methodName,
278+ genericParameters: swiftSignature. genericParameters,
279+ genericRequirements: swiftSignature. genericRequirements
276280 )
277281 }
278282
@@ -295,7 +299,9 @@ extension FFMSwift2JavaGenerator {
295299 convention: SwiftParameterConvention ,
296300 parameterName: String ,
297301 loweredParam: LoweredParameter ,
298- methodName: String
302+ methodName: String ,
303+ genericParameters: [ SwiftGenericParameterDeclaration ] ,
304+ genericRequirements: [ SwiftGenericRequirement ]
299305 ) throws -> TranslatedParameter {
300306
301307 // If there is a 1:1 mapping between this Swift type and a C type, that can
@@ -352,7 +358,15 @@ extension FFMSwift2JavaGenerator {
352358 guard let genericArgs = swiftNominalType. genericArguments, genericArgs. count == 1 else {
353359 throw JavaTranslationError . unhandledType ( swiftType)
354360 }
355- return try translateOptionalParameter ( wrappedType: genericArgs [ 0 ] , convention: convention, parameterName: parameterName, loweredParam: loweredParam, methodName: methodName)
361+ return try translateOptionalParameter (
362+ wrappedType: genericArgs [ 0 ] ,
363+ convention: convention,
364+ parameterName: parameterName,
365+ loweredParam: loweredParam,
366+ methodName: methodName,
367+ genericParameters: genericParameters,
368+ genericRequirements: genericRequirements
369+ )
356370
357371 case . string:
358372 return TranslatedParameter (
@@ -399,33 +413,32 @@ extension FFMSwift2JavaGenerator {
399413 conversion: . call( . placeholder, function: " \( methodName) .$toUpcallStub " , withArena: true )
400414 )
401415
402- case . existential( let proto) , . opaque( let proto) :
403- // If the protocol has a known representative implementation, e.g. `String` for `StringProtocol`
404- // Translate it as the concrete type.
405- // NOTE: This is a temporary workaround until we add support for generics.
406- if
407- let knownProtocol = proto. asNominalTypeDeclaration? . knownTypeKind,
408- let concreteTy = knownTypes. representativeType ( of: knownProtocol)
409- {
416+ case . existential, . opaque, . genericParameter:
417+ if let concreteTy = swiftType. representativeConcreteTypeIn ( knownTypes: knownTypes, genericParameters: genericParameters, genericRequirements: genericRequirements) {
410418 return try translateParameter (
411419 type: concreteTy,
412420 convention: convention,
413421 parameterName: parameterName,
414422 loweredParam: loweredParam,
415- methodName: methodName
423+ methodName: methodName,
424+ genericParameters: genericParameters,
425+ genericRequirements: genericRequirements
416426 )
417427 }
418428
419429 // Otherwise, not supported yet.
420430 throw JavaTranslationError . unhandledType ( swiftType)
421431
422432 case . optional( let wrapped) :
423- return try translateOptionalParameter ( wrappedType: wrapped, convention: convention, parameterName: parameterName, loweredParam: loweredParam, methodName: methodName)
424-
425- case . genericParameter:
426- // Otherwise, not supported yet.
427- throw JavaTranslationError . unhandledType ( swiftType)
428-
433+ return try translateOptionalParameter (
434+ wrappedType: wrapped,
435+ convention: convention,
436+ parameterName: parameterName,
437+ loweredParam: loweredParam,
438+ methodName: methodName,
439+ genericParameters: genericParameters,
440+ genericRequirements: genericRequirements
441+ )
429442 }
430443 }
431444
@@ -435,12 +448,14 @@ extension FFMSwift2JavaGenerator {
435448 convention: SwiftParameterConvention ,
436449 parameterName: String ,
437450 loweredParam: LoweredParameter ,
438- methodName: String
451+ methodName: String ,
452+ genericParameters: [ SwiftGenericParameterDeclaration ] ,
453+ genericRequirements: [ SwiftGenericRequirement ]
439454 ) throws -> TranslatedParameter {
440455 // If there is a 1:1 mapping between this Swift type and a C type, that can
441456 // be expressed as a Java primitive type.
442457 if let cType = try ? CType ( cdeclType: swiftType) {
443- var ( translatedClass, lowerFunc) = switch cType. javaType {
458+ let ( translatedClass, lowerFunc) = switch cType. javaType {
444459 case . int: ( " OptionalInt " , " toOptionalSegmentInt " )
445460 case . long: ( " OptionalLong " , " toOptionalSegmentLong " )
446461 case . double: ( " OptionalDouble " , " toOptionalSegmentDouble " )
@@ -478,23 +493,30 @@ extension FFMSwift2JavaGenerator {
478493 ] ,
479494 conversion: . call( . placeholder, function: " SwiftRuntime.toOptionalSegmentInstance " , withArena: false )
480495 )
481- case . existential( let proto) , . opaque( let proto) :
482- if
483- let knownProtocol = proto. asNominalTypeDeclaration? . knownTypeKind,
484- let concreteTy = knownTypes. representativeType ( of: knownProtocol)
485- {
496+ case . existential, . opaque, . genericParameter:
497+ if let concreteTy = swiftType. representativeConcreteTypeIn ( knownTypes: knownTypes, genericParameters: genericParameters, genericRequirements: genericRequirements) {
486498 return try translateOptionalParameter (
487499 wrappedType: concreteTy,
488500 convention: convention,
489501 parameterName: parameterName,
490502 loweredParam: loweredParam,
491- methodName: methodName
503+ methodName: methodName,
504+ genericParameters: genericParameters,
505+ genericRequirements: genericRequirements
492506 )
493507 }
494508 throw JavaTranslationError . unhandledType ( . optional( swiftType) )
495509 case . tuple( let tuple) :
496510 if tuple. count == 1 {
497- return try translateOptionalParameter ( wrappedType: tuple [ 0 ] , convention: convention, parameterName: parameterName, loweredParam: loweredParam, methodName: methodName)
511+ return try translateOptionalParameter (
512+ wrappedType: tuple [ 0 ] ,
513+ convention: convention,
514+ parameterName: parameterName,
515+ loweredParam: loweredParam,
516+ methodName: methodName,
517+ genericParameters: genericParameters,
518+ genericRequirements: genericRequirements
519+ )
498520 }
499521 throw JavaTranslationError . unhandledType ( . optional( swiftType) )
500522 default :
0 commit comments