Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 7 additions & 6 deletions Sources/SwiftJavaToolLib/JavaClassTranslator.swift
Original file line number Diff line number Diff line change
Expand Up @@ -270,6 +270,13 @@ extension JavaClassTranslator {

/// Add a field to the appropriate lists(s) for later translation.
private mutating func addField(_ field: Field) {
// Don't include inherited fields when translating to a class.
// This applies to both instance and static fields to avoid duplicates
if translateAsClass &&
!field.getDeclaringClass()!.equals(javaClass.as(JavaObject.self)!) {
return
}

// Static fields go into a separate list.
if field.isStatic {
staticFields.append(field)
Expand All @@ -283,12 +290,6 @@ extension JavaClassTranslator {
return
}

// Don't include inherited fields when translating to a class.
if translateAsClass &&
!field.getDeclaringClass()!.equals(javaClass.as(JavaObject.self)!) {
return
}

fields.append(field)
}

Expand Down
41 changes: 41 additions & 0 deletions Tests/SwiftJavaToolLibTests/WrapJavaTests/BasicWrapJavaTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -88,4 +88,45 @@ final class BasicWrapJavaTests: XCTestCase {
)
}


// Test that static fields from superclasses are not duplicated in generated code.
// This prevents duplicate serialVersionUID declarations when both a class and its
// superclass declare the field. The subclass field "hides" the superclass field,
// similar to how static methods work in Java.
func test_wrapJava_noDuplicateStaticFieldsFromSuperclass() async throws {
let classpathURL = try await compileJava(
"""
package com.example;

class SuperClass {
public static final long serialVersionUID = 1L;
}

class SubClass extends SuperClass {
public static final long serialVersionUID = 2L;
}
""")

try assertWrapJavaOutput(
javaClassNames: [
"com.example.SuperClass",
"com.example.SubClass"
],
classpath: [classpathURL],
expectedChunks: [
// SuperClass should have its static field
"""
extension JavaClass<SuperClass> {
@JavaStaticField(isFinal: true)
public var serialVersionUID: Int64
""",
// SubClass should only have its own static field, not the superclass one
"""
extension JavaClass<SubClass> {
@JavaStaticField(isFinal: true)
public var serialVersionUID: Int64
""",
]
)
}
}