Skip to content

Commit 68f004b

Browse files
committed
Dev: add support for native method overloading (two or more function with the same name but different argument types)
1 parent 7697986 commit 68f004b

13 files changed

Lines changed: 244 additions & 67 deletions

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ buildscript {
66
}
77

88
dependencies {
9-
classpath 'com.android.tools.build:gradle:3.1.0'
9+
classpath 'com.android.tools.build:gradle:3.1.3'
1010
classpath 'com.readdle.android.swift:swift-android-gradle:1.1.2'
1111
classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.8.0'
1212
}

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

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ public class JavaSwiftProcessor extends AbstractProcessor {
3434

3535
interface WritableElement {
3636
void generateCode(SwiftWriter swiftWriter, String javaFullName, String swiftType) throws IOException;
37+
String toString(String javaClassname);
3738
}
3839

3940
public static final String FOLDER = "SwiftGenerated";
@@ -200,7 +201,12 @@ private boolean processImpl(Set<? extends TypeElement> annotations, RoundEnviron
200201
for (SwiftValueDescriptor valueDescriptor: swiftValues.values()) {
201202
try {
202203
File file = valueDescriptor.generateCode();
203-
messager.printMessage(Diagnostic.Kind.NOTE, file.getName() + " generated");
204+
/* Logging */
205+
messager.printMessage(Diagnostic.Kind.NOTE, "Generate SwiftValue " + file.getName() + ":");
206+
for (WritableElement function : valueDescriptor.getFunctions()) {
207+
messager.printMessage(Diagnostic.Kind.NOTE, function.toString(valueDescriptor.getJavaFullName()));
208+
}
209+
/* Logging */
204210
} catch (IOException e) {
205211
e.printStackTrace();
206212
error(null, "Can't write to file: " + e.getMessage());
@@ -209,14 +215,14 @@ private boolean processImpl(Set<? extends TypeElement> annotations, RoundEnviron
209215
}
210216

211217
for (SwiftReferenceDescriptor referenceDescriptor: swiftReferences.values()) {
212-
213-
for (WritableElement function : referenceDescriptor.functions) {
214-
messager.printMessage(Diagnostic.Kind.NOTE, function.toString());
215-
}
216-
217218
try {
218219
File file = referenceDescriptor.generateCode();
219-
messager.printMessage(Diagnostic.Kind.NOTE, file.getName() + " generated");
220+
/* Logging */
221+
messager.printMessage(Diagnostic.Kind.NOTE, "Generate SwiftReference " + file.getName() + ":");
222+
for (WritableElement function : referenceDescriptor.functions) {
223+
messager.printMessage(Diagnostic.Kind.NOTE, function.toString(referenceDescriptor.getJavaFullName()));
224+
}
225+
/* Logging */
220226
} catch (IOException e) {
221227
e.printStackTrace();
222228
error(null, "Can't write to file: " + e.getMessage());
@@ -225,14 +231,14 @@ private boolean processImpl(Set<? extends TypeElement> annotations, RoundEnviron
225231
}
226232

227233
for (SwiftDelegateDescriptor delegateDescriptor: swiftDelegates.values()) {
228-
229-
for (SwiftFuncDescriptor function : delegateDescriptor.functions) {
230-
messager.printMessage(Diagnostic.Kind.NOTE, function.toString());
231-
}
232-
233234
try {
234235
File file = delegateDescriptor.generateCode();
235-
messager.printMessage(Diagnostic.Kind.NOTE, file.getName() + " generated");
236+
/* Logging */
237+
messager.printMessage(Diagnostic.Kind.NOTE, "Generate SwiftDelegate" + file.getName() + ":");
238+
for (WritableElement function : delegateDescriptor.functions) {
239+
messager.printMessage(Diagnostic.Kind.NOTE, function.toString(delegateDescriptor.getJavaFullName()));
240+
}
241+
/* Logging */
236242
} catch (IOException e) {
237243
e.printStackTrace();
238244
error(null, "Can't write to file: " + e.getMessage());
@@ -243,7 +249,9 @@ private boolean processImpl(Set<? extends TypeElement> annotations, RoundEnviron
243249
for (SwiftBlockDescriptor blockDescriptor: swiftBlocks.values()) {
244250
try {
245251
File file = blockDescriptor.generateCode();
246-
messager.printMessage(Diagnostic.Kind.NOTE, file.getName() + " generated");
252+
/* Logging */
253+
messager.printMessage(Diagnostic.Kind.NOTE, "Generate SwiftBlock" + file.getName());
254+
/* Logging */
247255
} catch (IOException e) {
248256
e.printStackTrace();
249257
error(null, "Can't write to file: " + e.getMessage());

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

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -86,13 +86,13 @@ class SwiftBlockDescriptor {
8686

8787
for (VariableElement variableElement : executableElement.getParameters()) {
8888
params.add(new SwiftParamDescriptor(variableElement));
89-
sig += javaClassToSig(variableElement.asType().toString());
89+
sig += Utils.javaClassToSig(variableElement.asType().toString());
9090
}
9191

9292
sig += ")";
9393

9494
if (returnSwiftType != null) {
95-
sig += javaClassToSig(executableElement.getReturnType().toString());
95+
sig += Utils.javaClassToSig(executableElement.getReturnType().toString());
9696
}
9797
else {
9898
sig += "V";
@@ -247,14 +247,4 @@ File generateCode() throws IOException {
247247
swiftWriter.close();
248248
return swiftExtensionFile;
249249
}
250-
251-
private String javaClassToSig(String javaClass) {
252-
// First, remove all templates
253-
int templateStart = javaClass.indexOf("<");
254-
if (templateStart > 0) {
255-
javaClass = javaClass.substring(0, templateStart);
256-
}
257-
// Replace all dots with / in package name
258-
return "L" + javaClass.replace(".", "/") + ";";
259-
}
260250
}

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

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -42,14 +42,14 @@ public class SwiftCallbackFuncDescriptor {
4242
for (VariableElement variableElement : executableElement.getParameters()) {
4343
params.add(new SwiftParamDescriptor(variableElement));
4444
String javaClass = variableElement.asType().toString();
45-
signatureBuilder.append(javaClassToSig(javaClass));
45+
signatureBuilder.append(Utils.javaClassToSig(javaClass));
4646
}
4747

4848
signatureBuilder.append(")");
4949

5050
if (returnSwiftType != null) {
5151
String javaClass = executableElement.getReturnType().toString();
52-
signatureBuilder.append(javaClassToSig(javaClass));
52+
signatureBuilder.append(Utils.javaClassToSig(javaClass));
5353
}
5454
else {
5555
signatureBuilder.append("V");
@@ -263,16 +263,6 @@ void generateCode(SwiftWriter swiftWriter, String javaFullName, String swiftType
263263
swiftWriter.emitEmptyLine();
264264
}
265265

266-
private String javaClassToSig(String javaClass) {
267-
// First, remove all templates
268-
int templateStart = javaClass.indexOf("<");
269-
if (templateStart > 0) {
270-
javaClass = javaClass.substring(0, templateStart);
271-
}
272-
// Replace all dots with / in package name
273-
return "L" + javaClass.replace(".", "/") + ";";
274-
}
275-
276266
@Override
277267
public String toString() {
278268
return "SwiftFuncDescriptor{" +

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
import java.io.File;
77
import java.io.IOException;
8+
import java.util.ArrayList;
89
import java.util.LinkedList;
910
import java.util.List;
1011

@@ -237,7 +238,7 @@ File generateCode() throws IOException {
237238
swiftWriter.endExtension();
238239

239240
if (!isInterface) {
240-
String swiftFuncName = "Java_" + javaFullName.replace("/", "_").replace("$", "_00024") + "_init";
241+
String swiftFuncName = Utils.mangleFunctionName(javaFullName, "init", new ArrayList<>());
241242
swiftWriter.emitEmptyLine();
242243
swiftWriter.emitStatement(String.format("@_silgen_name(\"%s\")", swiftFuncName));
243244
swiftWriter.emitStatement(String.format("public func %s(env: UnsafeMutablePointer<JNIEnv?>, this: jobject) {", swiftFuncName));
@@ -254,4 +255,8 @@ File generateCode() throws IOException {
254255
swiftWriter.close();
255256
return swiftExtensionFile;
256257
}
258+
259+
public String getJavaFullName() {
260+
return javaFullName;
261+
}
257262
}

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

Lines changed: 27 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -6,26 +6,26 @@ class SwiftEnvironment {
66

77
static class Type {
88
String swiftType;
9-
String javaPackage;
9+
String javaType;
1010
String swiftConstructorType;
1111

12-
Type(String swiftType, String javaPackage) {
12+
Type(String swiftType, String javaType) {
1313
this.swiftType = swiftType;
14-
this.javaPackage = javaPackage;
14+
this.javaType = javaType;
1515
this.swiftConstructorType = swiftType;
1616
}
1717

18-
Type(String swiftType, String javaPackage, String swiftConstructorType) {
18+
Type(String swiftType, String javaType, String swiftConstructorType) {
1919
this.swiftType = swiftType;
20-
this.javaPackage = javaPackage;
20+
this.javaType = javaType;
2121
this.swiftConstructorType = swiftConstructorType;
2222
}
2323

2424
@Override
2525
public String toString() {
2626
return "Type{" +
2727
"swiftType='" + swiftType + '\'' +
28-
", javaPackage='" + javaPackage + '\'' +
28+
", javaType='" + javaType + '\'' +
2929
'}';
3030
}
3131
}
@@ -35,49 +35,53 @@ public static Type parseJavaType(String javaType) {
3535
case "void":
3636
return null;
3737
case "java.lang.Integer":
38-
return new Type("Int", null);
38+
return new Type("Int", javaType);
3939
case "java.lang.Byte":
40-
return new Type("Int8", null);
40+
return new Type("Int8", javaType);
4141
case "java.lang.Short":
42-
return new Type("Int16", null);
42+
return new Type("Int16", javaType);
4343
case "java.lang.Long":
44-
return new Type("Int64", null);
44+
return new Type("Int64", javaType);
4545
case "java.math.BigInteger":
46-
return new Type("UInt64", null);
46+
return new Type("UInt64", javaType);
4747
case "java.lang.Boolean":
48-
return new Type("Bool", null);
48+
return new Type("Bool", javaType);
4949
case "java.lang.String":
50-
return new Type("String", null);
50+
return new Type("String", javaType);
5151
case "android.net.Uri":
52-
return new Type("URL", null);
52+
return new Type("URL", javaType);
5353
case "java.util.Date":
54-
return new Type("Date", null);
54+
return new Type("Date", javaType);
5555
case "java.nio.ByteBuffer":
56-
return new Type("Data", null);
56+
return new Type("Data", javaType);
5757
case "java.lang.Exception":
58-
return new Type("Error", null, "NSError");
58+
return new Type("Error", javaType, "NSError");
5959
default:
6060
try {
6161
if (javaType.startsWith("java.util.ArrayList<")) {
6262
Type subType = parseJavaType(javaType.substring("java.util.ArrayList<".length(), javaType.length() - 1));
63-
return new Type("[" + subType.swiftType + "]", null);
63+
return new Type("[" + subType.swiftType + "]", javaType);
6464
}
6565
else if (javaType.startsWith("java.util.HashSet<")) {
6666
Type subType = parseJavaType(javaType.substring("java.util.HashSet<".length(), javaType.length() - 1));
67-
return new Type("Set<" + subType.swiftType + ">", null);
67+
return new Type("Set<" + subType.swiftType + ">", javaType);
6868
}
6969
else if (javaType.startsWith("java.util.HashMap<")) {
7070
String substring = javaType.substring("java.util.HashMap<".length(), javaType.length() - 1);
7171
int commaIndex = substring.indexOf(",");
7272
Type keyType = parseJavaType(substring.substring(0, commaIndex));
7373
Type valueType = parseJavaType(substring.substring(commaIndex + 1, substring.length()));
74-
return new Type("[" + keyType.swiftType + ":" + valueType.swiftType + "]", null);
74+
return new Type("[" + keyType.swiftType + ":" + valueType.swiftType + "]", javaType);
7575
}
7676
else {
77-
String[] parts = javaType.split(Pattern.quote("."));
77+
// Try found enclosing typename
78+
String[] parts = javaType.split(Pattern.quote("$"));
79+
if (parts.length == 1) {
80+
// If not found enclosing, find typename
81+
parts = javaType.split(Pattern.quote("."));
82+
}
7883
String swiftType = parts[parts.length - 1];
79-
String javaPackage = javaType.replace("." + swiftType, "");
80-
return new Type(swiftType, javaPackage);
84+
return new Type(swiftType, javaType);
8185
}
8286
}
8387
catch (Exception e) {

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ class SwiftFuncDescriptor implements JavaSwiftProcessor.WritableElement {
8181

8282
@Override
8383
public void generateCode(SwiftWriter swiftWriter, String javaFullName, String swiftType) throws IOException {
84-
String swiftFuncName = "Java_" + javaFullName.replace("/", "_").replace("$", "_00024") + "_" + javaMethodName;
84+
String swiftFuncName = Utils.mangleFunctionName(javaFullName, javaMethodName, params);
8585

8686
swiftWriter.emitEmptyLine();
8787
swiftWriter.emitStatement(String.format("@_silgen_name(\"%s\")", swiftFuncName));
@@ -184,6 +184,11 @@ public void generateCode(SwiftWriter swiftWriter, String javaFullName, String sw
184184
swiftWriter.emitEmptyLine();
185185
}
186186

187+
@Override
188+
public String toString(String javaClassname) {
189+
return Utils.mangleFunctionName(javaClassname, javaMethodName, params);
190+
}
191+
187192
@Override
188193
public String toString() {
189194
return "SwiftFuncDescriptor{" +

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

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@
33
import com.readdle.codegen.anotation.SwiftGetter;
44

55
import java.io.IOException;
6+
import java.util.ArrayList;
7+
import java.util.Arrays;
8+
import java.util.Collections;
69

710
import javax.lang.model.element.ExecutableElement;
811
import javax.lang.model.element.Modifier;
@@ -46,7 +49,7 @@ class SwiftGetterDescriptor implements JavaSwiftProcessor.WritableElement {
4649

4750
@Override
4851
public void generateCode(SwiftWriter swiftWriter, String javaFullName, String swiftType) throws IOException {
49-
String swiftFuncName = "Java_" + javaFullName.replace("/", "_").replace("$", "_00024") + "_" + javaName;
52+
String swiftFuncName = Utils.mangleFunctionName(javaFullName, javaName, new ArrayList<>());
5053

5154
swiftWriter.emitEmptyLine();
5255
swiftWriter.emitStatement(String.format("@_silgen_name(\"%s\")", swiftFuncName));
@@ -89,6 +92,11 @@ public void generateCode(SwiftWriter swiftWriter, String javaFullName, String sw
8992
swiftWriter.emitEmptyLine();
9093
}
9194

95+
@Override
96+
public String toString(String javaClassname) {
97+
return Utils.mangleFunctionName(javaClassname, javaName, new ArrayList<>());
98+
}
99+
92100
@Override
93101
public String toString() {
94102
return "SwiftGetterDescriptor{" +

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ public class SwiftParamDescriptor {
1414

1515
SwiftParamDescriptor(VariableElement variableElement) {
1616
this.name = variableElement.getSimpleName().toString();
17-
this.swiftType = requireNonNull(SwiftEnvironment.parseJavaType(variableElement.asType().toString()));
17+
this.swiftType = requireNonNull(SwiftEnvironment.parseJavaType(Utils.typeToString(variableElement.asType())));
1818

1919
SwiftBlock swiftParam = variableElement.getAnnotation(SwiftBlock.class);
2020
if (swiftParam != null) {

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,4 +186,8 @@ File generateCode() throws IOException {
186186
public String getSwiftType() {
187187
return simpleTypeName;
188188
}
189+
190+
public String getJavaFullName() {
191+
return javaFullName;
192+
}
189193
}

0 commit comments

Comments
 (0)