From 5030dfb8f5825f824aa4829c8a83e21f79a8c59d Mon Sep 17 00:00:00 2001 From: Iceman Date: Thu, 12 Mar 2026 16:17:37 +0900 Subject: [PATCH 1/3] Add test case for generic super class --- .../Java2SwiftTests.swift | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/Tests/SwiftJavaToolLibTests/Java2SwiftTests.swift b/Tests/SwiftJavaToolLibTests/Java2SwiftTests.swift index e2948682..0a5c14e5 100644 --- a/Tests/SwiftJavaToolLibTests/Java2SwiftTests.swift +++ b/Tests/SwiftJavaToolLibTests/Java2SwiftTests.swift @@ -12,6 +12,7 @@ // //===----------------------------------------------------------------------===// +import JavaUtil @_spi(Testing) import SwiftJava import SwiftJavaConfigurationShared import SwiftJavaToolLib @@ -505,6 +506,28 @@ class Java2SwiftTests: XCTestCase { ) } + func testGenericSuperclassNotMapped() throws { + // ArrayDeque extends AbstractCollection + // If AbstractCollection is not mapped, it should fall back to JavaObject + try assertTranslatedClass( + ArrayDeque.self, + swiftTypeName: "ArrayDeque", + asClass: true, + translatedClasses: [ + "java.lang.Object": SwiftTypeName(module: "SwiftJava", name: "JavaObject"), + "java.util.Queue": SwiftTypeName(module: "SwiftJava", name: "Queue"), + "java.util.ArrayDeque": SwiftTypeName(module: "JavaUtil", name: "ArrayDeque"), + ], + expectedChunks: [ + "import SwiftJava", + """ + @JavaClass("java.util.ArrayDeque", implements: Queue.self) + open class ArrayDeque: JavaObject { + """, + ] + ) + } + func testJavaInterfaceAsClassNOT() throws { try assertTranslatedClass( MyJavaIntFunction.self, From 3ca4a0da64b625b6553d7e6b033f508ca708f093 Mon Sep 17 00:00:00 2001 From: Iceman Date: Thu, 12 Mar 2026 16:22:57 +0900 Subject: [PATCH 2/3] Fix incorrect generic type parameters are passed --- Sources/SwiftJavaToolLib/JavaClassTranslator.swift | 5 ++--- Tests/SwiftJavaToolLibTests/Java2SwiftTests.swift | 4 ++-- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/Sources/SwiftJavaToolLib/JavaClassTranslator.swift b/Sources/SwiftJavaToolLib/JavaClassTranslator.swift index 72bbc471..b201823d 100644 --- a/Sources/SwiftJavaToolLib/JavaClassTranslator.swift +++ b/Sources/SwiftJavaToolLib/JavaClassTranslator.swift @@ -163,7 +163,7 @@ struct JavaClassTranslator { } javaSuperclass = javaSuperclassNonOpt.getSuperclass() - javaGenericSuperclass = javaClass.getGenericSuperclass() + javaGenericSuperclass = javaSuperclassNonOpt.getGenericSuperclass() } self.effectiveJavaSuperclass = javaSuperclass @@ -183,13 +183,12 @@ struct JavaClassTranslator { } do { - let typeName = try translator.getSwiftTypeNameAsString( + return try translator.getSwiftTypeNameAsString( javaType, preferValueTypes: false, outerOptional: .nonoptional, eraseTypeArguments: true ) - return "\(typeName)" } catch { translator.logUntranslated("Unable to translate '\(fullName)' interface '\(javaType.getTypeName())': \(error)") return nil diff --git a/Tests/SwiftJavaToolLibTests/Java2SwiftTests.swift b/Tests/SwiftJavaToolLibTests/Java2SwiftTests.swift index 0a5c14e5..cfd32556 100644 --- a/Tests/SwiftJavaToolLibTests/Java2SwiftTests.swift +++ b/Tests/SwiftJavaToolLibTests/Java2SwiftTests.swift @@ -515,13 +515,13 @@ class Java2SwiftTests: XCTestCase { asClass: true, translatedClasses: [ "java.lang.Object": SwiftTypeName(module: "SwiftJava", name: "JavaObject"), - "java.util.Queue": SwiftTypeName(module: "SwiftJava", name: "Queue"), + "java.util.Deque": SwiftTypeName(module: "SwiftJava", name: "Deque"), "java.util.ArrayDeque": SwiftTypeName(module: "JavaUtil", name: "ArrayDeque"), ], expectedChunks: [ "import SwiftJava", """ - @JavaClass("java.util.ArrayDeque", implements: Queue.self) + @JavaClass("java.util.ArrayDeque", implements: Deque.self) open class ArrayDeque: JavaObject { """, ] From 1c6c8c5a06cad1bf1eda4cb42f360e516e1c97b3 Mon Sep 17 00:00:00 2001 From: Iceman Date: Thu, 12 Mar 2026 16:44:35 +0900 Subject: [PATCH 3/3] Generate some collection classes --- .../JavaUtil/generated/ArrayDeque.swift | 318 +++++++++++++----- .../JavaUtil/generated/TreeSet.swift | 174 +++++++--- 2 files changed, 372 insertions(+), 120 deletions(-) diff --git a/Sources/JavaStdlib/JavaUtil/generated/ArrayDeque.swift b/Sources/JavaStdlib/JavaUtil/generated/ArrayDeque.swift index 1a2f0424..2381ade2 100644 --- a/Sources/JavaStdlib/JavaUtil/generated/ArrayDeque.swift +++ b/Sources/JavaStdlib/JavaUtil/generated/ArrayDeque.swift @@ -10,111 +10,273 @@ open class ArrayDeque: JavaObject { @JavaMethod @_nonoverride public convenience init(environment: JNIEnvironment? = nil) - @JavaMethod - @_nonoverride public convenience init(_ arg0: JavaCollection?, environment: JNIEnvironment? = nil) - - @JavaMethod - open func remove() -> JavaObject! - + /// Java method `remove`. + /// + /// ### Java method signature + /// ```java + /// public E java.util.ArrayDeque.remove() + /// ``` + @JavaMethod(typeErasedResult: "E!") + open func remove() -> E! + + /// Java method `remove`. + /// + /// ### Java method signature + /// ```java + /// public boolean java.util.ArrayDeque.remove(java.lang.Object) + /// ``` @JavaMethod open func remove(_ arg0: JavaObject?) -> Bool + /// Java method `size`. + /// + /// ### Java method signature + /// ```java + /// public int java.util.ArrayDeque.size() + /// ``` @JavaMethod open func size() -> Int32 + /// Java method `clone`. + /// + /// ### Java method signature + /// ```java + /// public java.util.ArrayDeque java.util.ArrayDeque.clone() + /// ``` @JavaMethod - open override func clone() -> ArrayDeque! + open override func clone() -> ArrayDeque! + /// Java method `clear`. + /// + /// ### Java method signature + /// ```java + /// public void java.util.ArrayDeque.clear() + /// ``` @JavaMethod open func clear() + /// Java method `isEmpty`. + /// + /// ### Java method signature + /// ```java + /// public boolean java.util.ArrayDeque.isEmpty() + /// ``` @JavaMethod open func isEmpty() -> Bool + /// Java method `add`. + /// + /// ### Java method signature + /// ```java + /// public boolean java.util.ArrayDeque.add(E) + /// ``` @JavaMethod - open func add(_ arg0: JavaObject?) -> Bool + open func add(_ arg0: E?) -> Bool + /// Java method `toArray`. + /// + /// ### Java method signature + /// ```java + /// public T[] java.util.ArrayDeque.toArray(T[]) + /// ``` @JavaMethod - open func toArray(_ arg0: [JavaObject?]) -> [JavaObject?] + open func toArray(_ arg0: [T?]) -> [T?] + /// Java method `toArray`. + /// + /// ### Java method signature + /// ```java + /// public java.lang.Object[] java.util.ArrayDeque.toArray() + /// ``` @JavaMethod open func toArray() -> [JavaObject?] - @JavaMethod - open func iterator() -> JavaIterator! - + /// Java method `contains`. + /// + /// ### Java method signature + /// ```java + /// public boolean java.util.ArrayDeque.contains(java.lang.Object) + /// ``` @JavaMethod open func contains(_ arg0: JavaObject?) -> Bool - @JavaMethod - open func addAll(_ arg0: JavaCollection?) -> Bool - - @JavaMethod - open func peek() -> JavaObject! - - @JavaMethod - open func getFirst() -> JavaObject! - - @JavaMethod - open func getLast() -> JavaObject! - - @JavaMethod - open func element() -> JavaObject! - - @JavaMethod - open func addFirst(_ arg0: JavaObject?) - - @JavaMethod - open func addLast(_ arg0: JavaObject?) - - @JavaMethod - open func removeFirst() -> JavaObject! - - @JavaMethod - open func removeLast() -> JavaObject! - - @JavaMethod - open func removeAll(_ arg0: JavaCollection?) -> Bool - - @JavaMethod - open func retainAll(_ arg0: JavaCollection?) -> Bool - - @JavaMethod - open func poll() -> JavaObject! - - @JavaMethod - open func push(_ arg0: JavaObject?) - - @JavaMethod - open func pop() -> JavaObject! - - @JavaMethod - open func pollFirst() -> JavaObject! - - @JavaMethod - open func pollLast() -> JavaObject! - - @JavaMethod - open func offerLast(_ arg0: JavaObject?) -> Bool - - @JavaMethod - open func peekFirst() -> JavaObject! - + /// Java method `peek`. + /// + /// ### Java method signature + /// ```java + /// public E java.util.ArrayDeque.peek() + /// ``` + @JavaMethod(typeErasedResult: "E!") + open func peek() -> E! + + /// Java method `getFirst`. + /// + /// ### Java method signature + /// ```java + /// public E java.util.ArrayDeque.getFirst() + /// ``` + @JavaMethod(typeErasedResult: "E!") + open func getFirst() -> E! + + /// Java method `getLast`. + /// + /// ### Java method signature + /// ```java + /// public E java.util.ArrayDeque.getLast() + /// ``` + @JavaMethod(typeErasedResult: "E!") + open func getLast() -> E! + + /// Java method `element`. + /// + /// ### Java method signature + /// ```java + /// public E java.util.ArrayDeque.element() + /// ``` + @JavaMethod(typeErasedResult: "E!") + open func element() -> E! + + /// Java method `addFirst`. + /// + /// ### Java method signature + /// ```java + /// public void java.util.ArrayDeque.addFirst(E) + /// ``` + @JavaMethod + open func addFirst(_ arg0: E?) + + /// Java method `addLast`. + /// + /// ### Java method signature + /// ```java + /// public void java.util.ArrayDeque.addLast(E) + /// ``` + @JavaMethod + open func addLast(_ arg0: E?) + + /// Java method `removeFirst`. + /// + /// ### Java method signature + /// ```java + /// public E java.util.ArrayDeque.removeFirst() + /// ``` + @JavaMethod(typeErasedResult: "E!") + open func removeFirst() -> E! + + /// Java method `removeLast`. + /// + /// ### Java method signature + /// ```java + /// public E java.util.ArrayDeque.removeLast() + /// ``` + @JavaMethod(typeErasedResult: "E!") + open func removeLast() -> E! + + /// Java method `poll`. + /// + /// ### Java method signature + /// ```java + /// public E java.util.ArrayDeque.poll() + /// ``` + @JavaMethod(typeErasedResult: "E!") + open func poll() -> E! + + /// Java method `offer`. + /// + /// ### Java method signature + /// ```java + /// public boolean java.util.ArrayDeque.offer(E) + /// ``` + @JavaMethod + open func offer(_ arg0: E?) -> Bool + + /// Java method `push`. + /// + /// ### Java method signature + /// ```java + /// public void java.util.ArrayDeque.push(E) + /// ``` + @JavaMethod + open func push(_ arg0: E?) + + /// Java method `pop`. + /// + /// ### Java method signature + /// ```java + /// public E java.util.ArrayDeque.pop() + /// ``` + @JavaMethod(typeErasedResult: "E!") + open func pop() -> E! + + /// Java method `pollFirst`. + /// + /// ### Java method signature + /// ```java + /// public E java.util.ArrayDeque.pollFirst() + /// ``` + @JavaMethod(typeErasedResult: "E!") + open func pollFirst() -> E! + + /// Java method `pollLast`. + /// + /// ### Java method signature + /// ```java + /// public E java.util.ArrayDeque.pollLast() + /// ``` + @JavaMethod(typeErasedResult: "E!") + open func pollLast() -> E! + + /// Java method `offerLast`. + /// + /// ### Java method signature + /// ```java + /// public boolean java.util.ArrayDeque.offerLast(E) + /// ``` + @JavaMethod + open func offerLast(_ arg0: E?) -> Bool + + /// Java method `peekFirst`. + /// + /// ### Java method signature + /// ```java + /// public E java.util.ArrayDeque.peekFirst() + /// ``` + @JavaMethod(typeErasedResult: "E!") + open func peekFirst() -> E! + + /// Java method `removeFirstOccurrence`. + /// + /// ### Java method signature + /// ```java + /// public boolean java.util.ArrayDeque.removeFirstOccurrence(java.lang.Object) + /// ``` @JavaMethod open func removeFirstOccurrence(_ arg0: JavaObject?) -> Bool - @JavaMethod - open func offerFirst(_ arg0: JavaObject?) -> Bool - - @JavaMethod - open func peekLast() -> JavaObject! - + /// Java method `offerFirst`. + /// + /// ### Java method signature + /// ```java + /// public boolean java.util.ArrayDeque.offerFirst(E) + /// ``` + @JavaMethod + open func offerFirst(_ arg0: E?) -> Bool + + /// Java method `peekLast`. + /// + /// ### Java method signature + /// ```java + /// public E java.util.ArrayDeque.peekLast() + /// ``` + @JavaMethod(typeErasedResult: "E!") + open func peekLast() -> E! + + /// Java method `removeLastOccurrence`. + /// + /// ### Java method signature + /// ```java + /// public boolean java.util.ArrayDeque.removeLastOccurrence(java.lang.Object) + /// ``` @JavaMethod open func removeLastOccurrence(_ arg0: JavaObject?) -> Bool - - @JavaMethod - open func offer(_ arg0: JavaObject?) -> Bool - - @JavaMethod - open func descendingIterator() -> JavaIterator! } diff --git a/Sources/JavaStdlib/JavaUtil/generated/TreeSet.swift b/Sources/JavaStdlib/JavaUtil/generated/TreeSet.swift index 1ce1a686..5f0eb7a2 100644 --- a/Sources/JavaStdlib/JavaUtil/generated/TreeSet.swift +++ b/Sources/JavaStdlib/JavaUtil/generated/TreeSet.swift @@ -4,69 +4,159 @@ import SwiftJavaJNICore @JavaClass("java.util.TreeSet") open class TreeSet: JavaObject { - @JavaMethod - @_nonoverride public convenience init(_ arg0: JavaCollection?, environment: JNIEnvironment? = nil) - @JavaMethod @_nonoverride public convenience init(environment: JNIEnvironment? = nil) + /// Java method `remove`. + /// + /// ### Java method signature + /// ```java + /// public boolean java.util.TreeSet.remove(java.lang.Object) + /// ``` @JavaMethod open func remove(_ arg0: JavaObject?) -> Bool + /// Java method `size`. + /// + /// ### Java method signature + /// ```java + /// public int java.util.TreeSet.size() + /// ``` @JavaMethod open func size() -> Int32 + /// Java method `clone`. + /// + /// ### Java method signature + /// ```java + /// public java.lang.Object java.util.TreeSet.clone() + /// ``` @JavaMethod open override func clone() -> JavaObject! - @JavaMethod - open func floor(_ arg0: JavaObject?) -> JavaObject! - + /// Java method `floor`. + /// + /// ### Java method signature + /// ```java + /// public E java.util.TreeSet.floor(E) + /// ``` + @JavaMethod(typeErasedResult: "E!") + open func floor(_ arg0: E?) -> E! + + /// Java method `clear`. + /// + /// ### Java method signature + /// ```java + /// public void java.util.TreeSet.clear() + /// ``` @JavaMethod open func clear() + /// Java method `isEmpty`. + /// + /// ### Java method signature + /// ```java + /// public boolean java.util.TreeSet.isEmpty() + /// ``` @JavaMethod open func isEmpty() -> Bool + /// Java method `add`. + /// + /// ### Java method signature + /// ```java + /// public boolean java.util.TreeSet.add(E) + /// ``` @JavaMethod - open func add(_ arg0: JavaObject?) -> Bool - - @JavaMethod - open func iterator() -> JavaIterator! + open func add(_ arg0: E?) -> Bool + /// Java method `contains`. + /// + /// ### Java method signature + /// ```java + /// public boolean java.util.TreeSet.contains(java.lang.Object) + /// ``` @JavaMethod open func contains(_ arg0: JavaObject?) -> Bool - @JavaMethod - open func last() -> JavaObject! - - @JavaMethod - open func addAll(_ arg0: JavaCollection?) -> Bool - - @JavaMethod - open func first() -> JavaObject! - - @JavaMethod - open func addFirst(_ arg0: JavaObject?) - - @JavaMethod - open func addLast(_ arg0: JavaObject?) - - @JavaMethod - open func lower(_ arg0: JavaObject?) -> JavaObject! - - @JavaMethod - open func pollFirst() -> JavaObject! - - @JavaMethod - open func pollLast() -> JavaObject! - - @JavaMethod - open func descendingIterator() -> JavaIterator! - - @JavaMethod - open func ceiling(_ arg0: JavaObject?) -> JavaObject! - - @JavaMethod - open func higher(_ arg0: JavaObject?) -> JavaObject! + /// Java method `last`. + /// + /// ### Java method signature + /// ```java + /// public E java.util.TreeSet.last() + /// ``` + @JavaMethod(typeErasedResult: "E!") + open func last() -> E! + + /// Java method `first`. + /// + /// ### Java method signature + /// ```java + /// public E java.util.TreeSet.first() + /// ``` + @JavaMethod(typeErasedResult: "E!") + open func first() -> E! + + /// Java method `addFirst`. + /// + /// ### Java method signature + /// ```java + /// public void java.util.TreeSet.addFirst(E) + /// ``` + @JavaMethod + open func addFirst(_ arg0: E?) + + /// Java method `addLast`. + /// + /// ### Java method signature + /// ```java + /// public void java.util.TreeSet.addLast(E) + /// ``` + @JavaMethod + open func addLast(_ arg0: E?) + + /// Java method `lower`. + /// + /// ### Java method signature + /// ```java + /// public E java.util.TreeSet.lower(E) + /// ``` + @JavaMethod(typeErasedResult: "E!") + open func lower(_ arg0: E?) -> E! + + /// Java method `pollFirst`. + /// + /// ### Java method signature + /// ```java + /// public E java.util.TreeSet.pollFirst() + /// ``` + @JavaMethod(typeErasedResult: "E!") + open func pollFirst() -> E! + + /// Java method `pollLast`. + /// + /// ### Java method signature + /// ```java + /// public E java.util.TreeSet.pollLast() + /// ``` + @JavaMethod(typeErasedResult: "E!") + open func pollLast() -> E! + + /// Java method `ceiling`. + /// + /// ### Java method signature + /// ```java + /// public E java.util.TreeSet.ceiling(E) + /// ``` + @JavaMethod(typeErasedResult: "E!") + open func ceiling(_ arg0: E?) -> E! + + /// Java method `higher`. + /// + /// ### Java method signature + /// ```java + /// public E java.util.TreeSet.higher(E) + /// ``` + @JavaMethod(typeErasedResult: "E!") + open func higher(_ arg0: E?) -> E! }