@@ -117,7 +117,7 @@ extension JNISwift2JavaGenerator {
117117 printer. println ( )
118118
119119 for initializer in decl. initializers {
120- printInitializerBindings ( & printer, initializer, type : decl )
120+ printFunctionBinding ( & printer, initializer)
121121 printer. println ( )
122122 }
123123
@@ -176,75 +176,80 @@ extension JNISwift2JavaGenerator {
176176 }
177177
178178 private func printFunctionBinding( _ printer: inout CodePrinter , _ decl: ImportedFunc ) {
179- guard let _ = translatedDecl ( for: decl) else {
179+ guard let translatedDecl = translatedDecl ( for: decl) else {
180180 // Failed to translate. Skip.
181181 return
182182 }
183183
184+ var modifiers = " public "
184185 if decl. isStatic || decl. isInitializer || !decl. hasParent {
185- printStaticFunctionBinding ( & printer, decl)
186- } else {
187- printMemberMethodBindings ( & printer, decl)
186+ modifiers. append ( " static " )
188187 }
189- }
190188
191- private func printStaticFunctionBinding( _ printer: inout CodePrinter , _ decl: ImportedFunc ) {
192- printDeclDocumentation ( & printer, decl)
193- printer. print (
194- " public static native \( renderFunctionSignature ( decl) ) ; "
195- )
196- }
197-
198- /// Renders Java bindings for member methods
199- ///
200- /// Member methods are generated as a function that extracts the `selfPointer`
201- /// and passes it down to another native function along with the arguments
202- /// to call the Swift implementation.
203- private func printMemberMethodBindings( _ printer: inout CodePrinter , _ decl: ImportedFunc ) {
204- let translatedDecl = translatedDecl ( for: decl) ! // We will only call this method if we can translate the decl.
189+ let translatedSignature = translatedDecl. translatedFunctionSignature
190+ let resultType = translatedSignature. resultType. javaType
191+ var parameters = translatedDecl. translatedFunctionSignature. parameters. map ( \. parameter. asParameter)
192+ if translatedSignature. requiresSwiftArena {
193+ parameters. append ( " SwiftArena swiftArena$ " )
194+ }
195+ let throwsClause = decl. isThrowing ? " throws Exception " : " "
205196
206197 printDeclDocumentation ( & printer, decl)
207- printer. printBraceBlock ( " public \( renderFunctionSignature ( decl ) ) " ) { printer in
208- var arguments = translatedDecl. translatedFunctionSignature . parameters. map ( \ . name )
209-
210- let selfVarName = " self$ "
211- arguments . append ( selfVarName )
198+ printer. printBraceBlock (
199+ " \( modifiers ) \( resultType ) \( translatedDecl. name ) ( \( parameters. joined ( separator : " , " ) ) ) \( throwsClause ) "
200+ ) { printer in
201+ printDowncall ( & printer , decl )
202+ }
212203
213- let returnKeyword = translatedDecl. translatedFunctionSignature. resultType. isVoid ? " " : " return "
204+ printNativeFunction ( & printer, decl)
205+ }
214206
215- printer. print (
216- """
217- long \( selfVarName) = this.$memoryAddress();
218- \( returnKeyword) \( translatedDecl. parentName) .$ \( translatedDecl. name) ( \( arguments. joined ( separator: " , " ) ) );
219- """
220- )
207+ private func printNativeFunction( _ printer: inout CodePrinter , _ decl: ImportedFunc ) {
208+ let translatedDecl = translatedDecl ( for: decl) ! // Will always call with valid decl
209+ let nativeSignature = translatedDecl. nativeFunctionSignature
210+ let resultType = nativeSignature. result. javaType
211+ let nativeName = " $ \( translatedDecl. name) "
212+ var parameters = nativeSignature. parameters
213+ if let selfParameter = nativeSignature. selfParameter {
214+ parameters. append ( selfParameter)
221215 }
216+ let renderedParameters = parameters. map { " \( $0. javaParameter. type) \( $0. javaParameter. name) " } . joined ( separator: " , " )
222217
223- let returnType = translatedDecl. translatedFunctionSignature. resultType
224- var parameters = translatedDecl. translatedFunctionSignature. parameters. map ( \. asParameter)
225- parameters. append ( " long selfPointer " )
226- printer. print ( " private static native \( returnType) $ \( translatedDecl. name) ( \( parameters. joined ( separator: " , " ) ) ); " )
218+ printer. print ( " private static native \( resultType) \( nativeName) ( \( renderedParameters) ); " )
227219 }
228220
229- private func printInitializerBindings( _ printer: inout CodePrinter , _ decl: ImportedFunc , type: ImportedNominalType ) {
230- guard let translatedDecl = translatedDecl ( for: decl) else {
231- // Failed to translate. Skip.
232- return
221+ private func printDowncall(
222+ _ printer: inout CodePrinter ,
223+ _ decl: ImportedFunc
224+ ) {
225+ let translatedDecl = translatedDecl ( for: decl) ! // We will only call this method if we can translate the decl.
226+ let translatedFunctionSignature = translatedDecl. translatedFunctionSignature
227+
228+ // Regular parameters.
229+ var arguments = [ String] ( )
230+ for parameter in translatedFunctionSignature. parameters {
231+ let lowered = parameter. conversion. render ( & printer, parameter. parameter. name)
232+ arguments. append ( lowered)
233233 }
234234
235- printDeclDocumentation ( & printer, decl)
236- printer. printBraceBlock ( " public static \( renderFunctionSignature ( decl) ) " ) { printer in
237- let initArguments = translatedDecl. translatedFunctionSignature. parameters. map ( \. name)
238- printer. print (
239- """
240- long self$ = \( type. qualifiedName) .allocatingInit( \( initArguments. joined ( separator: " , " ) ) );
241- return new \( type. qualifiedName) (self$, swiftArena$);
242- """
243- )
235+ // 'self' parameter.
236+ if let selfParameter = translatedFunctionSignature. selfParameter {
237+ let lowered = selfParameter. conversion. render ( & printer, " this " )
238+ arguments. append ( lowered)
244239 }
245240
246- let parameters = translatedDecl. translatedFunctionSignature. parameters. map ( \. asParameter)
247- printer. print ( " private static native long allocatingInit( \( parameters. joined ( separator: " , " ) ) ); " )
241+ //=== Part 3: Downcall.
242+ // TODO: If we always generate a native method and a "public" method, we can actually choose our own thunk names
243+ // using the registry?
244+ let downcall = " \( translatedDecl. parentName) .$ \( translatedDecl. name) ( \( arguments. joined ( separator: " , " ) ) ) "
245+
246+ //=== Part 4: Convert the return value.
247+ if translatedFunctionSignature. resultType. javaType. isVoid {
248+ printer. print ( " \( downcall) ; " )
249+ } else {
250+ let result = translatedFunctionSignature. resultType. conversion. render ( & printer, downcall)
251+ printer. print ( " return \( result) ; " )
252+ }
248253 }
249254
250255 private func printDeclDocumentation( _ printer: inout CodePrinter , _ decl: ImportedFunc ) {
@@ -288,24 +293,4 @@ extension JNISwift2JavaGenerator {
288293 )
289294 }
290295 }
291-
292- /// Renders a Java function signature
293- ///
294- /// `func method(x: Int, y: Int) -> Int` becomes
295- /// `long method(long x, long y)`
296- private func renderFunctionSignature( _ decl: ImportedFunc ) -> String {
297- guard let translatedDecl = translatedDecl ( for: decl) else {
298- fatalError ( " Unable to render function signature for a function that cannot be translated: \( decl) " )
299- }
300- let resultType = translatedDecl. translatedFunctionSignature. resultType
301- var parameters = translatedDecl. translatedFunctionSignature. parameters. map ( \. asParameter)
302-
303- if decl. isInitializer {
304- parameters. append ( " SwiftArena swiftArena$ " )
305- }
306-
307- let throwsClause = decl. isThrowing ? " throws Exception " : " "
308-
309- return " \( resultType) \( translatedDecl. name) ( \( parameters. joined ( separator: " , " ) ) ) \( throwsClause) "
310- }
311296}
0 commit comments