diff --git a/Sources/SwiftJavaToolLib/JavaClassTranslator.swift b/Sources/SwiftJavaToolLib/JavaClassTranslator.swift index 36d311dc..ea0a793a 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 636ef8dc..60d5a331 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! + """, + ] + ) + } }