From 161350739bab34605b3fd72408ea3a37389a11e9 Mon Sep 17 00:00:00 2001 From: jrosen081 Date: Mon, 25 Nov 2024 23:27:10 -0500 Subject: [PATCH 01/11] Java Optional Return values --- Makefile | 12 +++--- .../Java2SwiftLib/JavaClassTranslator.swift | 43 +++++++++++++++++-- Sources/Java2SwiftLib/StringExtras.swift | 9 ++++ Sources/JavaKit/Optional+JavaOptional.swift | 23 ++++++++++ Sources/JavaKit/generated/JavaClass.swift | 3 ++ Sources/JavaKit/generated/JavaDouble.swift | 3 ++ Sources/JavaKit/generated/JavaFloat.swift | 3 ++ Sources/JavaKit/generated/JavaInteger.swift | 3 ++ Sources/JavaKit/generated/JavaLong.swift | 3 ++ Sources/JavaKit/generated/JavaOptional.swift | 39 +++++++++++++++++ Sources/JavaKit/generated/JavaString.swift | 3 ++ Sources/JavaKit/swift-java.config | 3 +- 12 files changed, 136 insertions(+), 11 deletions(-) create mode 100644 Sources/JavaKit/Optional+JavaOptional.swift create mode 100644 Sources/JavaKit/generated/JavaOptional.swift diff --git a/Makefile b/Makefile index d8f8717a..4b24b5a3 100644 --- a/Makefile +++ b/Makefile @@ -68,27 +68,27 @@ Java2Swift: $(BUILD_DIR)/debug/Java2Swift generate-JavaKit: Java2Swift mkdir -p Sources/JavaKit/generated - $(BUILD_DIR)/debug/Java2Swift --module-name JavaKit -o Sources/JavaKit/generated Sources/JavaKit/Java2Swift.config + $(BUILD_DIR)/debug/Java2Swift --module-name JavaKit -o Sources/JavaKit/generated Sources/JavaKit/swift-java.config generate-JavaKitCollection: Java2Swift mkdir -p Sources/JavaKitCollection/generated - $(BUILD_DIR)/debug/Java2Swift --module-name JavaKitCollection --depends-on JavaKit=Sources/JavaKit/Java2Swift.config -o Sources/JavaKitCollection/generated Sources/JavaKitCollection/Java2Swift.config + $(BUILD_DIR)/debug/Java2Swift --module-name JavaKitCollection --depends-on JavaKit=Sources/JavaKit/swift-java.config -o Sources/JavaKitCollection/generated Sources/JavaKitCollection/swift-java.config generate-JavaKitFunction: Java2Swift mkdir -p Sources/JavaKitFunction/generated - $(BUILD_DIR)/debug/Java2Swift --module-name JavaKitFunction --depends-on JavaKit=Sources/JavaKit/Java2Swift.config -o Sources/JavaKitFunction/generated Sources/JavaKitFunction/Java2Swift.config + $(BUILD_DIR)/debug/Java2Swift --module-name JavaKitFunction --depends-on JavaKit=Sources/JavaKit/swift-java.config -o Sources/JavaKitFunction/generated Sources/JavaKitFunction/swift-java.config generate-JavaKitReflection: Java2Swift generate-JavaKit generate-JavaKitCollection mkdir -p Sources/JavaKitReflection/generated - $(BUILD_DIR)/debug/Java2Swift --module-name JavaKitReflection --depends-on JavaKit=Sources/JavaKit/Java2Swift.config --depends-on JavaKitCollection=Sources/JavaKitCollection/Java2Swift.config -o Sources/JavaKitReflection/generated Sources/JavaKitReflection/Java2Swift.config + $(BUILD_DIR)/debug/Java2Swift --module-name JavaKitReflection --depends-on JavaKit=Sources/JavaKit/swift-java.config --depends-on JavaKitCollection=Sources/JavaKitCollection/swift-java.config -o Sources/JavaKitReflection/generated Sources/JavaKitReflection/swift-java.config generate-JavaKitJar: Java2Swift generate-JavaKit generate-JavaKitCollection mkdir -p Sources/JavaKitJar/generated - $(BUILD_DIR)/debug/Java2Swift --module-name JavaKitJar --depends-on JavaKit=Sources/JavaKit/Java2Swift.config --depends-on JavaKitCollection=Sources/JavaKitCollection/Java2Swift.config -o Sources/JavaKitJar/generated Sources/JavaKitJar/Java2Swift.config + $(BUILD_DIR)/debug/Java2Swift --module-name JavaKitJar --depends-on JavaKit=Sources/JavaKit/swift-java.config --depends-on JavaKitCollection=Sources/JavaKitCollection/swift-java.config -o Sources/JavaKitJar/generated Sources/JavaKitJar/swift-java.config generate-JavaKitNetwork: Java2Swift generate-JavaKit generate-JavaKitCollection mkdir -p Sources/JavaKitNetwork/generated - $(BUILD_DIR)/debug/Java2Swift --module-name JavaKitNetwork --depends-on JavaKit=Sources/JavaKit/Java2Swift.config --depends-on JavaKitCollection=Sources/JavaKitCollection/Java2Swift.config -o Sources/JavaKitNetwork/generated Sources/JavaKitNetwork/Java2Swift.config + $(BUILD_DIR)/debug/Java2Swift --module-name JavaKitNetwork --depends-on JavaKit=Sources/JavaKit/swift-java.config --depends-on JavaKitCollection=Sources/JavaKitCollection/swift-java.config -o Sources/JavaKitNetwork/generated Sources/JavaKitNetwork/swift-java.config javakit-generate: generate-JavaKit generate-JavaKitReflection generate-JavaKitJar generate-JavaKitNetwork diff --git a/Sources/Java2SwiftLib/JavaClassTranslator.swift b/Sources/Java2SwiftLib/JavaClassTranslator.swift index e2753790..a7a05adc 100644 --- a/Sources/Java2SwiftLib/JavaClassTranslator.swift +++ b/Sources/Java2SwiftLib/JavaClassTranslator.swift @@ -567,9 +567,21 @@ extension JavaClassTranslator { let overrideOpt = (translateAsClass && !javaMethod.isStatic && isOverride(javaMethod)) ? "override " : "" - return """ - \(methodAttribute)\(raw: accessModifier)\(raw: overrideOpt)func \(raw: swiftMethodName)\(raw: genericParameterClause)(\(raw: parametersStr))\(raw: throwsStr)\(raw: resultTypeStr)\(raw: whereClause) - """ + + if let resultOptional = resultTypeStr.optionalWrappedType() { + let parameters = parameters.map { "\($0.secondName!.trimmedDescription)" }.joined(separator: ", ") + return """ + \(methodAttribute)\(raw: accessModifier)\(raw: overrideOpt)func __\(raw: swiftMethodName)\(raw: genericParameterClause)(\(raw: parametersStr))\(raw: throwsStr)\(raw: resultTypeStr)\(raw: whereClause) + + \(raw: accessModifier)\(raw: overrideOpt)func \(raw: swiftMethodName)\(raw: genericParameterClause)(\(raw: parametersStr))\(raw: throwsStr)\(raw: resultOptional)\(raw: whereClause) { + \(raw: javaMethod.throwsCheckedException ? "try " : "")__\(raw: swiftMethodName)(\(raw: parameters))?.toJavaOptional() + } + """ + } else { + return """ + \(methodAttribute)\(raw: accessModifier)\(raw: overrideOpt)func \(raw: swiftMethodName)\(raw: genericParameterClause)(\(raw: parametersStr))\(raw: throwsStr)\(raw: resultTypeStr)\(raw: whereClause) + """ + } } /// Render a single Java field into the corresponding Swift property, or @@ -582,10 +594,33 @@ extension JavaClassTranslator { ) let fieldAttribute: AttributeSyntax = javaField.isStatic ? "@JavaStaticField" : "@JavaField"; let swiftFieldName = javaField.getName().escapedSwiftName - return """ + + if let optionalType = swiftTypeName.optionalWrappedType() { + let setter = if javaField.isFinal { + """ + + set { + __\(swiftFieldName) = newValue?.toJavaOptional() + } + """ + } else { "" } + return """ + \(fieldAttribute)(isFinal: \(raw: javaField.isFinal)) + public var __\(raw: swiftFieldName): \(raw: typeName) + + + public var \(raw: swiftFieldName): \(raw: optionalType)? { + get { + .init(__\(raw: swiftFieldName)) + }\(raw: setter) + } + """ + } else { + return """ \(fieldAttribute)(isFinal: \(raw: javaField.isFinal)) public var \(raw: swiftFieldName): \(raw: typeName) """ + } } package func renderEnum(name: String) -> [DeclSyntax] { diff --git a/Sources/Java2SwiftLib/StringExtras.swift b/Sources/Java2SwiftLib/StringExtras.swift index f26d7c1b..7436b4ab 100644 --- a/Sources/Java2SwiftLib/StringExtras.swift +++ b/Sources/Java2SwiftLib/StringExtras.swift @@ -39,4 +39,13 @@ extension String { public func replacing(_ character: Character, with replacement: Character) -> String { return replacingOccurrences(of: String(character), with: String(replacement)) } + + public func optionalWrappedType() -> String? { + print("\(self) printing this thing") + if starts(with: "JavaOptional<") { + return String(self[index(startIndex, offsetBy: 13).. JavaOptional { + return try! JavaClass>().ofNullable(self?.as(JavaObject.self)).as(JavaOptional.self)! + } + + init?(_ javaOptional: JavaOptional) { + self = javaOptional.isPresent() ? javaOptional.get().as(Wrapped.self) : Optional.none + } +} diff --git a/Sources/JavaKit/generated/JavaClass.swift b/Sources/JavaKit/generated/JavaClass.swift index b66835aa..1ea4a079 100644 --- a/Sources/JavaKit/generated/JavaClass.swift +++ b/Sources/JavaKit/generated/JavaClass.swift @@ -51,6 +51,9 @@ open class JavaClass: JavaObject { @JavaMethod open func isRecord() -> Bool + @JavaMethod + open func getClassLoader() -> JavaClassLoader! + @JavaMethod open func newInstance() throws -> JavaObject! diff --git a/Sources/JavaKit/generated/JavaDouble.swift b/Sources/JavaKit/generated/JavaDouble.swift index 4eaa425e..66ce9aa2 100644 --- a/Sources/JavaKit/generated/JavaDouble.swift +++ b/Sources/JavaKit/generated/JavaDouble.swift @@ -45,6 +45,9 @@ open class JavaDouble: JavaNumber { @JavaMethod open override func doubleValue() -> Double + @JavaMethod + open func describeConstable() -> JavaOptional! + @JavaMethod open func isNaN() -> Bool } diff --git a/Sources/JavaKit/generated/JavaFloat.swift b/Sources/JavaKit/generated/JavaFloat.swift index 6ad0536e..e686714a 100644 --- a/Sources/JavaKit/generated/JavaFloat.swift +++ b/Sources/JavaKit/generated/JavaFloat.swift @@ -48,6 +48,9 @@ open class JavaFloat: JavaNumber { @JavaMethod open override func doubleValue() -> Double + @JavaMethod + open func describeConstable() -> JavaOptional! + @JavaMethod open func isNaN() -> Bool } diff --git a/Sources/JavaKit/generated/JavaInteger.swift b/Sources/JavaKit/generated/JavaInteger.swift index 7aadd187..10270d95 100644 --- a/Sources/JavaKit/generated/JavaInteger.swift +++ b/Sources/JavaKit/generated/JavaInteger.swift @@ -41,6 +41,9 @@ open class JavaInteger: JavaNumber { @JavaMethod open override func doubleValue() -> Double + + @JavaMethod + open func describeConstable() -> JavaOptional! } extension JavaClass { @JavaStaticField(isFinal: true) diff --git a/Sources/JavaKit/generated/JavaLong.swift b/Sources/JavaKit/generated/JavaLong.swift index 4cbe97ba..8d3a5582 100644 --- a/Sources/JavaKit/generated/JavaLong.swift +++ b/Sources/JavaKit/generated/JavaLong.swift @@ -41,6 +41,9 @@ open class JavaLong: JavaNumber { @JavaMethod open override func doubleValue() -> Double + + @JavaMethod + open func describeConstable() -> JavaOptional! } extension JavaClass { @JavaStaticField(isFinal: true) diff --git a/Sources/JavaKit/generated/JavaOptional.swift b/Sources/JavaKit/generated/JavaOptional.swift new file mode 100644 index 00000000..7190a55e --- /dev/null +++ b/Sources/JavaKit/generated/JavaOptional.swift @@ -0,0 +1,39 @@ +// Auto-generated by Java-to-Swift wrapper generator. +import JavaRuntime + +@JavaClass("java.util.Optional") +open class JavaOptional: JavaObject { + @JavaMethod + open func get() -> JavaObject! + + @JavaMethod + open override func equals(_ arg0: JavaObject?) -> Bool + + @JavaMethod + open override func toString() -> String + + @JavaMethod + open override func hashCode() -> Int32 + + @JavaMethod + open func isEmpty() -> Bool + + @JavaMethod + open func isPresent() -> Bool + + @JavaMethod + open func orElse(_ arg0: JavaObject?) -> JavaObject! + + @JavaMethod + open func orElseThrow() -> JavaObject! +} +extension JavaClass { + @JavaStaticMethod + public func of(_ arg0: JavaObject?) -> JavaOptional! where ObjectType == JavaOptional + + @JavaStaticMethod + public func empty() -> JavaOptional! where ObjectType == JavaOptional + + @JavaStaticMethod + public func ofNullable(_ arg0: JavaObject?) -> JavaOptional! where ObjectType == JavaOptional +} diff --git a/Sources/JavaKit/generated/JavaString.swift b/Sources/JavaKit/generated/JavaString.swift index adf1993d..b63e9411 100644 --- a/Sources/JavaKit/generated/JavaString.swift +++ b/Sources/JavaKit/generated/JavaString.swift @@ -206,6 +206,9 @@ open class JavaString: JavaObject { @JavaMethod open func intern() -> String + + @JavaMethod + open func describeConstable() -> JavaOptional! } extension JavaClass { @JavaStaticMethod diff --git a/Sources/JavaKit/swift-java.config b/Sources/JavaKit/swift-java.config index d02a10ed..c667e8b4 100644 --- a/Sources/JavaKit/swift-java.config +++ b/Sources/JavaKit/swift-java.config @@ -18,6 +18,7 @@ "java.lang.Short" : "JavaShort", "java.lang.String" : "JavaString", "java.lang.Throwable" : "Throwable", - "java.lang.Void" : "JavaVoid" + "java.lang.Void" : "JavaVoid", + "java.util.Optional": "JavaOptional" } } From f44a6ace0cdb28f6286ea3edd11b3106a3cc1b53 Mon Sep 17 00:00:00 2001 From: jrosen081 Date: Tue, 26 Nov 2024 22:34:46 -0500 Subject: [PATCH 02/11] Add return values --- .../Java2SwiftLib/JavaClassTranslator.swift | 14 +++--- Sources/Java2SwiftLib/StringExtras.swift | 5 +- Sources/JavaKit/AnyJavaObject.swift | 6 --- Sources/JavaKit/Optional+JavaOptional.swift | 8 ++- Sources/JavaKit/generated/JavaClass.swift | 3 ++ .../JavaKit/generated/JavaClassLoader.swift | 4 +- Sources/JavaKit/generated/JavaDouble.swift | 4 ++ Sources/JavaKit/generated/JavaFloat.swift | 4 ++ Sources/JavaKit/generated/JavaInteger.swift | 4 ++ Sources/JavaKit/generated/JavaLong.swift | 4 ++ Sources/JavaKit/generated/JavaOptional.swift | 12 +++++ Sources/JavaKit/generated/JavaString.swift | 4 ++ .../JavaKitCollection/generated/HashMap.swift | 50 +++++++++++++++++++ .../JavaKitCollection/generated/TreeMap.swift | 50 ------------------- .../generated/URLClassLoader.swift | 3 ++ 15 files changed, 105 insertions(+), 70 deletions(-) diff --git a/Sources/Java2SwiftLib/JavaClassTranslator.swift b/Sources/Java2SwiftLib/JavaClassTranslator.swift index a7a05adc..a8f115ec 100644 --- a/Sources/Java2SwiftLib/JavaClassTranslator.swift +++ b/Sources/Java2SwiftLib/JavaClassTranslator.swift @@ -568,14 +568,14 @@ extension JavaClassTranslator { ? "override " : "" - if let resultOptional = resultTypeStr.optionalWrappedType() { + if let resultOptional = resultType.optionalWrappedType() { let parameters = parameters.map { "\($0.secondName!.trimmedDescription)" }.joined(separator: ", ") return """ - \(methodAttribute)\(raw: accessModifier)\(raw: overrideOpt)func __\(raw: swiftMethodName)\(raw: genericParameterClause)(\(raw: parametersStr))\(raw: throwsStr)\(raw: resultTypeStr)\(raw: whereClause) + \(methodAttribute)\(raw: accessModifier)\(raw: overrideOpt)func \(raw: swiftMethodName)\(raw: genericParameterClause)(\(raw: parametersStr))\(raw: throwsStr)\(raw: resultTypeStr)\(raw: whereClause) - \(raw: accessModifier)\(raw: overrideOpt)func \(raw: swiftMethodName)\(raw: genericParameterClause)(\(raw: parametersStr))\(raw: throwsStr)\(raw: resultOptional)\(raw: whereClause) { - \(raw: javaMethod.throwsCheckedException ? "try " : "")__\(raw: swiftMethodName)(\(raw: parameters))?.toJavaOptional() - } + \(raw: accessModifier)\(raw: overrideOpt)func \(raw: swiftMethodName)Optional\(raw: genericParameterClause)(\(raw: parametersStr))\(raw: throwsStr) -> \(raw: resultOptional)\(raw: whereClause) { + Optional(javaOptional: \(raw: javaMethod.throwsCheckedException ? "try " : "")\(raw: swiftMethodName)(\(raw: parameters))) + } """ } else { return """ @@ -605,13 +605,13 @@ extension JavaClassTranslator { """ } else { "" } return """ - \(fieldAttribute)(isFinal: \(raw: javaField.isFinal)) + \(fieldAttribute)("\(raw: swiftFieldName)", isFinal: \(raw: javaField.isFinal)) public var __\(raw: swiftFieldName): \(raw: typeName) public var \(raw: swiftFieldName): \(raw: optionalType)? { get { - .init(__\(raw: swiftFieldName)) + Optional(javaOptional: __\(raw: swiftFieldName)) }\(raw: setter) } """ diff --git a/Sources/Java2SwiftLib/StringExtras.swift b/Sources/Java2SwiftLib/StringExtras.swift index 7436b4ab..8c95690b 100644 --- a/Sources/Java2SwiftLib/StringExtras.swift +++ b/Sources/Java2SwiftLib/StringExtras.swift @@ -41,9 +41,8 @@ extension String { } public func optionalWrappedType() -> String? { - print("\(self) printing this thing") - if starts(with: "JavaOptional<") { - return String(self[index(startIndex, offsetBy: 13)..")!]))?" } else { return nil } diff --git a/Sources/JavaKit/AnyJavaObject.swift b/Sources/JavaKit/AnyJavaObject.swift index 27c3e06d..5e0a88d0 100644 --- a/Sources/JavaKit/AnyJavaObject.swift +++ b/Sources/JavaKit/AnyJavaObject.swift @@ -56,12 +56,6 @@ public protocol CustomJavaClassLoader: AnyJavaObject { static func getJavaClassLoader(in environment: JNIEnvironment) throws -> JavaClassLoader! } -/// Add getClassLoader() to JavaObject as it is otherwise recursively defined -extension JavaObject { - @JavaMethod - public func getClassLoader() throws -> JavaClassLoader! -} - extension AnyJavaObject { /// Retrieve the underlying Java object. public var javaThis: jobject { diff --git a/Sources/JavaKit/Optional+JavaOptional.swift b/Sources/JavaKit/Optional+JavaOptional.swift index a4f640d1..b4f75f88 100644 --- a/Sources/JavaKit/Optional+JavaOptional.swift +++ b/Sources/JavaKit/Optional+JavaOptional.swift @@ -17,7 +17,11 @@ extension Optional where Wrapped: AnyJavaObject { return try! JavaClass>().ofNullable(self?.as(JavaObject.self)).as(JavaOptional.self)! } - init?(_ javaOptional: JavaOptional) { - self = javaOptional.isPresent() ? javaOptional.get().as(Wrapped.self) : Optional.none + init(javaOptional: JavaOptional?) { + if let javaOptional { + self = javaOptional.isPresent() ? javaOptional.get().as(Wrapped.self) : Optional.none + } else { + self = nil + } } } diff --git a/Sources/JavaKit/generated/JavaClass.swift b/Sources/JavaKit/generated/JavaClass.swift index 1ea4a079..03d7f5e6 100644 --- a/Sources/JavaKit/generated/JavaClass.swift +++ b/Sources/JavaKit/generated/JavaClass.swift @@ -133,6 +133,9 @@ open class JavaClass: JavaObject { open func isSealed() -> Bool } extension JavaClass { + @JavaStaticMethod + public func forName(_ arg0: String, _ arg1: Bool, _ arg2: JavaClassLoader?) throws -> JavaClass! where ObjectType == JavaClass + @JavaStaticMethod public func forName(_ arg0: String) throws -> JavaClass! where ObjectType == JavaClass diff --git a/Sources/JavaKit/generated/JavaClassLoader.swift b/Sources/JavaKit/generated/JavaClassLoader.swift index 43eaeb4e..6c877cc3 100644 --- a/Sources/JavaKit/generated/JavaClassLoader.swift +++ b/Sources/JavaKit/generated/JavaClassLoader.swift @@ -31,10 +31,10 @@ open class JavaClassLoader: JavaObject { open func resolveClass(_ arg0: JavaClass?) @JavaMethod - open func defineClass(_ arg0: [Int8], _ arg1: Int32, _ arg2: Int32) throws -> JavaClass! + open func defineClass(_ arg0: String, _ arg1: [Int8], _ arg2: Int32, _ arg3: Int32) throws -> JavaClass! @JavaMethod - open func defineClass(_ arg0: String, _ arg1: [Int8], _ arg2: Int32, _ arg3: Int32) throws -> JavaClass! + open func defineClass(_ arg0: [Int8], _ arg1: Int32, _ arg2: Int32) throws -> JavaClass! @JavaMethod open func findLibrary(_ arg0: String) -> String diff --git a/Sources/JavaKit/generated/JavaDouble.swift b/Sources/JavaKit/generated/JavaDouble.swift index 66ce9aa2..efa77a95 100644 --- a/Sources/JavaKit/generated/JavaDouble.swift +++ b/Sources/JavaKit/generated/JavaDouble.swift @@ -48,6 +48,10 @@ open class JavaDouble: JavaNumber { @JavaMethod open func describeConstable() -> JavaOptional! + open func describeConstableOptional() -> JavaDouble? { + Optional(javaOptional: describeConstable()) + } + @JavaMethod open func isNaN() -> Bool } diff --git a/Sources/JavaKit/generated/JavaFloat.swift b/Sources/JavaKit/generated/JavaFloat.swift index e686714a..0c38d1ae 100644 --- a/Sources/JavaKit/generated/JavaFloat.swift +++ b/Sources/JavaKit/generated/JavaFloat.swift @@ -51,6 +51,10 @@ open class JavaFloat: JavaNumber { @JavaMethod open func describeConstable() -> JavaOptional! + open func describeConstableOptional() -> JavaFloat? { + Optional(javaOptional: describeConstable()) + } + @JavaMethod open func isNaN() -> Bool } diff --git a/Sources/JavaKit/generated/JavaInteger.swift b/Sources/JavaKit/generated/JavaInteger.swift index 10270d95..e5cd5fc1 100644 --- a/Sources/JavaKit/generated/JavaInteger.swift +++ b/Sources/JavaKit/generated/JavaInteger.swift @@ -44,6 +44,10 @@ open class JavaInteger: JavaNumber { @JavaMethod open func describeConstable() -> JavaOptional! + + open func describeConstableOptional() -> JavaInteger? { + Optional(javaOptional: describeConstable()) + } } extension JavaClass { @JavaStaticField(isFinal: true) diff --git a/Sources/JavaKit/generated/JavaLong.swift b/Sources/JavaKit/generated/JavaLong.swift index 8d3a5582..491ef1dd 100644 --- a/Sources/JavaKit/generated/JavaLong.swift +++ b/Sources/JavaKit/generated/JavaLong.swift @@ -44,6 +44,10 @@ open class JavaLong: JavaNumber { @JavaMethod open func describeConstable() -> JavaOptional! + + open func describeConstableOptional() -> JavaLong? { + Optional(javaOptional: describeConstable()) + } } extension JavaClass { @JavaStaticField(isFinal: true) diff --git a/Sources/JavaKit/generated/JavaOptional.swift b/Sources/JavaKit/generated/JavaOptional.swift index 7190a55e..bd77cfed 100644 --- a/Sources/JavaKit/generated/JavaOptional.swift +++ b/Sources/JavaKit/generated/JavaOptional.swift @@ -31,9 +31,21 @@ extension JavaClass { @JavaStaticMethod public func of(_ arg0: JavaObject?) -> JavaOptional! where ObjectType == JavaOptional + public func ofOptional(_ arg0: JavaObject?) -> JavaObject? where ObjectType == JavaOptional { + Optional(javaOptional: of(arg0)) + } + @JavaStaticMethod public func empty() -> JavaOptional! where ObjectType == JavaOptional + public func emptyOptional() -> JavaObject? where ObjectType == JavaOptional { + Optional(javaOptional: empty()) + } + @JavaStaticMethod public func ofNullable(_ arg0: JavaObject?) -> JavaOptional! where ObjectType == JavaOptional + + public func ofNullableOptional(_ arg0: JavaObject?) -> JavaObject? where ObjectType == JavaOptional { + Optional(javaOptional: ofNullable(arg0)) + } } diff --git a/Sources/JavaKit/generated/JavaString.swift b/Sources/JavaKit/generated/JavaString.swift index b63e9411..34d0080c 100644 --- a/Sources/JavaKit/generated/JavaString.swift +++ b/Sources/JavaKit/generated/JavaString.swift @@ -209,6 +209,10 @@ open class JavaString: JavaObject { @JavaMethod open func describeConstable() -> JavaOptional! + + open func describeConstableOptional() -> JavaString? { + Optional(javaOptional: describeConstable()) + } } extension JavaClass { @JavaStaticMethod diff --git a/Sources/JavaKitCollection/generated/HashMap.swift b/Sources/JavaKitCollection/generated/HashMap.swift index 424dfbb9..e8cfa118 100644 --- a/Sources/JavaKitCollection/generated/HashMap.swift +++ b/Sources/JavaKitCollection/generated/HashMap.swift @@ -61,6 +61,56 @@ open class HashMap: JavaObject { @JavaMethod open func getOrDefault(_ arg0: JavaObject?, _ arg1: JavaObject?) -> JavaObject! } +extension HashMap { + @JavaClass("java.util.AbstractMap$SimpleEntry") + open class SimpleEntry: JavaObject { + @JavaMethod + @_nonoverride public convenience init(_ arg0: JavaObject?, _ arg1: JavaObject?, environment: JNIEnvironment? = nil) + + @JavaMethod + open override func equals(_ arg0: JavaObject?) -> Bool + + @JavaMethod + open override func toString() -> String + + @JavaMethod + open override func hashCode() -> Int32 + + @JavaMethod + open func getValue() -> JavaObject! + + @JavaMethod + open func getKey() -> JavaObject! + + @JavaMethod + open func setValue(_ arg0: JavaObject?) -> JavaObject! + } +} +extension HashMap { + @JavaClass("java.util.AbstractMap$SimpleImmutableEntry") + open class SimpleImmutableEntry: JavaObject { + @JavaMethod + @_nonoverride public convenience init(_ arg0: JavaObject?, _ arg1: JavaObject?, environment: JNIEnvironment? = nil) + + @JavaMethod + open override func equals(_ arg0: JavaObject?) -> Bool + + @JavaMethod + open override func toString() -> String + + @JavaMethod + open override func hashCode() -> Int32 + + @JavaMethod + open func getValue() -> JavaObject! + + @JavaMethod + open func getKey() -> JavaObject! + + @JavaMethod + open func setValue(_ arg0: JavaObject?) -> JavaObject! + } +} extension JavaClass { @JavaStaticMethod public func newHashMap(_ arg0: Int32) -> HashMap! where ObjectType == HashMap diff --git a/Sources/JavaKitCollection/generated/TreeMap.swift b/Sources/JavaKitCollection/generated/TreeMap.swift index 7796d555..79560905 100644 --- a/Sources/JavaKitCollection/generated/TreeMap.swift +++ b/Sources/JavaKitCollection/generated/TreeMap.swift @@ -70,53 +70,3 @@ open class TreeMap: JavaObject { @JavaMethod open func lastKey() -> JavaObject! } -extension TreeMap { - @JavaClass("java.util.AbstractMap$SimpleEntry") - open class SimpleEntry: JavaObject { - @JavaMethod - @_nonoverride public convenience init(_ arg0: JavaObject?, _ arg1: JavaObject?, environment: JNIEnvironment? = nil) - - @JavaMethod - open override func equals(_ arg0: JavaObject?) -> Bool - - @JavaMethod - open override func toString() -> String - - @JavaMethod - open override func hashCode() -> Int32 - - @JavaMethod - open func getValue() -> JavaObject! - - @JavaMethod - open func getKey() -> JavaObject! - - @JavaMethod - open func setValue(_ arg0: JavaObject?) -> JavaObject! - } -} -extension TreeMap { - @JavaClass("java.util.AbstractMap$SimpleImmutableEntry") - open class SimpleImmutableEntry: JavaObject { - @JavaMethod - @_nonoverride public convenience init(_ arg0: JavaObject?, _ arg1: JavaObject?, environment: JNIEnvironment? = nil) - - @JavaMethod - open override func equals(_ arg0: JavaObject?) -> Bool - - @JavaMethod - open override func toString() -> String - - @JavaMethod - open override func hashCode() -> Int32 - - @JavaMethod - open func getValue() -> JavaObject! - - @JavaMethod - open func getKey() -> JavaObject! - - @JavaMethod - open func setValue(_ arg0: JavaObject?) -> JavaObject! - } -} diff --git a/Sources/JavaKitNetwork/generated/URLClassLoader.swift b/Sources/JavaKitNetwork/generated/URLClassLoader.swift index ba977e07..eac9c14c 100644 --- a/Sources/JavaKitNetwork/generated/URLClassLoader.swift +++ b/Sources/JavaKitNetwork/generated/URLClassLoader.swift @@ -27,6 +27,9 @@ open class URLClassLoader: JavaObject { open func getURLs() -> [URL?] } extension JavaClass { + @JavaStaticMethod + public func newInstance(_ arg0: [URL?], _ arg1: JavaClassLoader?) -> URLClassLoader! + @JavaStaticMethod public func newInstance(_ arg0: [URL?]) -> URLClassLoader! } From 4a55cb6d31243ae294604ec7bce28b501c134572 Mon Sep 17 00:00:00 2001 From: jrosen081 Date: Tue, 26 Nov 2024 22:50:06 -0500 Subject: [PATCH 03/11] Add friends --- Sources/Java2SwiftLib/StringExtras.swift | 8 ++- Sources/JavaKit/Optional+JavaOptional.swift | 54 +++++++++++++++++++ .../generated/JavaOptionalDouble.swift | 44 +++++++++++++++ .../JavaKit/generated/JavaOptionalInt.swift | 44 +++++++++++++++ .../JavaKit/generated/JavaOptionalLong.swift | 44 +++++++++++++++ Sources/JavaKit/swift-java.config | 5 +- 6 files changed, 197 insertions(+), 2 deletions(-) create mode 100644 Sources/JavaKit/generated/JavaOptionalDouble.swift create mode 100644 Sources/JavaKit/generated/JavaOptionalInt.swift create mode 100644 Sources/JavaKit/generated/JavaOptionalLong.swift diff --git a/Sources/Java2SwiftLib/StringExtras.swift b/Sources/Java2SwiftLib/StringExtras.swift index 8c95690b..ca43e96e 100644 --- a/Sources/Java2SwiftLib/StringExtras.swift +++ b/Sources/Java2SwiftLib/StringExtras.swift @@ -41,7 +41,13 @@ extension String { } public func optionalWrappedType() -> String? { - if hasPrefix("JavaOptional<") { + if self == "JavaOptionalInt!" { + return "Int32?" + } else if self == "JavaOptionalDouble!" { + return "Double?" + } else if self == "JavaOptionalLong!" { + return "Int64?" + } else if hasPrefix("JavaOptional<") { return "\(String(self[index(startIndex, offsetBy: 13)..")!]))?" } else { return nil diff --git a/Sources/JavaKit/Optional+JavaOptional.swift b/Sources/JavaKit/Optional+JavaOptional.swift index b4f75f88..7296d18c 100644 --- a/Sources/JavaKit/Optional+JavaOptional.swift +++ b/Sources/JavaKit/Optional+JavaOptional.swift @@ -25,3 +25,57 @@ extension Optional where Wrapped: AnyJavaObject { } } } + +extension Optional where Wrapped == Double { + func toJavaOptional() -> JavaOptionalDouble { + if let self { + return try! JavaClass().of(self)! + } else { + return try! JavaClass().empty()! + } + } + + init(javaOptional: JavaOptionalDouble?) { + if let javaOptional { + self = javaOptional.isPresent() ? javaOptional.getAsDouble() : nil + } else { + self = nil + } + } +} + +extension Optional where Wrapped == Int32 { + func toJavaOptional() -> JavaOptionalInt { + if let self { + return try! JavaClass().of(self)! + } else { + return try! JavaClass().empty()! + } + } + + init(javaOptional: JavaOptionalInt?) { + if let javaOptional { + self = javaOptional.isPresent() ? javaOptional.getAsInt() : nil + } else { + self = nil + } + } +} + +extension Optional where Wrapped == Int64 { + func toJavaOptional() -> JavaOptionalLong { + if let self { + return try! JavaClass().of(self)! + } else { + return try! JavaClass().empty()! + } + } + + init(javaOptional: JavaOptionalLong?) { + if let javaOptional { + self = javaOptional.isPresent() ? javaOptional.getAsLong() : nil + } else { + self = nil + } + } +} diff --git a/Sources/JavaKit/generated/JavaOptionalDouble.swift b/Sources/JavaKit/generated/JavaOptionalDouble.swift new file mode 100644 index 00000000..5926282a --- /dev/null +++ b/Sources/JavaKit/generated/JavaOptionalDouble.swift @@ -0,0 +1,44 @@ +// Auto-generated by Java-to-Swift wrapper generator. +import JavaRuntime + +@JavaClass("java.util.OptionalDouble") +open class JavaOptionalDouble: JavaObject { + @JavaMethod + open override func equals(_ arg0: JavaObject?) -> Bool + + @JavaMethod + open override func toString() -> String + + @JavaMethod + open override func hashCode() -> Int32 + + @JavaMethod + open func isEmpty() -> Bool + + @JavaMethod + open func isPresent() -> Bool + + @JavaMethod + open func orElse(_ arg0: Double) -> Double + + @JavaMethod + open func orElseThrow() -> Double + + @JavaMethod + open func getAsDouble() -> Double +} +extension JavaClass { + @JavaStaticMethod + public func of(_ arg0: Double) -> JavaOptionalDouble! + + public func ofOptional(_ arg0: Double) -> Double? { + Optional(javaOptional: of(arg0)) + } + + @JavaStaticMethod + public func empty() -> JavaOptionalDouble! + + public func emptyOptional() -> Double? { + Optional(javaOptional: empty()) + } +} diff --git a/Sources/JavaKit/generated/JavaOptionalInt.swift b/Sources/JavaKit/generated/JavaOptionalInt.swift new file mode 100644 index 00000000..1237a085 --- /dev/null +++ b/Sources/JavaKit/generated/JavaOptionalInt.swift @@ -0,0 +1,44 @@ +// Auto-generated by Java-to-Swift wrapper generator. +import JavaRuntime + +@JavaClass("java.util.OptionalInt") +open class JavaOptionalInt: JavaObject { + @JavaMethod + open override func equals(_ arg0: JavaObject?) -> Bool + + @JavaMethod + open override func toString() -> String + + @JavaMethod + open override func hashCode() -> Int32 + + @JavaMethod + open func isEmpty() -> Bool + + @JavaMethod + open func isPresent() -> Bool + + @JavaMethod + open func orElse(_ arg0: Int32) -> Int32 + + @JavaMethod + open func orElseThrow() -> Int32 + + @JavaMethod + open func getAsInt() -> Int32 +} +extension JavaClass { + @JavaStaticMethod + public func of(_ arg0: Int32) -> JavaOptionalInt! + + public func ofOptional(_ arg0: Int32) -> Int32? { + Optional(javaOptional: of(arg0)) + } + + @JavaStaticMethod + public func empty() -> JavaOptionalInt! + + public func emptyOptional() -> Int32? { + Optional(javaOptional: empty()) + } +} diff --git a/Sources/JavaKit/generated/JavaOptionalLong.swift b/Sources/JavaKit/generated/JavaOptionalLong.swift new file mode 100644 index 00000000..79a9e06f --- /dev/null +++ b/Sources/JavaKit/generated/JavaOptionalLong.swift @@ -0,0 +1,44 @@ +// Auto-generated by Java-to-Swift wrapper generator. +import JavaRuntime + +@JavaClass("java.util.OptionalLong") +open class JavaOptionalLong: JavaObject { + @JavaMethod + open override func equals(_ arg0: JavaObject?) -> Bool + + @JavaMethod + open override func toString() -> String + + @JavaMethod + open override func hashCode() -> Int32 + + @JavaMethod + open func isEmpty() -> Bool + + @JavaMethod + open func isPresent() -> Bool + + @JavaMethod + open func orElse(_ arg0: Int64) -> Int64 + + @JavaMethod + open func orElseThrow() -> Int64 + + @JavaMethod + open func getAsLong() -> Int64 +} +extension JavaClass { + @JavaStaticMethod + public func of(_ arg0: Int64) -> JavaOptionalLong! + + public func ofOptional(_ arg0: Int64) -> Int64? { + Optional(javaOptional: of(arg0)) + } + + @JavaStaticMethod + public func empty() -> JavaOptionalLong! + + public func emptyOptional() -> Int64? { + Optional(javaOptional: empty()) + } +} diff --git a/Sources/JavaKit/swift-java.config b/Sources/JavaKit/swift-java.config index c667e8b4..34751edd 100644 --- a/Sources/JavaKit/swift-java.config +++ b/Sources/JavaKit/swift-java.config @@ -19,6 +19,9 @@ "java.lang.String" : "JavaString", "java.lang.Throwable" : "Throwable", "java.lang.Void" : "JavaVoid", - "java.util.Optional": "JavaOptional" + "java.util.Optional": "JavaOptional", + "java.util.OptionalDouble": "JavaOptionalDouble", + "java.util.OptionalInt": "JavaOptionalInt", + "java.util.OptionalLong": "JavaOptionalLong" } } From 79fd9eacbd34098c4d52a15c64d0541ca7a84a20 Mon Sep 17 00:00:00 2001 From: jrosen081 Date: Tue, 26 Nov 2024 23:21:03 -0500 Subject: [PATCH 04/11] Rename --- Sources/Java2SwiftLib/JavaClassTranslator.swift | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/Sources/Java2SwiftLib/JavaClassTranslator.swift b/Sources/Java2SwiftLib/JavaClassTranslator.swift index a8f115ec..fb887463 100644 --- a/Sources/Java2SwiftLib/JavaClassTranslator.swift +++ b/Sources/Java2SwiftLib/JavaClassTranslator.swift @@ -570,6 +570,7 @@ extension JavaClassTranslator { if let resultOptional = resultType.optionalWrappedType() { let parameters = parameters.map { "\($0.secondName!.trimmedDescription)" }.joined(separator: ", ") + return """ \(methodAttribute)\(raw: accessModifier)\(raw: overrideOpt)func \(raw: swiftMethodName)\(raw: genericParameterClause)(\(raw: parametersStr))\(raw: throwsStr)\(raw: resultTypeStr)\(raw: whereClause) @@ -600,18 +601,18 @@ extension JavaClassTranslator { """ set { - __\(swiftFieldName) = newValue?.toJavaOptional() + \(swiftFieldName) = newValue?.toJavaOptional() } """ } else { "" } return """ - \(fieldAttribute)("\(raw: swiftFieldName)", isFinal: \(raw: javaField.isFinal)) - public var __\(raw: swiftFieldName): \(raw: typeName) + \(fieldAttribute)(isFinal: \(raw: javaField.isFinal)) + public var \(raw: swiftFieldName): \(raw: typeName) - public var \(raw: swiftFieldName): \(raw: optionalType)? { + public var \(raw: swiftFieldName)Optional: \(raw: optionalType)? { get { - Optional(javaOptional: __\(raw: swiftFieldName)) + Optional(javaOptional: \(raw: swiftFieldName)) }\(raw: setter) } """ From d1c2443422deea1cb5063a3691328a16dc370d2b Mon Sep 17 00:00:00 2001 From: jrosen081 Date: Tue, 26 Nov 2024 23:21:57 -0500 Subject: [PATCH 05/11] Add setter if not final --- Sources/Java2SwiftLib/JavaClassTranslator.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/Java2SwiftLib/JavaClassTranslator.swift b/Sources/Java2SwiftLib/JavaClassTranslator.swift index fb887463..61950d7b 100644 --- a/Sources/Java2SwiftLib/JavaClassTranslator.swift +++ b/Sources/Java2SwiftLib/JavaClassTranslator.swift @@ -597,7 +597,7 @@ extension JavaClassTranslator { let swiftFieldName = javaField.getName().escapedSwiftName if let optionalType = swiftTypeName.optionalWrappedType() { - let setter = if javaField.isFinal { + let setter = if !javaField.isFinal { """ set { From eb82b81d10153b76e07b6fe19de79d55b705daca Mon Sep 17 00:00:00 2001 From: jrosen081 Date: Tue, 26 Nov 2024 23:37:57 -0500 Subject: [PATCH 06/11] Add args --- .../Java2SwiftLib/JavaClassTranslator.swift | 25 ++++++++++++++++--- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/Sources/Java2SwiftLib/JavaClassTranslator.swift b/Sources/Java2SwiftLib/JavaClassTranslator.swift index 61950d7b..cb2072a1 100644 --- a/Sources/Java2SwiftLib/JavaClassTranslator.swift +++ b/Sources/Java2SwiftLib/JavaClassTranslator.swift @@ -568,14 +568,31 @@ extension JavaClassTranslator { ? "override " : "" - if let resultOptional = resultType.optionalWrappedType() { - let parameters = parameters.map { "\($0.secondName!.trimmedDescription)" }.joined(separator: ", ") + if resultType.optionalWrappedType() != nil || parameters.contains(where: { $0.type.trimmedDescription.optionalWrappedType() != nil }) { + let parameters = parameters.map { param -> (clause: FunctionParameterSyntax, passedArg: String) in + let name = param.secondName!.trimmedDescription + + return if let optionalType = param.type.trimmedDescription.optionalWrappedType() { + (clause: FunctionParameterSyntax(firstName: "_", secondName: "\(raw: name)", type: TypeSyntax(stringLiteral: "\(optionalType)")), passedArg: "\(name)?.toJavaOptional()") + } else { + (clause: param, passedArg: "\(name)") + } + } + + let resultOptional: String = resultType.optionalWrappedType() ?? resultType + let baseBody: ExprSyntax = "Optional(javaOptional: \(raw: javaMethod.throwsCheckedException ? "try " : "")\(raw: swiftMethodName)(\(raw: parameters.map(\.passedArg).joined(separator: ", "))))" + let body: ExprSyntax = if let optionalType = resultType.optionalWrappedType() { + "Optional(javaOptional: \(baseBody))" + } else { + baseBody + } + return """ \(methodAttribute)\(raw: accessModifier)\(raw: overrideOpt)func \(raw: swiftMethodName)\(raw: genericParameterClause)(\(raw: parametersStr))\(raw: throwsStr)\(raw: resultTypeStr)\(raw: whereClause) - \(raw: accessModifier)\(raw: overrideOpt)func \(raw: swiftMethodName)Optional\(raw: genericParameterClause)(\(raw: parametersStr))\(raw: throwsStr) -> \(raw: resultOptional)\(raw: whereClause) { - Optional(javaOptional: \(raw: javaMethod.throwsCheckedException ? "try " : "")\(raw: swiftMethodName)(\(raw: parameters))) + \(raw: accessModifier)\(raw: overrideOpt)func \(raw: swiftMethodName)Optional\(raw: genericParameterClause)(\(raw: parameters.map(\.clause.description).joined(separator: ", ")))\(raw: throwsStr) -> \(raw: resultOptional)\(raw: whereClause) { + \(body) } """ } else { From e35f9414404bf6138c339b74f7533c1d618b20c6 Mon Sep 17 00:00:00 2001 From: jrosen081 Date: Tue, 26 Nov 2024 23:40:32 -0500 Subject: [PATCH 07/11] second wrapping --- Sources/Java2SwiftLib/JavaClassTranslator.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/Java2SwiftLib/JavaClassTranslator.swift b/Sources/Java2SwiftLib/JavaClassTranslator.swift index cb2072a1..7c4937d3 100644 --- a/Sources/Java2SwiftLib/JavaClassTranslator.swift +++ b/Sources/Java2SwiftLib/JavaClassTranslator.swift @@ -580,7 +580,7 @@ extension JavaClassTranslator { } let resultOptional: String = resultType.optionalWrappedType() ?? resultType - let baseBody: ExprSyntax = "Optional(javaOptional: \(raw: javaMethod.throwsCheckedException ? "try " : "")\(raw: swiftMethodName)(\(raw: parameters.map(\.passedArg).joined(separator: ", "))))" + let baseBody: ExprSyntax = "\(raw: javaMethod.throwsCheckedException ? "try " : "")\(raw: swiftMethodName)(\(raw: parameters.map(\.passedArg).joined(separator: ", ")))" let body: ExprSyntax = if let optionalType = resultType.optionalWrappedType() { "Optional(javaOptional: \(baseBody))" } else { From 424d49246e9aad97e9b43b95caa07888baf9705a Mon Sep 17 00:00:00 2001 From: jrosen081 Date: Tue, 26 Nov 2024 23:50:41 -0500 Subject: [PATCH 08/11] Update sample --- .../Sources/JavaKitExample/JavaKitExample.swift | 7 ++++++- .../com/example/swift/ThreadSafeHelperClass.java | 12 ++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/Samples/JavaKitSampleApp/Sources/JavaKitExample/JavaKitExample.swift b/Samples/JavaKitSampleApp/Sources/JavaKitExample/JavaKitExample.swift index 366e8894..149eddaf 100644 --- a/Samples/JavaKitSampleApp/Sources/JavaKitExample/JavaKitExample.swift +++ b/Samples/JavaKitSampleApp/Sources/JavaKitExample/JavaKitExample.swift @@ -77,7 +77,12 @@ extension HelloSwift: HelloSwiftNativeMethods { } // Make sure that the thread safe class is sendable - let threadSafe: Sendable = ThreadSafeHelperClass(environment: javaEnvironment) + let helper = ThreadSafeHelperClass(environment: javaEnvironment) + let threadSafe: Sendable = helper + + let text: String? = helper.textOptional + let value: String? = helper.getValueOptional(Optional.none) + let textFunc: String? = helper.getTextOptional() return i * j } diff --git a/Samples/JavaKitSampleApp/Sources/JavaKitExample/com/example/swift/ThreadSafeHelperClass.java b/Samples/JavaKitSampleApp/Sources/JavaKitExample/com/example/swift/ThreadSafeHelperClass.java index 179b8cd6..a10dc51f 100644 --- a/Samples/JavaKitSampleApp/Sources/JavaKitExample/com/example/swift/ThreadSafeHelperClass.java +++ b/Samples/JavaKitSampleApp/Sources/JavaKitExample/com/example/swift/ThreadSafeHelperClass.java @@ -14,7 +14,19 @@ package com.example.swift; +import java.util.Optional; + @ThreadSafe public class ThreadSafeHelperClass { public ThreadSafeHelperClass() { } + + public Optional text = Optional.of(""); + + public String getValue(Optional name) { + return name.orElse(""); + } + + public Optional getText() { + return text; + } } From 8a2ed6553cb0399e34996470b58ae9130b7af410 Mon Sep 17 00:00:00 2001 From: Jack Rosen Date: Wed, 27 Nov 2024 00:11:42 -0500 Subject: [PATCH 09/11] Remove extraneous ? --- Sources/Java2SwiftLib/JavaClassTranslator.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/Java2SwiftLib/JavaClassTranslator.swift b/Sources/Java2SwiftLib/JavaClassTranslator.swift index 7c4937d3..c9837381 100644 --- a/Sources/Java2SwiftLib/JavaClassTranslator.swift +++ b/Sources/Java2SwiftLib/JavaClassTranslator.swift @@ -627,7 +627,7 @@ extension JavaClassTranslator { public var \(raw: swiftFieldName): \(raw: typeName) - public var \(raw: swiftFieldName)Optional: \(raw: optionalType)? { + public var \(raw: swiftFieldName)Optional: \(raw: optionalType) { get { Optional(javaOptional: \(raw: swiftFieldName)) }\(raw: setter) From 8245e85d04862064db41d0b6f34bbaa7c88e8954 Mon Sep 17 00:00:00 2001 From: jrosen081 Date: Wed, 27 Nov 2024 09:15:52 -0500 Subject: [PATCH 10/11] Fix build + feedback --- .../Sources/JavaKitExample/JavaKitExample.swift | 10 +++++++--- Sources/Java2SwiftLib/JavaClassTranslator.swift | 10 ++++++---- Sources/Java2SwiftLib/StringExtras.swift | 7 ++++--- Sources/JavaKit/Optional+JavaOptional.swift | 8 ++++---- 4 files changed, 21 insertions(+), 14 deletions(-) diff --git a/Samples/JavaKitSampleApp/Sources/JavaKitExample/JavaKitExample.swift b/Samples/JavaKitSampleApp/Sources/JavaKitExample/JavaKitExample.swift index 149eddaf..466a4e9e 100644 --- a/Samples/JavaKitSampleApp/Sources/JavaKitExample/JavaKitExample.swift +++ b/Samples/JavaKitSampleApp/Sources/JavaKitExample/JavaKitExample.swift @@ -80,13 +80,17 @@ extension HelloSwift: HelloSwiftNativeMethods { let helper = ThreadSafeHelperClass(environment: javaEnvironment) let threadSafe: Sendable = helper - let text: String? = helper.textOptional - let value: String? = helper.getValueOptional(Optional.none) - let textFunc: String? = helper.getTextOptional() + checkOptionals(helper: helper) return i * j } + func checkOptionals(helper: ThreadSafeHelperClass) { + let text: JavaString? = helper.textOptional + let value: String? = helper.getValueOptional(Optional.none) + let textFunc: JavaString? = helper.getTextOptional() + } + @JavaMethod func throwMessageFromSwift(_ message: String) throws -> String { throw SwiftWrappedError.message(message) diff --git a/Sources/Java2SwiftLib/JavaClassTranslator.swift b/Sources/Java2SwiftLib/JavaClassTranslator.swift index c9837381..bfd1657f 100644 --- a/Sources/Java2SwiftLib/JavaClassTranslator.swift +++ b/Sources/Java2SwiftLib/JavaClassTranslator.swift @@ -573,7 +573,7 @@ extension JavaClassTranslator { let name = param.secondName!.trimmedDescription return if let optionalType = param.type.trimmedDescription.optionalWrappedType() { - (clause: FunctionParameterSyntax(firstName: "_", secondName: "\(raw: name)", type: TypeSyntax(stringLiteral: "\(optionalType)")), passedArg: "\(name)?.toJavaOptional()") + (clause: "_ \(raw: name): \(raw: optionalType)", passedArg: "\(name).toJavaOptional()") } else { (clause: param, passedArg: "\(name)") } @@ -613,15 +613,17 @@ extension JavaClassTranslator { let fieldAttribute: AttributeSyntax = javaField.isStatic ? "@JavaStaticField" : "@JavaField"; let swiftFieldName = javaField.getName().escapedSwiftName - if let optionalType = swiftTypeName.optionalWrappedType() { + if let optionalType = typeName.optionalWrappedType() { let setter = if !javaField.isFinal { """ set { - \(swiftFieldName) = newValue?.toJavaOptional() + \(swiftFieldName) = newValue.toJavaOptional() } """ - } else { "" } + } else { + "" + } return """ \(fieldAttribute)(isFinal: \(raw: javaField.isFinal)) public var \(raw: swiftFieldName): \(raw: typeName) diff --git a/Sources/Java2SwiftLib/StringExtras.swift b/Sources/Java2SwiftLib/StringExtras.swift index ca43e96e..e67cd131 100644 --- a/Sources/Java2SwiftLib/StringExtras.swift +++ b/Sources/Java2SwiftLib/StringExtras.swift @@ -43,12 +43,13 @@ extension String { public func optionalWrappedType() -> String? { if self == "JavaOptionalInt!" { return "Int32?" - } else if self == "JavaOptionalDouble!" { - return "Double?" } else if self == "JavaOptionalLong!" { return "Int64?" + } else if self == "JavaOptionalDouble!" { + return "Double?" } else if hasPrefix("JavaOptional<") { - return "\(String(self[index(startIndex, offsetBy: 13)..")!]))?" + let offsetCount = "JavaOptional<".count + return "\(String(self[index(startIndex, offsetBy: offsetCount)..")!]))?" } else { return nil } diff --git a/Sources/JavaKit/Optional+JavaOptional.swift b/Sources/JavaKit/Optional+JavaOptional.swift index 7296d18c..c9becd58 100644 --- a/Sources/JavaKit/Optional+JavaOptional.swift +++ b/Sources/JavaKit/Optional+JavaOptional.swift @@ -12,7 +12,7 @@ // //===----------------------------------------------------------------------===// -extension Optional where Wrapped: AnyJavaObject { +public extension Optional where Wrapped: AnyJavaObject { func toJavaOptional() -> JavaOptional { return try! JavaClass>().ofNullable(self?.as(JavaObject.self)).as(JavaOptional.self)! } @@ -26,7 +26,7 @@ extension Optional where Wrapped: AnyJavaObject { } } -extension Optional where Wrapped == Double { +public extension Optional where Wrapped == Double { func toJavaOptional() -> JavaOptionalDouble { if let self { return try! JavaClass().of(self)! @@ -44,7 +44,7 @@ extension Optional where Wrapped == Double { } } -extension Optional where Wrapped == Int32 { +public extension Optional where Wrapped == Int32 { func toJavaOptional() -> JavaOptionalInt { if let self { return try! JavaClass().of(self)! @@ -62,7 +62,7 @@ extension Optional where Wrapped == Int32 { } } -extension Optional where Wrapped == Int64 { +public extension Optional where Wrapped == Int64 { func toJavaOptional() -> JavaOptionalLong { if let self { return try! JavaClass().of(self)! From d72a41327ff29349b92ca6b38ce01c2d33d476e8 Mon Sep 17 00:00:00 2001 From: jrosen081 Date: Wed, 27 Nov 2024 09:25:26 -0500 Subject: [PATCH 11/11] Small fixes for optionals --- .../Sources/JavaKitExample/JavaKitExample.swift | 7 +++++++ .../com/example/swift/ThreadSafeHelperClass.java | 9 +++++++++ Sources/Java2SwiftLib/StringExtras.swift | 6 +++--- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/Samples/JavaKitSampleApp/Sources/JavaKitExample/JavaKitExample.swift b/Samples/JavaKitSampleApp/Sources/JavaKitExample/JavaKitExample.swift index 466a4e9e..f074fee6 100644 --- a/Samples/JavaKitSampleApp/Sources/JavaKitExample/JavaKitExample.swift +++ b/Samples/JavaKitSampleApp/Sources/JavaKitExample/JavaKitExample.swift @@ -89,6 +89,13 @@ extension HelloSwift: HelloSwiftNativeMethods { let text: JavaString? = helper.textOptional let value: String? = helper.getValueOptional(Optional.none) let textFunc: JavaString? = helper.getTextOptional() + let doubleOpt: Double? = helper.valOptional + let longOpt: Int64? = helper.fromOptional(21 as Int32?) + print("Optional text = \(text)") + print("Optional string value = \(value)") + print("Optional text function returned \(textFunc)") + print("Optional double function returned \(doubleOpt)") + print("Optional long function returned \(longOpt)") } @JavaMethod diff --git a/Samples/JavaKitSampleApp/Sources/JavaKitExample/com/example/swift/ThreadSafeHelperClass.java b/Samples/JavaKitSampleApp/Sources/JavaKitExample/com/example/swift/ThreadSafeHelperClass.java index a10dc51f..3b7793f0 100644 --- a/Samples/JavaKitSampleApp/Sources/JavaKitExample/com/example/swift/ThreadSafeHelperClass.java +++ b/Samples/JavaKitSampleApp/Sources/JavaKitExample/com/example/swift/ThreadSafeHelperClass.java @@ -15,6 +15,9 @@ package com.example.swift; import java.util.Optional; +import java.util.OptionalLong; +import java.util.OptionalInt; +import java.util.OptionalDouble; @ThreadSafe public class ThreadSafeHelperClass { @@ -22,6 +25,8 @@ public ThreadSafeHelperClass() { } public Optional text = Optional.of(""); + public final OptionalDouble val = OptionalDouble.of(2); + public String getValue(Optional name) { return name.orElse(""); } @@ -29,4 +34,8 @@ public String getValue(Optional name) { public Optional getText() { return text; } + + public OptionalLong from(OptionalInt value) { + return OptionalLong.of(value.getAsInt()); + } } diff --git a/Sources/Java2SwiftLib/StringExtras.swift b/Sources/Java2SwiftLib/StringExtras.swift index e67cd131..e69f379c 100644 --- a/Sources/Java2SwiftLib/StringExtras.swift +++ b/Sources/Java2SwiftLib/StringExtras.swift @@ -41,11 +41,11 @@ extension String { } public func optionalWrappedType() -> String? { - if self == "JavaOptionalInt!" { + if self == "JavaOptionalInt!" || self == "JavaOptionalInt?" { return "Int32?" - } else if self == "JavaOptionalLong!" { + } else if self == "JavaOptionalLong!" || self == "JavaOptionalLong?" { return "Int64?" - } else if self == "JavaOptionalDouble!" { + } else if self == "JavaOptionalDouble!" || self == "JavaOptionalDouble?" { return "Double?" } else if hasPrefix("JavaOptional<") { let offsetCount = "JavaOptional<".count