Skip to content

Commit f21a377

Browse files
committed
Dev: fix primitive optional return types
1 parent beccdd0 commit f21a377

File tree

2 files changed

+59
-4
lines changed

2 files changed

+59
-4
lines changed

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

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,33 @@ Type makeUnsigned() {
151151
throw new IllegalStateException(swiftType + " can't be unsigned");
152152
}
153153
}
154+
155+
public String primitiveDefaultValue() {
156+
switch (swiftType) {
157+
case "Bool":
158+
return "jboolean(JNI_FALSE)";
159+
case "Int":
160+
case "Int32":
161+
case "UInt":
162+
case "UInt32":
163+
return "jint(0)";
164+
case "Int8":
165+
case "UInt8":
166+
return "jbyte(0)";
167+
case "Int16":
168+
case "UInt16":
169+
return "jshort(0)";
170+
case "Int64":
171+
case "UInt64":
172+
return "jlong(0)";
173+
case "Float":
174+
return "jfloat(0)";
175+
case "Double":
176+
return "jdouble(0)";
177+
default:
178+
throw new IllegalStateException(swiftType + " is not primitive");
179+
}
180+
}
154181
}
155182

156183
}

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

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,10 @@ public void generateCode(SwiftWriter swiftWriter, String javaFullName, String sw
9999

100100
String retType = "";
101101
if (returnSwiftType != null) {
102-
retType = " -> " + returnSwiftType.javaSigType(isReturnTypeOptional) + "?";
102+
retType = " -> " + returnSwiftType.javaSigType(isReturnTypeOptional);
103+
if (isReturnTypeOptional || !returnSwiftType.isPrimitiveType()) {
104+
retType += "?";
105+
}
103106
}
104107

105108
swiftWriter.emit(String.format(")%s {\n", retType));
@@ -143,7 +146,17 @@ else if (param.isOptional) {
143146
swiftWriter.emitStatement("}");
144147
swiftWriter.emitStatement("catch {");
145148
Utils.handleRuntimeError(swiftWriter);
146-
swiftWriter.emitStatement(String.format("return%s", returnSwiftType != null ? " nil" : ""));
149+
if (returnSwiftType == null) {
150+
swiftWriter.emitStatement("return");
151+
}
152+
else {
153+
if (!isReturnTypeOptional && returnSwiftType.isPrimitiveType()) {
154+
swiftWriter.emitStatement("return " + returnSwiftType.primitiveDefaultValue());
155+
}
156+
else {
157+
swiftWriter.emitStatement("return nil");
158+
}
159+
}
147160
swiftWriter.emitStatement("}");
148161
}
149162

@@ -192,15 +205,30 @@ else if (param.isOptional) {
192205
swiftWriter.emitStatement("}");
193206
swiftWriter.emitStatement("catch {");
194207
Utils.handleRuntimeError(swiftWriter);
195-
swiftWriter.emitStatement("return nil");
208+
if (!isReturnTypeOptional && returnSwiftType.isPrimitiveType()) {
209+
swiftWriter.emitStatement("return " + returnSwiftType.primitiveDefaultValue());
210+
}
211+
else {
212+
swiftWriter.emitStatement("return nil");
213+
}
196214
swiftWriter.emitStatement("}");
197215
}
198216

199217
if (isThrown) {
200218
swiftWriter.emitStatement("}");
201219
swiftWriter.emitStatement("catch {");
202220
Utils.handleError(swiftWriter);
203-
swiftWriter.emitStatement(String.format("return%s", returnSwiftType != null ? " nil" : ""));
221+
if (returnSwiftType == null) {
222+
swiftWriter.emitStatement("return");
223+
}
224+
else {
225+
if (!isReturnTypeOptional && returnSwiftType.isPrimitiveType()) {
226+
swiftWriter.emitStatement("return " + returnSwiftType.primitiveDefaultValue());
227+
}
228+
else {
229+
swiftWriter.emitStatement("return nil");
230+
}
231+
}
204232
swiftWriter.emitStatement("}");
205233
}
206234

0 commit comments

Comments
 (0)