Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,14 @@ public func makeStringID(_ value: String) -> MyID<String> {
MyID(value)
}

public func takeIntValue(from value: MyID<Int>) -> Int {
value.rawValue
}

public func takeStringValue(from value: MyID<String>) -> String {
value.rawValue
}

public struct MyEntity {
public var id: MyID<Int>
public var name: String
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,20 +21,22 @@

public class GenericTypeTest {
@Test
void returnsGenericType() {
void genericTypeValueRoundtrip() {
try (var arena = SwiftArena.ofConfined()) {
MyID stringId = MySwiftLibrary.makeStringID("Java", arena);
MyID<String> stringId = MySwiftLibrary.makeStringID("Java", arena);
assertEquals("Java", stringId.getDescription());
assertEquals("Java", MySwiftLibrary.takeStringValue(stringId));

MyID intId = MySwiftLibrary.makeIntID(42, arena);
MyID<Long> intId = MySwiftLibrary.makeIntID(42, arena);
assertEquals("42", intId.getDescription());
assertEquals(42, MySwiftLibrary.takeIntValue(intId));
}
}

@Test
void genericTypeProperty() {
try (var arena = SwiftArena.ofConfined()) {
MyID intId = MySwiftLibrary.makeIntID(42, arena);
MyID<Long> intId = MySwiftLibrary.makeIntID(42, arena);
MyEntity entity = MyEntity.init(intId, "name", arena);
assertEquals("42", entity.getId(arena).getDescription());
}
Expand All @@ -43,7 +45,7 @@ void genericTypeProperty() {
@Test
void genericEnum() {
try (var arena = SwiftArena.ofConfined()) {
GenericEnum value = MySwiftLibrary.makeIntGenericEnum(arena);
GenericEnum<Long> value = MySwiftLibrary.makeIntGenericEnum(arena);
switch (value.getCase()) {
case GenericEnum.Foo _ -> assertTrue(value.getAsFoo().isPresent());
case GenericEnum.Bar _ -> assertTrue(value.getAsBar().isPresent());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -234,6 +234,12 @@ extension JNISwift2JavaGenerator {
)
}
printer.println()
let genericClause =
if decl.swiftNominal.isGeneric {
"<\(decl.swiftNominal.genericParameters.map(\.name).joined(separator: ", "))>"
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍

} else {
""
}
printer.print(
"""
/**
Expand All @@ -245,12 +251,12 @@ extension JNISwift2JavaGenerator {
* <li>This operation does not copy, or retain, the pointed at pointer, so its lifetime must be ensured manually to be valid when wrapping.</li>
* </ul>
*/
public static \(decl.swiftNominal.name) wrapMemoryAddressUnsafe(\(swiftPointerArg), SwiftArena swiftArena) {
return new \(decl.swiftNominal.name)(\(swiftPointerParams.joined(separator: ", ")), swiftArena);
public static\(genericClause) \(decl.swiftNominal.name)\(genericClause) wrapMemoryAddressUnsafe(\(swiftPointerArg), SwiftArena swiftArena) {
return new \(decl.swiftNominal.name)\(genericClause)(\(swiftPointerParams.joined(separator: ", ")), swiftArena);
}

public static \(decl.swiftNominal.name) wrapMemoryAddressUnsafe(\(swiftPointerArg)) {
return new \(decl.swiftNominal.name)(\(swiftPointerParams.joined(separator: ", ")), SwiftMemoryManagement.DEFAULT_SWIFT_JAVA_AUTO_ARENA);
public static\(genericClause) \(decl.swiftNominal.name)\(genericClause) wrapMemoryAddressUnsafe(\(swiftPointerArg)) {
return new \(decl.swiftNominal.name)\(genericClause)(\(swiftPointerParams.joined(separator: ", ")), SwiftMemoryManagement.DEFAULT_SWIFT_JAVA_AUTO_ARENA);
}
"""
)
Expand Down Expand Up @@ -384,8 +390,14 @@ extension JNISwift2JavaGenerator {
.filter { $0.kind == .protocol }
.map(\.name)
let implementsClause = implements.joined(separator: ", ")
let genericClause =
if decl.swiftNominal.isGeneric {
"<\(decl.swiftNominal.genericParameters.map(\.name).joined(separator: ", "))>"
} else {
""
}
printer.printBraceBlock(
"\(modifiers.joined(separator: " ")) class \(decl.swiftNominal.name) implements \(implementsClause)"
"\(modifiers.joined(separator: " ")) class \(decl.swiftNominal.name)\(genericClause) implements \(implementsClause)"
) { printer in
body(&printer)
}
Expand Down
Loading
Loading