@@ -16,27 +16,81 @@ import JavaTypes
1616import SwiftSyntax
1717import SwiftSyntaxBuilder
1818
19+ class FFMSwift2JavaGenerator : Swift2JavaGenerator {
20+ private let log = Logger ( label: " ffm-generator " , logLevel: . info)
21+
22+ let analysis : AnalysisResult
23+ let swiftModuleName : String
24+ let javaPackage : String
25+ let swiftOutputDirectory : String
26+ let javaOutputDirectory : String
27+ let swiftStdlibTypes : SwiftStandardLibraryTypes
28+
29+ var javaPackagePath : String {
30+ javaPackage. replacingOccurrences ( of: " . " , with: " / " )
31+ }
32+
33+ var thunkNameRegistry : ThunkNameRegistry = ThunkNameRegistry ( )
34+
35+ init (
36+ analysis: AnalysisResult ,
37+ swiftModuleName: String ,
38+ javaPackage: String ,
39+ swiftOutputDirectory: String ,
40+ javaOutputDirectory: String
41+ ) {
42+ self . analysis = analysis
43+ self . swiftModuleName = swiftModuleName
44+ self . javaPackage = javaPackage
45+ self . swiftOutputDirectory = swiftOutputDirectory
46+ self . javaOutputDirectory = javaOutputDirectory
47+
48+ var parsedSwiftModule = SwiftParsedModuleSymbolTable ( moduleName: " Swift " )
49+ self . swiftStdlibTypes = SwiftStandardLibraryTypes ( into: & parsedSwiftModule)
50+ }
51+
52+ func generate( ) throws {
53+ try writeExportedJavaSources ( )
54+ }
55+ }
56+
57+ // ===== --------------------------------------------------------------------------------------------------------------
58+ // MARK: Defaults
59+
60+ extension FFMSwift2JavaGenerator {
61+
62+ /// Default set Java imports for every generated file
63+ static let defaultJavaImports : Array < String > = [
64+ " org.swift.swiftkit.* " ,
65+ " org.swift.swiftkit.SwiftKit " ,
66+ " org.swift.swiftkit.util.* " ,
67+
68+ // Necessary for native calls and type mapping
69+ " java.lang.foreign.* " ,
70+ " java.lang.invoke.* " ,
71+ " java.util.Arrays " ,
72+ " java.util.stream.Collectors " ,
73+ " java.util.concurrent.atomic.* " ,
74+ " java.nio.charset.StandardCharsets " ,
75+ ]
76+ }
77+
1978// ==== ---------------------------------------------------------------------------------------------------------------
2079// MARK: File writing
2180
22- let PATH_SEPARATOR = " / " // TODO: Windows
2381
24- extension Swift2JavaTranslator {
82+ extension FFMSwift2JavaGenerator {
2583
2684 /// Every imported public type becomes a public class in its own file in Java.
27- public func writeExportedJavaSources( outputDirectory : String ) throws {
85+ func writeExportedJavaSources( ) throws {
2886 var printer = CodePrinter ( )
29- try writeExportedJavaSources ( outputDirectory: outputDirectory, printer: & printer)
30- }
31-
32- public func writeExportedJavaSources( outputDirectory: String , printer: inout CodePrinter ) throws {
33- for (_, ty) in importedTypes. sorted ( by: { ( lhs, rhs) in lhs. key < rhs. key } ) {
87+ for (_, ty) in analysis. importedTypes. sorted ( by: { ( lhs, rhs) in lhs. key < rhs. key } ) {
3488 let filename = " \( ty. swiftNominal. name) .java "
3589 log. info ( " Printing contents: \( filename) " )
3690 printImportedNominal ( & printer, ty)
3791
3892 if let outputFile = try printer. writeContents (
39- outputDirectory: outputDirectory ,
93+ outputDirectory: javaOutputDirectory ,
4094 javaPackagePath: javaPackagePath,
4195 filename: filename
4296 ) {
@@ -50,7 +104,7 @@ extension Swift2JavaTranslator {
50104 printModule ( & printer)
51105
52106 if let outputFile = try printer. writeContents (
53- outputDirectory: outputDirectory ,
107+ outputDirectory: javaOutputDirectory ,
54108 javaPackagePath: javaPackagePath,
55109 filename: filename)
56110 {
@@ -63,26 +117,26 @@ extension Swift2JavaTranslator {
63117// ==== ---------------------------------------------------------------------------------------------------------------
64118// MARK: Java/text printing
65119
66- extension Swift2JavaTranslator {
120+ extension FFMSwift2JavaGenerator {
67121
68122 /// Render the Java file contents for an imported Swift module.
69123 ///
70124 /// This includes any Swift global functions in that module, and some general type information and helpers.
71- public func printModule( _ printer: inout CodePrinter ) {
125+ func printModule( _ printer: inout CodePrinter ) {
72126 printHeader ( & printer)
73127 printPackage ( & printer)
74128 printImports ( & printer)
75129
76130 printModuleClass ( & printer) { printer in
77131 // TODO: print all "static" methods
78- for decl in importedGlobalFuncs {
132+ for decl in analysis . importedGlobalFuncs {
79133 self . log. trace ( " Print imported decl: \( decl) " )
80134 printFunctionDowncallMethods ( & printer, decl)
81135 }
82136 }
83137 }
84138
85- package func printImportedNominal( _ printer: inout CodePrinter , _ decl: ImportedNominalType ) {
139+ func printImportedNominal( _ printer: inout CodePrinter , _ decl: ImportedNominalType ) {
86140 printHeader ( & printer)
87141 printPackage ( & printer)
88142 printImports ( & printer)
@@ -143,7 +197,7 @@ extension Swift2JavaTranslator {
143197 }
144198 }
145199
146- public func printHeader( _ printer: inout CodePrinter ) {
200+ func printHeader( _ printer: inout CodePrinter ) {
147201 printer. print (
148202 """
149203 // Generated by jextract-swift
@@ -153,7 +207,7 @@ extension Swift2JavaTranslator {
153207 )
154208 }
155209
156- public func printPackage( _ printer: inout CodePrinter ) {
210+ func printPackage( _ printer: inout CodePrinter ) {
157211 printer. print (
158212 """
159213 package \( javaPackage) ;
@@ -162,14 +216,14 @@ extension Swift2JavaTranslator {
162216 )
163217 }
164218
165- public func printImports( _ printer: inout CodePrinter ) {
166- for i in Swift2JavaTranslator . defaultJavaImports {
219+ func printImports( _ printer: inout CodePrinter ) {
220+ for i in FFMSwift2JavaGenerator . defaultJavaImports {
167221 printer. print ( " import \( i) ; " )
168222 }
169223 printer. print ( " " )
170224 }
171225
172- package func printNominal(
226+ func printNominal(
173227 _ printer: inout CodePrinter , _ decl: ImportedNominalType , body: ( inout CodePrinter ) -> Void
174228 ) {
175229 let parentProtocol : String
@@ -188,7 +242,7 @@ extension Swift2JavaTranslator {
188242 }
189243 }
190244
191- public func printModuleClass( _ printer: inout CodePrinter , body: ( inout CodePrinter ) -> Void ) {
245+ func printModuleClass( _ printer: inout CodePrinter , body: ( inout CodePrinter ) -> Void ) {
192246 printer. printBraceBlock ( " public final class \( swiftModuleName) " ) { printer in
193247 printPrivateConstructor ( & printer, swiftModuleName)
194248
@@ -261,7 +315,7 @@ extension Swift2JavaTranslator {
261315 }
262316 }
263317
264- private func printClassConstants( printer: inout CodePrinter ) {
318+ func printClassConstants( printer: inout CodePrinter ) {
265319 printer. print (
266320 """
267321 static final String LIB_NAME = " \( swiftModuleName) " ;
@@ -270,7 +324,7 @@ extension Swift2JavaTranslator {
270324 )
271325 }
272326
273- private func printPrivateConstructor( _ printer: inout CodePrinter , _ typeName: String ) {
327+ func printPrivateConstructor( _ printer: inout CodePrinter , _ typeName: String ) {
274328 printer. print (
275329 """
276330 private \( typeName) () {
@@ -296,7 +350,7 @@ extension Swift2JavaTranslator {
296350 )
297351 }
298352
299- package func printToStringMethod(
353+ func printToStringMethod(
300354 _ printer: inout CodePrinter , _ decl: ImportedNominalType
301355 ) {
302356 printer. print (
@@ -312,3 +366,4 @@ extension Swift2JavaTranslator {
312366 """ )
313367 }
314368}
369+
0 commit comments