@@ -133,6 +133,10 @@ extension JNISwift2JavaGenerator {
133133
134134 private func translateParameter( parameterName: String , type: SwiftType ) throws -> UpcallConversionStep {
135135
136+ if type. isDirectlyTranslatedToWrapJava {
137+ return . placeholder
138+ }
139+
136140 switch type {
137141 case . nominal( let nominalType) :
138142 if let knownType = nominalType. nominalTypeDecl. knownTypeKind {
@@ -146,12 +150,17 @@ extension JNISwift2JavaGenerator {
146150 wrappedType: genericArgs [ 0 ]
147151 )
148152
149- default :
150- guard knownType . isDirectlyTranslatedToWrapJava else {
153+ case . array :
154+ guard let genericArgs = nominalType . genericArguments , genericArgs . count == 1 else {
151155 throw JavaTranslationError . unsupportedSwiftType ( type)
152156 }
157+ return try translateArrayParameter (
158+ name: parameterName,
159+ elementType: genericArgs [ 0 ]
160+ )
153161
154- return . placeholder
162+ default :
163+ throw JavaTranslationError . unsupportedSwiftType ( type)
155164 }
156165 }
157166
@@ -171,11 +180,32 @@ extension JNISwift2JavaGenerator {
171180 wrappedType: wrappedType
172181 )
173182
174- case . genericParameter, . function, . metatype, . tuple, . existential, . opaque, . composite, . array:
183+ case . array( let elementType) :
184+ return try translateArrayParameter ( name: parameterName, elementType: elementType)
185+
186+ case . genericParameter, . function, . metatype, . tuple, . existential, . opaque, . composite:
175187 throw JavaTranslationError . unsupportedSwiftType ( type)
176188 }
177189 }
178190
191+ private func translateArrayParameter( name: String , elementType: SwiftType ) throws -> UpcallConversionStep {
192+ switch elementType {
193+ case . nominal( let nominalType) :
194+ // We assume this is a JExtracted type
195+ return . map(
196+ . placeholder,
197+ body: . toJavaWrapper(
198+ . placeholder,
199+ name: " arrayElement " ,
200+ nominalType: nominalType
201+ )
202+ )
203+
204+ case . array, . composite, . existential, . function, . genericParameter, . metatype, . opaque, . optional, . tuple:
205+ throw JavaTranslationError . unsupportedSwiftType ( . array( elementType) )
206+ }
207+ }
208+
179209 private func translateOptionalParameter( name: String , wrappedType: SwiftType ) throws -> UpcallConversionStep {
180210 let wrappedConversion = try translateParameter ( parameterName: name, type: wrappedType)
181211 return . toJavaOptional( . map( . placeholder, body: wrappedConversion) )
@@ -190,6 +220,10 @@ extension JNISwift2JavaGenerator {
190220 methodName: String ,
191221 allowNilForObjects: Bool = false
192222 ) throws -> UpcallConversionStep {
223+ if type. isDirectlyTranslatedToWrapJava {
224+ return . placeholder
225+ }
226+
193227 switch type {
194228 case . nominal( let nominalType) :
195229 if let knownType = nominalType. nominalTypeDecl. knownTypeKind {
@@ -203,11 +237,14 @@ extension JNISwift2JavaGenerator {
203237 methodName: methodName
204238 )
205239
206- default :
207- guard knownType . isDirectlyTranslatedToWrapJava else {
240+ case . array :
241+ guard let genericArgs = nominalType . genericArguments , genericArgs . count == 1 else {
208242 throw JavaTranslationError . unsupportedSwiftType ( type)
209243 }
210- return . placeholder
244+ return try self . translateArrayResult ( elementType: genericArgs [ 0 ] )
245+
246+ default :
247+ throw JavaTranslationError . unsupportedSwiftType ( type)
211248 }
212249 }
213250
@@ -228,11 +265,32 @@ extension JNISwift2JavaGenerator {
228265 case . optional( let wrappedType) :
229266 return try self . translateOptionalResult ( wrappedType: wrappedType, methodName: methodName)
230267
231- case . genericParameter, . function, . metatype, . tuple, . existential, . opaque, . composite, . array:
268+ case . array( let elementType) :
269+ return try self . translateArrayResult ( elementType: elementType)
270+
271+ case . genericParameter, . function, . metatype, . tuple, . existential, . opaque, . composite:
232272 throw JavaTranslationError . unsupportedSwiftType ( type)
233273 }
234274 }
235275
276+ private func translateArrayResult( elementType: SwiftType ) throws -> UpcallConversionStep {
277+ switch elementType {
278+ case . nominal( let nominalType) :
279+ // We assume this is a JExtracted type
280+ return . map(
281+ . placeholder,
282+ body: . toSwiftClass(
283+ . unwrapOptional( . placeholder, message: " Element of array was nil " ) ,
284+ name: " arrayElement " ,
285+ nominalType: nominalType
286+ )
287+ )
288+
289+ case . array, . composite, . existential, . function, . genericParameter, . metatype, . opaque, . optional, . tuple:
290+ throw JavaTranslationError . unsupportedSwiftType ( . array( elementType) )
291+ }
292+ }
293+
236294 private func translateOptionalResult( wrappedType: SwiftType , methodName: String ) throws -> UpcallConversionStep {
237295 // The `fromJavaOptional` will handle the nullability
238296 let wrappedConversion = try translateResult (
@@ -340,3 +398,31 @@ extension JNISwift2JavaGenerator {
340398 }
341399 }
342400}
401+
402+ extension SwiftType {
403+ /// Indicates whether this type is translated by `wrap-java`
404+ /// into the same type as `jextract`.
405+ ///
406+ /// This means we do not have to perform any mapping when passing
407+ /// this type between jextract and wrap-java
408+ var isDirectlyTranslatedToWrapJava : Bool {
409+ switch self {
410+ case . nominal( let swiftNominalType) :
411+ guard let knownType = swiftNominalType. nominalTypeDecl. knownTypeKind else {
412+ return false
413+ }
414+ switch knownType {
415+ case . bool, . int, . uint, . int8, . uint8, . int16, . uint16, . int32, . uint32, . int64, . uint64, . float, . double, . string, . void:
416+ return true
417+ default :
418+ return false
419+ }
420+
421+ case . array( let elementType) :
422+ return elementType. isDirectlyTranslatedToWrapJava
423+
424+ case . genericParameter, . function, . metatype, . optional, . tuple, . existential, . opaque, . composite:
425+ return false
426+ }
427+ }
428+ }
0 commit comments