1515import SwiftJava
1616import JavaLangReflect
1717import SwiftSyntax
18+ import OrderedCollections
1819import SwiftJavaConfigurationShared
1920import Logging
2021
@@ -606,25 +607,35 @@ extension JavaClassTranslator {
606607 return false
607608 }
608609
609- /// Translates the given Java method into a Swift declaration.
610- package func renderMethod(
611- _ javaMethod: Method ,
612- implementedInSwift: Bool ,
613- genericParameters: [ String ] = [ ] ,
614- whereClause: String = " "
615- ) throws -> DeclSyntax {
616- // Map the generic params on the method.
617- var allGenericParameters = genericParameters
610+ // TODO: make it more precise with the "origin" of the generic parameter (outer class etc)
611+ func collectMethodGenericParameters(
612+ genericParameters: [ String ] ,
613+ method javaMethod: Method
614+ ) -> OrderedSet < String > {
615+ var allGenericParameters = OrderedSet ( genericParameters)
618616 let typeParameters = javaMethod. getTypeParameters ( )
619617 if typeParameters. contains ( where: { $0 != nil } ) {
620- allGenericParameters += typeParameters. compactMap { typeParam in
618+ allGenericParameters. appending ( contentsOf : typeParameters. compactMap { typeParam in
621619 guard let typeParam else { return nil }
622620 guard genericParameterIsUsedInSignature ( typeParam, in: javaMethod) else {
623621 return nil
624622 }
625623 return " \( typeParam. getTypeName ( ) ) : AnyJavaObject "
626- }
624+ } )
627625 }
626+
627+ return allGenericParameters
628+ }
629+
630+ /// Translates the given Java method into a Swift declaration.
631+ package func renderMethod(
632+ _ javaMethod: Method ,
633+ implementedInSwift: Bool ,
634+ genericParameters: [ String ] = [ ] ,
635+ whereClause: String = " "
636+ ) throws -> DeclSyntax {
637+ // Map the generic params on the method.
638+ let allGenericParameters = collectMethodGenericParameters ( genericParameters: genericParameters, method: javaMethod)
628639 let genericParameterClauseStr =
629640 if allGenericParameters. isEmpty {
630641 " "
@@ -657,7 +668,7 @@ extension JavaClassTranslator {
657668 let throwsStr = javaMethod. throwsCheckedException ? " throws " : " "
658669 let swiftMethodName = javaMethod. getName ( ) . escapedSwiftName
659670
660- // Compute the '@...JavaMethod(...)' details
671+ // Compute the parameters for '@...JavaMethod(...)'
661672 let methodAttribute : AttributeSyntax
662673 if implementedInSwift {
663674 methodAttribute = " "
@@ -674,6 +685,7 @@ extension JavaClassTranslator {
674685 parameters. append ( " genericResult: \" \( resultType) \" " )
675686 }
676687 // TODO: generic parameters?
688+
677689 if !parameters. isEmpty {
678690 methodAttributeStr += " ( "
679691 methodAttributeStr. append ( parameters. joined ( separator: " , " ) )
@@ -690,6 +702,7 @@ extension JavaClassTranslator {
690702 ? " override "
691703 : " "
692704
705+ // FIXME: refactor this so we don't have to duplicate the method signatures
693706 if resultType. optionalWrappedType ( ) != nil || parameters. contains ( where: { $0. type. trimmedDescription. optionalWrappedType ( ) != nil } ) {
694707 let parameters = parameters. map { param -> ( clause: FunctionParameterSyntax , passedArg: String ) in
695708 let name = param. secondName!. trimmedDescription
@@ -711,15 +724,17 @@ extension JavaClassTranslator {
711724 }
712725
713726
714- return """
727+ return
728+ """
715729 \( methodAttribute) \( raw: accessModifier) \( raw: overrideOpt) func \( raw: swiftMethodName) \( raw: genericParameterClauseStr) ( \( raw: parametersStr) ) \( raw: throwsStr) \( raw: resultTypeStr) \( raw: whereClause)
716730
717731 \( raw: accessModifier) \( raw: overrideOpt) func \( raw: swiftMethodName) Optional \( raw: genericParameterClauseStr) ( \( raw: parameters. map ( \. clause. description) . joined ( separator: " , " ) ) ) \( raw: throwsStr) -> \( raw: resultOptional) \( raw: whereClause) {
718732 \( body)
719733 }
720734 """
721735 } else {
722- return """
736+ return
737+ """
723738 \( methodAttribute) \( raw: accessModifier) \( raw: overrideOpt) func \( raw: swiftMethodName) \( raw: genericParameterClauseStr) ( \( raw: parametersStr) ) \( raw: throwsStr) \( raw: resultTypeStr) \( raw: whereClause)
724739 """
725740 }
@@ -900,6 +915,7 @@ struct MethodCollector {
900915}
901916
902917// MARK: Utility functions
918+
903919extension JavaClassTranslator {
904920 /// Determine whether this method is an override of another Java
905921 /// method.
@@ -935,7 +951,7 @@ extension JavaClassTranslator {
935951 return true
936952 }
937953 } catch {
938- // FIXME: logging
954+ log . warning ( " Failed to determine if method ' \( method ) ' is an override, error: \( error ) " )
939955 }
940956 }
941957
0 commit comments