Skip to content

Commit 24fbaa5

Browse files
committed
towards generic parent class in wrap-java mode
1 parent c33070c commit 24fbaa5

File tree

3 files changed

+94
-30
lines changed

3 files changed

+94
-30
lines changed

Sources/SwiftJavaToolLib/JavaClassTranslator.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,8 @@ struct JavaClassTranslator {
148148
self.swiftSuperclass = nil
149149
}
150150

151+
print("[\(fullName)] SWUFT SUPER CLASS = \(swiftSuperclass)")
152+
151153
// Interfaces.
152154
self.swiftInterfaces = javaClass.getGenericInterfaces().compactMap { (javaType) -> String? in
153155
guard let javaType else {

Sources/SwiftJavaToolLib/JavaTranslator.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,7 @@ extension JavaTranslator {
257257
return translated.swiftType
258258
}
259259

260-
fatalError("Not translated: \(name); Had:\n\(translatedClasses)")
260+
print("DEBUG >>> Not translated: \(name)")
261261
throw TranslationError.untranslatedJavaClass(name)
262262
}
263263
}

Tests/SwiftJavaToolLibTests/WrapJavaTests.swift

Lines changed: 91 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -20,18 +20,18 @@ import XCTest // NOTE: Workaround for https://github.com/swiftlang/swift-java/is
2020

2121
class WrapJavaTests: XCTestCase {
2222

23-
let JavaSource: String =
24-
"""
25-
package com.example;
26-
27-
class ExampleSimpleClass {}
28-
"""
29-
3023
func testWrapJavaFromCompiledJavaSource() async throws {
31-
let classpathURL = try await compileJava(JavaSource)
24+
let classpathURL = try await compileJava(
25+
"""
26+
package com.example;
27+
28+
class ExampleSimpleClass {}
29+
""")
3230

3331
try assertWrapJavaOutput(
34-
javaClassName: "com.example.ExampleSimpleClass",
32+
javaClassNames: [
33+
"com.example.ExampleSimpleClass"
34+
],
3535
classpath: [classpathURL],
3636
expectedChunks: [
3737
"""
@@ -45,6 +45,58 @@ class WrapJavaTests: XCTestCase {
4545
]
4646
)
4747
}
48+
49+
/*
50+
/Users/ktoso/code/voldemort-swift-java/.build/plugins/outputs/voldemort-swift-java/VoldemortSwiftJava/destination/SwiftJavaPlugin/generated/CompressingStore.swift:6:30: error: reference to generic type 'AbstractStore' requires arguments in <...>
51+
4 |
52+
5 | @JavaClass("voldemort.store.compress.CompressingStore")
53+
6 | open class CompressingStore: AbstractStore {
54+
| `- error: reference to generic type 'AbstractStore' requires arguments in <...>
55+
7 | @JavaMethod
56+
8 | open override func getCapability(_ arg0: StoreCapabilityType?) -> JavaObject!
57+
58+
/Users/ktoso/code/voldemort-swift-java/.build/plugins/outputs/voldemort-swift-java/VoldemortSwiftJava/destination/SwiftJavaPlugin/generated/AbstractStore.swift:6:12: note: generic type 'AbstractStore' declared here
59+
4 |
60+
5 | @JavaClass("voldemort.store.AbstractStore", implements: Store<JavaObject, JavaObject, JavaObject>.self)
61+
6 | open class AbstractStore<K: AnyJavaObject, V: AnyJavaObject, T: AnyJavaObject>: JavaObject {
62+
| `- note: generic type 'AbstractStore' declared here
63+
7 | @JavaMethod
64+
8 | @_nonoverride public convenience init(_ arg0: String, environment: JNIEnvironment? = nil)
65+
*/
66+
func testGenericSuperclass() async throws {
67+
let classpathURL = try await compileJava(
68+
"""
69+
package com.example;
70+
71+
class ByteArray {}
72+
// class CompressingStore extends AbstractStore<ByteArray, byte[], byte[]> {}
73+
abstract class AbstractStore<K, V, T> implements Store<K, V, T> {}
74+
interface Store<K, V, T> {}
75+
76+
""")
77+
78+
try assertWrapJavaOutput(
79+
javaClassNames: [
80+
"com.example.ByteArray",
81+
"com.example.Store",
82+
],
83+
classpath: [classpathURL],
84+
expectedChunks: [
85+
"""
86+
import CSwiftJavaJNI
87+
import SwiftJava
88+
""",
89+
"""
90+
@JavaClass("com.example.ByteArray")
91+
open class ByteArray: JavaObject {
92+
""",
93+
"""
94+
@JavaInterface("com.example.Store")
95+
public struct Store<K: AnyJavaObject, V: AnyJavaObject, T: AnyJavaObject> {
96+
"""
97+
]
98+
)
99+
}
48100
}
49101

50102
fileprivate func createTemporaryDirectory(in directory: URL) throws -> URL {
@@ -84,11 +136,10 @@ func compileJava(_ sourceText: String) async throws -> URL {
84136
return classesDirectory
85137
}
86138

87-
88139
/// Translate a Java class and assert that the translated output contains
89140
/// each of the expected "chunks" of text.
90141
func assertWrapJavaOutput(
91-
javaClassName: String,
142+
javaClassNames: [String],
92143
classpath: [URL],
93144
expectedChunks: [String],
94145
function: String = #function,
@@ -109,27 +160,32 @@ func assertWrapJavaOutput(
109160
let classLoader = try! JavaClass<JavaClassLoader>(environment: environment)
110161
.getSystemClassLoader()!
111162

163+
164+
// FIXME: deduplicate this
165+
translator.startNewFile()
166+
167+
var swiftCompleteOutputText = ""
168+
112169
var javaClasses: [JavaClass<JavaObject>] = []
113-
guard let javaClass = try classLoader.loadClass(javaClassName) else {
114-
fatalError("Could not load Java class '\(javaClassName)' in test \(function) @ \(file):\(line)!")
115-
}
116-
javaClasses.append(javaClass)
170+
for javaClassName in javaClassNames {
171+
guard let javaClass = try classLoader.loadClass(javaClassName) else {
172+
fatalError("Could not load Java class '\(javaClassName)' in test \(function) @ \(file):\(line)!")
173+
}
174+
javaClasses.append(javaClass)
117175

118-
// FIXME: deduplicate this with SwiftJava.WrapJavaCommand.runCommand !!!
119-
// TODO: especially because nested classes
120-
// WrapJavaCommand().<TODO>
176+
// FIXME: deduplicate this with SwiftJava.WrapJavaCommand.runCommand !!!
177+
// TODO: especially because nested classes
178+
// WrapJavaCommand().<TODO>
121179

122-
let swiftUnqualifiedName = javaClassName.javaClassNameToCanonicalName
123-
.defaultSwiftNameForJavaClass
124-
translator.translatedClasses[javaClassName] =
125-
.init(module: nil, name: swiftUnqualifiedName)
180+
let swiftUnqualifiedName = javaClassName.javaClassNameToCanonicalName
181+
.defaultSwiftNameForJavaClass
182+
translator.translatedClasses[javaClassName] =
183+
.init(module: nil, name: swiftUnqualifiedName)
126184

127-
try translator.validateClassConfiguration()
185+
try translator.validateClassConfiguration()
128186

129-
// FIXME: deduplicate this
130-
translator.startNewFile()
131-
let swiftClassDecls = try translator.translateClass(javaClass)
132-
let importDecls = translator.getImportDecls()
187+
let swiftClassDecls = try translator.translateClass(javaClass)
188+
let importDecls = translator.getImportDecls()
133189

134190
let swiftFileText =
135191
"""
@@ -138,12 +194,18 @@ func assertWrapJavaOutput(
138194
\(swiftClassDecls.map { $0.description }.joined(separator: "\n"))
139195
140196
"""
197+
swiftCompleteOutputText += swiftFileText
198+
}
141199

142200
for expectedChunk in expectedChunks {
143-
if swiftFileText.contains(expectedChunk) {
201+
if swiftCompleteOutputText.contains(expectedChunk) {
144202
continue
145203
}
146204

147-
XCTFail("Expected chunk '\(expectedChunk)' not found in '\(swiftFileText)'", file: file, line: line)
205+
XCTFail("Expected chunk '\(expectedChunk)' not found in '\(swiftCompleteOutputText)'",
206+
file: file, line: line)
148207
}
208+
209+
print("=============================================")
210+
print(swiftCompleteOutputText)
149211
}

0 commit comments

Comments
 (0)