Skip to content

Commit 720c2cf

Browse files
committed
Add Tests for Subclasses
1 parent f18d327 commit 720c2cf

File tree

3 files changed

+41
-9
lines changed

3 files changed

+41
-9
lines changed

Sources/Java2Swift/JavaToSwift.swift

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -229,10 +229,26 @@ struct JavaToSwift: ParsableCommand {
229229
// Note that we will be translating this Java class, so it is a known class.
230230
translator.translatedClasses[javaClassName] = (translatedSwiftName, nil, true)
231231

232-
for internalClass in javaClass.getClasses() {
232+
var classes: [(classToImport: JavaClass<JavaObject>?, prefix: String)] = javaClass.getClasses().map { ($0, translatedSwiftName) }
233+
234+
// Go through all subclasses to find all of the classes to translate
235+
while let (internalClass, prefix) = classes.popLast() {
233236
if let internalClass {
234237
let (javaName, swiftName) = names(from: internalClass.getCanonicalName())
235-
translator.translatedClasses[internalClass.getCanonicalName()] = (swiftName.replacing("$", with: "."), nil, true)
238+
// If we have already been through this class, don't go through it again
239+
guard translator.translatedClasses[javaName] == nil else { continue }
240+
let currentClassName: String
241+
// If the prefix is the part of the canonical name, continue (else use the same)
242+
// This is needed since `java.lang.Enum.EnumDesc` is one of the declared classes of all of the enums
243+
if (internalClass.getCanonicalName().contains(prefix)) {
244+
currentClassName = "\(prefix).\(swiftName)"
245+
} else {
246+
currentClassName = swiftName
247+
}
248+
249+
let currentSanitizedClassName = currentClassName.replacing("$", with: ".")
250+
classes.append(contentsOf: internalClass.getClasses().map { ($0, currentSanitizedClassName) })
251+
translator.translatedClasses[javaName] = (currentSanitizedClassName, nil, true)
236252
}
237253
}
238254
}

Sources/Java2SwiftLib/JavaTranslator.swift

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,15 @@ extension JavaTranslator {
193193
package func translateClass(_ javaClass: JavaClass<JavaObject>) -> [DeclSyntax] {
194194
let fullName = javaClass.getCanonicalName()
195195
let swiftTypeName = try! getSwiftTypeNameFromJavaClassName(fullName)
196+
let (swiftParentType, swiftInnermostTypeName) = swiftTypeName.splitSwiftTypeName()
197+
198+
// If the swift parent type has not been translated, don't try to translate this one
199+
if let swiftParentType,
200+
!translatedClasses.contains(where: { _, value in value.swiftType == swiftParentType })
201+
{
202+
logUntranslated("Unable to translate '\(fullName)' parent class: \(swiftParentType) not found")
203+
return []
204+
}
196205

197206
// Superclass.
198207
let extends: String
@@ -356,13 +365,12 @@ extension JavaTranslator {
356365
staticMemberWhereClause = ""
357366
}
358367

359-
// Emit the struct declaration describing the java class.
360-
let (swiftParentType, swiftInnermostTypeName) = swiftTypeName.splitSwiftTypeName()
368+
// Emit the struct declaration describing the java class. Add backticks to the name since the type might interfere with Swift type names
361369
let classOrInterface: String = javaClass.isInterface() ? "JavaInterface" : "JavaClass";
362370
var classDecl =
363371
"""
364372
@\(raw:classOrInterface)(\(literal: fullName)\(raw: extends)\(raw: interfacesStr))
365-
public struct \(raw: swiftInnermostTypeName)\(raw: genericParameterClause) {
373+
public struct `\(raw: swiftInnermostTypeName)`\(raw: genericParameterClause) {
366374
\(raw: members.map { $0.description }.joined(separator: "\n\n"))
367375
}
368376
""" as DeclSyntax
@@ -382,6 +390,7 @@ extension JavaTranslator {
382390
classDecl = classDecl.formatted(using: format).cast(DeclSyntax.self)
383391

384392
topLevelDecls.append(classDecl)
393+
385394
let subClassDecls = javaClass.getClasses().compactMap {
386395
$0.flatMap { clazz in
387396
return translateClass(clazz)
@@ -391,7 +400,6 @@ extension JavaTranslator {
391400
topLevelDecls.append(
392401
contentsOf: subClassDecls
393402
)
394-
395403
// Translate static members.
396404
var staticMembers: [DeclSyntax] = []
397405

Tests/Java2SwiftTests/Java2SwiftTests.swift

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ class Java2SwiftTests: XCTestCase {
3737
"import JavaKit",
3838
"""
3939
@JavaClass("java.lang.Object")
40-
public struct MyJavaObject {
40+
public struct `MyJavaObject` {
4141
""",
4242
"""
4343
@JavaMethod
@@ -127,7 +127,16 @@ class Java2SwiftTests: XCTestCase {
127127
],
128128
expectedChunks: [
129129
"import JavaKit",
130-
""
130+
"""
131+
extension ProcessBuilder {
132+
@JavaClass("java.lang.ProcessBuilder.Redirect")
133+
public struct `Redirect` {
134+
""",
135+
"""
136+
extension ProcessBuilder.Redirect {
137+
@JavaClass("java.lang.ProcessBuilder.Redirect.Type")
138+
public struct `Type` {
139+
"""
131140
]
132141
)
133142
}
@@ -179,7 +188,6 @@ func assertTranslatedClass<JavaClassType: AnyJavaObject>(
179188
"""
180189

181190
for expectedChunk in expectedChunks {
182-
print(swiftFileText)
183191
if swiftFileText.contains(expectedChunk) {
184192
continue
185193
}

0 commit comments

Comments
 (0)