@@ -135,15 +135,26 @@ func getSwiftReturnTypeNameAsString(
135135 }
136136 }
137137
138- return try getSwiftTypeNameAsString ( genericReturnType!, preferValueTypes: preferValueTypes, outerOptional: outerOptional)
138+ return try getSwiftTypeNameAsString ( method : method , genericReturnType!, preferValueTypes: preferValueTypes, outerOptional: outerOptional)
139139 }
140140
141141 /// Turn a Java type into a string.
142142 func getSwiftTypeNameAsString(
143+ method: JavaLangReflect . Method ? = nil ,
143144 _ javaType: Type ,
144145 preferValueTypes: Bool ,
145146 outerOptional: OptionalKind
146147 ) throws -> String {
148+ print ( " get the javaType ==== \( javaType) " )
149+
150+ // if let method,
151+ // let parameterizedType = javaType.as(ParameterizedType.self) {
152+ // if method.getGenericParameterTypes().contains(where: {$0?.getTypeName() == javaType.getTypeName()}) {
153+ // fatalError("java type = \(javaType.as(ParameterizedType.self))")
154+ // return javaType.getTypeName()
155+ // }
156+ // }
157+
147158 // Replace type variables with their bounds.
148159 if let typeVariable = javaType. as ( TypeVariable< GenericDeclaration> . self ) ,
149160 typeVariable. getBounds ( ) . count == 1 ,
@@ -190,30 +201,49 @@ func getSwiftReturnTypeNameAsString(
190201
191202 // Handle parameterized types by recursing on the raw type and the type
192203 // arguments.
193- if let parameterizedType = javaType. as ( ParameterizedType . self) ,
194- let rawJavaType = parameterizedType. getRawType ( )
195- {
196- var rawSwiftType = try getSwiftTypeNameAsString (
197- rawJavaType,
198- preferValueTypes: false ,
199- outerOptional: outerOptional
200- )
201-
202- let optionalSuffix : String
203- if let lastChar = rawSwiftType. last, lastChar == " ? " || lastChar == " ! " {
204- optionalSuffix = " \( lastChar) "
205- rawSwiftType. removeLast ( )
206- } else {
207- optionalSuffix = " "
208- }
204+ print ( " parameterizedType = \( javaType. as ( ParameterizedType . self) ) " )
205+ print ( " parameterizedType.getRawType() = \( javaType. as ( ParameterizedType . self) ? . getRawType ( ) ) " )
206+
207+ if let parameterizedType = javaType. as ( ParameterizedType . self) {
208+ if let rawJavaType = parameterizedType. getRawType ( ) {
209+ var rawSwiftType = try getSwiftTypeNameAsString (
210+ rawJavaType,
211+ preferValueTypes: false ,
212+ outerOptional: outerOptional
213+ )
214+ print ( " MAPPED rawSwiftType = \( rawSwiftType) " )
215+ print ( " MAPPED parameterizedType.getActualTypeArguments() = \( parameterizedType. getActualTypeArguments ( ) ) " )
216+
217+ let optionalSuffix : String
218+ if let lastChar = rawSwiftType. last, lastChar == " ? " || lastChar == " ! " {
219+ optionalSuffix = " \( lastChar) "
220+ rawSwiftType. removeLast ( )
221+ } else {
222+ optionalSuffix = " "
223+ }
209224
210- let typeArguments = try parameterizedType. getActualTypeArguments ( ) . compactMap { typeArg in
211- try typeArg. map { typeArg in
212- try getSwiftTypeNameAsString ( typeArg, preferValueTypes: false , outerOptional: . nonoptional)
225+ let typeArguments : [ String ] = try parameterizedType. getActualTypeArguments ( ) . compactMap { typeArg in
226+ guard let typeArg else { return nil }
227+
228+ let mappedSwiftName = try getSwiftTypeNameAsString ( method: method, typeArg, preferValueTypes: false , outerOptional: . nonoptional)
229+
230+ // FIXME: improve the get instead...
231+ if mappedSwiftName == nil || mappedSwiftName == " JavaObject " {
232+ // Try to salvage it, is it perhaps a type parameter?
233+ if let method {
234+ if method. getTypeParameters ( ) . contains ( where: { $0? . getTypeName ( ) == typeArg. getTypeName ( ) } ) {
235+ return typeArg. getTypeName ( )
236+ }
237+ }
238+ }
239+
240+ return mappedSwiftName
213241 }
214- }
215242
216- return " \( rawSwiftType) < \( typeArguments. joined ( separator: " , " ) ) > \( optionalSuffix) "
243+ print ( " MAPPED ->> typeArguments = \( typeArguments) " )
244+
245+ return " \( rawSwiftType) < \( typeArguments. joined ( separator: " , " ) ) > \( optionalSuffix) "
246+ }
217247 }
218248
219249 // Handle direct references to Java classes.
0 commit comments