@@ -16,27 +16,90 @@ import JavaTypes
1616import SwiftSyntax
1717import SwiftSyntaxBuilder
1818
19+ package class FFMSwift2JavaGenerator : Swift2JavaGenerator {
20+ let log : Logger
21+ let analysis : AnalysisResult
22+ let swiftModuleName : String
23+ let javaPackage : String
24+ let swiftOutputDirectory : String
25+ let javaOutputDirectory : String
26+ let swiftStdlibTypes : SwiftStandardLibraryTypes
27+ let symbolTable : SwiftSymbolTable
28+
29+ var javaPackagePath : String {
30+ javaPackage. replacingOccurrences ( of: " . " , with: " / " )
31+ }
32+
33+ var thunkNameRegistry : ThunkNameRegistry = ThunkNameRegistry ( )
34+
35+ /// Cached Java translation result. 'nil' indicates failed translation.
36+ var translatedSignatures : [ ImportedFunc : TranslatedFunctionSignature ? ] = [ : ]
37+
38+ package init (
39+ translator: Swift2JavaTranslator ,
40+ javaPackage: String ,
41+ swiftOutputDirectory: String ,
42+ javaOutputDirectory: String
43+ ) {
44+ self . log = Logger ( label: " ffm-generator " , logLevel: translator. log. logLevel)
45+ self . analysis = translator. result
46+ self . swiftModuleName = translator. swiftModuleName
47+ self . javaPackage = javaPackage
48+ self . swiftOutputDirectory = swiftOutputDirectory
49+ self . javaOutputDirectory = javaOutputDirectory
50+ self . symbolTable = translator. symbolTable
51+ self . swiftStdlibTypes = translator. swiftStdlibTypes
52+ }
53+
54+ func generate( ) throws {
55+ try writeSwiftThunkSources ( )
56+ print ( " [swift-java] Generated Swift sources (module: ' \( self . swiftModuleName) ') in: \( swiftOutputDirectory) / " )
57+
58+ try writeExportedJavaSources ( )
59+ print ( " [swift-java] Generated Java sources (package: ' \( javaPackage) ') in: \( javaOutputDirectory) / " )
60+ }
61+ }
62+
63+ // ===== --------------------------------------------------------------------------------------------------------------
64+ // MARK: Defaults
65+
66+ extension FFMSwift2JavaGenerator {
67+
68+ /// Default set Java imports for every generated file
69+ static let defaultJavaImports : Array < String > = [
70+ " org.swift.swiftkit.* " ,
71+ " org.swift.swiftkit.SwiftKit " ,
72+ " org.swift.swiftkit.util.* " ,
73+
74+ // Necessary for native calls and type mapping
75+ " java.lang.foreign.* " ,
76+ " java.lang.invoke.* " ,
77+ " java.util.Arrays " ,
78+ " java.util.stream.Collectors " ,
79+ " java.util.concurrent.atomic.* " ,
80+ " java.nio.charset.StandardCharsets " ,
81+ ]
82+ }
83+
1984// ==== ---------------------------------------------------------------------------------------------------------------
2085// MARK: File writing
2186
22- let PATH_SEPARATOR = " / " // TODO: Windows
2387
24- extension Swift2JavaTranslator {
25-
26- /// Every imported public type becomes a public class in its own file in Java.
27- public func writeExportedJavaSources( outputDirectory: String ) throws {
88+ extension FFMSwift2JavaGenerator {
89+ package func writeExportedJavaSources( ) throws {
2890 var printer = CodePrinter ( )
29- try writeExportedJavaSources ( outputDirectory : outputDirectory , printer: & printer)
91+ try writeExportedJavaSources ( printer: & printer)
3092 }
3193
32- public func writeExportedJavaSources( outputDirectory: String , printer: inout CodePrinter ) throws {
33- for (_, ty) in importedTypes. sorted ( by: { ( lhs, rhs) in lhs. key < rhs. key } ) {
94+ /// Every imported public type becomes a public class in its own file in Java.
95+ package func writeExportedJavaSources( printer: inout CodePrinter ) throws {
96+ for (_, ty) in analysis. importedTypes. sorted ( by: { ( lhs, rhs) in lhs. key < rhs. key } ) {
3497 let filename = " \( ty. swiftNominal. name) .java "
3598 log. info ( " Printing contents: \( filename) " )
3699 printImportedNominal ( & printer, ty)
37100
38101 if let outputFile = try printer. writeContents (
39- outputDirectory: outputDirectory ,
102+ outputDirectory: javaOutputDirectory ,
40103 javaPackagePath: javaPackagePath,
41104 filename: filename
42105 ) {
@@ -50,7 +113,7 @@ extension Swift2JavaTranslator {
50113 printModule ( & printer)
51114
52115 if let outputFile = try printer. writeContents (
53- outputDirectory: outputDirectory ,
116+ outputDirectory: javaOutputDirectory ,
54117 javaPackagePath: javaPackagePath,
55118 filename: filename)
56119 {
@@ -63,26 +126,26 @@ extension Swift2JavaTranslator {
63126// ==== ---------------------------------------------------------------------------------------------------------------
64127// MARK: Java/text printing
65128
66- extension Swift2JavaTranslator {
129+ extension FFMSwift2JavaGenerator {
67130
68131 /// Render the Java file contents for an imported Swift module.
69132 ///
70133 /// This includes any Swift global functions in that module, and some general type information and helpers.
71- public func printModule( _ printer: inout CodePrinter ) {
134+ func printModule( _ printer: inout CodePrinter ) {
72135 printHeader ( & printer)
73136 printPackage ( & printer)
74137 printImports ( & printer)
75138
76139 printModuleClass ( & printer) { printer in
77140 // TODO: print all "static" methods
78- for decl in importedGlobalFuncs {
141+ for decl in analysis . importedGlobalFuncs {
79142 self . log. trace ( " Print imported decl: \( decl) " )
80143 printFunctionDowncallMethods ( & printer, decl)
81144 }
82145 }
83146 }
84147
85- package func printImportedNominal( _ printer: inout CodePrinter , _ decl: ImportedNominalType ) {
148+ func printImportedNominal( _ printer: inout CodePrinter , _ decl: ImportedNominalType ) {
86149 printHeader ( & printer)
87150 printPackage ( & printer)
88151 printImports ( & printer)
@@ -143,7 +206,7 @@ extension Swift2JavaTranslator {
143206 }
144207 }
145208
146- public func printHeader( _ printer: inout CodePrinter ) {
209+ func printHeader( _ printer: inout CodePrinter ) {
147210 printer. print (
148211 """
149212 // Generated by jextract-swift
@@ -153,7 +216,7 @@ extension Swift2JavaTranslator {
153216 )
154217 }
155218
156- public func printPackage( _ printer: inout CodePrinter ) {
219+ func printPackage( _ printer: inout CodePrinter ) {
157220 printer. print (
158221 """
159222 package \( javaPackage) ;
@@ -162,14 +225,14 @@ extension Swift2JavaTranslator {
162225 )
163226 }
164227
165- public func printImports( _ printer: inout CodePrinter ) {
166- for i in Swift2JavaTranslator . defaultJavaImports {
228+ func printImports( _ printer: inout CodePrinter ) {
229+ for i in FFMSwift2JavaGenerator . defaultJavaImports {
167230 printer. print ( " import \( i) ; " )
168231 }
169232 printer. print ( " " )
170233 }
171234
172- package func printNominal(
235+ func printNominal(
173236 _ printer: inout CodePrinter , _ decl: ImportedNominalType , body: ( inout CodePrinter ) -> Void
174237 ) {
175238 let parentProtocol : String
@@ -188,7 +251,7 @@ extension Swift2JavaTranslator {
188251 }
189252 }
190253
191- public func printModuleClass( _ printer: inout CodePrinter , body: ( inout CodePrinter ) -> Void ) {
254+ func printModuleClass( _ printer: inout CodePrinter , body: ( inout CodePrinter ) -> Void ) {
192255 printer. printBraceBlock ( " public final class \( swiftModuleName) " ) { printer in
193256 printPrivateConstructor ( & printer, swiftModuleName)
194257
@@ -261,7 +324,7 @@ extension Swift2JavaTranslator {
261324 }
262325 }
263326
264- private func printClassConstants( printer: inout CodePrinter ) {
327+ func printClassConstants( printer: inout CodePrinter ) {
265328 printer. print (
266329 """
267330 static final String LIB_NAME = " \( swiftModuleName) " ;
@@ -270,7 +333,7 @@ extension Swift2JavaTranslator {
270333 )
271334 }
272335
273- private func printPrivateConstructor( _ printer: inout CodePrinter , _ typeName: String ) {
336+ func printPrivateConstructor( _ printer: inout CodePrinter , _ typeName: String ) {
274337 printer. print (
275338 """
276339 private \( typeName) () {
@@ -296,7 +359,7 @@ extension Swift2JavaTranslator {
296359 )
297360 }
298361
299- package func printToStringMethod(
362+ func printToStringMethod(
300363 _ printer: inout CodePrinter , _ decl: ImportedNominalType
301364 ) {
302365 printer. print (
@@ -312,3 +375,4 @@ extension Swift2JavaTranslator {
312375 """ )
313376 }
314377}
378+
0 commit comments