From aa1f0bde24b67e0e5afd0cb46f844b92ad7b15cc Mon Sep 17 00:00:00 2001 From: Mads Odgaard Date: Fri, 27 Feb 2026 20:39:00 +0100 Subject: [PATCH 1/2] add AndroidCoreLibraryDesugaring trait --- Package.swift | 3 +++ Sources/SwiftJava/AndroidSupport.swift | 7 ++----- Sources/SwiftJavaMacros/JavaClassMacro.swift | 2 +- Tests/SwiftJavaMacrosTests/JavaClassMacroTests.swift | 10 +++++----- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Package.swift b/Package.swift index 9c1808ae..e3a5b37b 100644 --- a/Package.swift +++ b/Package.swift @@ -260,6 +260,9 @@ let package = Package( ), ], + traits: [ + .trait(name: "AndroidCoreLibraryDesugaring") + ], dependencies: [ .package(url: "https://github.com/swiftlang/swift-syntax", from: "602.0.0"), .package(url: "https://github.com/apple/swift-argument-parser", from: "1.5.0"), diff --git a/Sources/SwiftJava/AndroidSupport.swift b/Sources/SwiftJava/AndroidSupport.swift index ab87025e..a2293341 100644 --- a/Sources/SwiftJava/AndroidSupport.swift +++ b/Sources/SwiftJava/AndroidSupport.swift @@ -18,13 +18,10 @@ public enum AndroidSupport { public static func androidDesugarClassNameConversion( for fullClassName: String ) -> String { - #if os(Android) && compiler(>=6.3) + #if os(Android) && AndroidCoreLibraryDesugaring switch fullClassName { case "java.util.Optional": - // On API 23, Optionals are desugared - if #unavailable(Android 24) { - return "j$.util.Optional" - } + return "j$.util.Optional" default: break diff --git a/Sources/SwiftJavaMacros/JavaClassMacro.swift b/Sources/SwiftJavaMacros/JavaClassMacro.swift index d18eb7a1..6797f61d 100644 --- a/Sources/SwiftJavaMacros/JavaClassMacro.swift +++ b/Sources/SwiftJavaMacros/JavaClassMacro.swift @@ -96,7 +96,7 @@ extension JavaClassMacro: MemberMacro { """ /// The full Java class name for this Swift type. \(raw: classNameAccessSpecifier) \(raw: fullJavaClassNameMemberModifiers) var fullJavaClassName: String { - #if os(Android) + #if os(Android) && AndroidCoreLibraryDesugaring AndroidSupport.androidDesugarClassNameConversion(for: "\(raw: className)") #else "\(raw: className)" diff --git a/Tests/SwiftJavaMacrosTests/JavaClassMacroTests.swift b/Tests/SwiftJavaMacrosTests/JavaClassMacroTests.swift index fdd6ff79..d79b6bd4 100644 --- a/Tests/SwiftJavaMacrosTests/JavaClassMacroTests.swift +++ b/Tests/SwiftJavaMacrosTests/JavaClassMacroTests.swift @@ -43,7 +43,7 @@ class JavaKitMacroTests: XCTestCase { /// The full Java class name for this Swift type. open override class var fullJavaClassName: String { - #if os(Android) + #if os(Android) && AndroidCoreLibraryDesugaring AndroidSupport.androidDesugarClassNameConversion(for: "org.swift.example.HelloWorld") #else "org.swift.example.HelloWorld" @@ -169,7 +169,7 @@ class JavaKitMacroTests: XCTestCase { /// The full Java class name for this Swift type. public static var fullJavaClassName: String { - #if os(Android) + #if os(Android) && AndroidCoreLibraryDesugaring AndroidSupport.androidDesugarClassNameConversion(for: "org.swift.example.HelloWorld") #else "org.swift.example.HelloWorld" @@ -278,7 +278,7 @@ class JavaKitMacroTests: XCTestCase { /// The full Java class name for this Swift type. open override class var fullJavaClassName: String { - #if os(Android) + #if os(Android) && AndroidCoreLibraryDesugaring AndroidSupport.androidDesugarClassNameConversion(for: "org.swift.example.HelloWorld") #else "org.swift.example.HelloWorld" @@ -336,7 +336,7 @@ class JavaKitMacroTests: XCTestCase { /// The full Java class name for this Swift type. open class var fullJavaClassName: String { - #if os(Android) + #if os(Android) && AndroidCoreLibraryDesugaring AndroidSupport.androidDesugarClassNameConversion(for: "java.lang.Object") #else "java.lang.Object" @@ -390,7 +390,7 @@ class JavaKitMacroTests: XCTestCase { /// The full Java class name for this Swift type. open override class var fullJavaClassName: String { - #if os(Android) + #if os(Android) && AndroidCoreLibraryDesugaring AndroidSupport.androidDesugarClassNameConversion(for: "java.lang.Optional") #else "java.lang.Optional" From 7ef5929f21a69f3de917a3c5f939405be82a7b14 Mon Sep 17 00:00:00 2001 From: Mads Odgaard Date: Sat, 28 Feb 2026 09:56:20 +0100 Subject: [PATCH 2/2] add docs --- .../Documentation.docc/Android.md | 24 +++++++++++++++++++ .../Documentation.docc/SwiftPMPlugin.md | 4 ++-- .../Documentation.docc/index.md | 3 +++ 3 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 Sources/SwiftJavaDocumentation/Documentation.docc/Android.md diff --git a/Sources/SwiftJavaDocumentation/Documentation.docc/Android.md b/Sources/SwiftJavaDocumentation/Documentation.docc/Android.md new file mode 100644 index 00000000..537566b2 --- /dev/null +++ b/Sources/SwiftJavaDocumentation/Documentation.docc/Android.md @@ -0,0 +1,24 @@ +# Android + +## Android Core Library Desugaring + +If you are using [Core Library Desugaring](https://developer.android.com/studio/write/java8-support) in your +Android project, you must enable the `AndroidCoreLibraryDesugaring` trait to ensure that the SwiftJava wrappers +use the desugared class names: + +```swift +let package = Package( + name: "MyProject", + products: [ + // ... + ], + dependencies: [ + .package(url: "https://github.com/swiftlang/swift-java", from: "...", traits: ["AndroidCoreLibraryDesugaring"]), + ], + + targets: [ + // ... + ] +) +``` +``` diff --git a/Sources/SwiftJavaDocumentation/Documentation.docc/SwiftPMPlugin.md b/Sources/SwiftJavaDocumentation/Documentation.docc/SwiftPMPlugin.md index d10ab387..9750ba92 100644 --- a/Sources/SwiftJavaDocumentation/Documentation.docc/SwiftPMPlugin.md +++ b/Sources/SwiftJavaDocumentation/Documentation.docc/SwiftPMPlugin.md @@ -34,7 +34,7 @@ let package = Package( ], dependencies: [ - .package(url: "https://github.com/apple/swift-java", from: "..."), + .package(url: "https://github.com/swiftlang/swift-java", from: "..."), ], targets: [ @@ -123,4 +123,4 @@ func getJavaHomeFromLibexecJavaHome() -> String? { return nil } } -``` \ No newline at end of file +``` diff --git a/Sources/SwiftJavaDocumentation/Documentation.docc/index.md b/Sources/SwiftJavaDocumentation/Documentation.docc/index.md index 4383727d..05279aa8 100644 --- a/Sources/SwiftJavaDocumentation/Documentation.docc/index.md +++ b/Sources/SwiftJavaDocumentation/Documentation.docc/index.md @@ -42,3 +42,6 @@ which is a quick overview of all the features and approaches offered by SwiftJav - - +### Android Support + +-