Skip to content

Commit c40cf47

Browse files
committed
Update for review
1 parent 2a23a14 commit c40cf47

File tree

3 files changed

+42
-35
lines changed

3 files changed

+42
-35
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:

Tests/JExtractSwiftTests/FuncCallbackImportTests.swift

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ final class FuncCallbackImportTests {
8383
* }
8484
*/
8585
private static class $callback {
86+
@FunctionalInterface
8687
public interface Function {
8788
void apply();
8889
}
@@ -94,10 +95,10 @@ final class FuncCallbackImportTests {
9495
}
9596
}
9697
public static class callMe {
97-
public interface callback extends swiftjava___FakeModule_callMe_callback.$callback.Function {
98-
default MemorySegment toUpcallStub(Arena arena) {
99-
return swiftjava___FakeModule_callMe_callback.$callback.toUpcallStub(this, arena);
100-
}
98+
@FunctionalInterface
99+
public interface callback extends swiftjava___FakeModule_callMe_callback.$callback.Function {}
100+
private static MemorySegment $toUpcallStub(callback fi, Arena arena) {
101+
return swiftjava___FakeModule_callMe_callback.$callback.toUpcallStub(fi, arena);
101102
}
102103
}
103104
/**
@@ -108,7 +109,7 @@ final class FuncCallbackImportTests {
108109
*/
109110
public static void callMe(callMe.callback callback) {
110111
try(var arena$ = Arena.ofConfined()) {
111-
swiftjava___FakeModule_callMe_callback.call(callback.toUpcallStub(arena$));
112+
swiftjava___FakeModule_callMe_callback.call(callMe.$toUpcallStub(callback, arena$));
112113
}
113114
}
114115
"""
@@ -166,6 +167,7 @@ final class FuncCallbackImportTests {
166167
* }
167168
*/
168169
private static class $callback {
170+
@FunctionalInterface
169171
public interface Function {
170172
long apply(java.lang.foreign.MemorySegment _0, float _1);
171173
}
@@ -185,6 +187,7 @@ final class FuncCallbackImportTests {
185187
* }
186188
*/
187189
private static class $fn {
190+
@FunctionalInterface
188191
public interface Function {
189192
void apply();
190193
}
@@ -196,15 +199,15 @@ final class FuncCallbackImportTests {
196199
}
197200
}
198201
public static class callMeMore {
199-
public interface callback extends swiftjava___FakeModule_callMeMore_callback_fn.$callback.Function {
200-
default MemorySegment toUpcallStub(Arena arena) {
201-
return swiftjava___FakeModule_callMeMore_callback_fn.$callback.toUpcallStub(this, arena);
202-
}
202+
@FunctionalInterface
203+
public interface callback extends swiftjava___FakeModule_callMeMore_callback_fn.$callback.Function {}
204+
private static MemorySegment $toUpcallStub(callback fi, Arena arena) {
205+
return swiftjava___FakeModule_callMeMore_callback_fn.$callback.toUpcallStub(fi, arena);
203206
}
204-
public interface fn extends swiftjava___FakeModule_callMeMore_callback_fn.$fn.Function {
205-
default MemorySegment toUpcallStub(Arena arena) {
206-
return swiftjava___FakeModule_callMeMore_callback_fn.$fn.toUpcallStub(this, arena);
207-
}
207+
@FunctionalInterface
208+
public interface fn extends swiftjava___FakeModule_callMeMore_callback_fn.$fn.Function {}
209+
private static MemorySegment $toUpcallStub(fn fi, Arena arena) {
210+
return swiftjava___FakeModule_callMeMore_callback_fn.$fn.toUpcallStub(fi, arena);
208211
}
209212
}
210213
/**
@@ -215,7 +218,7 @@ final class FuncCallbackImportTests {
215218
*/
216219
public static void callMeMore(callMeMore.callback callback, callMeMore.fn fn) {
217220
try(var arena$ = Arena.ofConfined()) {
218-
swiftjava___FakeModule_callMeMore_callback_fn.call(callback.toUpcallStub(arena$), fn.toUpcallStub(arena$));
221+
swiftjava___FakeModule_callMeMore_callback_fn.call(callMeMore.$toUpcallStub(callback, arena$), callMeMore.$toUpcallStub(fn, arena$));
219222
}
220223
}
221224
"""

0 commit comments

Comments
 (0)