diff --git a/Samples/SwiftJavaExtractJNISampleApp/Sources/MySwiftLibrary/GenericType.swift b/Samples/SwiftJavaExtractJNISampleApp/Sources/MySwiftLibrary/GenericType.swift index 3f27d08e..9ae54875 100644 --- a/Samples/SwiftJavaExtractJNISampleApp/Sources/MySwiftLibrary/GenericType.swift +++ b/Samples/SwiftJavaExtractJNISampleApp/Sources/MySwiftLibrary/GenericType.swift @@ -88,6 +88,11 @@ public func makeIntGenericEnum() -> GenericEnum { if Bool.random() { return .foo } else { return .bar } } +public enum GenericEnumWithValue { + case some(T) + case none +} + extension MyID where T: BinaryInteger { // Conditional extension functions are not exported public func computeSomeValue() -> Int { diff --git a/Sources/JExtractSwiftLib/JNI/JNISwift2JavaGenerator+JavaBindingsPrinting.swift b/Sources/JExtractSwiftLib/JNI/JNISwift2JavaGenerator+JavaBindingsPrinting.swift index e9f13626..05a22ed6 100644 --- a/Sources/JExtractSwiftLib/JNI/JNISwift2JavaGenerator+JavaBindingsPrinting.swift +++ b/Sources/JExtractSwiftLib/JNI/JNISwift2JavaGenerator+JavaBindingsPrinting.swift @@ -511,17 +511,21 @@ extension JNISwift2JavaGenerator { printer.printBraceBlock("public Case getCase(\(requiresSwiftArena ? "SwiftArena swiftArena" : ""))") { printer in printer.printBraceBlock("return switch (this.getDiscriminator())", .semicolonNewLine) { printer in for enumCase in decl.cases { - guard let translatedCase = self.translatedEnumCase(for: enumCase) else { - continue - } - if enumCase.parameters.isEmpty { - printer.print( - "case \(enumCase.name.uppercased()) -> new Case.\(translatedCase.name)();" - ) + if let translatedCase = self.translatedEnumCase(for: enumCase) { + if enumCase.parameters.isEmpty { + printer.print( + "case \(enumCase.name.uppercased()) -> new Case.\(translatedCase.name)();" + ) + } else { + let arenaArgument = translatedCase.requiresSwiftArena ? "swiftArena" : "" + printer.print( + "case \(enumCase.name.uppercased()) -> this.getAs\(translatedCase.name)(\(arenaArgument)).orElseThrow();" + ) + } } else { - let arenaArgument = translatedCase.requiresSwiftArena ? "swiftArena" : "" + logger.warning("\(decl.effectiveJavaName).\(enumCase.name) contains unsupported values so its getCase() method call throws an error.") printer.print( - "case \(enumCase.name.uppercased()) -> this.getAs\(translatedCase.name)(\(arenaArgument)).orElseThrow();" + "case \(enumCase.name.uppercased()) -> throw new UnsupportedOperationException(\"\(decl.effectiveJavaName).\(enumCase.name) contains unsupported values.\");" ) } } diff --git a/Tests/JExtractSwiftTests/JNI/JNIGenericTypeTests.swift b/Tests/JExtractSwiftTests/JNI/JNIGenericTypeTests.swift index 5f82b3bd..5f419600 100644 --- a/Tests/JExtractSwiftTests/JNI/JNIGenericTypeTests.swift +++ b/Tests/JExtractSwiftTests/JNI/JNIGenericTypeTests.swift @@ -252,6 +252,45 @@ struct JNIGenericTypeTests { ) } + @Test + func genericEnumWithAssociatedValue() throws { + let input = + #""" + public enum MyOptional { + case some(Wrapped) + case none + } + """# + + try assertOutput( + input: input, + .jni, + .java, + detectChunkByInitialLines: 2, + expectedChunks: [ + """ + public enum Discriminator { + SOME, + NONE + } + """, + """ + public sealed interface Case { + record None() implements Case {} + } + """, + """ + public Case getCase() { + return switch (this.getDiscriminator()) { + case SOME -> throw new UnsupportedOperationException("MyOptional.some contains unsupported values."); + case NONE -> new Case.None(); + }; + } + """, + ] + ) + } + @Test func nestedGenericType() throws { let input =