Skip to content

Commit 10dabf8

Browse files
committed
handle the return type being the generic type
1 parent e3f7a2e commit 10dabf8

File tree

5 files changed

+64
-18
lines changed

5 files changed

+64
-18
lines changed

Sources/JavaStdlib/JavaLangReflect/generated/Executable.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ open class Executable: AccessibleObject {
1111
@JavaMethod
1212
open func getModifiers() -> Int32
1313

14-
@JavaMethod
15-
open func getTypeParameters() -> [TypeVariable<JavaObject>?]
14+
// @JavaMethod // FIXME why does this clash with Method.getTypeParameters?
15+
// open func getTypeParameters() -> [TypeVariable<JavaObject>?]
1616

1717
@JavaMethod
1818
open func getParameterTypes() -> [JavaClass<JavaObject>?]

Sources/JavaStdlib/JavaLangReflect/generated/Type.swift

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,13 @@ import CSwiftJavaJNI
66
public struct Type {
77
@JavaMethod
88
public func getTypeName() -> String
9+
10+
@JavaMethod
11+
public func toString() -> String
12+
}
13+
14+
extension Type: CustomStringConvertible {
15+
public var description: String {
16+
"JavaLangReflect.Type(\(self.toString()))"
17+
}
918
}

Sources/SwiftJavaToolLib/JavaClassTranslator.swift

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -576,21 +576,41 @@ extension JavaClassTranslator {
576576
package func renderMethod(
577577
_ javaMethod: Method,
578578
implementedInSwift: Bool,
579-
genericParameterClause: String = "",
579+
genericParameterClause __genericParameterClause: String = "", // FIXME: why is this a string, fix this...
580580
whereClause: String = ""
581581
) throws -> DeclSyntax {
582+
// Map the generic params on the method.
583+
let typeParameters = javaMethod.getTypeParameters()
584+
var genericParameterClauseStr = __genericParameterClause
585+
if typeParameters.count(where: {$0 != nil }) > 0 {
586+
genericParameterClauseStr = "<"
587+
genericParameterClauseStr += typeParameters.map { typeParam in
588+
// FIXME: determine if it is some other constraint
589+
"\(typeParam!.getTypeName()): AnyJavaObject"
590+
}.joined(separator: ", ")
591+
genericParameterClauseStr += ">"
592+
}
593+
582594
// Map the parameters.
583595
let parameters = try translateJavaParameters(javaMethod.getParameters())
584596

585597
let parametersStr = parameters.map { $0.description }.joined(separator: ", ")
586598

599+
print("javaMethod.getReturnType() == \(javaMethod.getReturnType())")
600+
print("javaMethod.getGenericReturnType() == \(javaMethod.getGenericReturnType())")
601+
587602
// Map the result type.
588603
let resultTypeStr: String
589-
let resultType = try translator.getSwiftTypeNameAsString(
590-
javaMethod.getGenericReturnType()!,
591-
preferValueTypes: true,
604+
let resultType = try translator.getSwiftReturnTypeNameAsString(
605+
method: javaMethod,
606+
preferValueTypes: true,
592607
outerOptional: .implicitlyUnwrappedOptional
593608
)
609+
// let resultType = try translator.getSwiftTypeNameAsString(
610+
// javaMethod.getGenericReturnType()!,
611+
// preferValueTypes: true,
612+
// outerOptional: .implicitlyUnwrappedOptional
613+
// )
594614

595615
// FIXME: cleanup the checking here
596616
if resultType != "Void" && resultType != "Swift.Void" {
@@ -632,15 +652,15 @@ extension JavaClassTranslator {
632652

633653

634654
return """
635-
\(methodAttribute)\(raw: accessModifier)\(raw: overrideOpt)func \(raw: swiftMethodName)\(raw: genericParameterClause)(\(raw: parametersStr))\(raw: throwsStr)\(raw: resultTypeStr)\(raw: whereClause)
655+
\(methodAttribute)\(raw: accessModifier)\(raw: overrideOpt)func \(raw: swiftMethodName)\(raw: genericParameterClauseStr)(\(raw: parametersStr))\(raw: throwsStr)\(raw: resultTypeStr)\(raw: whereClause)
636656
637-
\(raw: accessModifier)\(raw: overrideOpt)func \(raw: swiftMethodName)Optional\(raw: genericParameterClause)(\(raw: parameters.map(\.clause.description).joined(separator: ", ")))\(raw: throwsStr) -> \(raw: resultOptional)\(raw: whereClause) {
657+
\(raw: accessModifier)\(raw: overrideOpt)func \(raw: swiftMethodName)Optional\(raw: genericParameterClauseStr)(\(raw: parameters.map(\.clause.description).joined(separator: ", ")))\(raw: throwsStr) -> \(raw: resultOptional)\(raw: whereClause) {
638658
\(body)
639659
}
640660
"""
641661
} else {
642662
return """
643-
\(methodAttribute)\(raw: accessModifier)\(raw: overrideOpt)func \(raw: swiftMethodName)\(raw: genericParameterClause)(\(raw: parametersStr))\(raw: throwsStr)\(raw: resultTypeStr)\(raw: whereClause)
663+
\(methodAttribute)\(raw: accessModifier)\(raw: overrideOpt)func \(raw: swiftMethodName)\(raw: genericParameterClauseStr)(\(raw: parametersStr))\(raw: throwsStr)\(raw: resultTypeStr)\(raw: whereClause)
644664
"""
645665
}
646666
}

Sources/SwiftJavaToolLib/JavaTranslator.swift

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,24 @@ extension JavaTranslator {
120120

121121
// MARK: Type translation
122122
extension JavaTranslator {
123+
func getSwiftReturnTypeNameAsString(
124+
method: JavaLangReflect.Method,
125+
preferValueTypes: Bool,
126+
outerOptional: OptionalKind
127+
) throws -> String {
128+
let returnType = method.getReturnType()
129+
let genericReturnType = method.getGenericReturnType()
130+
131+
// Special handle the case when the return type is the generic type of the method: `<T> T foo()`
132+
if returnType?.getCanonicalName() == "java.lang.Object" {
133+
if let genericReturnType {
134+
return genericReturnType.getTypeName()
135+
}
136+
}
137+
138+
return try getSwiftTypeNameAsString(genericReturnType!, preferValueTypes: preferValueTypes, outerOptional: outerOptional)
139+
}
140+
123141
/// Turn a Java type into a string.
124142
func getSwiftTypeNameAsString(
125143
_ javaType: Type,

Tests/SwiftJavaToolLibTests/WrapJavaTests.swift

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -63,13 +63,8 @@ class WrapJavaTests: XCTestCase {
6363
class Pair<First, Second> { }
6464
6565
class ExampleSimpleClass {
66-
<KeyType, ValueType> Pair<KeyType, ValueType> get(
67-
String name,
68-
Item<KeyType> key,
69-
Item<ValueType> value
70-
) {
71-
return null;
72-
}
66+
<KeyType> KeyType getGeneric(Item<KeyType> key) { return null; }
67+
// <KeyType, ValueType> Pair<KeyType, ValueType> getPair(String name, Item<KeyType> key, Item<ValueType> value) { return null; }
7368
}
7469
""")
7570

@@ -95,8 +90,12 @@ class WrapJavaTests: XCTestCase {
9590
""",
9691
"""
9792
@JavaMethod
98-
open func getStore<T1, T2>(_ arg0: String, _ arg1: Item<T1>?, _ arg2: Item<T2>?) -> BDStore<T1, T2>!
99-
"""
93+
open func getGeneric<T1>(_ arg0: String, _ arg1: Item<T1>?) -> T1!
94+
""",
95+
// """
96+
// @JavaMethod
97+
// open func getStore<T1, T2>(_ arg0: String, _ arg1: Item<T1>?, _ arg2: Item<T2>?) -> BDStore<T1, T2>!
98+
// """
10099
]
101100
)
102101
} catch let error as Throwable {

0 commit comments

Comments
 (0)