@@ -47,7 +47,7 @@ struct JavaClassTranslator {
4747 let effectiveJavaSuperclass : JavaClass < JavaObject > ?
4848
4949 /// The Swift name of the superclass.
50- let swiftSuperclass : String ?
50+ let swiftSuperclass : SwiftJavaParameterizedType ?
5151
5252 /// The Swift names of the interfaces that this class implements.
5353 let swiftInterfaces : [ String ]
@@ -114,7 +114,7 @@ struct JavaClassTranslator {
114114 init ( javaClass: JavaClass < JavaObject > , translator: JavaTranslator ) throws {
115115 let fullName = javaClass. getName ( )
116116 print ( " TRANSLATE = \( fullName) " )
117-
117+
118118 self . javaClass = javaClass
119119 self . translator = translator
120120 self . translateAsClass = translator. translateAsClass && !javaClass. isInterface ( )
@@ -128,30 +128,46 @@ struct JavaClassTranslator {
128128 self . javaTypeParameters = javaClass. getTypeParameters ( ) . compactMap { $0 }
129129 self . nestedClasses = translator. nestedClasses [ fullName] ?? [ ]
130130
131- // Superclass.
131+ // Superclass, incl parameter types (if any)
132132 if !javaClass. isInterface ( ) {
133133 var javaSuperclass = javaClass. getSuperclass ( )
134- var swiftSuperclass : String ? = nil
134+ var javaGenericSuperclass : JavaReflectType ? = javaClass. getGenericSuperclass ( )
135+ var swiftSuperclassName : String ? = nil
136+ var swiftSuperclassTypeArgs : [ String ] = [ ]
135137 while let javaSuperclassNonOpt = javaSuperclass {
136138 do {
137- swiftSuperclass = try translator. getSwiftTypeName ( javaSuperclassNonOpt, preferValueTypes: false ) . swiftName
139+ swiftSuperclassName = try translator. getSwiftTypeName ( javaSuperclassNonOpt, preferValueTypes: false ) . swiftName
140+ if let javaGenericSuperclass = javaGenericSuperclass? . as ( JavaReflectParameterizedType . self) {
141+ print ( " javaGenericSuperclass = \( javaGenericSuperclass) " )
142+ for typeArg in javaGenericSuperclass. getActualTypeArguments ( ) {
143+ let javaTypeArgName = typeArg? . getTypeName ( ) ?? " "
144+ if let swiftTypeArgName = self . translator. translatedClasses [ javaTypeArgName] {
145+ swiftSuperclassTypeArgs. append ( swiftTypeArgName. qualifiedName)
146+ } else {
147+ swiftSuperclassTypeArgs. append ( " /* MISSING MAPPING FOR */ \( javaTypeArgName) " )
148+ }
149+ }
150+ }
138151 break
139152 } catch {
140153 translator. logUntranslated ( " Unable to translate ' \( fullName) ' superclass: \( error) " )
141154 }
142155
143156 javaSuperclass = javaSuperclassNonOpt. getSuperclass ( )
157+ javaGenericSuperclass = javaClass. getGenericSuperclass ( )
144158 }
145159
160+ print ( " swiftSuperclassTypeArgs = \( swiftSuperclassTypeArgs) " )
161+
146162 self . effectiveJavaSuperclass = javaSuperclass
147- self . swiftSuperclass = swiftSuperclass
163+ self . swiftSuperclass = SwiftJavaParameterizedType (
164+ name: swiftSuperclassName,
165+ typeArguments: swiftSuperclassTypeArgs)
148166 } else {
149167 self . effectiveJavaSuperclass = nil
150168 self . swiftSuperclass = nil
151169 }
152170
153- print ( " [ \( fullName) ] SWUFT SUPER CLASS = \( swiftSuperclass) " )
154-
155171 // Interfaces.
156172 self . swiftInterfaces = javaClass. getGenericInterfaces ( ) . compactMap { ( javaType) -> String ? in
157173 guard let javaType else {
@@ -333,7 +349,14 @@ extension JavaClassTranslator {
333349 let inheritanceClause : String
334350 if translateAsClass {
335351 extends = " "
336- inheritanceClause = swiftSuperclass. map { " : \( $0) " } ?? " "
352+ inheritanceClause =
353+ if let swiftSuperclass, swiftSuperclass. typeArguments. isEmpty {
354+ " : \( swiftSuperclass. name) "
355+ } else if let swiftSuperclass {
356+ " : \( swiftSuperclass. name) < \( swiftSuperclass. typeArguments. joined ( separator: " , " ) ) > "
357+ } else {
358+ " "
359+ }
337360 } else {
338361 extends = swiftSuperclass. map { " , extends: \( $0) .self " } ?? " "
339362 inheritanceClause = " "
0 commit comments