Skip to content

Commit 7dd266d

Browse files
committed
Dev: add support Kotlin Swift References
1 parent a381c8a commit 7dd266d

6 files changed

Lines changed: 226 additions & 180 deletions

File tree

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

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,37 @@ boolean isPrimitiveType() {
4242
swiftType.equals("Double");
4343
}
4444

45+
String javaSigType(boolean isOptional) {
46+
if (isOptional) {
47+
return "jobject";
48+
}
49+
else {
50+
switch (swiftType) {
51+
case "Bool":
52+
return "jboolean";
53+
case "Int":
54+
case "Int32":
55+
case "UInt16":
56+
return "jint";
57+
case "Int8":
58+
return "jbyte";
59+
case "Int16":
60+
case "UInt8":
61+
return "jshort";
62+
case "Int64":
63+
case "UInt":
64+
case "UInt32":
65+
return "jlong";
66+
case "Float":
67+
return "jfloat";
68+
case "Double":
69+
return "jdouble";
70+
default:
71+
return "jobject";
72+
}
73+
}
74+
}
75+
4576
String returnTypeFunc(boolean isOptional) {
4677
if (isOptional) {
4778
return "CallObjectMethod";

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

Lines changed: 36 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -88,10 +88,15 @@ public void generateCode(SwiftWriter swiftWriter, String javaFullName, String sw
8888
swiftWriter.emit(String.format("public func %s(env: UnsafeMutablePointer<JNIEnv?>, %s", swiftFuncName, isStatic ? "clazz: jclass" : "this: jobject"));
8989

9090
for (SwiftParamDescriptor param : params) {
91-
swiftWriter.emit(String.format(", j%s: jobject%s", param.name, param.isOptional ? "?" : ""));
91+
swiftWriter.emit(String.format(", j%s: %s%s", param.name, param.swiftType.javaSigType(param.isOptional), param.isOptional ? "?" : ""));
9292
}
9393

94-
swiftWriter.emit(String.format(")%s {\n", returnSwiftType != null ? " -> jobject?" : ""));
94+
String retType = "";
95+
if (returnSwiftType != null) {
96+
retType = " -> " + returnSwiftType.javaSigType(isReturnTypeOptional) + "?";
97+
}
98+
99+
swiftWriter.emit(String.format(")%s {\n", retType));
95100
swiftWriter.emitEmptyLine();
96101

97102
if (!isStatic) {
@@ -112,7 +117,15 @@ public void generateCode(SwiftWriter swiftWriter, String javaFullName, String sw
112117
}
113118

114119
for (SwiftParamDescriptor param : params) {
115-
if (param.isOptional) {
120+
if (param.isPrimitive()) {
121+
if (param.swiftType.swiftType.equals("Bool")) {
122+
swiftWriter.emitStatement(String.format("%1$s = j%1$s == JNI_TRUE", param.name));
123+
}
124+
else {
125+
swiftWriter.emitStatement(String.format("%1$s = j%1$s", param.name));
126+
}
127+
}
128+
else if (param.isOptional) {
116129
swiftWriter.emitStatement(String.format("if let j%1$s = j%1$s {", param.name));
117130
swiftWriter.emitStatement(String.format("%1$s = try %2$s.from(javaObject: j%1$s)", param.name, param.swiftType.swiftConstructorType));
118131
swiftWriter.emitStatement("}");
@@ -166,20 +179,29 @@ public void generateCode(SwiftWriter swiftWriter, String javaFullName, String sw
166179
}
167180

168181
if (returnSwiftType != null) {
169-
swiftWriter.emitStatement("do {");
170-
if (isReturnTypeOptional) {
171-
swiftWriter.emitStatement("return try result?.javaObject()");
182+
if (returnSwiftType.isPrimitiveType()) {
183+
if (returnSwiftType.swiftType.equals("Bool")) {
184+
swiftWriter.emitStatement("return jboolean(result ? JNI_TRUE : JNI_FALSE)");
185+
}
186+
else {
187+
swiftWriter.emitStatement("return result");
188+
}
172189
}
173190
else {
174-
swiftWriter.emitStatement("return try result.javaObject()");
191+
swiftWriter.emitStatement("do {");
192+
if (isReturnTypeOptional) {
193+
swiftWriter.emitStatement("return try result?.javaObject()");
194+
} else {
195+
swiftWriter.emitStatement("return try result.javaObject()");
196+
}
197+
swiftWriter.emitStatement("}");
198+
swiftWriter.emitStatement("catch {");
199+
swiftWriter.emitStatement("let nsError = error as NSError");
200+
swiftWriter.emitStatement("let errorString = \"\\(nsError.domain): \\(nsError.code)\"");
201+
swiftWriter.emitStatement("_ = JNI.api.ThrowNew(JNI.env, SwiftRuntimeErrorClass, errorString)");
202+
swiftWriter.emitStatement("return nil");
203+
swiftWriter.emitStatement("}");
175204
}
176-
swiftWriter.emitStatement("}");
177-
swiftWriter.emitStatement("catch {");
178-
swiftWriter.emitStatement("let nsError = error as NSError");
179-
swiftWriter.emitStatement("let errorString = \"\\(nsError.domain): \\(nsError.code)\"");
180-
swiftWriter.emitStatement("_ = JNI.api.ThrowNew(JNI.env, SwiftRuntimeErrorClass, errorString)");
181-
swiftWriter.emitStatement("return nil");
182-
swiftWriter.emitStatement("}");
183205
}
184206

185207
if (isThrown) {

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

Lines changed: 27 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,13 @@ public void generateCode(SwiftWriter swiftWriter, String javaFullName, String sw
5252
swiftWriter.emitEmptyLine();
5353
swiftWriter.emitStatement(String.format("@_silgen_name(\"%s\")", swiftFuncName));
5454
swiftWriter.emit(String.format("public func %s(env: UnsafeMutablePointer<JNIEnv?>, %s", swiftFuncName, isStatic ? "clazz: jclass" : "this: jobject"));
55-
swiftWriter.emit(String.format(")%s {\n", returnSwiftType != null ? " -> jobject?" : ""));
55+
56+
String retType = "";
57+
if (returnSwiftType != null) {
58+
retType = " -> " + returnSwiftType.javaSigType(isReturnTypeOptional) + "?";
59+
}
60+
61+
swiftWriter.emit(String.format(")%s {\n", retType));
5662
swiftWriter.emitEmptyLine();
5763

5864
if (!isStatic) {
@@ -71,20 +77,29 @@ public void generateCode(SwiftWriter swiftWriter, String javaFullName, String sw
7177
swiftWriter.emitStatement(String.format("let result = %s.%s", isStatic ? swiftType : "swiftSelf", swiftName));
7278

7379
if (returnSwiftType != null) {
74-
swiftWriter.emitStatement("do {");
75-
if (isReturnTypeOptional) {
76-
swiftWriter.emitStatement("return try result?.javaObject()");
80+
if (returnSwiftType.isPrimitiveType()) {
81+
if (returnSwiftType.swiftType.equals("Bool")) {
82+
swiftWriter.emitStatement("return jboolean(result ? JNI_TRUE : JNI_FALSE)");
83+
}
84+
else {
85+
swiftWriter.emitStatement("return result");
86+
}
7787
}
7888
else {
79-
swiftWriter.emitStatement("return try result.javaObject()");
89+
swiftWriter.emitStatement("do {");
90+
if (isReturnTypeOptional) {
91+
swiftWriter.emitStatement("return try result?.javaObject()");
92+
} else {
93+
swiftWriter.emitStatement("return try result.javaObject()");
94+
}
95+
swiftWriter.emitStatement("}");
96+
swiftWriter.emitStatement("catch {");
97+
swiftWriter.emitStatement("let nsError = error as NSError");
98+
swiftWriter.emitStatement("let errorString = \"\\(nsError.domain): \\(nsError.code)\"");
99+
swiftWriter.emitStatement("_ = JNI.api.ThrowNew(JNI.env, SwiftRuntimeErrorClass, errorString)");
100+
swiftWriter.emitStatement("return nil");
101+
swiftWriter.emitStatement("}");
80102
}
81-
swiftWriter.emitStatement("}");
82-
swiftWriter.emitStatement("catch {");
83-
swiftWriter.emitStatement("let nsError = error as NSError");
84-
swiftWriter.emitStatement("let errorString = \"\\(nsError.domain): \\(nsError.code)\"");
85-
swiftWriter.emitStatement("_ = JNI.api.ThrowNew(JNI.env, SwiftRuntimeErrorClass, errorString)");
86-
swiftWriter.emitStatement("return nil");
87-
swiftWriter.emitStatement("}");
88103
}
89104

90105
swiftWriter.emitStatement("}");

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

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ public void generateCode(SwiftWriter swiftWriter, String javaFullName, String sw
5151
swiftWriter.emitEmptyLine();
5252
swiftWriter.emitStatement(String.format("@_silgen_name(\"%s\")", swiftFuncName));
5353
swiftWriter.emit(String.format("public func %s(env: UnsafeMutablePointer<JNIEnv?>, %s", swiftFuncName, isStatic ? "clazz: jclass" : "this: jobject"));
54-
swiftWriter.emit(String.format(", j%s: jobject%s) {\n", param.name, param.isOptional ? "?" : ""));
54+
swiftWriter.emit(String.format(", j%s: %s%s) {\n", param.name, param.swiftType.javaSigType(param.isOptional), param.isOptional ? "?" : ""));
5555
swiftWriter.emitEmptyLine();
5656

5757
if (!isStatic) {
@@ -66,7 +66,15 @@ public void generateCode(SwiftWriter swiftWriter, String javaFullName, String sw
6666
swiftWriter.emitStatement(String.format("swiftSelf = try %s.from(javaObject: this)", swiftType));
6767
}
6868

69-
if (param.isOptional) {
69+
if (param.isPrimitive()) {
70+
if (param.swiftType.swiftType.equals("Bool")) {
71+
swiftWriter.emitStatement(String.format("%1$s = j%1$s == JNI_TRUE", param.name));
72+
}
73+
else {
74+
swiftWriter.emitStatement(String.format("%1$s = j%1$s", param.name));
75+
}
76+
}
77+
else if (param.isOptional) {
7078
swiftWriter.emitStatement(String.format("if let j%1$s = j%1$s {", param.name));
7179
swiftWriter.emitStatement(String.format("%1$s = try %2$s.from(javaObject: j%1$s)", param.name, param.swiftType.swiftConstructorType));
7280
swiftWriter.emitStatement("}");

sample/src/main/java/com/readdle/swiftjava/sample/SampleReference.java

Lines changed: 0 additions & 152 deletions
This file was deleted.

0 commit comments

Comments
 (0)