Skip to content

Commit f337bc9

Browse files
committed
Dev: add support of subclasses for SwiftValue
1 parent cd3de6f commit f337bc9

3 files changed

Lines changed: 22 additions & 5 deletions

File tree

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

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ class SwiftValueDescriptor {
3232
private String simpleTypeName;
3333
private String[] importPackages;
3434

35+
private boolean hasSubclasses = false;
36+
3537
List<JavaSwiftProcessor.WritableElement> functions = new LinkedList<>();
3638

3739
SwiftValueDescriptor(TypeElement classElement, Filer filer, String[] importPackages) throws IllegalArgumentException {
@@ -40,6 +42,8 @@ class SwiftValueDescriptor {
4042

4143
// Get the full QualifiedTypeName
4244
try {
45+
SwiftValue swiftValue = classElement.getAnnotation(SwiftValue.class);
46+
hasSubclasses = swiftValue.hasSubclasses();
4347
simpleTypeName = classElement.getSimpleName().toString();
4448
javaPackage = classElement.getQualifiedName().toString().replace("." + simpleTypeName, "");
4549
javaFullName = classElement.getQualifiedName().toString().replace(".", "/");
@@ -120,11 +124,21 @@ File generateCode() throws IOException {
120124
swiftWriter.emitEmptyLine();
121125
swiftWriter.beginExtension(simpleTypeName);
122126

123-
swiftWriter.emitEmptyLine();
124-
swiftWriter.emitStatement("// Decoding SwiftValue type with JavaCoder");
125-
swiftWriter.emitStatement(String.format("public static func from(javaObject: jobject) throws -> %s {", simpleTypeName));
126-
swiftWriter.emitStatement(String.format("return try JavaDecoder(forPackage: \"%s\", missingFieldsStrategy: .ignore).decode(%s.self, from: javaObject)", javaPackage.replace(".", "/"), simpleTypeName));
127-
swiftWriter.emitStatement("}");
127+
if (hasSubclasses) {
128+
swiftWriter.emitEmptyLine();
129+
swiftWriter.emitStatement("// Decoding SwiftValue type with JavaCoder");
130+
swiftWriter.emitStatement(String.format("public static func from<T: %s>(javaObject: jobject) throws -> T {", simpleTypeName));
131+
swiftWriter.emitStatement(String.format("let any = try JavaDecoder(forPackage: \"%s\", missingFieldsStrategy: .ignore).decode(AnyCodable.self, from: javaObject)", javaPackage.replace(".", "/")));
132+
swiftWriter.emitStatement("return any.value as! T");
133+
swiftWriter.emitStatement("}");
134+
}
135+
else {
136+
swiftWriter.emitEmptyLine();
137+
swiftWriter.emitStatement("// Decoding SwiftValue type with JavaCoder");
138+
swiftWriter.emitStatement(String.format("public static func from(javaObject: jobject) throws -> %s {", simpleTypeName));
139+
swiftWriter.emitStatement(String.format("return try JavaDecoder(forPackage: \"%s\", missingFieldsStrategy: .ignore).decode(%s.self, from: javaObject)", javaPackage.replace(".", "/"), simpleTypeName));
140+
swiftWriter.emitStatement("}");
141+
}
128142

129143
swiftWriter.emitEmptyLine();
130144
swiftWriter.emitStatement("// Encoding SwiftValue type with JavaCoder");

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ public void emitImports(String[] importPackages) throws IOException {
2626
this.writer.append("import Java\n");
2727
this.writer.append("import java_swift\n");
2828
this.writer.append("import JavaCoder\n");
29+
this.writer.append("import AnyCodable\n");
2930

3031
for (String importPackage : importPackages) {
3132
this.writer.append(String.format("import %s\n", importPackage));

library/src/main/java/com/readdle/codegen/anotation/SwiftValue.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,6 @@
88
@Target(ElementType.TYPE) @Retention(RetentionPolicy.CLASS)
99
public @interface SwiftValue {
1010

11+
boolean hasSubclasses() default false;
12+
1113
}

0 commit comments

Comments
 (0)