Skip to content

Commit 84d29f9

Browse files
committed
Add new initializer from enum case
1 parent 204cb84 commit 84d29f9

File tree

2 files changed

+32
-4
lines changed

2 files changed

+32
-4
lines changed

Sources/Java2SwiftLib/JavaTranslator.swift

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -360,7 +360,6 @@ extension JavaTranslator {
360360
contentsOf: staticFields.compactMap { field in
361361
// Translate each static field.
362362
do {
363-
// Enum constants are guaranteed to not be optional
364363
return try translateField(field)
365364
} catch {
366365
logUntranslated("Unable to translate '\(fullName)' field '\(field.getName())': \(error)")
@@ -470,10 +469,11 @@ extension JavaTranslator {
470469

471470
let mappingSyntax: DeclSyntax = """
472471
public var enumValue: \(raw: name)? {
472+
let classObj = self.javaClass
473473
\(raw: enumFields.map {
474474
// The equals method takes a java object, so we need to cast it here
475475
"""
476-
if self.equals(self.javaClass.\($0.getName())?.as(JavaObject.self)) {
476+
if self.equals(classObj.\($0.getName())?.as(JavaObject.self)) {
477477
return \(name).\($0.getName())
478478
}
479479
"""
@@ -483,7 +483,26 @@ extension JavaTranslator {
483483
}
484484
"""
485485

486-
return [extensionSyntax, mappingSyntax]
486+
let initSyntax: DeclSyntax = """
487+
public init?(_ enumValue: \(raw: name), environment: JNIEnvironment) throws {
488+
let classObj = try JavaClass<Self>(in: environment)
489+
switch enumValue {
490+
\(raw: enumFields.map {
491+
let caseName = $0.getName()
492+
return """
493+
case .\(caseName):
494+
if let \(caseName) = classObj.\(caseName) {
495+
self = \(caseName)
496+
} else {
497+
return nil
498+
}
499+
"""
500+
}.joined(separator: "\n"))
501+
}
502+
}
503+
"""
504+
505+
return [extensionSyntax, mappingSyntax, initSyntax]
487506
}
488507

489508
// Translate a Java parameter list into Swift parameters.

Tests/Java2SwiftTests/Java2SwiftTests.swift

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,10 +62,19 @@ class Java2SwiftTests: XCTestCase {
6262
"case APRIL",
6363
"public var enumValue: MonthCases?",
6464
"""
65-
} else if self.equals(self.javaClass.APRIL?.as(JavaObject.self)) {
65+
} else if self.equals(classObj.APRIL?.as(JavaObject.self)) {
6666
return MonthCases.APRIL
6767
}
6868
""",
69+
"public init?(_ enumValue: MonthCases, environment: JNIEnvironment) throws {",
70+
"""
71+
case .APRIL:
72+
if let APRIL = classObj.APRIL {
73+
self = APRIL
74+
} else {
75+
return nil
76+
}
77+
""",
6978
"""
7079
@JavaStaticField
7180
public var APRIL: Month?

0 commit comments

Comments
 (0)