Skip to content

Add Fields to Java2Swift Tool #55

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 5 commits into from
Oct 9, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
31 changes: 31 additions & 0 deletions Sources/Java2Swift/JavaTranslator.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down Expand Up @@ -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]
Expand Down Expand Up @@ -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] {
Expand Down
20 changes: 20 additions & 0 deletions Sources/JavaKitReflection/Field+Utilities.swift
Original file line number Diff line number Diff line change
@@ -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
}
}
3 changes: 3 additions & 0 deletions Sources/JavaKitReflection/JavaClass+Reflection.swift
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,9 @@ extension JavaClass {

@JavaMethod
public func getMethods() -> [Method?]

@JavaMethod
public func getFields() -> [Field?]

@JavaMethod
public func getConstructors() -> [Constructor<ObjectType>?]
Expand Down
151 changes: 151 additions & 0 deletions Sources/JavaKitReflection/generated/Field.swift
Original file line number Diff line number Diff line change
@@ -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<JavaObject>?

@JavaMethod
public func getAnnotation(_ arg0: JavaClass<Annotation>?) -> Annotation?

@JavaMethod
public func getAnnotationsByType(_ arg0: JavaClass<Annotation>?) -> [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<JavaObject>?

@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<Annotation>?) -> Bool

@JavaMethod
public func getAnnotations() -> [Annotation?]

@JavaMethod
public func getDeclaredAnnotation(_ arg0: JavaClass<Annotation>?) -> Annotation?

@JavaMethod
public func getDeclaredAnnotationsByType(_ arg0: JavaClass<Annotation>?) -> [Annotation?]

@JavaMethod
public func trySetAccessible() -> Bool

@JavaMethod
public func canAccess(_ arg0: JavaObject?) -> Bool

@JavaMethod
public func isAccessible() -> Bool

@JavaMethod
public func getClass() -> JavaClass<JavaObject>?

@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<Field> {
@JavaStaticMethod
public func setAccessible(_ arg0: [AccessibleObject?], _ arg1: Bool)
}
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down