Skip to content

Commit 45d195c

Browse files
committed
Java2Swift: Correctly determine if a Swift method will be an override.
When looking for a declared method with a given signature, we need to check all superclasses that have been mapped into Swift, not just the closest one.
1 parent b55cd4d commit 45d195c

File tree

2 files changed

+49
-8
lines changed

2 files changed

+49
-8
lines changed

Sources/Java2SwiftLib/JavaClassTranslator.swift

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -664,15 +664,30 @@ extension JavaClassTranslator {
664664
/// Determine whether this method is an override of another Java
665665
/// method.
666666
func isOverride(_ method: Method) -> Bool {
667-
guard let javaSuperclass = effectiveJavaSuperclass else {
668-
return false
669-
}
667+
var currentSuperclass = effectiveJavaSuperclass
668+
while let currentSuperclassNonOpt = currentSuperclass {
669+
// Set the loop up for the next run.
670+
defer {
671+
currentSuperclass = currentSuperclassNonOpt.getSuperclass()
672+
}
673+
674+
do {
675+
// If this class didn't get translated into Swift, skip it.
676+
if translator.translatedClasses[currentSuperclassNonOpt.getName()] == nil {
677+
continue
678+
}
670679

671-
do {
672-
let overriddenMethod = try javaSuperclass.getDeclaredMethod(method.getName(), method.getParameterTypes())
673-
return overriddenMethod != nil
674-
} catch {
675-
return false
680+
// If this superclass declares a method with the same parameter types,
681+
// we have an override.
682+
let overriddenMethod = try currentSuperclassNonOpt
683+
.getDeclaredMethod(method.getName(), method.getParameterTypes())
684+
if overriddenMethod != nil {
685+
return true
686+
}
687+
} catch {
688+
}
676689
}
690+
691+
return false
677692
}
678693
}

Tests/Java2SwiftTests/Java2SwiftTests.swift

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -422,6 +422,32 @@ class Java2SwiftTests: XCTestCase {
422422
]
423423
)
424424
}
425+
426+
func testOverrideSkipImmediateSuperclass() throws {
427+
// JavaByte overrides equals() from JavaObject, which it indirectly
428+
// inherits through JavaNumber
429+
try assertTranslatedClass(
430+
JavaByte.self,
431+
swiftTypeName: "JavaByte",
432+
asClass: true,
433+
translatedClasses: [
434+
"java.lang.Object" : ("JavaObject", "JavaKit"),
435+
"java.lang.Number" : ("JavaNumber", "JavaKit"),
436+
"java.lang.Byte" : ("JavaByte", "JavaKit"),
437+
],
438+
expectedChunks: [
439+
"import JavaKit",
440+
"""
441+
@JavaClass("java.lang.Byte")
442+
open class JavaByte: JavaNumber {
443+
""",
444+
"""
445+
@JavaMethod
446+
open override func equals(_ arg0: JavaObject?) -> Bool
447+
""",
448+
]
449+
)
450+
}
425451
}
426452

427453
@JavaClass("java.lang.ClassLoader")

0 commit comments

Comments
 (0)