|
4 | 4 |
|
5 | 5 | import java.io.IOException; |
6 | 6 | import java.util.Arrays; |
7 | | -import java.util.HashMap; |
8 | 7 | import java.util.LinkedList; |
9 | 8 | import java.util.List; |
10 | 9 |
|
@@ -36,7 +35,7 @@ public class SwiftCallbackFuncDescriptor { |
36 | 35 | this.isStatic = executableElement.getModifiers().contains(Modifier.STATIC); |
37 | 36 | this.isThrown = executableElement.getThrownTypes() != null && executableElement.getThrownTypes().size() > 0; |
38 | 37 | this.returnSwiftType = processor.parseJavaType(executableElement.getReturnType().toString()); |
39 | | - this.isReturnTypeOptional = JavaSwiftProcessor.isNullable(executableElement); |
| 38 | + this.isReturnTypeOptional = processor.isNullable(executableElement); |
40 | 39 |
|
41 | 40 | StringBuilder signatureBuilder = new StringBuilder("("); |
42 | 41 |
|
@@ -142,39 +141,60 @@ void generateCode(SwiftWriter swiftWriter, String javaFullName, String swiftType |
142 | 141 | swiftWriter.emitStatement("}"); |
143 | 142 |
|
144 | 143 | if (params.size() > 0) { |
145 | | - swiftWriter.emitStatement("do {"); |
| 144 | + boolean hasNonPrimitiveParam = false; |
| 145 | + for (int i = 0; i < params.size(); i++) { |
| 146 | + SwiftParamDescriptor param = params.get(i); |
| 147 | + if (param.isOptional || !param.isPrimitive()) { |
| 148 | + hasNonPrimitiveParam = true; |
| 149 | + break; |
| 150 | + } |
| 151 | + } |
| 152 | + |
| 153 | + if (hasNonPrimitiveParam) { |
| 154 | + swiftWriter.emitStatement("do {"); |
| 155 | + } |
| 156 | + |
146 | 157 | for (SwiftParamDescriptor param : params) { |
147 | 158 | if (param.isOptional) { |
148 | 159 | swiftWriter.emitStatement(String.format("if let %1$s = %1$s {", param.name)); |
149 | 160 | swiftWriter.emitStatement(String.format("java%1$s = try %1$s.javaObject()", param.name)); |
150 | 161 | swiftWriter.emitStatement("}"); |
151 | 162 | } else { |
152 | | - swiftWriter.emitStatement(String.format("java%s = try %s.javaObject()", param.name, param.name)); |
| 163 | + if (param.isPrimitive()) { |
| 164 | + swiftWriter.emitStatement(String.format("java%s = %s.javaPrimitive()", param.name, param.name)); |
| 165 | + } |
| 166 | + else { |
| 167 | + swiftWriter.emitStatement(String.format("java%s = try %s.javaObject()", param.name, param.name)); |
| 168 | + } |
153 | 169 | } |
154 | 170 | } |
155 | 171 |
|
156 | | - swiftWriter.emitStatement("}"); |
157 | | - swiftWriter.emitStatement("catch {"); |
158 | | - swiftWriter.emitStatement("let errorString = String(reflecting: type(of: error)) + String(describing: error)"); |
159 | | - if (returnSwiftType == null) { |
160 | | - swiftWriter.emitStatement("assert(false, errorString)"); |
161 | | - swiftWriter.emitStatement("return"); |
162 | | - } else if (isReturnTypeOptional) { |
163 | | - swiftWriter.emitStatement("assert(false, errorString)"); |
164 | | - swiftWriter.emitStatement("return nil"); |
165 | | - } else { |
166 | | - swiftWriter.emitStatement("fatalError(errorString)"); |
| 172 | + if (hasNonPrimitiveParam) { |
| 173 | + swiftWriter.emitStatement("}"); |
| 174 | + swiftWriter.emitStatement("catch {"); |
| 175 | + swiftWriter.emitStatement("let errorString = String(reflecting: type(of: error)) + String(describing: error)"); |
| 176 | + if (returnSwiftType == null) { |
| 177 | + swiftWriter.emitStatement("assert(false, errorString)"); |
| 178 | + swiftWriter.emitStatement("return"); |
| 179 | + } else if (isReturnTypeOptional) { |
| 180 | + swiftWriter.emitStatement("assert(false, errorString)"); |
| 181 | + swiftWriter.emitStatement("return nil"); |
| 182 | + } else { |
| 183 | + swiftWriter.emitStatement("fatalError(errorString)"); |
| 184 | + } |
| 185 | + swiftWriter.emitStatement("}"); |
167 | 186 | } |
168 | | - swiftWriter.emitStatement("}"); |
169 | 187 | } |
170 | 188 |
|
171 | 189 | String jniMethodTemplate; |
172 | 190 | if (returnSwiftType != null) { |
173 | 191 | if (!isStatic) { |
174 | | - jniMethodTemplate = "let optionalResult = JNI.CallObjectMethod(jniObject, %s.javaMethod%s"; |
| 192 | + String methodCallMethod = returnSwiftType.returnTypeFunc(isReturnTypeOptional); |
| 193 | + jniMethodTemplate = "let optionalResult = JNI." + methodCallMethod + "(jniObject, %s.javaMethod%s"; |
175 | 194 | } |
176 | 195 | else { |
177 | | - jniMethodTemplate = "let optionalResult = JNI.CallStaticObjectMethod(javaClass, %s.javaMethod%s"; |
| 196 | + String methodCallMethod = returnSwiftType.staticReturnTypeFunc(isReturnTypeOptional); |
| 197 | + jniMethodTemplate = "let optionalResult = JNI." + methodCallMethod + "(javaClass, %s.javaMethod%s"; |
178 | 198 | } |
179 | 199 | } |
180 | 200 | else { |
@@ -208,25 +228,29 @@ void generateCode(SwiftWriter swiftWriter, String javaFullName, String swiftType |
208 | 228 | swiftWriter.emitStatement("}"); |
209 | 229 |
|
210 | 230 | if (returnSwiftType != null) { |
211 | | - swiftWriter.emitStatement("guard let result = optionalResult else {"); |
212 | | - if (isReturnTypeOptional) { |
213 | | - swiftWriter.emitStatement("return nil"); |
| 231 | + if (!isReturnTypeOptional && returnSwiftType.isPrimitiveType()) { |
| 232 | + swiftWriter.emitStatement("return optionalResult"); |
214 | 233 | } |
215 | 234 | else { |
216 | | - swiftWriter.emitStatement("fatalError(\"Don't support nil here!\")"); |
| 235 | + swiftWriter.emitStatement("guard let result = optionalResult else {"); |
| 236 | + if (isReturnTypeOptional) { |
| 237 | + swiftWriter.emitStatement("return nil"); |
| 238 | + } else { |
| 239 | + swiftWriter.emitStatement("fatalError(\"Don't support nil here!\")"); |
| 240 | + } |
| 241 | + swiftWriter.emitStatement("}"); |
| 242 | + |
| 243 | + swiftWriter.emitStatement("defer {"); |
| 244 | + swiftWriter.emitStatement("JNI.DeleteLocalRef(result)"); |
| 245 | + swiftWriter.emitStatement("}"); |
| 246 | + swiftWriter.emitStatement("do {"); |
| 247 | + swiftWriter.emitStatement(String.format("return try %s.from(javaObject: result)", returnSwiftType.swiftConstructorType)); |
| 248 | + swiftWriter.emitStatement("}"); |
| 249 | + swiftWriter.emitStatement("catch {"); |
| 250 | + swiftWriter.emitStatement("let errorString = String(reflecting: type(of: error)) + String(describing: error)"); |
| 251 | + swiftWriter.emitStatement("fatalError(errorString)"); |
| 252 | + swiftWriter.emitStatement("}"); |
217 | 253 | } |
218 | | - swiftWriter.emitStatement("}"); |
219 | | - |
220 | | - swiftWriter.emitStatement("defer {"); |
221 | | - swiftWriter.emitStatement("JNI.DeleteLocalRef(result)"); |
222 | | - swiftWriter.emitStatement("}"); |
223 | | - swiftWriter.emitStatement("do {"); |
224 | | - swiftWriter.emitStatement(String.format("return try %s.from(javaObject: result)", returnSwiftType.swiftConstructorType)); |
225 | | - swiftWriter.emitStatement("}"); |
226 | | - swiftWriter.emitStatement("catch {"); |
227 | | - swiftWriter.emitStatement("let errorString = String(reflecting: type(of: error)) + String(describing: error)"); |
228 | | - swiftWriter.emitStatement("fatalError(errorString)"); |
229 | | - swiftWriter.emitStatement("}"); |
230 | 254 | } |
231 | 255 |
|
232 | 256 | swiftWriter.emitStatement("}"); |
|
0 commit comments