From be0462784e4471d4e6bda82dbfc86956b348cb91 Mon Sep 17 00:00:00 2001 From: Iceman Date: Thu, 8 Jan 2026 14:40:30 +0900 Subject: [PATCH 1/4] reduce SwiftJava runtime dependencies --- Package.swift | 1 - Sources/SwiftJava/String+Extensions.swift | 11 ++++++----- Sources/SwiftJavaMacros/JavaClassMacro.swift | 6 +++++- .../SwiftJavaRuntimeSupport/_JNIMethodIDCache.swift | 2 +- 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/Package.swift b/Package.swift index 3964be489..79bb7b3d1 100644 --- a/Package.swift +++ b/Package.swift @@ -297,7 +297,6 @@ let package = Package( "CSwiftJavaJNI", "SwiftJavaMacros", "JavaTypes", - "SwiftJavaConfigurationShared", // for Configuration reading at runtime ], exclude: ["swift-java.config"], swiftSettings: [ diff --git a/Sources/SwiftJava/String+Extensions.swift b/Sources/SwiftJava/String+Extensions.swift index b87e6a0c6..dc0d56665 100644 --- a/Sources/SwiftJava/String+Extensions.swift +++ b/Sources/SwiftJava/String+Extensions.swift @@ -12,7 +12,11 @@ // //===----------------------------------------------------------------------===// +#if canImport(FoundationEssentials) +import FoundationEssentials +#else import Foundation +#endif extension String { /// For a String that's of the form java.util.Vector, return the "Vector" part. @@ -30,11 +34,8 @@ extension String { /// Convert a Java class name to its canonical name. /// Replaces `$` with `.` for nested classes but preserves `$` at the start of identifiers. package var javaClassNameToCanonicalName: String { - self.replacingOccurrences( - of: #"(?<=\w)\$"#, - with: ".", - options: .regularExpression - ) + let regex = try! Regex(#"(?<=\w)\$"#) + return self.replacing(regex, with: ".") } /// Whether this is the name of an anonymous class. diff --git a/Sources/SwiftJavaMacros/JavaClassMacro.swift b/Sources/SwiftJavaMacros/JavaClassMacro.swift index 1fcbf11fd..f6186c251 100644 --- a/Sources/SwiftJavaMacros/JavaClassMacro.swift +++ b/Sources/SwiftJavaMacros/JavaClassMacro.swift @@ -15,7 +15,11 @@ import SwiftSyntax import SwiftSyntaxBuilder import SwiftSyntaxMacros -import Foundation // for e.g. replacingOccurrences +#if canImport(FoundationEssentials) +import FoundationEssentials +#else +import Foundation +#endif package enum JavaClassMacro {} diff --git a/Sources/SwiftJavaRuntimeSupport/_JNIMethodIDCache.swift b/Sources/SwiftJavaRuntimeSupport/_JNIMethodIDCache.swift index 3880ea61a..48cbaa47b 100644 --- a/Sources/SwiftJavaRuntimeSupport/_JNIMethodIDCache.swift +++ b/Sources/SwiftJavaRuntimeSupport/_JNIMethodIDCache.swift @@ -60,7 +60,7 @@ public final class _JNIMethodIDCache: Sendable { fatalError("Cannot get JNI.shared, it should have been initialized by JNI_OnLoad when loading the library") } guard let javaClass = try? jni.applicationClassLoader?.loadClass( - className.replacingOccurrences(of: "/", with: ".") + className.replacing("/", with: ".") ) else { fatalError("Class \(className) could not be found!") } From f5542cb6b5710699ad4edac09ae6898830a7ef21 Mon Sep 17 00:00:00 2001 From: Iceman Date: Thu, 8 Jan 2026 15:05:15 +0900 Subject: [PATCH 2/4] Macro targets can use Foundation --- Sources/SwiftJavaMacros/JavaClassMacro.swift | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/Sources/SwiftJavaMacros/JavaClassMacro.swift b/Sources/SwiftJavaMacros/JavaClassMacro.swift index f6186c251..1fcbf11fd 100644 --- a/Sources/SwiftJavaMacros/JavaClassMacro.swift +++ b/Sources/SwiftJavaMacros/JavaClassMacro.swift @@ -15,11 +15,7 @@ import SwiftSyntax import SwiftSyntaxBuilder import SwiftSyntaxMacros -#if canImport(FoundationEssentials) -import FoundationEssentials -#else -import Foundation -#endif +import Foundation // for e.g. replacingOccurrences package enum JavaClassMacro {} From 7f426c3e0739c956031903a84c21d9a6fd76bdce Mon Sep 17 00:00:00 2001 From: Iceman Date: Fri, 9 Jan 2026 09:56:02 +0900 Subject: [PATCH 3/4] Fix not to use lookbehind --- Sources/SwiftJava/String+Extensions.swift | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Sources/SwiftJava/String+Extensions.swift b/Sources/SwiftJava/String+Extensions.swift index dc0d56665..78d5f2169 100644 --- a/Sources/SwiftJava/String+Extensions.swift +++ b/Sources/SwiftJava/String+Extensions.swift @@ -34,8 +34,10 @@ extension String { /// Convert a Java class name to its canonical name. /// Replaces `$` with `.` for nested classes but preserves `$` at the start of identifiers. package var javaClassNameToCanonicalName: String { - let regex = try! Regex(#"(?<=\w)\$"#) - return self.replacing(regex, with: ".") + let regex = try! Regex(#"(\w)\$"#, as: (Substring, Substring).self) + return self.replacing(regex) { match in + "\(match.output.1)." + } } /// Whether this is the name of an anonymous class. From dbf126e4077a8b0e4296b72b51783a4213d173ba Mon Sep 17 00:00:00 2001 From: Konrad Malawski Date: Fri, 9 Jan 2026 10:30:53 +0900 Subject: [PATCH 4/4] fix the java dependency sample app --- Package.swift | 5 +++++ Samples/JavaDependencySampleApp/Package.swift | 1 + 2 files changed, 6 insertions(+) diff --git a/Package.swift b/Package.swift index 79bb7b3d1..080d35fe3 100644 --- a/Package.swift +++ b/Package.swift @@ -157,6 +157,11 @@ let package = Package( targets: ["CSwiftJavaJNI"] ), + .library( + name: "SwiftJavaConfigurationShared", + targets: ["SwiftJavaConfigurationShared"] + ), + .library( name: "JavaUtil", targets: ["JavaUtil"] diff --git a/Samples/JavaDependencySampleApp/Package.swift b/Samples/JavaDependencySampleApp/Package.swift index ed88ecb1c..a501d157d 100644 --- a/Samples/JavaDependencySampleApp/Package.swift +++ b/Samples/JavaDependencySampleApp/Package.swift @@ -111,6 +111,7 @@ let package = Package( name: "JavaDependencySample", dependencies: [ .product(name: "SwiftJava", package: "swift-java"), + .product(name: "SwiftJavaConfigurationShared", package: "swift-java"), .product(name: "CSwiftJavaJNI", package: "swift-java"), .product(name: "JavaUtilFunction", package: "swift-java"), "JavaCommonsCSV"