From 605e130fddb99c455ca42ba074453040999ff18b Mon Sep 17 00:00:00 2001 From: Tim Wang Date: Tue, 22 Oct 2024 18:55:06 +1100 Subject: [PATCH 1/2] Make the "environment" parameter to @JavaMethod initializers optionally-typed and default to nil --- Package.swift | 42 ++++++------------- Samples/JavaProbablyPrime/Package.swift | 1 - .../Sources/JavaProbablyPrime/prime.swift | 1 - Samples/JavaSieve/Package.swift | 1 - Sources/Java2Swift/JavaToSwift.swift | 1 - Sources/Java2SwiftLib/JavaTranslator.swift | 7 ++-- .../JavaKitVM/JavaVirtualMachine.swift | 2 - .../{ => JavaKit}/JavaKitVM/LockedState.swift | 0 Sources/JavaKit/generated/Exception.swift | 8 ++-- Sources/JavaKit/generated/JavaError.swift | 8 ++-- Sources/JavaKit/generated/JavaObject.swift | 2 +- .../JavaKit/generated/RuntimeException.swift | 8 ++-- Sources/JavaKit/generated/Throwable.swift | 8 ++-- .../generated/ArrayDeque.swift | 6 +-- .../generated/ArrayList.swift | 6 +-- .../JavaKitCollection/generated/BitSet.swift | 4 +- .../JavaKitCollection/generated/HashMap.swift | 6 +-- .../JavaKitCollection/generated/HashSet.swift | 8 ++-- .../generated/JavaDictionary.swift | 2 +- .../generated/LinkedList.swift | 4 +- .../generated/PriorityQueue.swift | 8 ++-- .../JavaKitCollection/generated/Stack.swift | 2 +- .../JavaKitCollection/generated/TreeMap.swift | 2 +- .../JavaKitCollection/generated/TreeSet.swift | 4 +- Sources/JavaKitJar/generated/Attributes.swift | 6 +-- Sources/JavaKitJar/generated/JarEntry.swift | 4 +- Sources/JavaKitJar/generated/JarFile.swift | 4 +- Sources/JavaKitJar/generated/Manifest.swift | 4 +- Sources/JavaKitMacros/JavaMethodMacro.swift | 3 +- Sources/JavaKitNetwork/generated/URI.swift | 10 ++--- Sources/JavaKitNetwork/generated/URL.swift | 8 ++-- .../generated/URLClassLoader.swift | 2 +- Tests/Java2SwiftTests/Java2SwiftTests.swift | 3 +- .../JavaClassMacroTests.swift | 14 +++++-- Tests/JavaKitTests/BasicRuntimeTests.swift | 1 - USER_GUIDE.md | 18 ++++---- 36 files changed, 103 insertions(+), 115 deletions(-) rename Sources/{ => JavaKit}/JavaKitVM/JavaVirtualMachine.swift (99%) rename Sources/{ => JavaKit}/JavaKitVM/LockedState.swift (100%) diff --git a/Package.swift b/Package.swift index 0f492710..5b34a2eb 100644 --- a/Package.swift +++ b/Package.swift @@ -77,11 +77,6 @@ let package = Package( targets: ["JavaKitReflection"] ), - .library( - name: "JavaKitVM", - targets: ["JavaKitVM"] - ), - .library( name: "JavaTypes", targets: ["JavaTypes"] @@ -165,6 +160,18 @@ let package = Package( swiftSettings: [ .swiftLanguageMode(.v5), .unsafeFlags(["-I\(javaIncludePath)", "-I\(javaPlatformIncludePath)"]) + ], + linkerSettings: [ + .unsafeFlags( + [ + "-L\(javaHome)/lib/server", + "-Xlinker", + "-rpath", + "-Xlinker", + "\(javaHome)/lib/server", + ] + ), + .linkedLibrary("jvm"), ] ), .target( @@ -203,27 +210,6 @@ let package = Package( .unsafeFlags(["-I\(javaIncludePath)", "-I\(javaPlatformIncludePath)"]) ] ), - .target( - name: "JavaKitVM", - dependencies: ["JavaKit"], - swiftSettings: [ - .swiftLanguageMode(.v5), - .unsafeFlags(["-I\(javaIncludePath)", "-I\(javaPlatformIncludePath)"]) - ], - linkerSettings: [ - .unsafeFlags( - [ - "-L\(javaHome)/lib/server", - "-Xlinker", - "-rpath", - "-Xlinker", - "\(javaHome)/lib/server", - ] - ), - .linkedLibrary("jvm"), - ] - ), - .plugin( name: "JavaCompilerPlugin", capability: .buildTool() @@ -272,7 +258,6 @@ let package = Package( "JavaKitJar", "JavaKitReflection", "JavaKitNetwork", - "JavaKitVM", "JavaTypes", ], swiftSettings: [ @@ -291,7 +276,6 @@ let package = Package( "JavaKit", "JavaKitJar", "JavaKitNetwork", - "JavaKitVM", "Java2SwiftLib", ], @@ -328,7 +312,7 @@ let package = Package( .testTarget( name: "JavaKitTests", - dependencies: ["JavaKit", "JavaKitNetwork", "JavaKitVM"], + dependencies: ["JavaKit", "JavaKitNetwork"], swiftSettings: [ .swiftLanguageMode(.v5) ] diff --git a/Samples/JavaProbablyPrime/Package.swift b/Samples/JavaProbablyPrime/Package.swift index 8cd2be18..b35788f8 100644 --- a/Samples/JavaProbablyPrime/Package.swift +++ b/Samples/JavaProbablyPrime/Package.swift @@ -27,7 +27,6 @@ let package = Package( name: "JavaProbablyPrime", dependencies: [ .product(name: "JavaKit", package: "swift-java"), - .product(name: "JavaKitVM", package: "swift-java"), .product(name: "ArgumentParser", package: "swift-argument-parser"), ], swiftSettings: [ diff --git a/Samples/JavaProbablyPrime/Sources/JavaProbablyPrime/prime.swift b/Samples/JavaProbablyPrime/Sources/JavaProbablyPrime/prime.swift index bd83c1ee..ddebb518 100644 --- a/Samples/JavaProbablyPrime/Sources/JavaProbablyPrime/prime.swift +++ b/Samples/JavaProbablyPrime/Sources/JavaProbablyPrime/prime.swift @@ -14,7 +14,6 @@ import ArgumentParser import JavaKit -import JavaKitVM @main struct ProbablyPrime: ParsableCommand { diff --git a/Samples/JavaSieve/Package.swift b/Samples/JavaSieve/Package.swift index 2420dcf1..35dcd19c 100644 --- a/Samples/JavaSieve/Package.swift +++ b/Samples/JavaSieve/Package.swift @@ -70,7 +70,6 @@ let package = Package( "JavaMath", .product(name: "JavaKit", package: "swift-java"), .product(name: "JavaKitCollection", package: "swift-java"), - .product(name: "JavaKitVM", package: "swift-java"), ], swiftSettings: [ .unsafeFlags(["-I\(javaIncludePath)", "-I\(javaPlatformIncludePath)"]) diff --git a/Sources/Java2Swift/JavaToSwift.swift b/Sources/Java2Swift/JavaToSwift.swift index a4c64277..ffb9a24f 100644 --- a/Sources/Java2Swift/JavaToSwift.swift +++ b/Sources/Java2Swift/JavaToSwift.swift @@ -19,7 +19,6 @@ import JavaKit import JavaKitJar import JavaKitNetwork import JavaKitReflection -import JavaKitVM import SwiftSyntax import SwiftSyntaxBuilder diff --git a/Sources/Java2SwiftLib/JavaTranslator.swift b/Sources/Java2SwiftLib/JavaTranslator.swift index 3b592715..a91ed41a 100644 --- a/Sources/Java2SwiftLib/JavaTranslator.swift +++ b/Sources/Java2SwiftLib/JavaTranslator.swift @@ -410,7 +410,7 @@ extension JavaTranslator { extension JavaTranslator { /// Translates the given Java constructor into a Swift declaration. package func translateConstructor(_ javaConstructor: Constructor) throws -> DeclSyntax { - let parameters = try translateParameters(javaConstructor.getParameters()) + ["environment: JNIEnvironment"] + let parameters = try translateParameters(javaConstructor.getParameters()) + ["environment: JNIEnvironment? = nil"] let parametersStr = parameters.map { $0.description }.joined(separator: ", ") let throwsStr = javaConstructor.throwsCheckedException ? "throws" : "" @@ -483,8 +483,9 @@ extension JavaTranslator { """ let initSyntax: DeclSyntax = """ - public init(_ enumValue: \(raw: name), environment: JNIEnvironment) { - let classObj = try! JavaClass(in: environment) + public init(_ enumValue: \(raw: name), environment: JNIEnvironment? = nil) { + let _environment = environment == nil ? try! JavaVirtualMachine.shared().environment() : environment! + let classObj = try! JavaClass(in: _environment) switch enumValue { \(raw: enumFields.map { return """ diff --git a/Sources/JavaKitVM/JavaVirtualMachine.swift b/Sources/JavaKit/JavaKitVM/JavaVirtualMachine.swift similarity index 99% rename from Sources/JavaKitVM/JavaVirtualMachine.swift rename to Sources/JavaKit/JavaKitVM/JavaVirtualMachine.swift index d01580d7..52882a41 100644 --- a/Sources/JavaKitVM/JavaVirtualMachine.swift +++ b/Sources/JavaKit/JavaKitVM/JavaVirtualMachine.swift @@ -12,8 +12,6 @@ // //===----------------------------------------------------------------------===// -import JavaKit - typealias JavaVMPointer = UnsafeMutablePointer public final class JavaVirtualMachine: @unchecked Sendable { diff --git a/Sources/JavaKitVM/LockedState.swift b/Sources/JavaKit/JavaKitVM/LockedState.swift similarity index 100% rename from Sources/JavaKitVM/LockedState.swift rename to Sources/JavaKit/JavaKitVM/LockedState.swift diff --git a/Sources/JavaKit/generated/Exception.swift b/Sources/JavaKit/generated/Exception.swift index 79db057b..59a1f246 100644 --- a/Sources/JavaKit/generated/Exception.swift +++ b/Sources/JavaKit/generated/Exception.swift @@ -4,16 +4,16 @@ import JavaRuntime @JavaClass("java.lang.Exception", extends: Throwable.self) public struct Exception { @JavaMethod - public init(_ arg0: Throwable?, environment: JNIEnvironment) + public init(_ arg0: Throwable?, environment: JNIEnvironment? = nil) @JavaMethod - public init(_ arg0: String, _ arg1: Throwable?, environment: JNIEnvironment) + public init(_ arg0: String, _ arg1: Throwable?, environment: JNIEnvironment? = nil) @JavaMethod - public init(_ arg0: String, environment: JNIEnvironment) + public init(_ arg0: String, environment: JNIEnvironment? = nil) @JavaMethod - public init(environment: JNIEnvironment) + public init(environment: JNIEnvironment? = nil) @JavaMethod public func printStackTrace() diff --git a/Sources/JavaKit/generated/JavaError.swift b/Sources/JavaKit/generated/JavaError.swift index 483f5ab2..62abca63 100644 --- a/Sources/JavaKit/generated/JavaError.swift +++ b/Sources/JavaKit/generated/JavaError.swift @@ -4,16 +4,16 @@ import JavaRuntime @JavaClass("java.lang.Error", extends: Throwable.self) public struct JavaError { @JavaMethod - public init(_ arg0: Throwable?, environment: JNIEnvironment) + public init(_ arg0: Throwable?, environment: JNIEnvironment? = nil) @JavaMethod - public init(_ arg0: String, _ arg1: Throwable?, environment: JNIEnvironment) + public init(_ arg0: String, _ arg1: Throwable?, environment: JNIEnvironment? = nil) @JavaMethod - public init(_ arg0: String, environment: JNIEnvironment) + public init(_ arg0: String, environment: JNIEnvironment? = nil) @JavaMethod - public init(environment: JNIEnvironment) + public init(environment: JNIEnvironment? = nil) @JavaMethod public func printStackTrace() diff --git a/Sources/JavaKit/generated/JavaObject.swift b/Sources/JavaKit/generated/JavaObject.swift index 05b1b9c1..809d1418 100644 --- a/Sources/JavaKit/generated/JavaObject.swift +++ b/Sources/JavaKit/generated/JavaObject.swift @@ -4,7 +4,7 @@ import JavaRuntime @JavaClass("java.lang.Object") public struct JavaObject { @JavaMethod - public init(environment: JNIEnvironment) + public init(environment: JNIEnvironment? = nil) @JavaMethod public func equals(_ arg0: JavaObject?) -> Bool diff --git a/Sources/JavaKit/generated/RuntimeException.swift b/Sources/JavaKit/generated/RuntimeException.swift index dd1316b4..5686efd9 100644 --- a/Sources/JavaKit/generated/RuntimeException.swift +++ b/Sources/JavaKit/generated/RuntimeException.swift @@ -4,16 +4,16 @@ import JavaRuntime @JavaClass("java.lang.RuntimeException", extends: Exception.self) public struct RuntimeException { @JavaMethod - public init(_ arg0: Throwable?, environment: JNIEnvironment) + public init(_ arg0: Throwable?, environment: JNIEnvironment? = nil) @JavaMethod - public init(_ arg0: String, _ arg1: Throwable?, environment: JNIEnvironment) + public init(_ arg0: String, _ arg1: Throwable?, environment: JNIEnvironment? = nil) @JavaMethod - public init(_ arg0: String, environment: JNIEnvironment) + public init(_ arg0: String, environment: JNIEnvironment? = nil) @JavaMethod - public init(environment: JNIEnvironment) + public init(environment: JNIEnvironment? = nil) @JavaMethod public func printStackTrace() diff --git a/Sources/JavaKit/generated/Throwable.swift b/Sources/JavaKit/generated/Throwable.swift index 9622cf58..98a4fda2 100644 --- a/Sources/JavaKit/generated/Throwable.swift +++ b/Sources/JavaKit/generated/Throwable.swift @@ -4,16 +4,16 @@ import JavaRuntime @JavaClass("java.lang.Throwable") public struct Throwable { @JavaMethod - public init(_ arg0: Throwable?, environment: JNIEnvironment) + public init(_ arg0: Throwable?, environment: JNIEnvironment? = nil) @JavaMethod - public init(_ arg0: String, _ arg1: Throwable?, environment: JNIEnvironment) + public init(_ arg0: String, _ arg1: Throwable?, environment: JNIEnvironment? = nil) @JavaMethod - public init(_ arg0: String, environment: JNIEnvironment) + public init(_ arg0: String, environment: JNIEnvironment? = nil) @JavaMethod - public init(environment: JNIEnvironment) + public init(environment: JNIEnvironment? = nil) @JavaMethod public func printStackTrace() diff --git a/Sources/JavaKitCollection/generated/ArrayDeque.swift b/Sources/JavaKitCollection/generated/ArrayDeque.swift index af2fd314..85040ac7 100644 --- a/Sources/JavaKitCollection/generated/ArrayDeque.swift +++ b/Sources/JavaKitCollection/generated/ArrayDeque.swift @@ -5,13 +5,13 @@ import JavaRuntime @JavaClass("java.util.ArrayDeque") public struct ArrayDeque { @JavaMethod - public init(_ arg0: Int32, environment: JNIEnvironment) + public init(_ arg0: Int32, environment: JNIEnvironment? = nil) @JavaMethod - public init(environment: JNIEnvironment) + public init(environment: JNIEnvironment? = nil) @JavaMethod - public init(_ arg0: JavaCollection?, environment: JNIEnvironment) + public init(_ arg0: JavaCollection?, environment: JNIEnvironment? = nil) @JavaMethod public func remove() -> JavaObject? diff --git a/Sources/JavaKitCollection/generated/ArrayList.swift b/Sources/JavaKitCollection/generated/ArrayList.swift index 765f4d9f..2b8f1608 100644 --- a/Sources/JavaKitCollection/generated/ArrayList.swift +++ b/Sources/JavaKitCollection/generated/ArrayList.swift @@ -5,13 +5,13 @@ import JavaRuntime @JavaClass("java.util.ArrayList", implements: List.self, RandomAccess.self) public struct ArrayList { @JavaMethod - public init(_ arg0: JavaCollection?, environment: JNIEnvironment) + public init(_ arg0: JavaCollection?, environment: JNIEnvironment? = nil) @JavaMethod - public init(environment: JNIEnvironment) + public init(environment: JNIEnvironment? = nil) @JavaMethod - public init(_ arg0: Int32, environment: JNIEnvironment) + public init(_ arg0: Int32, environment: JNIEnvironment? = nil) @JavaMethod public func remove(_ arg0: JavaObject?) -> Bool diff --git a/Sources/JavaKitCollection/generated/BitSet.swift b/Sources/JavaKitCollection/generated/BitSet.swift index f9c0bda9..d5371c67 100644 --- a/Sources/JavaKitCollection/generated/BitSet.swift +++ b/Sources/JavaKitCollection/generated/BitSet.swift @@ -5,10 +5,10 @@ import JavaRuntime @JavaClass("java.util.BitSet") public struct BitSet { @JavaMethod - public init(environment: JNIEnvironment) + public init(environment: JNIEnvironment? = nil) @JavaMethod - public init(_ arg0: Int32, environment: JNIEnvironment) + public init(_ arg0: Int32, environment: JNIEnvironment? = nil) @JavaMethod public func cardinality() -> Int32 diff --git a/Sources/JavaKitCollection/generated/HashMap.swift b/Sources/JavaKitCollection/generated/HashMap.swift index d4048dd0..8bd86744 100644 --- a/Sources/JavaKitCollection/generated/HashMap.swift +++ b/Sources/JavaKitCollection/generated/HashMap.swift @@ -5,13 +5,13 @@ import JavaRuntime @JavaClass("java.util.HashMap") public struct HashMap { @JavaMethod - public init(_ arg0: Int32, environment: JNIEnvironment) + public init(_ arg0: Int32, environment: JNIEnvironment? = nil) @JavaMethod - public init(_ arg0: Int32, _ arg1: Float, environment: JNIEnvironment) + public init(_ arg0: Int32, _ arg1: Float, environment: JNIEnvironment? = nil) @JavaMethod - public init(environment: JNIEnvironment) + public init(environment: JNIEnvironment? = nil) @JavaMethod public func remove(_ arg0: JavaObject?) -> JavaObject? diff --git a/Sources/JavaKitCollection/generated/HashSet.swift b/Sources/JavaKitCollection/generated/HashSet.swift index aa071dfd..ff194343 100644 --- a/Sources/JavaKitCollection/generated/HashSet.swift +++ b/Sources/JavaKitCollection/generated/HashSet.swift @@ -5,16 +5,16 @@ import JavaRuntime @JavaClass("java.util.HashSet", implements: JavaSet.self) public struct HashSet { @JavaMethod - public init(_ arg0: Int32, environment: JNIEnvironment) + public init(_ arg0: Int32, environment: JNIEnvironment? = nil) @JavaMethod - public init(_ arg0: Int32, _ arg1: Float, environment: JNIEnvironment) + public init(_ arg0: Int32, _ arg1: Float, environment: JNIEnvironment? = nil) @JavaMethod - public init(_ arg0: JavaCollection?, environment: JNIEnvironment) + public init(_ arg0: JavaCollection?, environment: JNIEnvironment? = nil) @JavaMethod - public init(environment: JNIEnvironment) + public init(environment: JNIEnvironment? = nil) @JavaMethod public func remove(_ arg0: JavaObject?) -> Bool diff --git a/Sources/JavaKitCollection/generated/JavaDictionary.swift b/Sources/JavaKitCollection/generated/JavaDictionary.swift index c32b3038..6e46c942 100644 --- a/Sources/JavaKitCollection/generated/JavaDictionary.swift +++ b/Sources/JavaKitCollection/generated/JavaDictionary.swift @@ -5,7 +5,7 @@ import JavaRuntime @JavaClass("java.util.Dictionary") public struct JavaDictionary { @JavaMethod - public init(environment: JNIEnvironment) + public init(environment: JNIEnvironment? = nil) @JavaMethod public func remove(_ arg0: JavaObject?) -> JavaObject? diff --git a/Sources/JavaKitCollection/generated/LinkedList.swift b/Sources/JavaKitCollection/generated/LinkedList.swift index cf7043c2..25abfbbf 100644 --- a/Sources/JavaKitCollection/generated/LinkedList.swift +++ b/Sources/JavaKitCollection/generated/LinkedList.swift @@ -5,10 +5,10 @@ import JavaRuntime @JavaClass("java.util.LinkedList") public struct LinkedList { @JavaMethod - public init(_ arg0: JavaCollection?, environment: JNIEnvironment) + public init(_ arg0: JavaCollection?, environment: JNIEnvironment? = nil) @JavaMethod - public init(environment: JNIEnvironment) + public init(environment: JNIEnvironment? = nil) @JavaMethod public func remove(_ arg0: JavaObject?) -> Bool diff --git a/Sources/JavaKitCollection/generated/PriorityQueue.swift b/Sources/JavaKitCollection/generated/PriorityQueue.swift index 7b70c7cd..ec1f2cca 100644 --- a/Sources/JavaKitCollection/generated/PriorityQueue.swift +++ b/Sources/JavaKitCollection/generated/PriorityQueue.swift @@ -5,16 +5,16 @@ import JavaRuntime @JavaClass("java.util.PriorityQueue") public struct PriorityQueue { @JavaMethod - public init(_ arg0: PriorityQueue?, environment: JNIEnvironment) + public init(_ arg0: PriorityQueue?, environment: JNIEnvironment? = nil) @JavaMethod - public init(_ arg0: JavaCollection?, environment: JNIEnvironment) + public init(_ arg0: JavaCollection?, environment: JNIEnvironment? = nil) @JavaMethod - public init(_ arg0: Int32, environment: JNIEnvironment) + public init(_ arg0: Int32, environment: JNIEnvironment? = nil) @JavaMethod - public init(environment: JNIEnvironment) + public init(environment: JNIEnvironment? = nil) @JavaMethod public func remove(_ arg0: JavaObject?) -> Bool diff --git a/Sources/JavaKitCollection/generated/Stack.swift b/Sources/JavaKitCollection/generated/Stack.swift index 65d92872..d3a883b5 100644 --- a/Sources/JavaKitCollection/generated/Stack.swift +++ b/Sources/JavaKitCollection/generated/Stack.swift @@ -5,7 +5,7 @@ import JavaRuntime @JavaClass("java.util.Stack") public struct Stack { @JavaMethod - public init(environment: JNIEnvironment) + public init(environment: JNIEnvironment? = nil) @JavaMethod public func empty() -> Bool diff --git a/Sources/JavaKitCollection/generated/TreeMap.swift b/Sources/JavaKitCollection/generated/TreeMap.swift index f029c220..49055dce 100644 --- a/Sources/JavaKitCollection/generated/TreeMap.swift +++ b/Sources/JavaKitCollection/generated/TreeMap.swift @@ -5,7 +5,7 @@ import JavaRuntime @JavaClass("java.util.TreeMap") public struct TreeMap { @JavaMethod - public init(environment: JNIEnvironment) + public init(environment: JNIEnvironment? = nil) @JavaMethod public func remove(_ arg0: JavaObject?) -> JavaObject? diff --git a/Sources/JavaKitCollection/generated/TreeSet.swift b/Sources/JavaKitCollection/generated/TreeSet.swift index 9633750e..7c1e0c86 100644 --- a/Sources/JavaKitCollection/generated/TreeSet.swift +++ b/Sources/JavaKitCollection/generated/TreeSet.swift @@ -5,10 +5,10 @@ import JavaRuntime @JavaClass("java.util.TreeSet") public struct TreeSet { @JavaMethod - public init(_ arg0: JavaCollection?, environment: JNIEnvironment) + public init(_ arg0: JavaCollection?, environment: JNIEnvironment? = nil) @JavaMethod - public init(environment: JNIEnvironment) + public init(environment: JNIEnvironment? = nil) @JavaMethod public func remove(_ arg0: JavaObject?) -> Bool diff --git a/Sources/JavaKitJar/generated/Attributes.swift b/Sources/JavaKitJar/generated/Attributes.swift index 69827d34..22aa68a4 100644 --- a/Sources/JavaKitJar/generated/Attributes.swift +++ b/Sources/JavaKitJar/generated/Attributes.swift @@ -6,13 +6,13 @@ import JavaRuntime @JavaClass("java.util.jar.Attributes") public struct Attributes { @JavaMethod - public init(_ arg0: Attributes?, environment: JNIEnvironment) + public init(_ arg0: Attributes?, environment: JNIEnvironment? = nil) @JavaMethod - public init(_ arg0: Int32, environment: JNIEnvironment) + public init(_ arg0: Int32, environment: JNIEnvironment? = nil) @JavaMethod - public init(environment: JNIEnvironment) + public init(environment: JNIEnvironment? = nil) @JavaMethod public func remove(_ arg0: JavaObject?) -> JavaObject? diff --git a/Sources/JavaKitJar/generated/JarEntry.swift b/Sources/JavaKitJar/generated/JarEntry.swift index 75a34d4e..5fae3e56 100644 --- a/Sources/JavaKitJar/generated/JarEntry.swift +++ b/Sources/JavaKitJar/generated/JarEntry.swift @@ -5,10 +5,10 @@ import JavaRuntime @JavaClass("java.util.jar.JarEntry") public struct JarEntry { @JavaMethod - public init(_ arg0: JarEntry?, environment: JNIEnvironment) + public init(_ arg0: JarEntry?, environment: JNIEnvironment? = nil) @JavaMethod - public init(_ arg0: String, environment: JNIEnvironment) + public init(_ arg0: String, environment: JNIEnvironment? = nil) @JavaMethod public func getRealName() -> String diff --git a/Sources/JavaKitJar/generated/JarFile.swift b/Sources/JavaKitJar/generated/JarFile.swift index e5d8eb6d..5dbfdcad 100644 --- a/Sources/JavaKitJar/generated/JarFile.swift +++ b/Sources/JavaKitJar/generated/JarFile.swift @@ -6,10 +6,10 @@ import JavaRuntime @JavaClass("java.util.jar.JarFile") public struct JarFile { @JavaMethod - public init(_ arg0: String, _ arg1: Bool, environment: JNIEnvironment) throws + public init(_ arg0: String, _ arg1: Bool, environment: JNIEnvironment? = nil) throws @JavaMethod - public init(_ arg0: String, environment: JNIEnvironment) throws + public init(_ arg0: String, environment: JNIEnvironment? = nil) throws @JavaMethod public func entries() -> Enumeration? diff --git a/Sources/JavaKitJar/generated/Manifest.swift b/Sources/JavaKitJar/generated/Manifest.swift index 7ea25ae1..1cd2ae64 100644 --- a/Sources/JavaKitJar/generated/Manifest.swift +++ b/Sources/JavaKitJar/generated/Manifest.swift @@ -5,10 +5,10 @@ import JavaRuntime @JavaClass("java.util.jar.Manifest") public struct Manifest { @JavaMethod - public init(_ arg0: Manifest?, environment: JNIEnvironment) + public init(_ arg0: Manifest?, environment: JNIEnvironment? = nil) @JavaMethod - public init(environment: JNIEnvironment) + public init(environment: JNIEnvironment? = nil) @JavaMethod public func equals(_ arg0: JavaObject?) -> Bool diff --git a/Sources/JavaKitMacros/JavaMethodMacro.swift b/Sources/JavaKitMacros/JavaMethodMacro.swift index dc08374d..d99fd843 100644 --- a/Sources/JavaKitMacros/JavaMethodMacro.swift +++ b/Sources/JavaKitMacros/JavaMethodMacro.swift @@ -94,7 +94,8 @@ extension JavaMethodMacro: BodyMacro { return [ """ - self = \(raw: tryKeyword) Self.dynamicJavaNewObject(in: environment\(raw: arguments)) + let _environment = environment == nil ? \(raw: tryKeyword) JavaVirtualMachine.shared().environment() : environment! + self = \(raw: tryKeyword) Self.dynamicJavaNewObject(in: _environment\(raw: arguments)) """ ] } diff --git a/Sources/JavaKitNetwork/generated/URI.swift b/Sources/JavaKitNetwork/generated/URI.swift index 6fdad52c..3135e466 100644 --- a/Sources/JavaKitNetwork/generated/URI.swift +++ b/Sources/JavaKitNetwork/generated/URI.swift @@ -5,19 +5,19 @@ import JavaRuntime @JavaClass("java.net.URI") public struct URI { @JavaMethod - public init(_ arg0: String, _ arg1: String, _ arg2: String, _ arg3: String, _ arg4: String, environment: JNIEnvironment) throws + public init(_ arg0: String, _ arg1: String, _ arg2: String, _ arg3: String, _ arg4: String, environment: JNIEnvironment? = nil) throws @JavaMethod - public init(_ arg0: String, _ arg1: String, _ arg2: String, _ arg3: String, environment: JNIEnvironment) throws + public init(_ arg0: String, _ arg1: String, _ arg2: String, _ arg3: String, environment: JNIEnvironment? = nil) throws @JavaMethod - public init(_ arg0: String, _ arg1: String, _ arg2: String, environment: JNIEnvironment) throws + public init(_ arg0: String, _ arg1: String, _ arg2: String, environment: JNIEnvironment? = nil) throws @JavaMethod - public init(_ arg0: String, environment: JNIEnvironment) throws + public init(_ arg0: String, environment: JNIEnvironment? = nil) throws @JavaMethod - public init(_ arg0: String, _ arg1: String, _ arg2: String, _ arg3: Int32, _ arg4: String, _ arg5: String, _ arg6: String, environment: JNIEnvironment) throws + public init(_ arg0: String, _ arg1: String, _ arg2: String, _ arg3: Int32, _ arg4: String, _ arg5: String, _ arg6: String, environment: JNIEnvironment? = nil) throws @JavaMethod public func equals(_ arg0: JavaObject?) -> Bool diff --git a/Sources/JavaKitNetwork/generated/URL.swift b/Sources/JavaKitNetwork/generated/URL.swift index c98fa947..86c6c46a 100644 --- a/Sources/JavaKitNetwork/generated/URL.swift +++ b/Sources/JavaKitNetwork/generated/URL.swift @@ -5,16 +5,16 @@ import JavaRuntime @JavaClass("java.net.URL") public struct URL { @JavaMethod - public init(_ arg0: URL?, _ arg1: String, environment: JNIEnvironment) throws + public init(_ arg0: URL?, _ arg1: String, environment: JNIEnvironment? = nil) throws @JavaMethod - public init(_ arg0: String, environment: JNIEnvironment) throws + public init(_ arg0: String, environment: JNIEnvironment? = nil) throws @JavaMethod - public init(_ arg0: String, _ arg1: String, _ arg2: Int32, _ arg3: String, environment: JNIEnvironment) throws + public init(_ arg0: String, _ arg1: String, _ arg2: Int32, _ arg3: String, environment: JNIEnvironment? = nil) throws @JavaMethod - public init(_ arg0: String, _ arg1: String, _ arg2: String, environment: JNIEnvironment) throws + public init(_ arg0: String, _ arg1: String, _ arg2: String, environment: JNIEnvironment? = nil) throws @JavaMethod public func equals(_ arg0: JavaObject?) -> Bool diff --git a/Sources/JavaKitNetwork/generated/URLClassLoader.swift b/Sources/JavaKitNetwork/generated/URLClassLoader.swift index 6dd407f4..2f83d963 100644 --- a/Sources/JavaKitNetwork/generated/URLClassLoader.swift +++ b/Sources/JavaKitNetwork/generated/URLClassLoader.swift @@ -6,7 +6,7 @@ import JavaRuntime @JavaClass("java.net.URLClassLoader") public struct URLClassLoader { @JavaMethod - public init(_ arg0: [URL?], environment: JNIEnvironment) + public init(_ arg0: [URL?], environment: JNIEnvironment? = nil) @JavaMethod public func findResource(_ arg0: String) -> URL? diff --git a/Tests/Java2SwiftTests/Java2SwiftTests.swift b/Tests/Java2SwiftTests/Java2SwiftTests.swift index 579c74a8..e4ded5ab 100644 --- a/Tests/Java2SwiftTests/Java2SwiftTests.swift +++ b/Tests/Java2SwiftTests/Java2SwiftTests.swift @@ -14,7 +14,6 @@ import JavaKit import Java2SwiftLib -import JavaKitVM import XCTest // NOTE: Workaround for https://github.com/swiftlang/swift-java/issues/43 /// Handy reference to the JVM abstraction. @@ -66,7 +65,7 @@ class Java2SwiftTests: XCTestCase { return MonthCases.APRIL } """, - "public init(_ enumValue: MonthCases, environment: JNIEnvironment) {", + "public init(_ enumValue: MonthCases, environment: JNIEnvironment? = nil) {", """ case .APRIL: if let APRIL = classObj.APRIL { diff --git a/Tests/JavaKitMacroTests/JavaClassMacroTests.swift b/Tests/JavaKitMacroTests/JavaClassMacroTests.swift index cc0ad31b..2d35ccf6 100644 --- a/Tests/JavaKitMacroTests/JavaClassMacroTests.swift +++ b/Tests/JavaKitMacroTests/JavaClassMacroTests.swift @@ -31,7 +31,10 @@ class JavaKitMacroTests: XCTestCase { @JavaClass("org.swift.example.HelloWorld") public struct HelloWorld { @JavaMethod - public init(_ value: Int32, environment: JNIEnvironment) + public init(environment: JNIEnvironment? = nil) + + @JavaMethod + public init(_ value: Int32, environment: JNIEnvironment? = nil) @JavaMethod public func isBigEnough(_: Int32) -> Bool @@ -43,8 +46,13 @@ class JavaKitMacroTests: XCTestCase { expandedSource: """ public struct HelloWorld { - public init(_ value: Int32, environment: JNIEnvironment) { - self = try! Self.dynamicJavaNewObject(in: environment, arguments: value.self) + public init(environment: JNIEnvironment? = nil) { + let _environment = environment == nil ? try! JavaVirtualMachine.shared().environment() : environment! + self = try! Self.dynamicJavaNewObject(in: _environment) + } + public init(_ value: Int32, environment: JNIEnvironment? = nil) { + let _environment = environment == nil ? try! JavaVirtualMachine.shared().environment() : environment! + self = try! Self.dynamicJavaNewObject(in: _environment, arguments: value.self) } public func isBigEnough(_: Int32) -> Bool { return try! dynamicJavaMethodCall(methodName: "isBigEnough", resultType: Bool.self) diff --git a/Tests/JavaKitTests/BasicRuntimeTests.swift b/Tests/JavaKitTests/BasicRuntimeTests.swift index 16669470..ad379a92 100644 --- a/Tests/JavaKitTests/BasicRuntimeTests.swift +++ b/Tests/JavaKitTests/BasicRuntimeTests.swift @@ -14,7 +14,6 @@ import JavaKit import JavaKitNetwork -import JavaKitVM import XCTest // NOTE: Workaround for https://github.com/swiftlang/swift-java/issues/43 /// Handy reference to the JVM abstraction. diff --git a/USER_GUIDE.md b/USER_GUIDE.md index b156f3e6..1e75b93d 100644 --- a/USER_GUIDE.md +++ b/USER_GUIDE.md @@ -47,7 +47,7 @@ If you build the project, there will be a generated file `BigInteger.swift` that @JavaClass("java.math.BigInteger") public struct BigInteger { @JavaMethod - public init(_ arg0: String, environment: JNIEnvironment) + public init(_ arg0: String, environment: JNIEnvironment? = nil) @JavaMethod public func toString() -> String @@ -225,7 +225,7 @@ Each Java class that can be used from Swift is translated to a Swift `struct` th @JavaClass("java.util.jar.JarFile", extends: ZipFile.self, implements: AutoCloseable.self) public struct JarFile { @JavaMethod - public init(_ arg0: String, _ arg1: Bool, environment: JNIEnvironment) + public init(_ arg0: String, _ arg1: Bool, environment: JNIEnvironment? = nil) @JavaMethod public func entries() -> Enumeration? @@ -259,7 +259,7 @@ Each of the public Java constructors, methods, and fields in the Java class will ```swift @JavaMethod - public init(_ arg0: String, _ arg1: Bool, environment: JNIEnvironment) + public init(_ arg0: String, _ arg1: Bool, environment: JNIEnvironment? = nil) ``` corresponds to the Java constructor: @@ -268,7 +268,9 @@ corresponds to the Java constructor: public JarFile(String arg0, bool arg1) ``` -The `environment` parameter is the pointer to the JNI environment (`JNIEnv*` in C) in which the underlying Java object lives. It is available to all methods that are written in or exposed to Java, either directly as a parameter (as in constructors) or on an instance of any type that's projected from Java through the `javaEnvironment` property of the `AnyJavaObject` conformance. Given a +The `environment` parameter is the pointer to the JNI environment (`JNIEnv*` in C) in which the underlying Java object lives. It is available to all methods that are written in or exposed to Java, +either directly as a parameter (as in constructors - in case of nil, the `JavaVirtualMachine.shared().environment()` value will be used) +or on an instance of any type that's projected from Java through the `javaEnvironment` property of the `AnyJavaObject` conformance. Given a Java environment, one can create a `JarFile` instance in Swift with, e.g., ```swift @@ -409,7 +411,7 @@ extension HelloSwift { Java native methods that throw any checked exception should be marked as `throws` in Swift. Swift will translate any thrown error into a Java exception. -The Swift implementations of Java `native` constructors and static methods require an additional Swift parameter `environment: JNIEnvironment`, which will receive the JNI environment in which the function is being executed. +The Swift implementations of Java `native` constructors and static methods require an additional Swift parameter `environment: JNIEnvironment? = nil`, which will receive the JNI environment in which the function is being executed. In case of nil, the `JavaVirtualMachine.shared().environment()` value will be used. ## Translating Java classes with `Java2Swift` @@ -541,7 +543,7 @@ import JavaKit @JavaClass("org.swift.javakit.HelloSwiftMain") struct HelloSwiftMain { @ImplementsJava - static func main(arguments: [String], environment: JNIEnvironment) { + static func main(arguments: [String], environment: JNIEnvironment? = nil) { print("Command line arguments are: \(arguments)") } } @@ -573,12 +575,12 @@ struct HelloSwiftMain: ParsableCommand { var verbose: Bool = false @ImplementsJava - static func main(arguments: [String], environment: JNIEnvironment) { + static func main(arguments: [String], environment: JNIEnvironment? = nil) { let command = Self.parseOrExit(arguments) command.run(environment: environment) } - func run(environment: JNIEnvironment) { + func run(environment: JNIEnvironment? = nil) { print("Verbose = \(verbose)") } } From a8eb5412898ea56d4ced2cf4bfbb09c807049c78 Mon Sep 17 00:00:00 2001 From: Tim Wang Date: Wed, 23 Oct 2024 06:32:13 +1100 Subject: [PATCH 2/2] Adjust syntax of setting `_environment` to avoid force unwrapping based on PR conmments --- Sources/Java2SwiftLib/JavaTranslator.swift | 6 +++++- Sources/JavaKitMacros/JavaMethodMacro.swift | 6 +++++- Tests/JavaKitMacroTests/JavaClassMacroTests.swift | 12 ++++++++++-- 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/Sources/Java2SwiftLib/JavaTranslator.swift b/Sources/Java2SwiftLib/JavaTranslator.swift index a91ed41a..b7eec617 100644 --- a/Sources/Java2SwiftLib/JavaTranslator.swift +++ b/Sources/Java2SwiftLib/JavaTranslator.swift @@ -484,7 +484,11 @@ extension JavaTranslator { let initSyntax: DeclSyntax = """ public init(_ enumValue: \(raw: name), environment: JNIEnvironment? = nil) { - let _environment = environment == nil ? try! JavaVirtualMachine.shared().environment() : environment! + let _environment = if let environment { + environment + } else { + try! JavaVirtualMachine.shared().environment() + } let classObj = try! JavaClass(in: _environment) switch enumValue { \(raw: enumFields.map { diff --git a/Sources/JavaKitMacros/JavaMethodMacro.swift b/Sources/JavaKitMacros/JavaMethodMacro.swift index d99fd843..c748f050 100644 --- a/Sources/JavaKitMacros/JavaMethodMacro.swift +++ b/Sources/JavaKitMacros/JavaMethodMacro.swift @@ -94,7 +94,11 @@ extension JavaMethodMacro: BodyMacro { return [ """ - let _environment = environment == nil ? \(raw: tryKeyword) JavaVirtualMachine.shared().environment() : environment! + let _environment = if let environment { + environment + } else { + \(raw: tryKeyword) JavaVirtualMachine.shared().environment() + } self = \(raw: tryKeyword) Self.dynamicJavaNewObject(in: _environment\(raw: arguments)) """ ] diff --git a/Tests/JavaKitMacroTests/JavaClassMacroTests.swift b/Tests/JavaKitMacroTests/JavaClassMacroTests.swift index 2d35ccf6..82792df6 100644 --- a/Tests/JavaKitMacroTests/JavaClassMacroTests.swift +++ b/Tests/JavaKitMacroTests/JavaClassMacroTests.swift @@ -47,11 +47,19 @@ class JavaKitMacroTests: XCTestCase { public struct HelloWorld { public init(environment: JNIEnvironment? = nil) { - let _environment = environment == nil ? try! JavaVirtualMachine.shared().environment() : environment! + let _environment = if let environment { + environment + } else { + try! JavaVirtualMachine.shared().environment() + } self = try! Self.dynamicJavaNewObject(in: _environment) } public init(_ value: Int32, environment: JNIEnvironment? = nil) { - let _environment = environment == nil ? try! JavaVirtualMachine.shared().environment() : environment! + let _environment = if let environment { + environment + } else { + try! JavaVirtualMachine.shared().environment() + } self = try! Self.dynamicJavaNewObject(in: _environment, arguments: value.self) } public func isBigEnough(_: Int32) -> Bool {