From 1003890947a7c20470d1045afb73de913686cd2a Mon Sep 17 00:00:00 2001 From: Konrad Malawski Date: Fri, 16 Jan 2026 14:38:09 +0900 Subject: [PATCH] wrap-java: account for generic use inside parameterized types in parameters We would accidentally drop the genric because we'd not detect it was used in a generic type in the parameters to a function. This corrects this situation --- .../JavaClassTranslator.swift | 10 ++++++ .../WrapJavaTests/GenericsWrapJavaTests.swift | 35 +++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/Sources/SwiftJavaToolLib/JavaClassTranslator.swift b/Sources/SwiftJavaToolLib/JavaClassTranslator.swift index 36d311dc7..ea0a793ac 100644 --- a/Sources/SwiftJavaToolLib/JavaClassTranslator.swift +++ b/Sources/SwiftJavaToolLib/JavaClassTranslator.swift @@ -616,6 +616,16 @@ extension JavaClassTranslator { if parameterizedType.isEqualTo(typeParam.as(Type.self)) { return true } + + // Also check if the type param is used as a type argument inside a parameterized parameter type + if let parameterizedParamType = parameterizedType.as(ParameterizedType.self) { + for actualTypeParam in parameterizedParamType.getActualTypeArguments() { + guard let actualTypeParam else { continue } + if actualTypeParam.isEqualTo(typeParam.as(Type.self)) { + return true + } + } + } } } diff --git a/Tests/SwiftJavaToolLibTests/WrapJavaTests/GenericsWrapJavaTests.swift b/Tests/SwiftJavaToolLibTests/WrapJavaTests/GenericsWrapJavaTests.swift index 636ef8dc3..60d5a3319 100644 --- a/Tests/SwiftJavaToolLibTests/WrapJavaTests/GenericsWrapJavaTests.swift +++ b/Tests/SwiftJavaToolLibTests/WrapJavaTests/GenericsWrapJavaTests.swift @@ -408,5 +408,40 @@ final class GenericsWrapJavaTests: XCTestCase { ] ) } + + + func testWrapJavaGenericMethod_parameterizedParameterType() async throws { + let classpathURL = try await compileJava( + """ + package com.example; + + class Resolver { } + class Serializer { } + + class Store { + public Store + bootstrapStore( + String name, + Resolver resolver, + Serializer serializer + ) { return null; } + } + """) + + try assertWrapJavaOutput( + javaClassNames: [ + "com.example.Resolver", + "com.example.Serializer", + "com.example.Store" + ], + classpath: [classpathURL], + expectedChunks: [ + """ + @JavaMethod + open func bootstrapStore(_ arg0: String, _ arg1: Resolver?, _ arg2: Serializer?) -> Store! + """, + ] + ) + } }