From 433ae800c6ac8ae1e17929b446ced62ba2e053e1 Mon Sep 17 00:00:00 2001 From: clemo97 Date: Mon, 26 Jan 2026 19:43:23 +0300 Subject: [PATCH] Append parameter labels to Java method names for overload disambiguation --- .../com/example/swift/HelloJava2Swift.java | 28 +++++++++---------- ...MSwift2JavaGenerator+JavaTranslation.swift | 15 +++++++++- 2 files changed, 28 insertions(+), 15 deletions(-) diff --git a/Samples/SwiftJavaExtractFFMSampleApp/src/main/java/com/example/swift/HelloJava2Swift.java b/Samples/SwiftJavaExtractFFMSampleApp/src/main/java/com/example/swift/HelloJava2Swift.java index a13125478..9bcecb3ff 100644 --- a/Samples/SwiftJavaExtractFFMSampleApp/src/main/java/com/example/swift/HelloJava2Swift.java +++ b/Samples/SwiftJavaExtractFFMSampleApp/src/main/java/com/example/swift/HelloJava2Swift.java @@ -40,13 +40,13 @@ public static void main(String[] args) { static void examples() { MySwiftLibrary.helloWorld(); - MySwiftLibrary.globalTakeInt(1337); + MySwiftLibrary.globalTakeInt_i(1337); - long cnt = MySwiftLibrary.globalWriteString("String from Java"); + long cnt = MySwiftLibrary.globalWriteString_string("String from Java"); CallTraces.trace("count = " + cnt); - MySwiftLibrary.globalCallMeRunnable(() -> { + MySwiftLibrary.globalCallMeRunnable_run(() -> { CallTraces.trace("running runnable"); }); @@ -55,7 +55,7 @@ static void examples() { // Example of using an arena; MyClass.deinit is run at end of scope try (var arena = AllocatingSwiftArena.ofConfined()) { - MySwiftClass obj = MySwiftClass.init(2222, 7777, arena); + MySwiftClass obj = MySwiftClass.init_len_cap(2222, 7777, arena); // just checking retains/releases work CallTraces.trace("retainCount = " + SwiftRuntime.retainCount(obj)); @@ -68,14 +68,14 @@ static void examples() { CallTraces.trace("obj.counter = " + obj.getCounter()); obj.voidMethod(); - obj.takeIntMethod(42); + obj.takeIntMethod_i(42); - MySwiftClass otherObj = MySwiftClass.factory(12, 42, arena); + MySwiftClass otherObj = MySwiftClass.factory_len_cap(12, 42, arena); otherObj.voidMethod(); - MySwiftStruct swiftValue = MySwiftStruct.init(2222, 1111, arena); + MySwiftStruct swiftValue = MySwiftStruct.init_cap_len(2222, 1111, arena); CallTraces.trace("swiftValue.capacity = " + swiftValue.getCapacity()); - swiftValue.withCapLen((cap, len) -> { + swiftValue.withCapLen__((cap, len) -> { CallTraces.trace("withCapLenCallback: cap=" + cap + ", len=" + len); }); } @@ -83,11 +83,11 @@ static void examples() { // Example of using 'Data'. try (var arena = AllocatingSwiftArena.ofConfined()) { var origBytes = arena.allocateFrom("foobar"); - var origDat = Data.init(origBytes, origBytes.byteSize(), arena); + var origDat = Data.init_bytes_count(origBytes, origBytes.byteSize(), arena); CallTraces.trace("origDat.count = " + origDat.getCount()); - var retDat = MySwiftLibrary.globalReceiveReturnData(origDat, arena); - retDat.withUnsafeBytes((retBytes) -> { + var retDat = MySwiftLibrary.globalReceiveReturnData_data(origDat, arena); + retDat.withUnsafeBytes__((retBytes) -> { var str = retBytes.getString(0); CallTraces.trace("retStr=" + str); }); @@ -95,9 +95,9 @@ static void examples() { try (var arena = AllocatingSwiftArena.ofConfined()) { var bytes = arena.allocateFrom("hello"); - var dat = Data.init(bytes, bytes.byteSize(), arena); - MySwiftLibrary.globalReceiveSomeDataProtocol(dat); - MySwiftLibrary.globalReceiveOptional(OptionalLong.of(12), Optional.of(dat)); + var dat = Data.init_bytes_count(bytes, bytes.byteSize(), arena); + MySwiftLibrary.globalReceiveSomeDataProtocol_data(dat); + MySwiftLibrary.globalReceiveOptional_o1_o2(OptionalLong.of(12), Optional.of(dat)); } diff --git a/Sources/JExtractSwiftLib/FFM/FFMSwift2JavaGenerator+JavaTranslation.swift b/Sources/JExtractSwiftLib/FFM/FFMSwift2JavaGenerator+JavaTranslation.swift index da1914d45..8eaef5f8a 100644 --- a/Sources/JExtractSwiftLib/FFM/FFMSwift2JavaGenerator+JavaTranslation.swift +++ b/Sources/JExtractSwiftLib/FFM/FFMSwift2JavaGenerator+JavaTranslation.swift @@ -156,11 +156,24 @@ extension FFMSwift2JavaGenerator { let loweredSignature = try lowering.lowerFunctionSignature(decl.functionSignature) // Name. - let javaName = switch decl.apiKind { + let baseName = switch decl.apiKind { case .getter, .subscriptGetter: decl.javaGetterName case .setter, .subscriptSetter: decl.javaSetterName case .function, .initializer, .enumCase: decl.name } + + // Add parameter labels to make method names unique (for overloading support) + let suffix: String + switch decl.apiKind { + case .getter, .subscriptGetter, .setter, .subscriptSetter: + suffix = "" + default: + suffix = decl.functionSignature.parameters + .map { "_" + ($0.argumentLabel ?? "_") } + .joined() + } + + let javaName = baseName + suffix // Signature. let translatedSignature = try translate(loweredFunctionSignature: loweredSignature, methodName: javaName)