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..9c445df7 100644 --- a/Sources/Java2Swift/JavaTranslator.swift +++ b/Sources/Java2Swift/JavaTranslator.swift @@ -243,6 +243,26 @@ extension JavaTranslator { // Members var members: [DeclSyntax] = [] + + // Fields + 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 + } + } + } + ) // Constructors members.append( @@ -327,6 +347,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 +444,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 var \(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?] 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) +} 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",