Skip to content

Commit bcd3b6e

Browse files
committed
handle open class CompressingStore: AbstractStore<ByteArray, [UInt8], [UInt8]> {
1 parent 149ab11 commit bcd3b6e

File tree

5 files changed

+75
-15
lines changed

5 files changed

+75
-15
lines changed

Sources/SwiftJavaToolLib/JavaClassTranslator.swift

Lines changed: 32 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ struct JavaClassTranslator {
4747
let effectiveJavaSuperclass: JavaClass<JavaObject>?
4848

4949
/// The Swift name of the superclass.
50-
let swiftSuperclass: String?
50+
let swiftSuperclass: SwiftJavaParameterizedType?
5151

5252
/// The Swift names of the interfaces that this class implements.
5353
let swiftInterfaces: [String]
@@ -114,7 +114,7 @@ struct JavaClassTranslator {
114114
init(javaClass: JavaClass<JavaObject>, translator: JavaTranslator) throws {
115115
let fullName = javaClass.getName()
116116
print("TRANSLATE = \(fullName)")
117-
117+
118118
self.javaClass = javaClass
119119
self.translator = translator
120120
self.translateAsClass = translator.translateAsClass && !javaClass.isInterface()
@@ -128,30 +128,46 @@ struct JavaClassTranslator {
128128
self.javaTypeParameters = javaClass.getTypeParameters().compactMap { $0 }
129129
self.nestedClasses = translator.nestedClasses[fullName] ?? []
130130

131-
// Superclass.
131+
// Superclass, incl parameter types (if any)
132132
if !javaClass.isInterface() {
133133
var javaSuperclass = javaClass.getSuperclass()
134-
var swiftSuperclass: String? = nil
134+
var javaGenericSuperclass: JavaReflectType? = javaClass.getGenericSuperclass()
135+
var swiftSuperclassName: String? = nil
136+
var swiftSuperclassTypeArgs: [String] = []
135137
while let javaSuperclassNonOpt = javaSuperclass {
136138
do {
137-
swiftSuperclass = try translator.getSwiftTypeName(javaSuperclassNonOpt, preferValueTypes: false).swiftName
139+
swiftSuperclassName = try translator.getSwiftTypeName(javaSuperclassNonOpt, preferValueTypes: false).swiftName
140+
if let javaGenericSuperclass = javaGenericSuperclass?.as(JavaReflectParameterizedType.self) {
141+
print("javaGenericSuperclass = \(javaGenericSuperclass)")
142+
for typeArg in javaGenericSuperclass.getActualTypeArguments() {
143+
let javaTypeArgName = typeArg?.getTypeName() ?? ""
144+
if let swiftTypeArgName = self.translator.translatedClasses[javaTypeArgName] {
145+
swiftSuperclassTypeArgs.append(swiftTypeArgName.qualifiedName)
146+
} else {
147+
swiftSuperclassTypeArgs.append("/* MISSING MAPPING FOR */ \(javaTypeArgName)")
148+
}
149+
}
150+
}
138151
break
139152
} catch {
140153
translator.logUntranslated("Unable to translate '\(fullName)' superclass: \(error)")
141154
}
142155

143156
javaSuperclass = javaSuperclassNonOpt.getSuperclass()
157+
javaGenericSuperclass = javaClass.getGenericSuperclass()
144158
}
145159

160+
print("swiftSuperclassTypeArgs = \(swiftSuperclassTypeArgs)")
161+
146162
self.effectiveJavaSuperclass = javaSuperclass
147-
self.swiftSuperclass = swiftSuperclass
163+
self.swiftSuperclass = SwiftJavaParameterizedType(
164+
name: swiftSuperclassName,
165+
typeArguments: swiftSuperclassTypeArgs)
148166
} else {
149167
self.effectiveJavaSuperclass = nil
150168
self.swiftSuperclass = nil
151169
}
152170

153-
print("[\(fullName)] SWUFT SUPER CLASS = \(swiftSuperclass)")
154-
155171
// Interfaces.
156172
self.swiftInterfaces = javaClass.getGenericInterfaces().compactMap { (javaType) -> String? in
157173
guard let javaType else {
@@ -333,7 +349,14 @@ extension JavaClassTranslator {
333349
let inheritanceClause: String
334350
if translateAsClass {
335351
extends = ""
336-
inheritanceClause = swiftSuperclass.map { ": \($0)" } ?? ""
352+
inheritanceClause =
353+
if let swiftSuperclass, swiftSuperclass.typeArguments.isEmpty {
354+
": \(swiftSuperclass.name)"
355+
} else if let swiftSuperclass {
356+
": \(swiftSuperclass.name)<\(swiftSuperclass.typeArguments.joined(separator: ", "))>"
357+
} else {
358+
""
359+
}
337360
} else {
338361
extends = swiftSuperclass.map { ", extends: \($0).self" } ?? ""
339362
inheritanceClause = ""
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
//===----------------------------------------------------------------------===//
2+
//
3+
// This source file is part of the Swift.org open source project
4+
//
5+
// Copyright (c) 2024 Apple Inc. and the Swift.org project authors
6+
// Licensed under Apache License v2.0
7+
//
8+
// See LICENSE.txt for license information
9+
// See CONTRIBUTORS.txt for the list of Swift.org project authors
10+
//
11+
// SPDX-License-Identifier: Apache-2.0
12+
//
13+
//===----------------------------------------------------------------------===//
14+
15+
// E.g. `Another<Bites, The, Dust>`
16+
struct SwiftJavaParameterizedType {
17+
let name: String
18+
let typeArguments: [String]
19+
20+
init?(name: String?, typeArguments: [String]) {
21+
guard let name else {
22+
return nil
23+
}
24+
25+
self.name = name
26+
self.typeArguments = typeArguments
27+
}
28+
}

Sources/SwiftJavaToolLib/JavaTranslator+Validation.swift

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,14 @@ package struct SwiftTypeName: Hashable, CustomStringConvertible {
2323
self.swiftType = name
2424
}
2525

26+
package var qualifiedName: String {
27+
if let swiftModule {
28+
"\(swiftModule).\(swiftType)"
29+
} else {
30+
"\(swiftType)"
31+
}
32+
}
33+
2634
package var description: String {
2735
if let swiftModule {
2836
"`\(swiftModule)/\(swiftType)`"

Sources/SwiftJavaToolLib/JavaTranslator.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,8 @@ package class JavaTranslator {
3737
/// A mapping from the name of each known Java class to the corresponding
3838
/// Swift type name and its Swift module.
3939
package var translatedClasses: [JavaFullyQualifiedTypeName: SwiftTypeName] = [
40-
"java.lang.Object": SwiftTypeName(module: "SwiftJava", name: "JavaObject")
40+
"java.lang.Object": SwiftTypeName(module: "SwiftJava", name: "JavaObject"),
41+
"byte[]": SwiftTypeName(module: nil, name: "[UInt8]")
4142
]
4243

4344
/// A mapping from the name of each known Java class with the Swift value type

Tests/SwiftJavaToolLibTests/WrapJavaTests.swift

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -94,13 +94,13 @@ class WrapJavaTests: XCTestCase {
9494
@JavaClass("com.example.ByteArray")
9595
open class ByteArray: JavaObject {
9696
""",
97-
"""
98-
@JavaInterface("com.example.Store")
99-
public struct Store<K: AnyJavaObject, V: AnyJavaObject, T: AnyJavaObject> {
100-
""",
97+
// """
98+
// @JavaInterface("com.example.Store")
99+
// public struct Store<K: AnyJavaObject, V: AnyJavaObject, T: AnyJavaObject> {
100+
// """,
101101
"""
102102
@JavaClass("com.example.CompressingStore")
103-
open class CompressingStore: AbstractStore {
103+
open class CompressingStore: AbstractStore<ByteArray, [UInt8], [UInt8]> {
104104
"""
105105
]
106106
)

0 commit comments

Comments
 (0)