Skip to content

Commit ce81695

Browse files
committed
Dev: add support enclosingElement
1 parent 8b35b90 commit ce81695

File tree

6 files changed

+56
-36
lines changed

6 files changed

+56
-36
lines changed

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,4 +238,12 @@ static boolean isNullable(Element element) {
238238
}
239239
return true;
240240
}
241+
242+
static String replaceLast(String text, char replace, char replacement) {
243+
int index = text.lastIndexOf(replace);
244+
if (index >= 0) {
245+
return text.substring(0, index) + replacement + text.substring(index + 1, text.length());
246+
}
247+
return text;
248+
}
241249
}

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

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -80,13 +80,12 @@ public class SwiftCallbackFuncDescriptor {
8080
}
8181
}
8282

83-
void generateCode(SwiftWriter swiftWriter, String javaPackage, String swiftType) throws IOException {
83+
void generateCode(SwiftWriter swiftWriter, String javaFullName, String swiftType) throws IOException {
8484

8585
swiftWriter.emitEmptyLine();
86-
swiftWriter.emitStatement(String.format("static let javaMethod%1$s = try! JNI.%5$s(forClass:\"%2$s/%3$s\", method: \"%1$s\", sig: \"%4$s\")",
86+
swiftWriter.emitStatement(String.format("static let javaMethod%1$s = try! JNI.%4$s(forClass:\"%2$s\", method: \"%1$s\", sig: \"%3$s\")",
8787
name,
88-
javaPackage.replace(".", "/"),
89-
swiftType,
88+
javaFullName,
9089
sig,
9190
isStatic ? "getStaticJavaMethod" : "getJavaMethod"));
9291

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

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ class SwiftDelegateDescriptor {
2222
private static final String SUFFIX = "Android.swift";
2323

2424
private TypeElement annotatedClassElement;
25-
private String javaPackage;
25+
private String javaFullName;
2626
String simpleTypeName;
2727
private String[] importPackages;
2828
private String pointerBasicTypeSig;
@@ -43,12 +43,19 @@ class SwiftDelegateDescriptor {
4343
importPackages = annotation.importPackages();
4444
protocols = annotation.protocols();
4545
simpleTypeName = classElement.getSimpleName().toString();
46-
javaPackage = classElement.getQualifiedName().toString().replace("." + simpleTypeName, "");
46+
javaFullName = classElement.getQualifiedName().toString().replace(".", "/");
47+
4748
} catch (MirroredTypeException mte) {
4849
DeclaredType classTypeMirror = (DeclaredType) mte.getTypeMirror();
4950
TypeElement classTypeElement = (TypeElement) classTypeMirror.asElement();
5051
simpleTypeName = classTypeElement.getSimpleName().toString();
51-
javaPackage = classElement.getQualifiedName().toString().replace("." + simpleTypeName, "");
52+
javaFullName = classElement.getQualifiedName().toString().replace(".", "/");
53+
}
54+
55+
Element enclosingElement = classElement.getEnclosingElement();
56+
while (enclosingElement != null && enclosingElement.getKind() == ElementKind.CLASS) {
57+
javaFullName = JavaSwiftProcessor.replaceLast(javaFullName, '/', '$');
58+
enclosingElement = enclosingElement.getEnclosingElement();
5259
}
5360

5461
if (!isInterface) {
@@ -145,7 +152,7 @@ File generateCode(File dirPath) throws IOException {
145152
swiftWriter.emitImports(importPackages);
146153
swiftWriter.emitEmptyLine();
147154

148-
swiftWriter.emitStatement(String.format("fileprivate let javaClass = JNI.GlobalFindClass(\"%s/%s\")!", javaPackage.replace(".", "/"), simpleTypeName));
155+
swiftWriter.emitStatement(String.format("fileprivate let javaClass = JNI.GlobalFindClass(\"%s\")!", javaFullName));
149156

150157
if (!isInterface) {
151158
if (pointerBasicTypeSig != null) {
@@ -211,13 +218,13 @@ File generateCode(File dirPath) throws IOException {
211218
swiftWriter.emitStatement("}");
212219

213220
for (SwiftCallbackFuncDescriptor function : callbackFunctions) {
214-
function.generateCode(swiftWriter, javaPackage, simpleTypeName);
221+
function.generateCode(swiftWriter, javaFullName, simpleTypeName);
215222
}
216223

217224
swiftWriter.endExtension();
218225

219226
if (!isInterface) {
220-
String swiftFuncName = "Java_" + javaPackage.replace(".", "_") + "_" + simpleTypeName + "_init";
227+
String swiftFuncName = "Java_" + javaFullName.replace("/", "_").replace("$", "_") + "_init";
221228
swiftWriter.emitEmptyLine();
222229
swiftWriter.emitStatement(String.format("@_silgen_name(\"%s\")", swiftFuncName));
223230
swiftWriter.emitStatement(String.format("public func %s(env: UnsafeMutablePointer<JNIEnv?>, this: jobject) {", swiftFuncName));
@@ -228,7 +235,7 @@ File generateCode(File dirPath) throws IOException {
228235
}
229236

230237
for (SwiftFuncDescriptor function : functions) {
231-
function.generateCode(swiftWriter, javaPackage, simpleTypeName);
238+
function.generateCode(swiftWriter, javaFullName, simpleTypeName);
232239
}
233240

234241
swiftWriter.close();

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,8 @@ class SwiftFuncDescriptor {
6868
}
6969
}
7070

71-
void generateCode(SwiftWriter swiftWriter, String javaPackage, String swiftType) throws IOException {
72-
String swiftFuncName = "Java_" + javaPackage.replace(".", "_") + "_" + swiftType + "_" + name;
71+
void generateCode(SwiftWriter swiftWriter, String javaFullName, String swiftType) throws IOException {
72+
String swiftFuncName = "Java_" + javaFullName.replace("/", "_").replace("$", "_") + "_" + name;
7373

7474
swiftWriter.emitEmptyLine();
7575
swiftWriter.emitStatement(String.format("@_silgen_name(\"%s\")", swiftFuncName));

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

Lines changed: 17 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
package com.readdle.codegen;
22

3-
4-
import com.readdle.codegen.anotation.SwiftFunc;
53
import com.readdle.codegen.anotation.SwiftReference;
64

75
import java.io.File;
@@ -18,15 +16,15 @@
1816
import javax.lang.model.type.DeclaredType;
1917
import javax.lang.model.type.MirroredTypeException;
2018

21-
public class SwiftReferenceDescriptor {
19+
class SwiftReferenceDescriptor {
2220

23-
static final String SUFFIX = "Android.swift";
21+
private static final String SUFFIX = "Android.swift";
2422

2523
private TypeElement annotatedClassElement;
26-
String javaPackage;
27-
String simpleTypeName;
28-
String[] importPackages;
29-
String pointerBasicTypeSig;
24+
private String javaFullName;
25+
private String simpleTypeName;
26+
private String[] importPackages;
27+
private String pointerBasicTypeSig;
3028

3129
List<SwiftFuncDescriptor> functions = new LinkedList<>();
3230

@@ -38,12 +36,18 @@ public class SwiftReferenceDescriptor {
3836
SwiftReference annotation = classElement.getAnnotation(SwiftReference.class);
3937
importPackages = annotation.importPackages();
4038
simpleTypeName = classElement.getSimpleName().toString();
41-
javaPackage = classElement.getQualifiedName().toString().replace("." + simpleTypeName, "");
39+
javaFullName = classElement.getQualifiedName().toString().replace(".", "/");
4240
} catch (MirroredTypeException mte) {
4341
DeclaredType classTypeMirror = (DeclaredType) mte.getTypeMirror();
4442
TypeElement classTypeElement = (TypeElement) classTypeMirror.asElement();
4543
simpleTypeName = classTypeElement.getSimpleName().toString();
46-
javaPackage = classElement.getQualifiedName().toString().replace("." + simpleTypeName, "");
44+
javaFullName = classElement.getQualifiedName().toString().replace(".", "/");
45+
}
46+
47+
Element enclosingElement = classElement.getEnclosingElement();
48+
while (enclosingElement != null && enclosingElement.getKind() == ElementKind.CLASS) {
49+
javaFullName = JavaSwiftProcessor.replaceLast(javaFullName, '/', '$');
50+
enclosingElement = enclosingElement.getEnclosingElement();
4751
}
4852

4953
// Check if it's an abstract class
@@ -52,21 +56,13 @@ public class SwiftReferenceDescriptor {
5256
classElement.getQualifiedName().toString(), SwiftReference.class.getSimpleName()));
5357
}
5458

55-
ExecutableElement retainExecutableElement = null;
5659
ExecutableElement releaseExecutableElement = null;
5760
boolean hasNativePointer = false;
5861
boolean hasEmptyConstructor = false;
5962

6063
for (Element element : classElement.getEnclosedElements()) {
6164
if (element.getKind() == ElementKind.METHOD) {
6265
ExecutableElement executableElement = (ExecutableElement) element;
63-
if (executableElement.getSimpleName().toString().equals("retain")) {
64-
if (!executableElement.getModifiers().contains(Modifier.NATIVE)) {
65-
throw new IllegalArgumentException(String.format("%s is not native method",
66-
executableElement.getSimpleName()));
67-
}
68-
retainExecutableElement = executableElement;
69-
}
7066
if (executableElement.getSimpleName().toString().equals("release")) {
7167
if (!executableElement.getModifiers().contains(Modifier.NATIVE)) {
7268
throw new IllegalArgumentException(String.format("%s is not native method",
@@ -140,7 +136,7 @@ File generateCode(File dirPath) throws IOException {
140136
swiftWriter.emitImports(importPackages);
141137
swiftWriter.emitEmptyLine();
142138

143-
swiftWriter.emitStatement(String.format("fileprivate let javaClass = JNI.GlobalFindClass(\"%s/%s\")!", javaPackage.replace(".", "/"), simpleTypeName));
139+
swiftWriter.emitStatement(String.format("fileprivate let javaClass = JNI.GlobalFindClass(\"%s\")!", javaFullName));
144140
if (pointerBasicTypeSig != null) {
145141
swiftWriter.emitStatement(String.format("fileprivate let javaPointerClass = JNI.GlobalFindClass(\"%s\")!", pointerBasicTypeSig));
146142
swiftWriter.emitStatement("fileprivate let javaSwiftPointerFiled = JNI.api.GetFieldID(JNI.env, javaPointerClass, \"nativePointer\", \"J\")");
@@ -149,7 +145,7 @@ File generateCode(File dirPath) throws IOException {
149145
swiftWriter.emitStatement("fileprivate let javaSwiftPointerFiled = JNI.api.GetFieldID(JNI.env, javaClass, \"nativePointer\", \"J\")");
150146
}
151147

152-
swiftWriter.emitStatement(String.format("fileprivate let javaConstructor = try! JNI.getJavaEmptyConstructor(forClass: \"%s/%s\")", javaPackage.replace(".", "/"), simpleTypeName));
148+
swiftWriter.emitStatement(String.format("fileprivate let javaConstructor = try! JNI.getJavaEmptyConstructor(forClass: \"%s\")", javaFullName));
153149

154150
swiftWriter.emitEmptyLine();
155151
swiftWriter.beginExtension(simpleTypeName);
@@ -185,7 +181,7 @@ File generateCode(File dirPath) throws IOException {
185181
swiftWriter.endExtension();
186182

187183
for (SwiftFuncDescriptor function : functions) {
188-
function.generateCode(swiftWriter, javaPackage, simpleTypeName);
184+
function.generateCode(swiftWriter, javaFullName, simpleTypeName);
189185
}
190186

191187
swiftWriter.close();

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

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

3-
import com.readdle.codegen.anotation.SwiftFunc;
43
import com.readdle.codegen.anotation.SwiftValue;
54

65
import java.io.File;
@@ -22,6 +21,7 @@ class SwiftValueDescriptor {
2221

2322
private TypeElement annotatedClassElement;
2423
private String javaPackage;
24+
private String javaFullName;
2525
private String simpleTypeName;
2626
private String[] importPackages;
2727

@@ -36,13 +36,23 @@ class SwiftValueDescriptor {
3636
importPackages = annotation.importPackages();
3737
simpleTypeName = classElement.getSimpleName().toString();
3838
javaPackage = classElement.getQualifiedName().toString().replace("." + simpleTypeName, "");
39+
javaFullName = classElement.getQualifiedName().toString().replace(".", "/");
3940
} catch (MirroredTypeException mte) {
4041
DeclaredType classTypeMirror = (DeclaredType) mte.getTypeMirror();
4142
TypeElement classTypeElement = (TypeElement) classTypeMirror.asElement();
4243
simpleTypeName = classTypeElement.getSimpleName().toString();
4344
javaPackage = classElement.getQualifiedName().toString().replace("." + simpleTypeName, "");
45+
javaFullName = classElement.getQualifiedName().toString().replace(".", "/");
4446
}
4547

48+
Element enclosingElement = classElement.getEnclosingElement();
49+
while (enclosingElement != null && enclosingElement.getKind() == ElementKind.CLASS) {
50+
javaFullName = JavaSwiftProcessor.replaceLast(javaFullName, '/', '$');
51+
javaPackage = javaFullName.substring(0, javaFullName.lastIndexOf("."));
52+
enclosingElement = enclosingElement.getEnclosingElement();
53+
}
54+
55+
4656
// Check if it's an abstract class
4757
if (classElement.getModifiers().contains(Modifier.ABSTRACT)) {
4858
throw new IllegalArgumentException(String.format("The class %s is abstract. You can't annotate abstract classes with @%s",
@@ -104,7 +114,7 @@ File generateCode(File dirPath) throws IOException {
104114
swiftWriter.endExtension();
105115

106116
for (SwiftFuncDescriptor function : functions) {
107-
function.generateCode(swiftWriter, javaPackage, simpleTypeName);
117+
function.generateCode(swiftWriter, javaFullName, simpleTypeName);
108118
}
109119

110120
swiftWriter.close();

0 commit comments

Comments
 (0)