swiftlang / swiftlang/swift-java

Compilation error for class with sync/async function overloads: method is already defined

Open
#906 1 comment 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
Swift
Stars
1.2k
Forks
123
Avg merge
1d 7h
Merged PRs (30d)
16

Description

Commit hash: a736a64e18a85f55f267427a3c9de60ae8377b7a

Context:
While testing swiftly's support of existing Swift code, noticed that a code using a function that is overloaded with both sync and async variants is not compiling, failing with "method is already defined" error.

import Foundation

public class Test {
    public func remove(key: String) { /* sync */ }
    public func remove(key: String) async { }
}

Results in the following compilation error:

.../.build/plugins/outputs/lib/SwiftTestLib/destination/JExtractSwiftPlugin/src/generated/java/com/example/swiftexamplelib/Test.java:93: error: method removeKey(String) is already defined in class Test
    public java.util.concurrent.CompletableFuture<java.lang.Void> removeKey(java.lang.String key) {

Portion of the generated Java file:

  // ==== --------------------------------------------------
  // Test.remove
  
  /**
   * Downcall to Swift:
   * {@snippet lang=swift :
   * public func remove(key: String)
   * }
   */
  public void removeKey(java.lang.String key) {
    Test.$removeKey(key, this.$memoryAddress());
  } // printJavaBindingWrapperMethod(_:_:importedFunc:skipMethodBody:) @ JExtractSwiftLib/JNISwift2JavaGenerator+JavaBindingsPrinting.swift:950
  private static native void $removeKey(java.lang.String key, long selfPointer);
  
  
  // ==== --------------------------------------------------
  // Test.remove
  
  /**
   * Downcall to Swift:
   * {@snippet lang=swift :
   * public func remove(key: String) async
   * }
   */
  public java.util.concurrent.CompletableFuture<java.lang.Void> removeKey(java.lang.String key) {
    java.util.concurrent.CompletableFuture<java.lang.Void> future$ = new java.util.concurrent.CompletableFuture<java.lang.Void>();
    Test.$removeKey(key, this.$memoryAddress(), future$);
    return future$.thenApply((futureResult$) -> {
      return futureResult$;
    } // render(_:_:) @ JExtractSwiftLib/JNISwift2JavaGenerator+JavaTranslation.swift:2072
    );
  } // printJavaBindingWrapperMethod(_:_:importedFunc:skipMethodBody:) @ JExtractSwiftLib/JNISwift2JavaGenerator+JavaBindingsPrinting.swift:950
  private static native void $removeKey(java.lang.String key, long selfPointer, java.util.concurrent.CompletableFuture<java.lang.Void> result_future);

Environment: Swift 6.3.3 on macOS.

$ swiftly run swift --version
Apple Swift version 6.3.3 (swift-6.3.3-RELEASE)
Target: arm64-apple-macosx26.0

$ uname -a
Darwin it-C01241 25.6.0 Darwin Kernel Version 25.6.0: Fri Jul 31 19:18:49 PDT 2026; root:xnu-12377.161.14~5/RELEASE_ARM64_T6000 arm64

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with JNISwift2JavaGenerator+JavaBindingsPrinting.swift at printJavaBindingWrapperMethod and JavaTranslation.swift at render, then reproduce the reported sync/async remove overload example. Trace how both Swift methods become Java methods and ensure the generated class compiles without the duplicate method error while retaining both bindings.

Written by the indexing model from the issue text.

Assessment

Tech stack
java, swift
Domain
tooling
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Active
Clarity
Mostly clear
Newbie friendliness
68/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.