Skip to content

Add Support for Static Fields to Java2Swift tool #61

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 4 commits into from
Oct 10, 2024
Merged
Show file tree
Hide file tree
Changes from 2 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
30 changes: 17 additions & 13 deletions Sources/Java2Swift/JavaTranslator.swift
Original file line number Diff line number Diff line change
Expand Up @@ -347,23 +347,28 @@ 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 {

if staticMethods.isEmpty && staticFields.isEmpty {
return [classDecl]
}

// Translate static members.
var staticMembers: [DeclSyntax] = []
staticMembers.append(
contentsOf: javaClass.getMethods().compactMap {
$0.flatMap { method in
// Skip the instance methods; they were handled above.
if !method.isStatic {
return nil
}

staticMembers.append(
contentsOf: staticFields.compactMap { field in
// Translate each static field.
do {
return try translateField(field)
} catch {
logUntranslated("Unable to translate '\(fullName)' field '\(field.getName())': \(error)")
return nil
}
}
)

staticMembers.append(
contentsOf: staticMethods.compactMap { method in
// Translate each static method.
do {
return try translateMethod(
Expand All @@ -376,7 +381,6 @@ extension JavaTranslator {
return nil
}
}
}
)

if staticMembers.isEmpty {
Expand Down Expand Up @@ -447,7 +451,7 @@ extension JavaTranslator {

func translateField(_ javaField: Field) throws -> DeclSyntax {
let typeName = try getSwiftTypeNameAsString(javaField.getGenericType()!, outerOptional: true)
let fieldAttribute: AttributeSyntax = "@JavaField";
let fieldAttribute: AttributeSyntax = javaField.isStatic ? "@JavaStaticField" : "@JavaField";
return """
\(fieldAttribute)
public var \(raw: javaField.getName()): \(raw: typeName)
Expand Down
15 changes: 15 additions & 0 deletions Sources/JavaKit/Macros.swift
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,21 @@ public macro JavaInterface(_ fullClassName: String, extends: (any AnyJavaObject.
@attached(accessor)
public macro JavaField(_ javaFieldName: String? = nil) = #externalMacro(module: "JavaKitMacros", type: "JavaFieldMacro")


/// Attached macro that turns a Swift property into one that accesses a Java static field on the underlying Java object.
///
/// The macro must be used within a specific JavaClass instance.
///
/// ```swift
/// @JavaClass("org.swift.example.HelloSwift")
/// struct HelloSwift {
/// @JavaField
/// var counter: Int32
/// }
/// ```
@attached(accessor)
public macro JavaStaticField(_ javaFieldName: String? = nil) = #externalMacro(module: "JavaKitMacros", type: "JavaFieldMacro")

/// Attached macro that turns a Swift method into one that wraps a Java method on the underlying Java object.
///
/// The macro must be used in an AnyJavaObject-conforming type.
Expand Down
4 changes: 2 additions & 2 deletions Sources/JavaKitExample/JavaKitExample.swift
Original file line number Diff line number Diff line change
Expand Up @@ -109,12 +109,12 @@ extension JavaClass<HelloSwift> {

@JavaClass("com.example.swift.HelloSubclass", extends: HelloSwift.self)
struct HelloSubclass {
@JavaField
@JavaStaticField
var greeting: String

@JavaMethod
func greetMe()

@JavaMethod
init(greeting: String, environment: JNIEnvironment)
}
}