Skip to content

Commit 4c8ddf2

Browse files
committed
Update for review
1 parent 2a23a14 commit 4c8ddf2

File tree

2 files changed

+25
-21
lines changed

2 files changed

+25
-21
lines changed

Sources/JExtractSwiftLib/Swift2JavaTranslator+JavaBindingsPrinting.swift

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ extension Swift2JavaTranslator {
130130

131131
/// Print required helper classes/interfaces for describing the CFunction.
132132
///
133-
/// * function pointer parameter as a function interface.
133+
/// * function pointer parameter as a functional interface.
134134
/// * Unnamed-struct parameter as a record. (unimplemented)
135135
func printParameterDescriptorClasses(
136136
_ printer: inout CodePrinter,
@@ -151,6 +151,7 @@ extension Swift2JavaTranslator {
151151
///
152152
/// ```java
153153
/// class $<parameter-name> {
154+
/// @FunctionalInterface
154155
/// interface Function {
155156
/// <return-type> apply(<parameters>);
156157
/// }
@@ -167,7 +168,7 @@ extension Swift2JavaTranslator {
167168
_ cType: CType
168169
) {
169170
guard case .pointer(.function(let cResultType, let cParameterTypes, variadic: false)) = cType else {
170-
preconditionFailure("must be a C function pointer type")
171+
preconditionFailure("must be a C function pointer type; name=\(name), cType=\(cType)")
171172
}
172173

173174
let cParams = cParameterTypes.enumerated().map { i, ty in
@@ -187,6 +188,7 @@ extension Swift2JavaTranslator {
187188
) { printer in
188189
printer.print(
189190
"""
191+
@FunctionalInterface
190192
public interface Function {
191193
\(cResultType.javaType) apply(\(paramDecls.joined(separator: ", ")));
192194
}
@@ -206,7 +208,7 @@ extension Swift2JavaTranslator {
206208

207209
/// Print the helper type container for a user-facing Java API.
208210
///
209-
/// * User-facing function interfaces.
211+
/// * User-facing functional interfaces.
210212
func printJavaBindingWrapperHelperClass(
211213
_ printer: inout CodePrinter,
212214
_ decl: ImportedFunc
@@ -228,22 +230,22 @@ extension Swift2JavaTranslator {
228230
}
229231
}
230232

231-
/// Print "wrapper" function interface representing a Swift closure type.
233+
/// Print "wrapper" functional interface representing a Swift closure type.
232234
func printJavaBindingWrapperFunctionTypeHelper(
233235
_ printer: inout CodePrinter,
234236
_ functionType: TranslatedFunctionType,
235237
_ bindingDescriptorName: String
236238
) {
237-
let cdeclDescritor = "\(bindingDescriptorName).$\(functionType.name)"
238-
if functionType.isTrivial {
239-
// If the usser-facing function interface is C-compatible, just extend the
240-
// lowered function pointer parameter interface.
239+
let cdeclDescriptor = "\(bindingDescriptorName).$\(functionType.name)"
240+
if functionType.isCompatibleWithC {
241+
// If the user-facing functional interface is C ABI compatible, just extend
242+
// the lowered function pointer parameter interface.
241243
printer.print(
242244
"""
243-
public interface \(functionType.name) extends \(cdeclDescritor).Function {
244-
default MemorySegment toUpcallStub(Arena arena) {
245-
return \(bindingDescriptorName).$\(functionType.name).toUpcallStub(this, arena);
246-
}
245+
@FunctionalInterface
246+
public interface \(functionType.name) extends \(cdeclDescriptor).Function {}
247+
private static MemorySegment $toUpcallStub(\(functionType.name) fi, Arena arena) {
248+
return \(bindingDescriptorName).$\(functionType.name).toUpcallStub(fi, arena);
247249
}
248250
"""
249251
)
@@ -256,13 +258,14 @@ extension Swift2JavaTranslator {
256258

257259
printer.print(
258260
"""
261+
@FunctionalInterface
259262
public interface \(functionType.name) {
260263
\(functionType.result.javaResultType) apply(\(apiParams.joined(separator: ", ")));
261-
private default MemorySegment toUpcallStub(Arena arena) {
262-
return \(cdeclDescritor).toUpcallStub((<cdecl-params>) -> {
263-
<maybe-return> fi(<converted-args>)
264-
}, arena);
265-
}
264+
}
265+
private static MemorySegment $toUpcallStub(\(functionType.name) fi, Arena arena) {
266+
return \(cdeclDescriptor).toUpcallStub((<cdecl-params>) -> {
267+
<maybe-return> fi(<converted-args>)
268+
}, arena);
266269
}
267270
"""
268271
)

Sources/JExtractSwiftLib/Swift2JavaTranslator+JavaTranslation.swift

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ struct TranslatedFunctionDecl {
8989
/// Java function name.
9090
let name: String
9191

92-
/// Function interfaces (i.e. lambda types) required for the Java method.
92+
/// Functional interfaces required for the Java method.
9393
let functionTypes: [TranslatedFunctionType]
9494

9595
/// Function signature.
@@ -114,7 +114,8 @@ struct TranslatedFunctionType {
114114
var parameters: [TranslatedParameter]
115115
var result: TranslatedResult
116116

117-
var isTrivial: Bool {
117+
/// Whether or not this functional interface with C ABI compatible.
118+
var isCompatibleWithC: Bool {
118119
result.conversion.isPass && parameters.allSatisfy(\.conversion.isPass)
119120
}
120121
}
@@ -185,7 +186,7 @@ struct JavaTranslation {
185186
)
186187
}
187188

188-
/// Translate Swift closure type to Java function interface.
189+
/// Translate Swift closure type to Java functional interface.
189190
func translateFunctionType(
190191
name: String,
191192
swiftType: SwiftFunctionType
@@ -365,7 +366,7 @@ struct JavaTranslation {
365366
type: JavaType.class(package: nil, name: "\(methodName).\(parameterName)"),
366367
name: parameterName)
367368
],
368-
conversion: .method(methodName: "toUpcallStub", withArena: true)
369+
conversion: .call(function: "\(methodName).$toUpcallStub", withArena: true)
369370
)
370371

371372
case .optional:

0 commit comments

Comments
 (0)