Skip to content

Commit 7965f5c

Browse files
committed
update tuple definitions
1 parent c37a07c commit 7965f5c

31 files changed

Lines changed: 874 additions & 1927 deletions

Samples/SwiftJavaExtractJNISampleApp/Sources/MySwiftLibrary/Tuples.swift

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,3 +27,17 @@ public func labeledTuple() -> (x: Int32, y: Int32) {
2727
public func echoTriple(triple: (Bool, Double, Int64)) -> (Bool, Double, Int64) {
2828
triple
2929
}
30+
31+
public func makeBigTuple() -> (
32+
Bool, Int8, Int16, UInt16,
33+
Int32, Int64, Float, Double,
34+
String, Bool, Int8, Int16,
35+
UInt16, Int32, Int64, Float
36+
) {
37+
(
38+
true, 1, 2, 3,
39+
4, 5, 6.0, 7.0,
40+
"eight", false, 9, 10,
41+
11, 12, 13, 14.0
42+
)
43+
}

Samples/SwiftJavaExtractJNISampleApp/src/test/java/com/example/swift/TupleTest.java

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,16 @@
1818
import org.junit.jupiter.api.Test;
1919
import org.swift.swiftkit.core.tuple.Tuple2;
2020
import org.swift.swiftkit.core.tuple.Tuple3;
21+
import org.swift.swiftkit.core.tuple.Tuple16;
2122

2223
import static org.junit.jupiter.api.Assertions.*;
2324

2425
public class TupleTest {
2526
@Test
2627
void returnPair() {
2728
Tuple2<Long, String> result = MySwiftLibrary.returnPair();
28-
assertEquals(42L, result.$0());
29-
assertEquals("hello", result.$1());
29+
assertEquals(42L, result.$0);
30+
assertEquals("hello", result.$1);
3031
}
3132

3233
@Test
@@ -38,16 +39,40 @@ void takePair() {
3839
@Test
3940
void labeledTuple() {
4041
Tuple2<Integer, Integer> result = MySwiftLibrary.labeledTuple();
41-
assertEquals(10, result.$0());
42-
assertEquals(20, result.$1());
42+
assertEquals(10, result.$0);
43+
assertEquals(20, result.$1);
4344
}
4445

4546
@Test
4647
void echoTriple() {
4748
Tuple3<Boolean, Double, Long> input = new Tuple3<>(true, 3.14, 100L);
4849
Tuple3<Boolean, Double, Long> result = MySwiftLibrary.echoTriple(input);
49-
assertEquals(true, result.$0());
50-
assertEquals(3.14, result.$1(), 0.001);
51-
assertEquals(100L, result.$2());
50+
assertEquals(true, result.$0);
51+
assertEquals(3.14, result.$1, 0.001);
52+
assertEquals(100L, result.$2);
53+
}
54+
55+
@Test
56+
void makeBigTuple() {
57+
Tuple16<Boolean, Byte, Short, Character,
58+
Integer, Long, Float, Double,
59+
String, Boolean, Byte, Short,
60+
Character, Integer, Long, Float> result = MySwiftLibrary.makeBigTuple();
61+
assertEquals(true, result.$0);
62+
assertEquals((byte) 1, result.$1);
63+
assertEquals((short) 2, result.$2);
64+
assertEquals((char) 3, result.$3);
65+
assertEquals(4, result.$4);
66+
assertEquals(5L, result.$5);
67+
assertEquals(6.0f, result.$6);
68+
assertEquals(7.0, result.$7);
69+
assertEquals("eight", result.$8);
70+
assertEquals(false, result.$9);
71+
assertEquals((byte) 9, result.$10);
72+
assertEquals((short) 10, result.$11);
73+
assertEquals((char) 11, result.$12);
74+
assertEquals(12, result.$13);
75+
assertEquals(13L, result.$14);
76+
assertEquals(14.0f, result.$15);
5277
}
5378
}

Sources/JExtractSwiftLib/JNI/JNISwift2JavaGenerator+JavaTranslation.swift

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -604,10 +604,9 @@ extension JNISwift2JavaGenerator {
604604
genericRequirements: [SwiftGenericRequirement],
605605
parameterPosition: Int?
606606
) throws -> TranslatedParameter {
607-
let arity = elements.count
608-
var elementBoxedTypes: [String] = []
607+
var elementJavaTypes: [JavaType] = []
609608

610-
// Generate a conversion that extracts each element from the Tuple record
609+
// Generate a conversion that extracts each element from the Tuple
611610
var elementConversions: [JavaNativeConversionStep] = []
612611
for (idx, element) in elements.enumerated() {
613612
let elementTranslated = try translateParameter(
@@ -620,17 +619,16 @@ extension JNISwift2JavaGenerator {
620619
parameterPosition: parameterPosition
621620
)
622621

623-
// Extract the element from the tuple using .$N() accessor
622+
// Extract the element from the tuple using .$N field access
624623
let extraction = JavaNativeConversionStep.replacingPlaceholder(
625624
elementTranslated.conversion,
626-
placeholder: "\(parameterName).$\(idx)()"
625+
placeholder: "\(parameterName).$\(idx)"
627626
)
628627
elementConversions.append(extraction)
629-
elementBoxedTypes.append(elementTranslated.parameter.type.javaType.boxedName)
628+
elementJavaTypes.append(elementTranslated.parameter.type.javaType)
630629
}
631630

632-
let genericParams = elementBoxedTypes.joined(separator: ", ")
633-
let javaType: JavaType = .class(package: "org.swift.swiftkit.core.tuple", name: "Tuple\(arity)<\(genericParams)>")
631+
let javaType: JavaType = .tuple(elementTypes: elementJavaTypes)
634632

635633
return TranslatedParameter(
636634
parameter: JavaParameter(
@@ -960,7 +958,7 @@ extension JNISwift2JavaGenerator {
960958
var outParameters: [OutParameter] = []
961959
var elementOutParamNames: [String] = []
962960
var elementConversions: [JavaNativeConversionStep] = []
963-
var elementBoxedTypes: [String] = []
961+
var elementJavaTypes: [JavaType] = []
964962

965963
for (idx, element) in elements.enumerated() {
966964
let outParamName = "\(resultName)_\(idx)$"
@@ -974,13 +972,11 @@ extension JNISwift2JavaGenerator {
974972
)
975973
elementOutParamNames.append(outParamName)
976974
elementConversions.append(elementConversion)
977-
elementBoxedTypes.append(javaType.boxedName)
975+
elementJavaTypes.append(javaType)
978976
}
979977

980-
let genericParams = elementBoxedTypes.joined(separator: ", ")
981-
let tupleClassName = "Tuple\(arity)<\(genericParams)>"
978+
let javaResultType: JavaType = .tuple(elementTypes: elementJavaTypes)
982979
let fullTupleClassName = "org.swift.swiftkit.core.tuple.Tuple\(arity)"
983-
let javaResultType: JavaType = .class(package: "org.swift.swiftkit.core.tuple", name: tupleClassName)
984980

985981
let tupleElements: [(outParamName: String, elementConversion: JavaNativeConversionStep)] =
986982
zip(elementOutParamNames, elementConversions).map { ($0, $1) }

Sources/JExtractSwiftLib/JNI/JNISwift2JavaGenerator+NativeTranslation.swift

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -793,13 +793,15 @@ extension JNISwift2JavaGenerator {
793793
JavaParameter(name: outParamName, type: .array(elementResult.javaType))
794794
)
795795

796-
destructureElements.append((
797-
index: idx,
798-
label: element.label,
799-
conversion: elementResult.conversion,
800-
outParamName: outParamName,
801-
javaType: elementResult.javaType
802-
))
796+
destructureElements.append(
797+
(
798+
index: idx,
799+
label: element.label,
800+
conversion: elementResult.conversion,
801+
outParamName: outParamName,
802+
javaType: elementResult.javaType
803+
)
804+
)
803805
}
804806

805807
return NativeResult(

Sources/JExtractSwiftLib/JavaTypes/JavaType+SwiftKit.swift

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,17 @@ extension JavaType {
2121
.class(package: "org.swift.swiftkit.core", name: "SimpleCompletableFuture", typeParameters: [T.boxedType])
2222
}
2323

24+
/// The maximum supported tuple arity.
25+
static let maxTupleArity = 24
26+
27+
/// The description of the type org.swift.swiftkit.core.tuple.TupleN<T0, T1, ...>
28+
static func tuple(elementTypes: [JavaType]) -> JavaType {
29+
let arity = elementTypes.count
30+
guard arity <= maxTupleArity else {
31+
fatalError("Tuple arity \(arity) exceeds maximum supported arity of \(maxTupleArity)")
32+
}
33+
let genericParams = elementTypes.map(\.boxedName).joined(separator: ", ")
34+
return .class(package: "org.swift.swiftkit.core.tuple", name: "Tuple\(arity)<\(genericParams)>")
35+
}
36+
2437
}

SwiftKitCore/src/main/java/org/swift/swiftkit/core/tuple/Tuple1.java

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,23 +14,23 @@
1414

1515
package org.swift.swiftkit.core.tuple;
1616

17+
/**
18+
* Corresponds to Swift's built-in 1-element tuple type <code>(T0)</code>.
19+
* Elements are accessed via public final fields <code>$0</code>, <code>$1</code>, etc.
20+
*/
1721
public final class Tuple1<T0> {
18-
private final T0 $0;
22+
public final T0 $0;
1923

2024
public Tuple1(T0 $0) {
2125
this.$0 = $0;
2226
}
2327

24-
public T0 $0() {
25-
return $0;
26-
}
27-
2828
@Override
29-
public boolean equals(Object o) {
30-
if (this == o) return true;
31-
if (\!(o instanceof Tuple1)) return false;
32-
Tuple1<?> other = (Tuple1<?>) o;
33-
return java.util.Objects.equals($0, other.$0);
29+
public boolean equals(Object other) {
30+
if (this == other) return true;
31+
if (!(other instanceof Tuple1)) return false;
32+
Tuple1 o = (Tuple1) other;
33+
return java.util.Objects.equals(this.$0, o.$0);
3434
}
3535

3636
@Override

SwiftKitCore/src/main/java/org/swift/swiftkit/core/tuple/Tuple10.java

Lines changed: 28 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -14,17 +14,21 @@
1414

1515
package org.swift.swiftkit.core.tuple;
1616

17+
/**
18+
* Corresponds to Swift's built-in 10-element tuple type <code>(T0, T1, T2, T3, T4, T5, T6, T7, T8, T9)</code>.
19+
* Elements are accessed via public final fields <code>$0</code>, <code>$1</code>, etc.
20+
*/
1721
public final class Tuple10<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9> {
18-
private final T0 $0;
19-
private final T1 $1;
20-
private final T2 $2;
21-
private final T3 $3;
22-
private final T4 $4;
23-
private final T5 $5;
24-
private final T6 $6;
25-
private final T7 $7;
26-
private final T8 $8;
27-
private final T9 $9;
22+
public final T0 $0;
23+
public final T1 $1;
24+
public final T2 $2;
25+
public final T3 $3;
26+
public final T4 $4;
27+
public final T5 $5;
28+
public final T6 $6;
29+
public final T7 $7;
30+
public final T8 $8;
31+
public final T9 $9;
2832

2933
public Tuple10(T0 $0, T1 $1, T2 $2, T3 $3, T4 $4, T5 $5, T6 $6, T7 $7, T8 $8, T9 $9) {
3034
this.$0 = $0;
@@ -39,61 +43,21 @@ public Tuple10(T0 $0, T1 $1, T2 $2, T3 $3, T4 $4, T5 $5, T6 $6, T7 $7, T8 $8, T9
3943
this.$9 = $9;
4044
}
4145

42-
public T0 $0() {
43-
return $0;
44-
}
45-
46-
public T1 $1() {
47-
return $1;
48-
}
49-
50-
public T2 $2() {
51-
return $2;
52-
}
53-
54-
public T3 $3() {
55-
return $3;
56-
}
57-
58-
public T4 $4() {
59-
return $4;
60-
}
61-
62-
public T5 $5() {
63-
return $5;
64-
}
65-
66-
public T6 $6() {
67-
return $6;
68-
}
69-
70-
public T7 $7() {
71-
return $7;
72-
}
73-
74-
public T8 $8() {
75-
return $8;
76-
}
77-
78-
public T9 $9() {
79-
return $9;
80-
}
81-
8246
@Override
83-
public boolean equals(Object o) {
84-
if (this == o) return true;
85-
if (\!(o instanceof Tuple10)) return false;
86-
Tuple10<?, ?, ?, ?, ?, ?, ?, ?, ?, ?> other = (Tuple10<?, ?, ?, ?, ?, ?, ?, ?, ?, ?>) o;
87-
return java.util.Objects.equals($0, other.$0) &&
88-
java.util.Objects.equals($1, other.$1) &&
89-
java.util.Objects.equals($2, other.$2) &&
90-
java.util.Objects.equals($3, other.$3) &&
91-
java.util.Objects.equals($4, other.$4) &&
92-
java.util.Objects.equals($5, other.$5) &&
93-
java.util.Objects.equals($6, other.$6) &&
94-
java.util.Objects.equals($7, other.$7) &&
95-
java.util.Objects.equals($8, other.$8) &&
96-
java.util.Objects.equals($9, other.$9);
47+
public boolean equals(Object other) {
48+
if (this == other) return true;
49+
if (!(other instanceof Tuple10)) return false;
50+
Tuple10 o = (Tuple10) other;
51+
return java.util.Objects.equals(this.$0, o.$0) &&
52+
java.util.Objects.equals(this.$1, o.$1) &&
53+
java.util.Objects.equals(this.$2, o.$2) &&
54+
java.util.Objects.equals(this.$3, o.$3) &&
55+
java.util.Objects.equals(this.$4, o.$4) &&
56+
java.util.Objects.equals(this.$5, o.$5) &&
57+
java.util.Objects.equals(this.$6, o.$6) &&
58+
java.util.Objects.equals(this.$7, o.$7) &&
59+
java.util.Objects.equals(this.$8, o.$8) &&
60+
java.util.Objects.equals(this.$9, o.$9);
9761
}
9862

9963
@Override

0 commit comments

Comments
 (0)