From f21a37786b0f3c6bda3f9fe8b756f58175e6da92 Mon Sep 17 00:00:00 2001 From: Andrew Druk Date: Sat, 30 Jan 2021 20:02:06 +0200 Subject: [PATCH] Dev: fix primitive optional return types --- .../com/readdle/codegen/SwiftEnvironment.java | 27 ++++++++++++++ .../readdle/codegen/SwiftFuncDescriptor.java | 36 ++++++++++++++++--- 2 files changed, 59 insertions(+), 4 deletions(-) diff --git a/compiler/src/main/java/com/readdle/codegen/SwiftEnvironment.java b/compiler/src/main/java/com/readdle/codegen/SwiftEnvironment.java index 5f3faf3..7e95ba3 100644 --- a/compiler/src/main/java/com/readdle/codegen/SwiftEnvironment.java +++ b/compiler/src/main/java/com/readdle/codegen/SwiftEnvironment.java @@ -151,6 +151,33 @@ Type makeUnsigned() { throw new IllegalStateException(swiftType + " can't be unsigned"); } } + + public String primitiveDefaultValue() { + switch (swiftType) { + case "Bool": + return "jboolean(JNI_FALSE)"; + case "Int": + case "Int32": + case "UInt": + case "UInt32": + return "jint(0)"; + case "Int8": + case "UInt8": + return "jbyte(0)"; + case "Int16": + case "UInt16": + return "jshort(0)"; + case "Int64": + case "UInt64": + return "jlong(0)"; + case "Float": + return "jfloat(0)"; + case "Double": + return "jdouble(0)"; + default: + throw new IllegalStateException(swiftType + " is not primitive"); + } + } } } diff --git a/compiler/src/main/java/com/readdle/codegen/SwiftFuncDescriptor.java b/compiler/src/main/java/com/readdle/codegen/SwiftFuncDescriptor.java index 57836aa..7b58bc6 100644 --- a/compiler/src/main/java/com/readdle/codegen/SwiftFuncDescriptor.java +++ b/compiler/src/main/java/com/readdle/codegen/SwiftFuncDescriptor.java @@ -99,7 +99,10 @@ public void generateCode(SwiftWriter swiftWriter, String javaFullName, String sw String retType = ""; if (returnSwiftType != null) { - retType = " -> " + returnSwiftType.javaSigType(isReturnTypeOptional) + "?"; + retType = " -> " + returnSwiftType.javaSigType(isReturnTypeOptional); + if (isReturnTypeOptional || !returnSwiftType.isPrimitiveType()) { + retType += "?"; + } } swiftWriter.emit(String.format(")%s {\n", retType)); @@ -143,7 +146,17 @@ else if (param.isOptional) { swiftWriter.emitStatement("}"); swiftWriter.emitStatement("catch {"); Utils.handleRuntimeError(swiftWriter); - swiftWriter.emitStatement(String.format("return%s", returnSwiftType != null ? " nil" : "")); + if (returnSwiftType == null) { + swiftWriter.emitStatement("return"); + } + else { + if (!isReturnTypeOptional && returnSwiftType.isPrimitiveType()) { + swiftWriter.emitStatement("return " + returnSwiftType.primitiveDefaultValue()); + } + else { + swiftWriter.emitStatement("return nil"); + } + } swiftWriter.emitStatement("}"); } @@ -192,7 +205,12 @@ else if (param.isOptional) { swiftWriter.emitStatement("}"); swiftWriter.emitStatement("catch {"); Utils.handleRuntimeError(swiftWriter); - swiftWriter.emitStatement("return nil"); + if (!isReturnTypeOptional && returnSwiftType.isPrimitiveType()) { + swiftWriter.emitStatement("return " + returnSwiftType.primitiveDefaultValue()); + } + else { + swiftWriter.emitStatement("return nil"); + } swiftWriter.emitStatement("}"); } @@ -200,7 +218,17 @@ else if (param.isOptional) { swiftWriter.emitStatement("}"); swiftWriter.emitStatement("catch {"); Utils.handleError(swiftWriter); - swiftWriter.emitStatement(String.format("return%s", returnSwiftType != null ? " nil" : "")); + if (returnSwiftType == null) { + swiftWriter.emitStatement("return"); + } + else { + if (!isReturnTypeOptional && returnSwiftType.isPrimitiveType()) { + swiftWriter.emitStatement("return " + returnSwiftType.primitiveDefaultValue()); + } + else { + swiftWriter.emitStatement("return nil"); + } + } swiftWriter.emitStatement("}"); }