From 986fe1d5f7a1777ffdb3d4e50c1d4d7bec75260a Mon Sep 17 00:00:00 2001 From: Iceman Date: Tue, 19 May 2026 12:32:17 +0900 Subject: [PATCH 1/2] FFM translated parameter has only one parameter --- ...t2JavaGenerator+JavaBindingsPrinting.swift | 15 ++-- ...MSwift2JavaGenerator+JavaTranslation.swift | 85 ++++++------------- .../JExtractSwiftTests/DataImportTests.swift | 2 +- .../OptionalImportTests.swift | 2 +- 4 files changed, 35 insertions(+), 69 deletions(-) diff --git a/Sources/JExtractSwiftLib/FFM/FFMSwift2JavaGenerator+JavaBindingsPrinting.swift b/Sources/JExtractSwiftLib/FFM/FFMSwift2JavaGenerator+JavaBindingsPrinting.swift index afd32d7f..1357a249 100644 --- a/Sources/JExtractSwiftLib/FFM/FFMSwift2JavaGenerator+JavaBindingsPrinting.swift +++ b/Sources/JExtractSwiftLib/FFM/FFMSwift2JavaGenerator+JavaBindingsPrinting.swift @@ -310,8 +310,8 @@ extension FFMSwift2JavaGenerator { ) } else { // Otherwise, the lambda must be wrapped with the lowered function instance. - let apiParams = functionType.parameters.flatMap { - $0.javaParameters.map { param in "\(param.type) \(param.name)" } + let apiParams = functionType.parameters.map { + "\($0.parameter.type) \($0.parameter.name)" } printer.print( @@ -338,7 +338,7 @@ extension FFMSwift2JavaGenerator { printer.indent() var convertedArgs: [String] = [] for param in functionType.parameters { - let arg = param.conversion.render(&printer, param.javaParameters[0].name) + let arg = param.conversion.render(&printer, param.parameter.name) convertedArgs.append(arg) } @@ -379,8 +379,7 @@ extension FFMSwift2JavaGenerator { if !annotationsStr.isEmpty { annotationsStr += "\n" } var paramDecls = translatedSignature.parameters - .flatMap(\.javaParameters) - .map { $0.renderParameter() } + .map { $0.parameter.renderParameter() } if translatedSignature.requiresSwiftArena { paramDecls.append("AllocatingSwiftArena swiftArena") } @@ -435,10 +434,8 @@ extension FFMSwift2JavaGenerator { var downCallArguments: [String] = [] // Regular parameters. - for (i, parameter) in translatedSignature.parameters.enumerated() { - let original = decl.functionSignature.parameters[i] - let parameterName = original.parameterName ?? "_\(i)" - let lowered = parameter.conversion.render(&printer, parameterName) + for parameter in translatedSignature.parameters { + let lowered = parameter.conversion.render(&printer, parameter.parameter.name) downCallArguments.append(lowered) } diff --git a/Sources/JExtractSwiftLib/FFM/FFMSwift2JavaGenerator+JavaTranslation.swift b/Sources/JExtractSwiftLib/FFM/FFMSwift2JavaGenerator+JavaTranslation.swift index 2686366e..98d15577 100644 --- a/Sources/JExtractSwiftLib/FFM/FFMSwift2JavaGenerator+JavaTranslation.swift +++ b/Sources/JExtractSwiftLib/FFM/FFMSwift2JavaGenerator+JavaTranslation.swift @@ -43,9 +43,7 @@ extension FFMSwift2JavaGenerator { /// Represent a Swift API parameter translated to Java. struct TranslatedParameter { /// Java parameter(s) mapped to the Swift parameter. - /// - /// Array because one Swift parameter can be mapped to multiple parameters. - var javaParameters: [JavaParameter] + var parameter: JavaParameter /// Describes how to convert the Java parameter to the lowered arguments for /// the foreign function. @@ -255,9 +253,7 @@ extension FFMSwift2JavaGenerator { ) throws -> TranslatedParameter { if let cType = try? CType(cdeclType: type) { return TranslatedParameter( - javaParameters: [ - JavaParameter(name: parameterName, type: cType.javaType) - ], + parameter: JavaParameter(name: parameterName, type: cType.javaType), conversion: .placeholder ) } @@ -268,9 +264,7 @@ extension FFMSwift2JavaGenerator { switch knownType { case .unsafeRawBufferPointer, .unsafeMutableRawBufferPointer: return TranslatedParameter( - javaParameters: [ - JavaParameter(name: parameterName, type: .javaForeignMemorySegment) - ], + parameter: JavaParameter(name: parameterName, type: .javaForeignMemorySegment), conversion: .method( .explodedName(component: "pointer"), methodName: "reinterpret", @@ -373,13 +367,11 @@ extension FFMSwift2JavaGenerator { overflowCheck = .none } return TranslatedParameter( - javaParameters: [ - JavaParameter( - name: parameterName, - type: javaType, - annotations: parameterAnnotations - ) - ], + parameter: JavaParameter( + name: parameterName, + type: javaType, + annotations: parameterAnnotations + ), conversion: .placeholder, needs32BitIntOverflowCheck: overflowCheck ) @@ -389,13 +381,11 @@ extension FFMSwift2JavaGenerator { case .metatype: // Metatype are expressed as 'org.swift.swiftkit.SwiftAnyType' return TranslatedParameter( - javaParameters: [ - JavaParameter( - name: parameterName, - type: JavaType.class(package: "org.swift.swiftkit.ffm", name: "SwiftAnyType"), - annotations: parameterAnnotations - ) - ], + parameter: JavaParameter( + name: parameterName, + type: JavaType.class(package: "org.swift.swiftkit.ffm", name: "SwiftAnyType"), + annotations: parameterAnnotations + ), conversion: .swiftValueSelfSegment(.placeholder) ) @@ -415,9 +405,7 @@ extension FFMSwift2JavaGenerator { case .unsafeRawBufferPointer, .unsafeMutableRawBufferPointer: return TranslatedParameter( - javaParameters: [ - JavaParameter(name: parameterName, type: .javaForeignMemorySegment) - ], + parameter: JavaParameter(name: parameterName, type: .javaForeignMemorySegment), conversion: .commaSeparated([ .placeholder, .method(.placeholder, methodName: "byteSize", arguments: [], withArena: false), @@ -437,20 +425,16 @@ extension FFMSwift2JavaGenerator { case .string: return TranslatedParameter( - javaParameters: [ - JavaParameter( + parameter: JavaParameter( name: parameterName, type: .javaLangString - ) - ], + ), conversion: .call(.placeholder, function: "SwiftStrings.toCString", withArena: true) ) case .array(let element) where element == knownTypes.uint8: return TranslatedParameter( - javaParameters: [ - JavaParameter(name: parameterName, type: .array(.byte), annotations: parameterAnnotations) - ], + parameter: JavaParameter(name: parameterName, type: .array(.byte), annotations: parameterAnnotations), conversion: .commaSeparated([ .call( @@ -481,24 +465,20 @@ extension FFMSwift2JavaGenerator { } return TranslatedParameter( - javaParameters: [ - JavaParameter( + parameter: JavaParameter( name: parameterName, type: try translate(swiftType: swiftType) - ) - ], + ), conversion: .swiftValueSelfSegment(.placeholder) ) case .tuple([]): return TranslatedParameter( - javaParameters: [ - JavaParameter( + parameter: JavaParameter( name: parameterName, type: .void, annotations: parameterAnnotations - ) - ], + ), conversion: .placeholder ) @@ -514,12 +494,10 @@ extension FFMSwift2JavaGenerator { case .function: return TranslatedParameter( - javaParameters: [ - JavaParameter( + parameter: JavaParameter( name: parameterName, type: JavaType.class(package: nil, name: "\(methodName).\(parameterName)") - ) - ], + ), conversion: .call(.placeholder, function: "\(methodName).$toUpcallStub", withArena: true) ) @@ -578,22 +556,17 @@ extension FFMSwift2JavaGenerator { genericParameters: genericParameters, genericRequirements: genericRequirements ) - guard elementTranslated.javaParameters.count == 1 else { - throw JavaTranslationError.unhandledType(element.type) - } let extraction = JavaConversionStep.replacingPlaceholder( elementTranslated.conversion, placeholder: "\(parameterName).$\(idx)" ) elementConversions.append(extraction) - elementJavaTypes.append(elementTranslated.javaParameters[0].type.javaType) + elementJavaTypes.append(elementTranslated.parameter.type.javaType) } let javaType: JavaType = .tuple(elementTypes: elementJavaTypes) return TranslatedParameter( - javaParameters: [ - JavaParameter(name: parameterName, type: javaType) - ], + parameter: JavaParameter(name: parameterName, type: javaType), conversion: .commaSeparated(elementConversions) ) } @@ -624,9 +597,7 @@ extension FFMSwift2JavaGenerator { default: throw JavaTranslationError.unhandledType(known: .optional(swiftType)) } return TranslatedParameter( - javaParameters: [ - JavaParameter(name: parameterName, type: JavaType(className: translatedClass)) - ], + parameter: JavaParameter(name: parameterName, type: JavaType(className: translatedClass)), conversion: .call(.placeholder, function: "SwiftRuntime.\(lowerFunc)", withArena: true) ) } @@ -646,9 +617,7 @@ extension FFMSwift2JavaGenerator { let translatedTy = try self.translate(swiftType: swiftType) return TranslatedParameter( - javaParameters: [ - JavaParameter(name: parameterName, type: JavaType(className: "Optional<\(translatedTy.description)>")) - ], + parameter: JavaParameter(name: parameterName, type: .optional(translatedTy)), conversion: .call(.placeholder, function: "SwiftRuntime.toOptionalSegmentInstance", withArena: false) ) case .existential, .opaque, .genericParameter: diff --git a/Tests/JExtractSwiftTests/DataImportTests.swift b/Tests/JExtractSwiftTests/DataImportTests.swift index ad1e46c9..a1ad0774 100644 --- a/Tests/JExtractSwiftTests/DataImportTests.swift +++ b/Tests/JExtractSwiftTests/DataImportTests.swift @@ -471,7 +471,7 @@ final class DataImportTests { * public func receiveDataProtocol(dat: some DataProtocol, dat2: T?) * } */ - public static void receiveDataProtocol(Data dat, Optional dat2) { + public static void receiveDataProtocol(Data dat, java.util.Optional dat2) { swiftjava_SwiftModule_receiveDataProtocol_dat_dat2.call(dat.$memorySegment(), SwiftRuntime.toOptionalSegmentInstance(dat2)); } """, diff --git a/Tests/JExtractSwiftTests/OptionalImportTests.swift b/Tests/JExtractSwiftTests/OptionalImportTests.swift index 7ef9b10a..5752e548 100644 --- a/Tests/JExtractSwiftTests/OptionalImportTests.swift +++ b/Tests/JExtractSwiftTests/OptionalImportTests.swift @@ -147,7 +147,7 @@ final class OptionalImportTests { * public func receiveOptionalDataProto(_ arg: (some DataProtocol)?) * } */ - public static void receiveOptionalDataProto(Optional arg) { + public static void receiveOptionalDataProto(java.util.Optional arg) { swiftjava_SwiftModule_receiveOptionalDataProto__.call(SwiftRuntime.toOptionalSegmentInstance(arg)); } """, From 20088e5ff305d6c6ba909cb5530248842569eec8 Mon Sep 17 00:00:00 2001 From: Iceman Date: Tue, 19 May 2026 12:45:45 +0900 Subject: [PATCH 2/2] format --- ...MSwift2JavaGenerator+JavaTranslation.swift | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/Sources/JExtractSwiftLib/FFM/FFMSwift2JavaGenerator+JavaTranslation.swift b/Sources/JExtractSwiftLib/FFM/FFMSwift2JavaGenerator+JavaTranslation.swift index 98d15577..bfcc02ef 100644 --- a/Sources/JExtractSwiftLib/FFM/FFMSwift2JavaGenerator+JavaTranslation.swift +++ b/Sources/JExtractSwiftLib/FFM/FFMSwift2JavaGenerator+JavaTranslation.swift @@ -42,7 +42,7 @@ extension FFMSwift2JavaGenerator { /// Represent a Swift API parameter translated to Java. struct TranslatedParameter { - /// Java parameter(s) mapped to the Swift parameter. + /// Java parameter mapped to the Swift parameter. var parameter: JavaParameter /// Describes how to convert the Java parameter to the lowered arguments for @@ -426,9 +426,9 @@ extension FFMSwift2JavaGenerator { case .string: return TranslatedParameter( parameter: JavaParameter( - name: parameterName, - type: .javaLangString - ), + name: parameterName, + type: .javaLangString + ), conversion: .call(.placeholder, function: "SwiftStrings.toCString", withArena: true) ) @@ -466,19 +466,19 @@ extension FFMSwift2JavaGenerator { return TranslatedParameter( parameter: JavaParameter( - name: parameterName, - type: try translate(swiftType: swiftType) - ), + name: parameterName, + type: try translate(swiftType: swiftType) + ), conversion: .swiftValueSelfSegment(.placeholder) ) case .tuple([]): return TranslatedParameter( parameter: JavaParameter( - name: parameterName, - type: .void, - annotations: parameterAnnotations - ), + name: parameterName, + type: .void, + annotations: parameterAnnotations + ), conversion: .placeholder ) @@ -495,9 +495,9 @@ extension FFMSwift2JavaGenerator { case .function: return TranslatedParameter( parameter: JavaParameter( - name: parameterName, - type: JavaType.class(package: nil, name: "\(methodName).\(parameterName)") - ), + name: parameterName, + type: JavaType.class(package: nil, name: "\(methodName).\(parameterName)") + ), conversion: .call(.placeholder, function: "\(methodName).$toUpcallStub", withArena: true) )