Skip to content

Commit 8599a30

Browse files
committed
Dev: fix SwiftBlock with primitives
1 parent 241d6ea commit 8599a30

38 files changed

+497
-46
lines changed

compiler/src/main/java/com/readdle/codegen/JavaSwiftProcessor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -382,7 +382,7 @@ static String replaceLast(String text, char replace, char replacement) {
382382
}
383383

384384
public SwiftEnvironment.Type parseJavaType(String javaType) {
385-
if (moduleDescriptor.customTypeMappings.containsKey(javaType)) {
385+
if (moduleDescriptor.customTypeMappings != null && moduleDescriptor.customTypeMappings.containsKey(javaType)) {
386386
return new SwiftEnvironment.Type(moduleDescriptor.customTypeMappings.get(javaType), javaType);
387387
}
388388
switch (javaType) {

compiler/src/main/java/com/readdle/codegen/SwiftBlockDescriptor.java

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,8 @@ File generateCode() throws IOException {
203203

204204
String jniMethodTemplate;
205205
if (returnSwiftType != null) {
206-
jniMethodTemplate = "let optionalResult = JNI.CallObjectMethod(self.jniObject, %s.javaMethod%s";
206+
String methodCallMethod = returnSwiftType.returnTypeFunc(isReturnTypeOptional);
207+
jniMethodTemplate = "let optionalResult = JNI." + methodCallMethod + "(self.jniObject, %s.javaMethod%s";
207208
}
208209
else {
209210
jniMethodTemplate = "JNI.CallVoidMethod(self.jniObject, %s.javaMethod%s";
@@ -231,19 +232,29 @@ File generateCode() throws IOException {
231232
swiftWriter.emitStatement("}");
232233

233234
if (returnSwiftType != null) {
234-
swiftWriter.emitStatement("guard let result = optionalResult else {");
235-
swiftWriter.emitStatement(isReturnTypeOptional ? "return nil" : "fatalError(\"Don't support nil here!\")");
236-
swiftWriter.emitStatement("}");
237-
swiftWriter.emitStatement("defer {");
238-
swiftWriter.emitStatement("JNI.DeleteLocalRef(result)");
239-
swiftWriter.emitStatement("}");
240-
swiftWriter.emitStatement("do {");
241-
swiftWriter.emitStatement(String.format("return try %s.from(javaObject: result)", returnSwiftType.swiftConstructorType));
242-
swiftWriter.emitStatement("}");
243-
swiftWriter.emitStatement("catch {");
244-
swiftWriter.emitStatement("let errorString = String(reflecting: type(of: error)) + String(describing: error)");
245-
swiftWriter.emitStatement("fatalError(errorString)");
246-
swiftWriter.emitStatement("}");
235+
if (!isReturnTypeOptional && returnSwiftType.isPrimitiveType()) {
236+
swiftWriter.emitStatement("return " + returnSwiftType.swiftType + "(fromJavaPrimitive: optionalResult)");
237+
}
238+
else {
239+
swiftWriter.emitStatement("guard let result = optionalResult else {");
240+
if (isReturnTypeOptional) {
241+
swiftWriter.emitStatement("return nil");
242+
} else {
243+
swiftWriter.emitStatement("fatalError(\"Don't support nil here!\")");
244+
}
245+
swiftWriter.emitStatement("}");
246+
247+
swiftWriter.emitStatement("defer {");
248+
swiftWriter.emitStatement("JNI.DeleteLocalRef(result)");
249+
swiftWriter.emitStatement("}");
250+
swiftWriter.emitStatement("do {");
251+
swiftWriter.emitStatement(String.format("return try %s.from(javaObject: result)", returnSwiftType.swiftConstructorType));
252+
swiftWriter.emitStatement("}");
253+
swiftWriter.emitStatement("catch {");
254+
swiftWriter.emitStatement("let errorString = String(reflecting: type(of: error)) + String(describing: error)");
255+
swiftWriter.emitStatement("fatalError(errorString)");
256+
swiftWriter.emitStatement("}");
257+
}
247258
}
248259

249260
swiftWriter.emitStatement("}");

sample/build.gradle

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@ apply plugin: 'kotlin-android'
55
apply plugin: 'kotlin-android-extensions'
66
apply plugin: 'kotlin-kapt'
77

8-
apply plugin: 'kotlin-kapt'
9-
108
swift {
119
useKapt true
1210
cleanEnabled true

sample/src/androidTest/java/com/readdle/swiftjava/sample/BoolTests.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,4 +91,14 @@ public void testDecode() {
9191
Assert.assertFalse(BoolTest.testDecode(badParam));
9292
}
9393

94+
@Test
95+
public void testBlock() {
96+
Assert.assertTrue(BoolTest.testBlock(value -> value));
97+
}
98+
99+
@Test
100+
public void testOptionalBlock() {
101+
Assert.assertTrue(BoolTest.testOptionalBlock(value -> value));
102+
}
103+
94104
}

sample/src/androidTest/java/com/readdle/swiftjava/sample/DoubleTests.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,4 +98,14 @@ public void testDecode() {
9898
Assert.assertFalse(DoubleTest.testDecode(badParam));
9999
}
100100

101+
@Test
102+
public void testBlock() {
103+
Assert.assertTrue(DoubleTest.testBlock(value -> value));
104+
}
105+
106+
@Test
107+
public void testOptionalBoolBlock() {
108+
Assert.assertTrue(DoubleTest.testOptionalBlock(value -> value));
109+
}
110+
101111
}

sample/src/androidTest/java/com/readdle/swiftjava/sample/FloatTests.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,4 +98,14 @@ public void testDecode() {
9898
Assert.assertFalse(FloatTest.testDecode(badParam));
9999
}
100100

101+
@Test
102+
public void testBlock() {
103+
Assert.assertTrue(FloatTest.testBlock(value -> value));
104+
}
105+
106+
@Test
107+
public void testOptionalBlock() {
108+
Assert.assertTrue(FloatTest.testOptionalBlock(value -> value));
109+
}
110+
101111
}

sample/src/androidTest/java/com/readdle/swiftjava/sample/Int16Tests.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,4 +124,14 @@ public void testOptionSetDecode() {
124124
Assert.assertEquals(Int16OptionsSet.getThree().getRawValue(), Int16Test.testOptionSetDecode(Int16OptionsSet.getThree()));
125125
}
126126

127+
@Test
128+
public void testBlock() {
129+
Assert.assertTrue(Int16Test.testBlock(value -> value));
130+
}
131+
132+
@Test
133+
public void testOptionalBlock() {
134+
Assert.assertTrue(Int16Test.testOptionalBlock(value -> value));
135+
}
136+
127137
}

sample/src/androidTest/java/com/readdle/swiftjava/sample/Int64Tests.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,4 +124,14 @@ public void testOptionSetDecode() {
124124
Assert.assertEquals(Int64OptionsSet.getThree().getRawValue(), Int64Test.testOptionSetDecode(Int64OptionsSet.getThree()));
125125
}
126126

127+
@Test
128+
public void testBlock() {
129+
Assert.assertTrue(Int64Test.testBlock(value -> value));
130+
}
131+
132+
@Test
133+
public void testOptionalBlock() {
134+
Assert.assertTrue(Int64Test.testOptionalBlock(value -> value));
135+
}
136+
127137
}

sample/src/androidTest/java/com/readdle/swiftjava/sample/Int8Tests.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,4 +124,14 @@ public void testOptionSetDecode() {
124124
Assert.assertEquals(Int8OptionsSet.getThree().getRawValue(), Int8Test.testOptionSetDecode(Int8OptionsSet.getThree()));
125125
}
126126

127+
@Test
128+
public void testBlock() {
129+
Assert.assertTrue(Int8Test.testBlock(value -> value));
130+
}
131+
132+
@Test
133+
public void testOptionalBlock() {
134+
Assert.assertTrue(Int8Test.testOptionalBlock(value -> value));
135+
}
136+
127137
}

sample/src/androidTest/java/com/readdle/swiftjava/sample/IntTests.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,4 +144,14 @@ public void testOptionSetDecode() {
144144
Assert.assertEquals(IntOptionsSet.getThree().getRawValue(), IntTest.testOptionSetDecode(IntOptionsSet.getThree()));
145145
}
146146

147+
@Test
148+
public void testBlock() {
149+
Assert.assertTrue(IntTest.testBlock(value -> value));
150+
}
151+
152+
@Test
153+
public void testOptionalBlock() {
154+
Assert.assertTrue(IntTest.testOptionalBlock(value -> value));
155+
}
156+
147157
}

sample/src/androidTest/java/com/readdle/swiftjava/sample/UInt16Tests.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,4 +127,14 @@ public void testOptionSetDecode() {
127127
Assert.assertEquals(UInt16OptionsSet.getThree().getRawValue(),UInt16Test.testOptionSetDecode(UInt16OptionsSet.getThree()));
128128
}
129129

130+
@Test
131+
public void testBlock() {
132+
Assert.assertTrue(UInt16Test.testBlock(value -> value));
133+
}
134+
135+
@Test
136+
public void testOptionalBlock() {
137+
Assert.assertTrue(UInt16Test.testOptionalBlock(value -> value));
138+
}
139+
130140
}

sample/src/androidTest/java/com/readdle/swiftjava/sample/UInt64Tests.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,4 +127,14 @@ public void testOptionSetDecode() {
127127
Assert.assertEquals(UInt64OptionsSet.getThree().getRawValue(),UInt64Test.testOptionSetDecode(UInt64OptionsSet.getThree()));
128128
}
129129

130+
@Test
131+
public void testBlock() {
132+
Assert.assertTrue(UInt64Test.testBlock(value -> value));
133+
}
134+
135+
@Test
136+
public void testOptionalBlock() {
137+
Assert.assertTrue(UInt64Test.testOptionalBlock(value -> value));
138+
}
139+
130140
}

sample/src/androidTest/java/com/readdle/swiftjava/sample/UInt8Tests.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,4 +127,14 @@ public void testOptionSetDecode() {
127127
Assert.assertEquals(UInt8OptionsSet.getThree().getRawValue(),UInt8Test.testOptionSetDecode(UInt8OptionsSet.getThree()));
128128
}
129129

130+
@Test
131+
public void testBlock() {
132+
Assert.assertTrue(UInt8Test.testBlock(value -> value));
133+
}
134+
135+
@Test
136+
public void testOptionalBlock() {
137+
Assert.assertTrue(UInt8Test.testOptionalBlock(value -> value));
138+
}
139+
130140
}

sample/src/androidTest/java/com/readdle/swiftjava/sample/UIntTests.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,4 +140,14 @@ public void testOptionSetDecode() {
140140
Assert.assertEquals(UIntOptionsSet.getThree().getRawValue(),UIntTest.testOptionSetDecode(UIntOptionsSet.getThree()));
141141
}
142142

143+
@Test
144+
public void testBlock() {
145+
Assert.assertTrue(UIntTest.testBlock(value -> value));
146+
}
147+
148+
@Test
149+
public void testOptionalBlock() {
150+
Assert.assertTrue(UIntTest.testOptionalBlock(value -> value));
151+
}
152+
143153
}

sample/src/main/java/com/readdle/swiftjava/sample/BoolTest.kt

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
11
package com.readdle.swiftjava.sample
22

3-
import com.readdle.codegen.anotation.SwiftCallbackFunc
4-
import com.readdle.codegen.anotation.SwiftDelegate
5-
import com.readdle.codegen.anotation.SwiftReference
6-
import com.readdle.codegen.anotation.SwiftValue
3+
import com.readdle.codegen.anotation.*
74
import java.lang.annotation.Native
85

96
@SwiftValue
@@ -39,6 +36,16 @@ class BoolTest private constructor() {
3936
fun testOptionalReturnType(): Boolean?
4037
}
4138

39+
@SwiftBlock("(Bool) -> Bool")
40+
interface BoolBlock {
41+
fun call(value: Boolean): Boolean
42+
}
43+
44+
@SwiftBlock("(Bool?) -> Bool?")
45+
interface OptionalBoolBlock {
46+
fun call(value: Boolean?): Boolean?
47+
}
48+
4249
companion object {
4350
@JvmStatic
4451
external fun testYes(): Boolean
@@ -71,10 +78,16 @@ class BoolTest private constructor() {
7178
external fun testProtocolOptionalReturnType(callback: BoolOptionalReturnTypeProtocol): Boolean?
7279

7380
@JvmStatic
74-
external fun testEncode(): BoolTestStruct
81+
external fun testEncode(): BoolTestStruct
7582

7683
@JvmStatic
7784
external fun testDecode(value: BoolTestStruct): Boolean
85+
86+
@JvmStatic
87+
external fun testBlock(@SwiftBlock block: BoolBlock): Boolean
88+
89+
@JvmStatic
90+
external fun testOptionalBlock(@SwiftBlock block: OptionalBoolBlock): Boolean
7891
}
7992

8093
@Native

sample/src/main/java/com/readdle/swiftjava/sample/DoubleTest.kt

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
11
package com.readdle.swiftjava.sample
22

3-
import com.readdle.codegen.anotation.SwiftCallbackFunc
4-
import com.readdle.codegen.anotation.SwiftDelegate
5-
import com.readdle.codegen.anotation.SwiftReference
6-
import com.readdle.codegen.anotation.SwiftValue
3+
import com.readdle.codegen.anotation.*
74
import java.lang.annotation.Native
85

96
@SwiftValue
@@ -40,6 +37,16 @@ class DoubleTest private constructor() {
4037
fun testOptionalReturnType(): Double?
4138
}
4239

40+
@SwiftBlock("(Double) -> Double")
41+
interface DoubleBlock {
42+
fun call(value: Double): Double
43+
}
44+
45+
@SwiftBlock("(Double?) -> Double?")
46+
interface OptionalDoubleBlock {
47+
fun call(value: Double?): Double?
48+
}
49+
4350
companion object {
4451
@JvmStatic
4552
external fun testZero(): Double
@@ -79,6 +86,12 @@ class DoubleTest private constructor() {
7986

8087
@JvmStatic
8188
external fun testDecode(value: DoubleTestStruct): Boolean
89+
90+
@JvmStatic
91+
external fun testBlock(@SwiftBlock block: DoubleBlock): Boolean
92+
93+
@JvmStatic
94+
external fun testOptionalBlock(@SwiftBlock block: OptionalDoubleBlock): Boolean
8295
}
8396

8497
@Native

sample/src/main/java/com/readdle/swiftjava/sample/FloatTest.kt

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
11
package com.readdle.swiftjava.sample
22

3-
import com.readdle.codegen.anotation.SwiftCallbackFunc
4-
import com.readdle.codegen.anotation.SwiftDelegate
5-
import com.readdle.codegen.anotation.SwiftReference
6-
import com.readdle.codegen.anotation.SwiftValue
3+
import com.readdle.codegen.anotation.*
74
import java.lang.annotation.Native
85

96
@SwiftValue
@@ -40,6 +37,16 @@ class FloatTest private constructor() {
4037
fun testOptionalReturnType(): Float?
4138
}
4239

40+
@SwiftBlock("(Float) -> Float")
41+
interface FloatBlock {
42+
fun call(value: Float): Float
43+
}
44+
45+
@SwiftBlock("(Float?) -> Float?")
46+
interface OptionalFloatBlock {
47+
fun call(value: Float?): Float?
48+
}
49+
4350
companion object {
4451
@JvmStatic
4552
external fun testZero(): Float
@@ -79,6 +86,12 @@ class FloatTest private constructor() {
7986

8087
@JvmStatic
8188
external fun testDecode(value: FloatTestStruct): Boolean
89+
90+
@JvmStatic
91+
external fun testBlock(@SwiftBlock block: FloatBlock): Boolean
92+
93+
@JvmStatic
94+
external fun testOptionalBlock(@SwiftBlock block: OptionalFloatBlock): Boolean
8295
}
8396

8497
@Native

0 commit comments

Comments
 (0)