@@ -16,27 +16,81 @@ import JavaTypes
16
16
import SwiftSyntax
17
17
import SwiftSyntaxBuilder
18
18
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
+
19
78
// ==== ---------------------------------------------------------------------------------------------------------------
20
79
// MARK: File writing
21
80
22
- let PATH_SEPARATOR = " / " // TODO: Windows
23
81
24
- extension Swift2JavaTranslator {
82
+ extension FFMSwift2JavaGenerator {
25
83
26
84
/// 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 {
28
86
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 } ) {
34
88
let filename = " \( ty. swiftNominal. name) .java "
35
89
log. info ( " Printing contents: \( filename) " )
36
90
printImportedNominal ( & printer, ty)
37
91
38
92
if let outputFile = try printer. writeContents (
39
- outputDirectory: outputDirectory ,
93
+ outputDirectory: javaOutputDirectory ,
40
94
javaPackagePath: javaPackagePath,
41
95
filename: filename
42
96
) {
@@ -50,7 +104,7 @@ extension Swift2JavaTranslator {
50
104
printModule ( & printer)
51
105
52
106
if let outputFile = try printer. writeContents (
53
- outputDirectory: outputDirectory ,
107
+ outputDirectory: javaOutputDirectory ,
54
108
javaPackagePath: javaPackagePath,
55
109
filename: filename)
56
110
{
@@ -63,26 +117,26 @@ extension Swift2JavaTranslator {
63
117
// ==== ---------------------------------------------------------------------------------------------------------------
64
118
// MARK: Java/text printing
65
119
66
- extension Swift2JavaTranslator {
120
+ extension FFMSwift2JavaGenerator {
67
121
68
122
/// Render the Java file contents for an imported Swift module.
69
123
///
70
124
/// 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 ) {
72
126
printHeader ( & printer)
73
127
printPackage ( & printer)
74
128
printImports ( & printer)
75
129
76
130
printModuleClass ( & printer) { printer in
77
131
// TODO: print all "static" methods
78
- for decl in importedGlobalFuncs {
132
+ for decl in analysis . importedGlobalFuncs {
79
133
self . log. trace ( " Print imported decl: \( decl) " )
80
134
printFunctionDowncallMethods ( & printer, decl)
81
135
}
82
136
}
83
137
}
84
138
85
- package func printImportedNominal( _ printer: inout CodePrinter , _ decl: ImportedNominalType ) {
139
+ func printImportedNominal( _ printer: inout CodePrinter , _ decl: ImportedNominalType ) {
86
140
printHeader ( & printer)
87
141
printPackage ( & printer)
88
142
printImports ( & printer)
@@ -143,7 +197,7 @@ extension Swift2JavaTranslator {
143
197
}
144
198
}
145
199
146
- public func printHeader( _ printer: inout CodePrinter ) {
200
+ func printHeader( _ printer: inout CodePrinter ) {
147
201
printer. print (
148
202
"""
149
203
// Generated by jextract-swift
@@ -153,7 +207,7 @@ extension Swift2JavaTranslator {
153
207
)
154
208
}
155
209
156
- public func printPackage( _ printer: inout CodePrinter ) {
210
+ func printPackage( _ printer: inout CodePrinter ) {
157
211
printer. print (
158
212
"""
159
213
package \( javaPackage) ;
@@ -162,14 +216,14 @@ extension Swift2JavaTranslator {
162
216
)
163
217
}
164
218
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 {
167
221
printer. print ( " import \( i) ; " )
168
222
}
169
223
printer. print ( " " )
170
224
}
171
225
172
- package func printNominal(
226
+ func printNominal(
173
227
_ printer: inout CodePrinter , _ decl: ImportedNominalType , body: ( inout CodePrinter ) -> Void
174
228
) {
175
229
let parentProtocol : String
@@ -188,7 +242,7 @@ extension Swift2JavaTranslator {
188
242
}
189
243
}
190
244
191
- public func printModuleClass( _ printer: inout CodePrinter , body: ( inout CodePrinter ) -> Void ) {
245
+ func printModuleClass( _ printer: inout CodePrinter , body: ( inout CodePrinter ) -> Void ) {
192
246
printer. printBraceBlock ( " public final class \( swiftModuleName) " ) { printer in
193
247
printPrivateConstructor ( & printer, swiftModuleName)
194
248
@@ -261,7 +315,7 @@ extension Swift2JavaTranslator {
261
315
}
262
316
}
263
317
264
- private func printClassConstants( printer: inout CodePrinter ) {
318
+ func printClassConstants( printer: inout CodePrinter ) {
265
319
printer. print (
266
320
"""
267
321
static final String LIB_NAME = " \( swiftModuleName) " ;
@@ -270,7 +324,7 @@ extension Swift2JavaTranslator {
270
324
)
271
325
}
272
326
273
- private func printPrivateConstructor( _ printer: inout CodePrinter , _ typeName: String ) {
327
+ func printPrivateConstructor( _ printer: inout CodePrinter , _ typeName: String ) {
274
328
printer. print (
275
329
"""
276
330
private \( typeName) () {
@@ -296,7 +350,7 @@ extension Swift2JavaTranslator {
296
350
)
297
351
}
298
352
299
- package func printToStringMethod(
353
+ func printToStringMethod(
300
354
_ printer: inout CodePrinter , _ decl: ImportedNominalType
301
355
) {
302
356
printer. print (
@@ -312,3 +366,4 @@ extension Swift2JavaTranslator {
312
366
""" )
313
367
}
314
368
}
369
+
0 commit comments