Skip to content

Commit 204cb84

Browse files
committed
Update enum values to the new setup
1 parent 1afa7f7 commit 204cb84

File tree

2 files changed

+44
-4
lines changed

2 files changed

+44
-4
lines changed

Sources/Java2SwiftLib/JavaTranslator.swift

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ extension JavaTranslator {
7777
package static let defaultTranslatedClasses: [String: (swiftType: String, swiftModule: String?, isOptional: Bool)] = [
7878
"java.lang.Class": ("JavaClass", "JavaKit", true),
7979
"java.lang.String": ("String", "JavaKit", false),
80+
"java.lang.Object": ("JavaObject", "JavaKit", true)
8081
]
8182
}
8283

@@ -234,17 +235,17 @@ extension JavaTranslator {
234235

235236
// Fields
236237
var staticFields: [Field] = []
238+
var enumConstants: [Field] = []
237239
members.append(
238240
contentsOf: javaClass.getFields().compactMap {
239241
$0.flatMap { field in
240242
if field.isStatic {
241243
staticFields.append(field)
242244

243245
if field.isEnumConstant() {
244-
return "public static let \(raw: field.getName()) = try! JavaClass<Self>(in: JavaVirtualMachine.shared().environment()).\(raw: field.getName())!"
245-
} else {
246-
return nil
246+
enumConstants.append(field)
247247
}
248+
return nil
248249
}
249250

250251
do {
@@ -257,6 +258,13 @@ extension JavaTranslator {
257258
}
258259
)
259260

261+
if !enumConstants.isEmpty {
262+
let enumName = "\(swiftTypeName)Cases"
263+
members.append(
264+
contentsOf: translateToEnumValue(name: enumName, enumFields: enumConstants)
265+
)
266+
}
267+
260268
// Constructors
261269
members.append(
262270
contentsOf: javaClass.getConstructors().compactMap {
@@ -453,6 +461,31 @@ extension JavaTranslator {
453461
"""
454462
}
455463

464+
package func translateToEnumValue(name: String, enumFields: [Field]) -> [DeclSyntax] {
465+
let extensionSyntax: DeclSyntax = """
466+
public enum \(raw: name): Equatable {
467+
\(raw: enumFields.map { "case \($0.getName())" }.joined(separator: "\n"))
468+
}
469+
"""
470+
471+
let mappingSyntax: DeclSyntax = """
472+
public var enumValue: \(raw: name)? {
473+
\(raw: enumFields.map {
474+
// The equals method takes a java object, so we need to cast it here
475+
"""
476+
if self.equals(self.javaClass.\($0.getName())?.as(JavaObject.self)) {
477+
return \(name).\($0.getName())
478+
}
479+
"""
480+
}.joined(separator: " else ")) else {
481+
return nil
482+
}
483+
}
484+
"""
485+
486+
return [extensionSyntax, mappingSyntax]
487+
}
488+
456489
// Translate a Java parameter list into Swift parameters.
457490
private func translateParameters(_ parameters: [Parameter?]) throws -> [FunctionParameterSyntax] {
458491
return try parameters.compactMap { javaParameter in

Tests/Java2SwiftTests/Java2SwiftTests.swift

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,14 @@ class Java2SwiftTests: XCTestCase {
5858
swiftTypeName: "Month",
5959
expectedChunks: [
6060
"import JavaKit",
61-
"public static let APRIL = try! JavaClass<Self>(in: JavaVirtualMachine.shared().environment()).APRIL!",
61+
"enum MonthCases: Equatable",
62+
"case APRIL",
63+
"public var enumValue: MonthCases?",
64+
"""
65+
} else if self.equals(self.javaClass.APRIL?.as(JavaObject.self)) {
66+
return MonthCases.APRIL
67+
}
68+
""",
6269
"""
6370
@JavaStaticField
6471
public var APRIL: Month?

0 commit comments

Comments
 (0)