From 70edd09318f255408903ab9216d8924b14d49f0b Mon Sep 17 00:00:00 2001 From: jrosen081 Date: Wed, 9 Oct 2024 09:16:24 -0400 Subject: [PATCH 1/5] Add Support for Field Accessors --- Makefile | 2 +- Sources/Java2Swift/JavaTranslator.swift | 30 +++++++++++++++++++ .../JavaKitReflection/Field+Utilities.swift | 20 +++++++++++++ .../JavaClass+Reflection.swift | 3 ++ 4 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 Sources/JavaKitReflection/Field+Utilities.swift diff --git a/Makefile b/Makefile index 3528d1a6..7e067cce 100644 --- a/Makefile +++ b/Makefile @@ -55,7 +55,7 @@ generate-JavaKit: Java2Swift generate-JavaKitReflection: Java2Swift generate-JavaKit mkdir -p Sources/JavaKitReflection/generated - $(BUILD_DIR)/debug/Java2Swift --module-name JavaKitReflection --manifests Sources/JavaKit/generated/JavaKit.swift2java -o Sources/JavaKitReflection/generated java.lang.reflect.Method java.lang.reflect.Type java.lang.reflect.Constructor java.lang.reflect.Parameter java.lang.reflect.ParameterizedType java.lang.reflect.Executable java.lang.reflect.AnnotatedType java.lang.reflect.TypeVariable java.lang.reflect.WildcardType java.lang.reflect.GenericArrayType java.lang.reflect.AccessibleObject java.lang.annotation.Annotation java.lang.reflect.GenericDeclaration + $(BUILD_DIR)/debug/Java2Swift --module-name JavaKitReflection --manifests Sources/JavaKit/generated/JavaKit.swift2java -o Sources/JavaKitReflection/generated java.lang.reflect.Method java.lang.reflect.Type java.lang.reflect.Constructor java.lang.reflect.Parameter java.lang.reflect.ParameterizedType java.lang.reflect.Executable java.lang.reflect.AnnotatedType java.lang.reflect.TypeVariable java.lang.reflect.WildcardType java.lang.reflect.GenericArrayType java.lang.reflect.AccessibleObject java.lang.annotation.Annotation java.lang.reflect.GenericDeclaration java.lang.reflect.Field generate-JavaKitJar: Java2Swift generate-JavaKit mkdir -p Sources/JavaKitJar/generated diff --git a/Sources/Java2Swift/JavaTranslator.swift b/Sources/Java2Swift/JavaTranslator.swift index bc2140a0..6ca0c978 100644 --- a/Sources/Java2Swift/JavaTranslator.swift +++ b/Sources/Java2Swift/JavaTranslator.swift @@ -280,6 +280,25 @@ extension JavaTranslator { } } ) + + var staticFields: [Field] = [] + members.append( + contentsOf: javaClass.getFields().compactMap { + $0.flatMap { field in + if field.isStatic { + staticFields.append(field) + return nil + } + + do { + return try translateField(field) + } catch { + logUntranslated("Unable to translate '\(fullName)' field '\(field.getName())': \(error)") + return nil + } + } + } + ) // Map the generic parameters. let genericParameterClause: String @@ -327,6 +346,8 @@ extension JavaTranslator { // Format the class declaration. classDecl = classDecl.formatted(using: format).cast(DeclSyntax.self) + + // TODO: Handle static fields in https://github.com/swiftlang/swift-java/issues/39 if staticMethods.isEmpty { return [classDecl] @@ -422,6 +443,15 @@ extension JavaTranslator { public func \(raw: javaMethod.getName())\(raw: genericParameterClause)(\(raw: parametersStr))\(raw: throwsStr)\(raw: resultTypeStr)\(raw: whereClause) """ } + + func translateField(_ javaField: Field) throws -> DeclSyntax { + let typeName = try getSwiftTypeNameAsString(javaField.getGenericType()!, outerOptional: true) + let fieldAttribute: AttributeSyntax = "@JavaField"; + return """ + \(fieldAttribute) + public func \(raw: javaField.getName()): \(raw: typeName) + """ + } // Translate a Java parameter list into Swift parameters. private func translateParameters(_ parameters: [Parameter?]) throws -> [FunctionParameterSyntax] { diff --git a/Sources/JavaKitReflection/Field+Utilities.swift b/Sources/JavaKitReflection/Field+Utilities.swift new file mode 100644 index 00000000..1f803bac --- /dev/null +++ b/Sources/JavaKitReflection/Field+Utilities.swift @@ -0,0 +1,20 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift.org open source project +// +// Copyright (c) 2024 Apple Inc. and the Swift.org project authors +// Licensed under Apache License v2.0 +// +// See LICENSE.txt for license information +// See CONTRIBUTORS.txt for the list of Swift.org project authors +// +// SPDX-License-Identifier: Apache-2.0 +// +//===----------------------------------------------------------------------===// + +extension Field { + /// Whether this is a 'static' field. + public var isStatic: Bool { + return (getModifiers() & 0x08) != 0 + } +} diff --git a/Sources/JavaKitReflection/JavaClass+Reflection.swift b/Sources/JavaKitReflection/JavaClass+Reflection.swift index 5191a7b7..fcaf80cc 100644 --- a/Sources/JavaKitReflection/JavaClass+Reflection.swift +++ b/Sources/JavaKitReflection/JavaClass+Reflection.swift @@ -28,6 +28,9 @@ extension JavaClass { @JavaMethod public func getMethods() -> [Method?] + + @JavaMethod + public func getFields() -> [Field?] @JavaMethod public func getConstructors() -> [Constructor?] From bbc4fc8ee2db63e0d0ef19e302d9c79103dedf9f Mon Sep 17 00:00:00 2001 From: jrosen081 Date: Wed, 9 Oct 2024 09:23:50 -0400 Subject: [PATCH 2/5] Add small updates --- Sources/Java2Swift/JavaTranslator.swift | 40 +++++++++---------- .../generated/JavaKitReflection.swift2java | 1 + 2 files changed, 21 insertions(+), 20 deletions(-) diff --git a/Sources/Java2Swift/JavaTranslator.swift b/Sources/Java2Swift/JavaTranslator.swift index 6ca0c978..3721513b 100644 --- a/Sources/Java2Swift/JavaTranslator.swift +++ b/Sources/Java2Swift/JavaTranslator.swift @@ -257,6 +257,25 @@ extension JavaTranslator { } } ) + + var staticFields: [Field] = [] + members.append( + contentsOf: javaClass.getFields().compactMap { + $0.flatMap { field in + if field.isStatic { + staticFields.append(field) + return nil + } + + do { + return try translateField(field) + } catch { + logUntranslated("Unable to translate '\(fullName)' field '\(field.getName())': \(error)") + return nil + } + } + } + ) // Methods var staticMethods: [Method] = [] @@ -280,25 +299,6 @@ extension JavaTranslator { } } ) - - var staticFields: [Field] = [] - members.append( - contentsOf: javaClass.getFields().compactMap { - $0.flatMap { field in - if field.isStatic { - staticFields.append(field) - return nil - } - - do { - return try translateField(field) - } catch { - logUntranslated("Unable to translate '\(fullName)' field '\(field.getName())': \(error)") - return nil - } - } - } - ) // Map the generic parameters. let genericParameterClause: String @@ -449,7 +449,7 @@ extension JavaTranslator { let fieldAttribute: AttributeSyntax = "@JavaField"; return """ \(fieldAttribute) - public func \(raw: javaField.getName()): \(raw: typeName) + public var \(raw: javaField.getName()): \(raw: typeName) """ } diff --git a/Sources/JavaKitReflection/generated/JavaKitReflection.swift2java b/Sources/JavaKitReflection/generated/JavaKitReflection.swift2java index 19725c6a..72e42f6f 100644 --- a/Sources/JavaKitReflection/generated/JavaKitReflection.swift2java +++ b/Sources/JavaKitReflection/generated/JavaKitReflection.swift2java @@ -6,6 +6,7 @@ "java.lang.reflect.AnnotatedType" : "AnnotatedType", "java.lang.reflect.Constructor" : "Constructor", "java.lang.reflect.Executable" : "Executable", + "java.lang.reflect.Field" : "Field", "java.lang.reflect.GenericArrayType" : "GenericArrayType", "java.lang.reflect.GenericDeclaration" : "GenericDeclaration", "java.lang.reflect.Method" : "Method", From 7a7fcc6caaf910a6c189e4fd02f13e63c11b91ea Mon Sep 17 00:00:00 2001 From: jrosen081 Date: Wed, 9 Oct 2024 17:32:38 -0400 Subject: [PATCH 3/5] Put fields first --- Sources/Java2Swift/JavaTranslator.swift | 29 +++++++++++++------------ 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/Sources/Java2Swift/JavaTranslator.swift b/Sources/Java2Swift/JavaTranslator.swift index 3721513b..97103c63 100644 --- a/Sources/Java2Swift/JavaTranslator.swift +++ b/Sources/Java2Swift/JavaTranslator.swift @@ -243,21 +243,8 @@ extension JavaTranslator { // Members var members: [DeclSyntax] = [] - - // Constructors - members.append( - contentsOf: javaClass.getConstructors().compactMap { - $0.flatMap { constructor in - do { - return try translateConstructor(constructor) - } catch { - logUntranslated("Unable to translate '\(fullName)' constructor: \(error)") - return nil - } - } - } - ) + // Fields var staticFields: [Field] = [] members.append( contentsOf: javaClass.getFields().compactMap { @@ -277,6 +264,20 @@ extension JavaTranslator { } ) + // Constructors + members.append( + contentsOf: javaClass.getConstructors().compactMap { + $0.flatMap { constructor in + do { + return try translateConstructor(constructor) + } catch { + logUntranslated("Unable to translate '\(fullName)' constructor: \(error)") + return nil + } + } + } + ) + // Methods var staticMethods: [Method] = [] members.append( From 235911c039a96cf9d44b9c0a9568124c9ecd41c6 Mon Sep 17 00:00:00 2001 From: jrosen081 Date: Wed, 9 Oct 2024 17:33:32 -0400 Subject: [PATCH 4/5] Add Field class --- .../JavaKitReflection/generated/Field.swift | 151 ++++++++++++++++++ 1 file changed, 151 insertions(+) create mode 100644 Sources/JavaKitReflection/generated/Field.swift diff --git a/Sources/JavaKitReflection/generated/Field.swift b/Sources/JavaKitReflection/generated/Field.swift new file mode 100644 index 00000000..f6823600 --- /dev/null +++ b/Sources/JavaKitReflection/generated/Field.swift @@ -0,0 +1,151 @@ +// Auto-generated by Java-to-Swift wrapper generator. +import JavaKit +import JavaRuntime + +@JavaClass("java.lang.reflect.Field", extends: AccessibleObject.self) +public struct Field { + @JavaMethod + public func getName() -> String + + @JavaMethod + public func get(_ arg0: JavaObject?) throws -> JavaObject? + + @JavaMethod + public func equals(_ arg0: JavaObject?) -> Bool + + @JavaMethod + public func toString() -> String + + @JavaMethod + public func hashCode() -> Int32 + + @JavaMethod + public func getModifiers() -> Int32 + + @JavaMethod + public func getBoolean(_ arg0: JavaObject?) throws -> Bool + + @JavaMethod + public func getByte(_ arg0: JavaObject?) throws -> Int8 + + @JavaMethod + public func getShort(_ arg0: JavaObject?) throws -> Int16 + + @JavaMethod + public func getChar(_ arg0: JavaObject?) throws -> UInt16 + + @JavaMethod + public func getInt(_ arg0: JavaObject?) throws -> Int32 + + @JavaMethod + public func getLong(_ arg0: JavaObject?) throws -> Int64 + + @JavaMethod + public func getFloat(_ arg0: JavaObject?) throws -> Float + + @JavaMethod + public func getDouble(_ arg0: JavaObject?) throws -> Double + + @JavaMethod + public func toGenericString() -> String + + @JavaMethod + public func isSynthetic() -> Bool + + @JavaMethod + public func getDeclaringClass() -> JavaClass? + + @JavaMethod + public func getAnnotation(_ arg0: JavaClass?) -> Annotation? + + @JavaMethod + public func getAnnotationsByType(_ arg0: JavaClass?) -> [Annotation?] + + @JavaMethod + public func getDeclaredAnnotations() -> [Annotation?] + + @JavaMethod + public func set(_ arg0: JavaObject?, _ arg1: JavaObject?) throws + + @JavaMethod + public func setAccessible(_ arg0: Bool) + + @JavaMethod + public func getGenericType() -> Type? + + @JavaMethod + public func getType() -> JavaClass? + + @JavaMethod + public func setBoolean(_ arg0: JavaObject?, _ arg1: Bool) throws + + @JavaMethod + public func setByte(_ arg0: JavaObject?, _ arg1: Int8) throws + + @JavaMethod + public func setChar(_ arg0: JavaObject?, _ arg1: UInt16) throws + + @JavaMethod + public func setShort(_ arg0: JavaObject?, _ arg1: Int16) throws + + @JavaMethod + public func setInt(_ arg0: JavaObject?, _ arg1: Int32) throws + + @JavaMethod + public func setLong(_ arg0: JavaObject?, _ arg1: Int64) throws + + @JavaMethod + public func setFloat(_ arg0: JavaObject?, _ arg1: Float) throws + + @JavaMethod + public func setDouble(_ arg0: JavaObject?, _ arg1: Double) throws + + @JavaMethod + public func isEnumConstant() -> Bool + + @JavaMethod + public func getAnnotatedType() -> AnnotatedType? + + @JavaMethod + public func isAnnotationPresent(_ arg0: JavaClass?) -> Bool + + @JavaMethod + public func getAnnotations() -> [Annotation?] + + @JavaMethod + public func getDeclaredAnnotation(_ arg0: JavaClass?) -> Annotation? + + @JavaMethod + public func getDeclaredAnnotationsByType(_ arg0: JavaClass?) -> [Annotation?] + + @JavaMethod + public func trySetAccessible() -> Bool + + @JavaMethod + public func canAccess(_ arg0: JavaObject?) -> Bool + + @JavaMethod + public func isAccessible() -> Bool + + @JavaMethod + public func getClass() -> JavaClass? + + @JavaMethod + public func notify() + + @JavaMethod + public func notifyAll() + + @JavaMethod + public func wait(_ arg0: Int64) throws + + @JavaMethod + public func wait(_ arg0: Int64, _ arg1: Int32) throws + + @JavaMethod + public func wait() throws +} +extension JavaClass { + @JavaStaticMethod + public func setAccessible(_ arg0: [AccessibleObject?], _ arg1: Bool) +} From 202a5cd5c43ac2931fd78d4204b1cac82d854d50 Mon Sep 17 00:00:00 2001 From: jrosen081 Date: Wed, 9 Oct 2024 18:32:59 -0400 Subject: [PATCH 5/5] Formatting --- Sources/Java2Swift/JavaTranslator.swift | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Sources/Java2Swift/JavaTranslator.swift b/Sources/Java2Swift/JavaTranslator.swift index 97103c63..9c445df7 100644 --- a/Sources/Java2Swift/JavaTranslator.swift +++ b/Sources/Java2Swift/JavaTranslator.swift @@ -445,14 +445,14 @@ extension JavaTranslator { """ } - func translateField(_ javaField: Field) throws -> DeclSyntax { - let typeName = try getSwiftTypeNameAsString(javaField.getGenericType()!, outerOptional: true) - let fieldAttribute: AttributeSyntax = "@JavaField"; - return """ - \(fieldAttribute) - public var \(raw: javaField.getName()): \(raw: typeName) - """ - } + func translateField(_ javaField: Field) throws -> DeclSyntax { + let typeName = try getSwiftTypeNameAsString(javaField.getGenericType()!, outerOptional: true) + let fieldAttribute: AttributeSyntax = "@JavaField"; + return """ + \(fieldAttribute) + public var \(raw: javaField.getName()): \(raw: typeName) + """ + } // Translate a Java parameter list into Swift parameters. private func translateParameters(_ parameters: [Parameter?]) throws -> [FunctionParameterSyntax] {