Skip to content

Commit b69f4d7

Browse files
authored
Add Support for Static Fields to Java2Swift tool (#61)
* Add JavaStaticField and Update Translator * Update name to be better * Update docs and usage * Add static to error
1 parent c561af5 commit b69f4d7

File tree

3 files changed

+34
-16
lines changed

3 files changed

+34
-16
lines changed

Sources/Java2Swift/JavaTranslator.swift

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,7 @@ extension JavaTranslator {
257257
do {
258258
return try translateField(field)
259259
} catch {
260-
logUntranslated("Unable to translate '\(fullName)' field '\(field.getName())': \(error)")
260+
logUntranslated("Unable to translate '\(fullName)' static field '\(field.getName())': \(error)")
261261
return nil
262262
}
263263
}
@@ -347,23 +347,28 @@ extension JavaTranslator {
347347

348348
// Format the class declaration.
349349
classDecl = classDecl.formatted(using: format).cast(DeclSyntax.self)
350-
351-
// TODO: Handle static fields in https://github.com/swiftlang/swift-java/issues/39
352-
353-
if staticMethods.isEmpty {
350+
351+
if staticMethods.isEmpty && staticFields.isEmpty {
354352
return [classDecl]
355353
}
356354

357355
// Translate static members.
358356
var staticMembers: [DeclSyntax] = []
359-
staticMembers.append(
360-
contentsOf: javaClass.getMethods().compactMap {
361-
$0.flatMap { method in
362-
// Skip the instance methods; they were handled above.
363-
if !method.isStatic {
364-
return nil
365-
}
366357

358+
staticMembers.append(
359+
contentsOf: staticFields.compactMap { field in
360+
// Translate each static field.
361+
do {
362+
return try translateField(field)
363+
} catch {
364+
logUntranslated("Unable to translate '\(fullName)' field '\(field.getName())': \(error)")
365+
return nil
366+
}
367+
}
368+
)
369+
370+
staticMembers.append(
371+
contentsOf: staticMethods.compactMap { method in
367372
// Translate each static method.
368373
do {
369374
return try translateMethod(
@@ -376,7 +381,6 @@ extension JavaTranslator {
376381
return nil
377382
}
378383
}
379-
}
380384
)
381385

382386
if staticMembers.isEmpty {
@@ -447,7 +451,7 @@ extension JavaTranslator {
447451

448452
func translateField(_ javaField: Field) throws -> DeclSyntax {
449453
let typeName = try getSwiftTypeNameAsString(javaField.getGenericType()!, outerOptional: true)
450-
let fieldAttribute: AttributeSyntax = "@JavaField";
454+
let fieldAttribute: AttributeSyntax = javaField.isStatic ? "@JavaStaticField" : "@JavaField";
451455
return """
452456
\(fieldAttribute)
453457
public var \(raw: javaField.getName()): \(raw: typeName)

Sources/JavaKit/Macros.swift

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,20 @@ public macro JavaInterface(_ fullClassName: String, extends: (any AnyJavaObject.
9393
@attached(accessor)
9494
public macro JavaField(_ javaFieldName: String? = nil) = #externalMacro(module: "JavaKitMacros", type: "JavaFieldMacro")
9595

96+
97+
/// Attached macro that turns a Swift property into one that accesses a Java static field on the underlying Java object.
98+
///
99+
/// The macro must be used within a specific JavaClass instance.
100+
///
101+
/// ```swift
102+
/// extension JavaClass<HelloSwift> {
103+
/// @JavaStaticField
104+
/// var initialValue: Double
105+
/// }
106+
/// ```
107+
@attached(accessor)
108+
public macro JavaStaticField(_ javaFieldName: String? = nil) = #externalMacro(module: "JavaKitMacros", type: "JavaFieldMacro")
109+
96110
/// Attached macro that turns a Swift method into one that wraps a Java method on the underlying Java object.
97111
///
98112
/// The macro must be used in an AnyJavaObject-conforming type.

Sources/JavaKitExample/JavaKitExample.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ struct HelloSwift {
103103
}
104104

105105
extension JavaClass<HelloSwift> {
106-
@JavaField
106+
@JavaStaticField
107107
var initialValue: Double
108108
}
109109

@@ -117,4 +117,4 @@ struct HelloSubclass {
117117

118118
@JavaMethod
119119
init(greeting: String, environment: JNIEnvironment)
120-
}
120+
}

0 commit comments

Comments
 (0)