Skip to content

Commit c0fd49a

Browse files
authored
Merge branch 'master' into feature/errors-location
2 parents bbf7a9e + aef3300 commit c0fd49a

8 files changed

Lines changed: 117 additions & 113 deletions

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

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -157,32 +157,32 @@ File generateCode() throws IOException {
157157
swiftWriter.emitStatement(String.format("let java_%s: JNIArgumentProtocol", param.name));
158158
}
159159

160-
swiftWriter.emitStatement("do {");
161-
for (int i = 0; i < params.size(); i++) {
162-
SwiftParamDescriptor param = params.get(i);
163-
if (param.isOptional) {
164-
swiftWriter.emitStatement(String.format("if let %s = $%s {", param.name, i + ""));
165-
swiftWriter.emitStatement(String.format("java_%s = try %s.javaObject()", param.name, param.name));
166-
swiftWriter.emitStatement("} else {");
167-
swiftWriter.emitStatement(String.format("java_%s = jnull()", param.name));
168-
swiftWriter.emitStatement("}");
169-
}
170-
else {
171-
swiftWriter.emitStatement(String.format("java_%s = try $%s.javaObject()", param.name, i + ""));
160+
if (params.size() > 0) {
161+
swiftWriter.emitStatement("do {");
162+
for (int i = 0; i < params.size(); i++) {
163+
SwiftParamDescriptor param = params.get(i);
164+
if (param.isOptional) {
165+
swiftWriter.emitStatement(String.format("if let %s = $%s {", param.name, i + ""));
166+
swiftWriter.emitStatement(String.format("java_%s = try %s.javaObject()", param.name, param.name));
167+
swiftWriter.emitStatement("} else {");
168+
swiftWriter.emitStatement(String.format("java_%s = jnull()", param.name));
169+
swiftWriter.emitStatement("}");
170+
} else {
171+
swiftWriter.emitStatement(String.format("java_%s = try $%s.javaObject()", param.name, i + ""));
172+
}
172173
}
173-
}
174174

175-
swiftWriter.emitStatement("}");
176-
swiftWriter.emitStatement("catch {");
177-
swiftWriter.emitStatement("let errorString = String(reflecting: type(of: error)) + String(describing: error)");
178-
if (returnSwiftType == null) {
179-
swiftWriter.emitStatement("assert(false, errorString)");
180-
swiftWriter.emitStatement("return");
181-
}
182-
else {
183-
swiftWriter.emitStatement("fatalError(errorString)");
175+
swiftWriter.emitStatement("}");
176+
swiftWriter.emitStatement("catch {");
177+
swiftWriter.emitStatement("let errorString = String(reflecting: type(of: error)) + String(describing: error)");
178+
if (returnSwiftType == null) {
179+
swiftWriter.emitStatement("assert(false, errorString)");
180+
swiftWriter.emitStatement("return");
181+
} else {
182+
swiftWriter.emitStatement("fatalError(errorString)");
183+
}
184+
swiftWriter.emitStatement("}");
184185
}
185-
swiftWriter.emitStatement("}");
186186

187187
String jniMethodTemplate;
188188
if (returnSwiftType != null) {
@@ -207,7 +207,7 @@ File generateCode() throws IOException {
207207

208208
swiftWriter.emitStatement("if let throwable = JNI.ExceptionCheck() {");
209209
if (isThrown) {
210-
swiftWriter.emitStatement("throw NSError(domain: \"JavaException\", code: 1)");
210+
swiftWriter.emitStatement("throw Error.from(javaObject: throwable)");
211211
}
212212
else {
213213
swiftWriter.emitStatement("fatalError(\"JavaException\")");

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

Lines changed: 42 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -96,13 +96,27 @@ void generateCode(SwiftWriter swiftWriter, String javaFullName, String swiftType
9696
swiftWriter.emitEmptyLine();
9797
swiftWriter.emit(String.format("public %s func %s(", isStatic ? "static" : "", swiftMethodName));
9898
for (int i = 0; i < params.size(); i++) {
99+
boolean isFirst = i == 0;
100+
99101
SwiftParamDescriptor param = params.get(i);
102+
103+
String paramLabel = paramNames.get(i);
104+
String paramName = param.name;
100105
String paramType = param.swiftType.swiftType + (param.isOptional ? "?" : "");
101-
if (i == 0) {
102-
swiftWriter.emit(paramNames.get(i) + " " + param.name + ": " + paramType);
106+
107+
String paramString;
108+
if (paramLabel.equals(paramName)) {
109+
paramString = paramName;
110+
}
111+
else {
112+
paramString = paramLabel + " " + paramName;
113+
}
114+
115+
if (isFirst) {
116+
swiftWriter.emit(paramString + ": " + paramType);
103117
}
104118
else {
105-
swiftWriter.emit(", " + paramNames.get(i) + " " + param.name + ": " + paramType);
119+
swiftWriter.emit(", " + paramString + ": " + paramType);
106120
}
107121
}
108122

@@ -126,32 +140,32 @@ void generateCode(SwiftWriter swiftWriter, String javaFullName, String swiftType
126140
}
127141
swiftWriter.emitStatement("}");
128142

129-
swiftWriter.emitStatement("do {");
130-
for (SwiftParamDescriptor param : params) {
131-
if (param.isOptional) {
132-
swiftWriter.emitStatement(String.format("if let %1$s = %1$s {", param.name));
133-
swiftWriter.emitStatement(String.format("java%1$s = try %1$s.javaObject()", param.name));
134-
swiftWriter.emitStatement("}");
135-
}
136-
else {
137-
swiftWriter.emitStatement(String.format("java%s = try %s.javaObject()", param.name, param.name));
143+
if (params.size() > 0) {
144+
swiftWriter.emitStatement("do {");
145+
for (SwiftParamDescriptor param : params) {
146+
if (param.isOptional) {
147+
swiftWriter.emitStatement(String.format("if let %1$s = %1$s {", param.name));
148+
swiftWriter.emitStatement(String.format("java%1$s = try %1$s.javaObject()", param.name));
149+
swiftWriter.emitStatement("}");
150+
} else {
151+
swiftWriter.emitStatement(String.format("java%s = try %s.javaObject()", param.name, param.name));
152+
}
138153
}
139-
}
140154

141-
swiftWriter.emitStatement("}");
142-
swiftWriter.emitStatement("catch {");
143-
swiftWriter.emitStatement("let errorString = String(reflecting: type(of: error)) + String(describing: error)");
144-
if (returnSwiftType == null) {
145-
swiftWriter.emitStatement("assert(false, errorString)");
146-
swiftWriter.emitStatement("return");
147-
}
148-
else if (isReturnTypeOptional) {
149-
swiftWriter.emitStatement("assert(false, errorString)");
150-
swiftWriter.emitStatement("return nil");
151-
} else {
152-
swiftWriter.emitStatement("fatalError(errorString)");
155+
swiftWriter.emitStatement("}");
156+
swiftWriter.emitStatement("catch {");
157+
swiftWriter.emitStatement("let errorString = String(reflecting: type(of: error)) + String(describing: error)");
158+
if (returnSwiftType == null) {
159+
swiftWriter.emitStatement("assert(false, errorString)");
160+
swiftWriter.emitStatement("return");
161+
} else if (isReturnTypeOptional) {
162+
swiftWriter.emitStatement("assert(false, errorString)");
163+
swiftWriter.emitStatement("return nil");
164+
} else {
165+
swiftWriter.emitStatement("fatalError(errorString)");
166+
}
167+
swiftWriter.emitStatement("}");
153168
}
154-
swiftWriter.emitStatement("}");
155169

156170
String jniMethodTemplate;
157171
if (returnSwiftType != null) {
@@ -181,7 +195,7 @@ else if (isReturnTypeOptional) {
181195
swiftWriter.emit(") else {");
182196
swiftWriter.emitStatement("if let throwable = JNI.ExceptionCheck() {");
183197
if (isThrown) {
184-
swiftWriter.emitStatement("throw NSError(domain: \"JavaException\", code: 1)");
198+
swiftWriter.emitStatement("throw Error.from(javaObject: throwable)");
185199
}
186200
else {
187201
swiftWriter.emitStatement("fatalError(\"Don't support exception here!\")");
@@ -201,7 +215,7 @@ else if (isReturnTypeOptional) {
201215

202216
swiftWriter.emitStatement("if let throwable = JNI.ExceptionCheck() {");
203217
if (isThrown) {
204-
swiftWriter.emitStatement("throw NSError(domain: \"JavaException\", code: 1)");
218+
swiftWriter.emitStatement("throw Error.from(javaObject: throwable)");
205219
}
206220
else {
207221
swiftWriter.emitStatement("fatalError(\"JavaException\")");

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

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,10 @@ public void generateCode(SwiftWriter swiftWriter, String javaFullName, String sw
9595
swiftWriter.emitStatement(String.format("let %s: %s%s", param.name, param.swiftType.swiftType, param.isOptional ? "?" : ""));
9696
}
9797

98-
swiftWriter.emitStatement("do {");
98+
boolean shouldCatchPreamble = params.size() > 0 || !isStatic;
99+
if (shouldCatchPreamble) {
100+
swiftWriter.emitStatement("do {");
101+
}
99102

100103
if (!isStatic) {
101104
swiftWriter.emitStatement(String.format("swiftSelf = try %s.from(javaObject: this)", swiftType));
@@ -113,12 +116,15 @@ public void generateCode(SwiftWriter swiftWriter, String javaFullName, String sw
113116
swiftWriter.emitStatement(String.format("%1$s = try %2$s.from(javaObject: j%1$s)", param.name, param.swiftType.swiftConstructorType));
114117
}
115118
}
116-
swiftWriter.emitStatement("}");
117-
swiftWriter.emitStatement("catch {");
118-
swiftWriter.emitStatement("let errorString = String(reflecting: type(of: error)) + String(describing: error)");
119-
swiftWriter.emitStatement("_ = JNI.api.ThrowNew(JNI.env, SwiftRuntimeErrorClass, errorString)");
120-
swiftWriter.emitStatement(String.format("return%s", returnSwiftType != null ? " nil" : ""));
121-
swiftWriter.emitStatement("}");
119+
120+
if (shouldCatchPreamble) {
121+
swiftWriter.emitStatement("}");
122+
swiftWriter.emitStatement("catch {");
123+
swiftWriter.emitStatement("let errorString = String(reflecting: type(of: error)) + String(describing: error)");
124+
swiftWriter.emitStatement("_ = JNI.api.ThrowNew(JNI.env, SwiftRuntimeErrorClass, errorString)");
125+
swiftWriter.emitStatement(String.format("return%s", returnSwiftType != null ? " nil" : ""));
126+
swiftWriter.emitStatement("}");
127+
}
122128

123129
if (isThrown) {
124130
swiftWriter.emitStatement("do {");

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

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package com.readdle.codegen;
22

3-
import com.readdle.codegen.anotation.SwiftFunc;
3+
import com.readdle.codegen.anotation.SwiftGetter;
44

55
import java.io.IOException;
66

@@ -17,9 +17,7 @@ class SwiftGetterDescriptor implements JavaSwiftProcessor.WritableElement {
1717
private SwiftEnvironment.Type returnSwiftType;
1818
private boolean isReturnTypeOptional;
1919

20-
private String description;
21-
22-
SwiftGetterDescriptor(ExecutableElement executableElement) {
20+
SwiftGetterDescriptor(ExecutableElement executableElement, SwiftGetter getterAnnotation) {
2321
this.javaName = executableElement.getSimpleName().toString();
2422
this.isStatic = executableElement.getModifiers().contains(Modifier.STATIC);
2523
this.returnSwiftType = SwiftEnvironment.parseJavaType(executableElement.getReturnType().toString());
@@ -33,9 +31,8 @@ class SwiftGetterDescriptor implements JavaSwiftProcessor.WritableElement {
3331
throw new SwiftMappingException("Getter can't has parameters", executableElement);
3432
}
3533

36-
SwiftFunc swiftFunc = executableElement.getAnnotation(SwiftFunc.class);
37-
if (swiftFunc != null && !swiftFunc.value().isEmpty()) {
38-
this.swiftName = swiftFunc.value();
34+
if (getterAnnotation != null && !getterAnnotation.value().isEmpty()) {
35+
this.swiftName = getterAnnotation.value();
3936
}
4037
else {
4138
this.swiftName = javaName;
@@ -100,7 +97,6 @@ public String toString() {
10097
", isStatic=" + isStatic +
10198
", returnSwiftType=" + returnSwiftType +
10299
", isReturnTypeOptional=" + isReturnTypeOptional +
103-
", description='" + description + '\'' +
104100
'}';
105101
}
106102
}

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,23 @@
44

55
import javax.lang.model.element.VariableElement;
66

7+
import static java.util.Objects.requireNonNull;
8+
79
public class SwiftParamDescriptor {
810

911
final String name;
10-
SwiftEnvironment.Type swiftType;
12+
final SwiftEnvironment.Type swiftType;
1113
final boolean isOptional;
12-
final String description;
1314

1415
SwiftParamDescriptor(VariableElement variableElement) {
1516
this.name = variableElement.getSimpleName().toString();
16-
this.swiftType = SwiftEnvironment.parseJavaType(variableElement.asType().toString());
17+
this.swiftType = requireNonNull(SwiftEnvironment.parseJavaType(variableElement.asType().toString()));
18+
1719
SwiftBlock swiftParam = variableElement.getAnnotation(SwiftBlock.class);
1820
if (swiftParam != null) {
1921
this.swiftType.swiftConstructorType = "SwiftBlock" + this.swiftType.swiftConstructorType;
2022
}
2123
this.isOptional = JavaSwiftProcessor.isNullable(variableElement);
22-
this.description = null;
2324
}
2425

2526
@Override
@@ -28,7 +29,6 @@ public String toString() {
2829
"name='" + name + '\'' +
2930
", swiftType='" + swiftType + '\'' +
3031
", isOptional=" + isOptional +
31-
", description='" + description + '\'' +
3232
'}';
3333
}
3434
}

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

Lines changed: 14 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,15 @@
44
import com.readdle.codegen.anotation.SwiftReference;
55
import com.readdle.codegen.anotation.SwiftSetter;
66

7-
import java.io.File;
8-
import java.io.IOException;
9-
import java.util.LinkedList;
10-
import java.util.List;
11-
127
import javax.annotation.processing.Filer;
13-
import javax.lang.model.element.Element;
14-
import javax.lang.model.element.ElementKind;
15-
import javax.lang.model.element.ExecutableElement;
16-
import javax.lang.model.element.Modifier;
17-
import javax.lang.model.element.TypeElement;
18-
import javax.lang.model.element.VariableElement;
8+
import javax.lang.model.element.*;
199
import javax.lang.model.type.DeclaredType;
2010
import javax.lang.model.type.MirroredTypeException;
2111
import javax.tools.StandardLocation;
12+
import java.io.File;
13+
import java.io.IOException;
14+
import java.util.LinkedList;
15+
import java.util.List;
2216

2317
import static com.readdle.codegen.JavaSwiftProcessor.FOLDER;
2418

@@ -27,15 +21,13 @@ class SwiftReferenceDescriptor {
2721
private static final String SUFFIX = "Android.swift";
2822
private String swiftFilePath;
2923

30-
private TypeElement annotatedClassElement;
3124
private String javaFullName;
3225
private String simpleTypeName;
3326
private String[] importPackages;
3427

3528
List<JavaSwiftProcessor.WritableElement> functions = new LinkedList<>();
3629

3730
SwiftReferenceDescriptor(TypeElement classElement, Filer filer, String[] importPackages) throws IllegalArgumentException {
38-
this.annotatedClassElement = classElement;
3931
this.importPackages = importPackages;
4032

4133
// Get the full QualifiedTypeName
@@ -117,13 +109,15 @@ class SwiftReferenceDescriptor {
117109
if (element.getKind() == ElementKind.METHOD) {
118110
ExecutableElement executableElement = (ExecutableElement) element;
119111
if (executableElement.getModifiers().contains(Modifier.NATIVE)) {
120-
if (executableElement.getAnnotation(SwiftGetter.class) != null) {
121-
functions.add(new SwiftGetterDescriptor(executableElement));
122-
}
123-
else if (executableElement.getAnnotation(SwiftSetter.class) != null) {
124-
functions.add(new SwiftSetterDescriptor(executableElement));
112+
SwiftGetter getterAnnotation = executableElement.getAnnotation(SwiftGetter.class);
113+
SwiftSetter setterAnnotation = executableElement.getAnnotation(SwiftSetter.class);
114+
115+
if (getterAnnotation != null) {
116+
functions.add(new SwiftGetterDescriptor(executableElement, getterAnnotation));
125117
}
126-
else {
118+
else if (setterAnnotation != null) {
119+
functions.add(new SwiftSetterDescriptor(executableElement, setterAnnotation));
120+
} else {
127121
functions.add(new SwiftFuncDescriptor(executableElement));
128122
}
129123
}
@@ -172,7 +166,7 @@ File generateCode() throws IOException {
172166
swiftWriter.emitEmptyLine();
173167
swiftWriter.emitStatement("// Unbalanced retain");
174168
swiftWriter.emitStatement("public func retain() {");
175-
swiftWriter.emitStatement("Unmanaged.passUnretained(self).retain()");
169+
swiftWriter.emitStatement("_ = Unmanaged.passUnretained(self).retain()");
176170
swiftWriter.emitStatement("}");
177171

178172
swiftWriter.endExtension();

0 commit comments

Comments
 (0)