Skip to content
Merged
Show file tree
Hide file tree
Changes from 4 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