diff --git a/Sources/Java2Swift/JavaTranslator.swift b/Sources/Java2Swift/JavaTranslator.swift index 9c445df7..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 } } @@ -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..51d62739 100644 --- a/Sources/JavaKit/Macros.swift +++ b/Sources/JavaKit/Macros.swift @@ -93,6 +93,20 @@ 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 +/// extension JavaClass { +/// @JavaStaticField +/// var initialValue: Double +/// } +/// ``` +@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. diff --git a/Sources/JavaKitExample/JavaKitExample.swift b/Sources/JavaKitExample/JavaKitExample.swift index bcc58114..d6eba19d 100644 --- a/Sources/JavaKitExample/JavaKitExample.swift +++ b/Sources/JavaKitExample/JavaKitExample.swift @@ -103,7 +103,7 @@ struct HelloSwift { } extension JavaClass { - @JavaField + @JavaStaticField var initialValue: Double } @@ -117,4 +117,4 @@ struct HelloSubclass { @JavaMethod init(greeting: String, environment: JNIEnvironment) -} \ No newline at end of file +}