@@ -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" );
0 commit comments