From e29e550d042a4e79cdfe952e95b214ae59944d38 Mon Sep 17 00:00:00 2001 From: jrosen081 Date: Wed, 9 Oct 2024 23:54:33 -0400 Subject: [PATCH 1/4] Add JavaStaticField and Update Translator --- Sources/Java2Swift/JavaTranslator.swift | 30 ++++++++++++++----------- Sources/JavaKit/Macros.swift | 15 +++++++++++++ 2 files changed, 32 insertions(+), 13 deletions(-) diff --git a/Sources/Java2Swift/JavaTranslator.swift b/Sources/Java2Swift/JavaTranslator.swift index 9c445df7..953a3545 100644 --- a/Sources/Java2Swift/JavaTranslator.swift +++ b/Sources/Java2Swift/JavaTranslator.swift @@ -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( @@ -376,7 +381,6 @@ extension JavaTranslator { return nil } } - } ) if staticMembers.isEmpty { @@ -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) diff --git a/Sources/JavaKit/Macros.swift b/Sources/JavaKit/Macros.swift index 772138f8..393e2035 100644 --- a/Sources/JavaKit/Macros.swift +++ b/Sources/JavaKit/Macros.swift @@ -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 StaticJavaField(_ 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. From 7d112b85af118f985b089d89285e034a630ea03c Mon Sep 17 00:00:00 2001 From: jrosen081 Date: Wed, 9 Oct 2024 23:57:39 -0400 Subject: [PATCH 2/4] Update name to be better --- Sources/JavaKit/Macros.swift | 2 +- Sources/JavaKitExample/JavaKitExample.swift | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Sources/JavaKit/Macros.swift b/Sources/JavaKit/Macros.swift index 393e2035..11b02f39 100644 --- a/Sources/JavaKit/Macros.swift +++ b/Sources/JavaKit/Macros.swift @@ -106,7 +106,7 @@ public macro JavaField(_ javaFieldName: String? = nil) = #externalMacro(module: /// } /// ``` @attached(accessor) -public macro StaticJavaField(_ javaFieldName: String? = nil) = #externalMacro(module: "JavaKitMacros", type: "JavaFieldMacro") +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. /// diff --git a/Sources/JavaKitExample/JavaKitExample.swift b/Sources/JavaKitExample/JavaKitExample.swift index bcc58114..97389cda 100644 --- a/Sources/JavaKitExample/JavaKitExample.swift +++ b/Sources/JavaKitExample/JavaKitExample.swift @@ -109,7 +109,7 @@ extension JavaClass { @JavaClass("com.example.swift.HelloSubclass", extends: HelloSwift.self) struct HelloSubclass { - @JavaField + @JavaStaticField var greeting: String @JavaMethod @@ -117,4 +117,4 @@ struct HelloSubclass { @JavaMethod init(greeting: String, environment: JNIEnvironment) -} \ No newline at end of file +} From 653ffdb7806e5229eed02149646615093fe25278 Mon Sep 17 00:00:00 2001 From: jrosen081 Date: Thu, 10 Oct 2024 08:52:08 -0400 Subject: [PATCH 3/4] Update docs and usage --- Sources/JavaKit/Macros.swift | 7 +++---- Sources/JavaKitExample/JavaKitExample.swift | 4 ++-- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/Sources/JavaKit/Macros.swift b/Sources/JavaKit/Macros.swift index 11b02f39..51d62739 100644 --- a/Sources/JavaKit/Macros.swift +++ b/Sources/JavaKit/Macros.swift @@ -99,10 +99,9 @@ public macro JavaField(_ javaFieldName: String? = nil) = #externalMacro(module: /// The macro must be used within a specific JavaClass instance. /// /// ```swift -/// @JavaClass("org.swift.example.HelloSwift") -/// struct HelloSwift { -/// @JavaField -/// var counter: Int32 +/// extension JavaClass { +/// @JavaStaticField +/// var initialValue: Double /// } /// ``` @attached(accessor) diff --git a/Sources/JavaKitExample/JavaKitExample.swift b/Sources/JavaKitExample/JavaKitExample.swift index 97389cda..d6eba19d 100644 --- a/Sources/JavaKitExample/JavaKitExample.swift +++ b/Sources/JavaKitExample/JavaKitExample.swift @@ -103,13 +103,13 @@ struct HelloSwift { } extension JavaClass { - @JavaField + @JavaStaticField var initialValue: Double } @JavaClass("com.example.swift.HelloSubclass", extends: HelloSwift.self) struct HelloSubclass { - @JavaStaticField + @JavaField var greeting: String @JavaMethod From 2a3b41da314ab14efe3239a0f54a9ec9c7e99a76 Mon Sep 17 00:00:00 2001 From: jrosen081 Date: Thu, 10 Oct 2024 16:45:34 -0400 Subject: [PATCH 4/4] Add static to error --- Sources/Java2Swift/JavaTranslator.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/Java2Swift/JavaTranslator.swift b/Sources/Java2Swift/JavaTranslator.swift index 953a3545..78f3cd87 100644 --- a/Sources/Java2Swift/JavaTranslator.swift +++ b/Sources/Java2Swift/JavaTranslator.swift @@ -257,7 +257,7 @@ extension JavaTranslator { do { return try translateField(field) } catch { - logUntranslated("Unable to translate '\(fullName)' field '\(field.getName())': \(error)") + logUntranslated("Unable to translate '\(fullName)' static field '\(field.getName())': \(error)") return nil } }