@@ -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 )
0 commit comments